From 5b156d72c0fbc39ceb5ac985d9f11975cab19958 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 6 Aug 2024 01:19:19 +0300 Subject: [PATCH 01/82] Fix bug #44363 --- OdfFile/Reader/Format/text_elements.cpp | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/OdfFile/Reader/Format/text_elements.cpp b/OdfFile/Reader/Format/text_elements.cpp index 35683ff86b..533ee78bd2 100644 --- a/OdfFile/Reader/Format/text_elements.cpp +++ b/OdfFile/Reader/Format/text_elements.cpp @@ -252,6 +252,35 @@ size_t paragraph::drop_cap_docx_convert(oox::docx_conversion_context & Context) } return index; } + +void static process_list_bullet_style(oox::docx_conversion_context& Context, office_element_ptr_array& content) +{ + if (content.size() <= 0) + return; + + span* first_span = dynamic_cast(content[0].get()); + if (!first_span) + return; + + style_instance* span_style = Context.root()->odf_context().styleContainer().style_by_name(first_span->text_style_name_, style_family::Text, false); + if (!span_style) + return; + + style_content* span_style_content = span_style->content(); + if (!span_style_content) + return; + + std::wstringstream ss; + style_text_properties* text_props = span_style_content->get_style_text_properties(); + + if (text_props->content_.fo_font_weight_->get_type() == odf_types::font_weight::WBold) + ss << ""; + if (text_props->content_.fo_font_style_->get_type() == odf_types::font_style::Italic) + ss << ""; + + Context.get_text_tracked_context().dumpRPrInsDel_ = ss.str(); +} + void paragraph::docx_convert(oox::docx_conversion_context & Context, _CP_OPT(std::wstring) next_element_style_name) { std::wstring styleName = attrs_.text_style_name_; @@ -347,6 +376,8 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context, _CP_OPT(std } Context.start_paragraph_style(styleName); + + process_list_bullet_style(Context, content_); int textStyle = Context.process_paragraph_attr(&attrs_); From c9117df33d22a51cf4ce73b8dabfe1d908223193 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 28 Aug 2024 15:57:05 +0300 Subject: [PATCH 02/82] Fix work with snapshots --- DesktopEditor/doctrenderer/docbuilder_p.cpp | 3 +-- DesktopEditor/doctrenderer/doctrenderer.cpp | 3 +-- DesktopEditor/doctrenderer/editors.h | 16 ++++------------ 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder_p.cpp b/DesktopEditor/doctrenderer/docbuilder_p.cpp index f740456b2f..ba250a992e 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.cpp +++ b/DesktopEditor/doctrenderer/docbuilder_p.cpp @@ -253,8 +253,7 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri LOGGER_SPEED_LAP("compile"); - if (!m_context->isSnapshotUsed()) - NSDoctRenderer::RunEditor(editorType, m_context, try_catch, config); + NSDoctRenderer::RunEditor(editorType, m_context, try_catch, config); if(try_catch->Check()) return false; diff --git a/DesktopEditor/doctrenderer/doctrenderer.cpp b/DesktopEditor/doctrenderer/doctrenderer.cpp index d23142ac23..45e81bd1b3 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.cpp +++ b/DesktopEditor/doctrenderer/doctrenderer.cpp @@ -599,8 +599,7 @@ namespace NSDoctRenderer LOGGER_SPEED_LAP("compile"); - if (!context->isSnapshotUsed()) - NSDoctRenderer::RunEditor(editorType, context, try_catch, this); + NSDoctRenderer::RunEditor(editorType, context, try_catch, this); if (try_catch->Check()) { diff --git a/DesktopEditor/doctrenderer/editors.h b/DesktopEditor/doctrenderer/editors.h index 4fbd706836..f95c0e2df4 100644 --- a/DesktopEditor/doctrenderer/editors.h +++ b/DesktopEditor/doctrenderer/editors.h @@ -211,11 +211,7 @@ namespace NSDoctRenderer if (!RunScript(context, try_catch, config->m_strAllFonts)) return false; - std::string sFooter = "\ -window.InitNativeObject();\ -window.InitNativeTextMeasurer();\ -window.InitNativeZLib();\ -AscFonts.checkAllFonts();\n"; + std::string sFooter = "window.InitNativeEditors();"; if (context->isSnapshotUsed()) { @@ -237,6 +233,9 @@ String.prototype.replaceAll = function(str, newStr)\ static bool RunEditor(const DoctRendererEditorType& type, JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config) { + if (context->isSnapshotUsed()) + return RunEditorFooter(context, try_catch, config); + NSStringUtils::CStringBuilderA builder; builder.AddSize(10 * 1024 * 1024); std::wstring sCachePath = GetAllScript(&builder, type, config); @@ -284,13 +283,6 @@ String.prototype.replaceAll = function(str, newStr)\ JSSmart context = new NSJSBase::CJSContext(false); context->Initialize(sCachePath); - NSJSBase::CJSContextScope scope(context); - - JSSmart try_catch = context->GetExceptions(); - - if (!RunEditorFooter(context, try_catch, config)) - return NULL; - return context; } From 3b47ce04b46420949fa2347eafb467a7edf16548 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 28 Aug 2024 16:07:31 +0300 Subject: [PATCH 03/82] Disable embedded drawing file --- DesktopEditor/doctrenderer/doctrenderer.pro | 28 +++++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 387f0a787e..8a0bffba00 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -16,11 +16,6 @@ DEFINES += DOCTRENDERER_USE_DYNAMIC_LIBRARY_BUILDING DEFINES += JSBASE_USE_DYNAMIC_LIBRARY_BUILDING ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network) -# drawingfile support -DEFINES += WASM_SERIALIZER_USE_ALLOCATOR -ADD_DEPENDENCY(PdfFile, XpsFile, DjVuFile, DocxRenderer) -SOURCES += ../../HtmlRenderer/src/HTMLRendererText.cpp - #CONFIG += build_xp #CONFIG += v8_version_60 core_android:DEFINES += DISABLE_MEMORY_LIMITATION @@ -49,8 +44,7 @@ HEADERS += \ nativecontrol.h \ graphics.h \ hash.h \ - server.h \ - drawingfile.h + server.h HEADERS += \ embed/PointerEmbed.h \ @@ -63,7 +57,6 @@ HEADERS += \ embed/TextMeasurerEmbed.h \ embed/HashEmbed.h \ embed/Default.h \ - embed/DrawingFileEmbed.h \ js_internal/js_base.h SOURCES += \ @@ -76,8 +69,7 @@ SOURCES += \ embed/NativeBuilderDocumentEmbed.cpp \ embed/TextMeasurerEmbed.cpp \ embed/HashEmbed.cpp \ - embed/Default.cpp \ - embed/DrawingFileEmbed.cpp + embed/Default.cpp # Serialize objects to JS HEADERS += \ @@ -110,7 +102,6 @@ ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/NativeControlEmbed.h) ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/PointerEmbed.h) ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/TextMeasurerEmbed.h) ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/ZipEmbed.h) -ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/DrawingFileEmbed.h) include(../graphics/pro/textshaper.pri) include(../../Common/3dParty/openssl/openssl.pri) @@ -118,3 +109,18 @@ include(../../Common/3dParty/openssl/openssl.pri) # downloader DEFINES += BUIDLER_OPEN_DOWNLOAD_ENABLED DEFINES += BUIDLER_OPEN_BASE64_ENABLED + +drawingfile_support { + DEFINES += WASM_SERIALIZER_USE_ALLOCATOR + ADD_DEPENDENCY(PdfFile, XpsFile, DjVuFile, DocxRenderer) + + HEADERS += \ + drawingfile.h \ + embed/DrawingFileEmbed.h + + SOURCES += \ + ../../HtmlRenderer/src/HTMLRendererText.cpp \ + embed/DrawingFileEmbed.cpp + + ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/DrawingFileEmbed.h) +} From 13088c6ed4e7592284e96155704806d8cd28ef2e Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Wed, 28 Aug 2024 16:45:32 +0300 Subject: [PATCH 04/82] fix bug #69892 --- MsBinaryFile/DocFile/BookmarkFirst.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/DocFile/BookmarkFirst.cpp b/MsBinaryFile/DocFile/BookmarkFirst.cpp index 87a232b99a..0141e72050 100644 --- a/MsBinaryFile/DocFile/BookmarkFirst.cpp +++ b/MsBinaryFile/DocFile/BookmarkFirst.cpp @@ -62,7 +62,10 @@ namespace DocFileFormat { ProtInfoBookmark *newObject = new ProtInfoBookmark(); - newObject->id = reader->ReadUInt32(); + if (length > 8) + { + newObject->id = reader->ReadUInt32(); + } newObject->uidSel = reader->ReadUInt16(); newObject->iProt = reader->ReadUInt16(); From b00c2eb7735154bf304e315ff248d58cc5683b52 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 29 Aug 2024 10:45:55 +0300 Subject: [PATCH 05/82] Fix bug 69862 --- DesktopEditor/graphics/Graphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/graphics/Graphics.cpp b/DesktopEditor/graphics/Graphics.cpp index e83ae9cda8..dba220d2de 100644 --- a/DesktopEditor/graphics/Graphics.cpp +++ b/DesktopEditor/graphics/Graphics.cpp @@ -655,7 +655,7 @@ namespace Aggplus if (fabs(dDet) < 0.0001) { path_copy.transform_all_paths(m_oFullTransform.m_internal->m_agg_mtx); - dWidth *= sqrt(dDet); + dWidth *= sqrt(fabs(dDet)); bIsUseIdentity = true; } From c7b72698a8ab96b4a78ad38dde5aebb42a24d3d4 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 29 Aug 2024 10:52:13 +0300 Subject: [PATCH 06/82] Fix ctm for write --- PdfFile/PdfEditor.cpp | 39 ++++++++++++--------------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/PdfFile/PdfEditor.cpp b/PdfFile/PdfEditor.cpp index 0cf157a199..5f35b77306 100644 --- a/PdfFile/PdfEditor.cpp +++ b/PdfFile/PdfEditor.cpp @@ -383,9 +383,19 @@ HRESULT _ChangePassword(const std::wstring& wsPath, const std::wstring& wsPasswo return bRes ? S_OK : S_FALSE; } -void StreamGetCTM(XRef* pXref, Object* oStream, double* dCTM) +void GetCTM(XRef* pXref, Object* oPage, double* dCTM) { - Parser* parser = new Parser(pXref, new Lexer(pXref, oStream), gFalse); + if (!oPage || !oPage->isDict()) + return; + + Object oContents; + if (!oPage->dictLookup("Contents", &oContents) || (!oContents.isArray() && !oContents.isStream())) + { + oContents.free(); + return; + } + + Parser* parser = new Parser(pXref, new Lexer(pXref, &oContents), gFalse); int nNumArgs = 0; Object oObj; @@ -435,32 +445,7 @@ void StreamGetCTM(XRef* pXref, Object* oStream, double* dCTM) for (int i = 0; i < nNumArgs; ++i) pArgs[i].free(); RELEASEOBJECT(parser); -} -void GetCTM(XRef* pXref, Object* oPage, double* dCTM) -{ - if (!oPage || !oPage->isDict()) - return; - Object oContents; - if (!oPage->dictLookup("Contents", &oContents)) - { - oContents.free(); - return; - } - - if (oContents.isArray()) - { - for (int nIndex = 0; nIndex < oContents.arrayGetLength(); ++nIndex) - { - Object oTemp; - oContents.arrayGet(nIndex, &oTemp); - if (oTemp.isStream()) - StreamGetCTM(pXref, &oTemp, dCTM); - oTemp.free(); - } - } - else if (oContents.isStream()) - StreamGetCTM(pXref, &oContents, dCTM); oContents.free(); } From a73c9cc6593048993d3a8b85cb97842592c1f219 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Thu, 29 Aug 2024 13:52:51 +0400 Subject: [PATCH 07/82] Some defines and typo fixes --- DesktopEditor/doctrenderer/doctrenderer.cpp | 2 +- DesktopEditor/doctrenderer/editors.h | 4 ---- DesktopEditor/doctrenderer/js_internal/js_base.h | 1 - .../doctrenderer/js_internal/v8/v8_base.cpp | 13 ++++++------- DesktopEditor/doctrenderer/js_internal/v8/v8_base.h | 2 +- 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/DesktopEditor/doctrenderer/doctrenderer.cpp b/DesktopEditor/doctrenderer/doctrenderer.cpp index 45e81bd1b3..121446a3d7 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.cpp +++ b/DesktopEditor/doctrenderer/doctrenderer.cpp @@ -1086,7 +1086,7 @@ namespace NSDoctRenderer void CDoctrenderer::CreateSnapshots() { -#ifdef V8_VERSION_89_PLUS +#ifdef V8_SUPPORT_SNAPSHOTS std::vector editors; editors.push_back(NSDoctRenderer::DoctRendererEditorType::WORD); editors.push_back(NSDoctRenderer::DoctRendererEditorType::SLIDE); diff --git a/DesktopEditor/doctrenderer/editors.h b/DesktopEditor/doctrenderer/editors.h index f95c0e2df4..e570b8f25d 100644 --- a/DesktopEditor/doctrenderer/editors.h +++ b/DesktopEditor/doctrenderer/editors.h @@ -265,10 +265,6 @@ String.prototype.replaceAll = function(str, newStr)\ static JSSmart RunEditorWithSnapshot(const DoctRendererEditorType& type, CDoctRendererConfig* config) { -#ifndef V8_VERSION_89_PLUS - return NULL; -#endif - #ifndef V8_SUPPORT_SNAPSHOTS return NULL; #endif diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h index 186b5966ac..fc20f63172 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base.h +++ b/DesktopEditor/doctrenderer/js_internal/js_base.h @@ -490,7 +490,6 @@ namespace NSJSBase /** * Generate snapshot by script. * @param script The script to be executed. - * @param exception The object for handling exceptions. * @param snapshotPath The path to the snapshot * @return Returns true whether a snapshot has been created. */ diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp index 0097378b67..c8884fecf0 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp @@ -192,7 +192,7 @@ namespace NSJSBase { if (m_internal->m_isolate == NULL) { -#ifdef V8_VERSION_89_PLUS +#ifdef V8_SUPPORT_SNAPSHOTS if (!snapshotPath.empty()) { BYTE* data = NULL; @@ -411,9 +411,9 @@ namespace NSJSBase bool CJSContext::generateSnapshot(const std::string& script, const std::wstring& snapshotPath) { -#ifdef V8_VERSION_89_PLUS +#ifdef V8_SUPPORT_SNAPSHOTS bool result = false; - // snapshot creator should be in its own scope, because it handles entering, exiting and disposing the isolate + // Snapshot creator should be in its own scope, because it handles entering, exiting and disposing the isolate v8::SnapshotCreator snapshotCreator; v8::Isolate* isolate = snapshotCreator.GetIsolate(); { @@ -422,8 +422,7 @@ namespace NSJSBase v8::Local context = v8::Context::New(isolate); v8::Context::Scope context_scope(context); - // Trying to handle compile & run errors: - // window + // Handle compile & run errors v8::Local global = context->Global(); global->Set(context, v8::String::NewFromUtf8Literal(isolate, "window"), global).Check(); global->Set(context, v8::String::NewFromUtf8Literal(isolate, "self"), global).Check(); @@ -433,11 +432,11 @@ namespace NSJSBase v8::Local source = v8::String::NewFromUtf8(isolate, script.c_str()).ToLocalChecked(); v8::Local script = v8::Script::Compile(context, source).ToLocalChecked(); - bool isEmpty = script->Run(context).IsEmpty(); + script->Run(context).IsEmpty(); snapshotCreator.SetDefaultContext(context); } v8::StartupData data = snapshotCreator.CreateBlob(v8::SnapshotCreator::FunctionCodeHandling::kKeep); - + // Save snapshot to file NSFile::CFileBinary snapshotFile; if (data.data && snapshotFile.CreateFile(snapshotPath)) { diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 436304740c..7c9ca925db 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -200,7 +200,7 @@ public: nMaxVirtualMemory); #endif -#ifdef V8_VERSION_89_PLUS +#ifdef V8_SUPPORT_SNAPSHOTS create_params.snapshot_blob = startupData; #endif From ea58d59b68d34eafa9b23d211de1ed953214f0a8 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Thu, 29 Aug 2024 14:12:22 +0400 Subject: [PATCH 08/82] Remove static functions from editors.h --- DesktopEditor/doctrenderer/doctrenderer.pro | 1 + DesktopEditor/doctrenderer/editors.cpp | 249 ++++++++++++++++++++ DesktopEditor/doctrenderer/editors.h | 238 +------------------ 3 files changed, 253 insertions(+), 235 deletions(-) create mode 100644 DesktopEditor/doctrenderer/editors.cpp diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 8a0bffba00..080a7225df 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -27,6 +27,7 @@ HEADERS += \ docbuilder.h SOURCES += \ + editors.cpp \ nativecontrol.cpp \ doctrenderer.cpp \ docbuilder.cpp \ diff --git a/DesktopEditor/doctrenderer/editors.cpp b/DesktopEditor/doctrenderer/editors.cpp new file mode 100644 index 0000000000..bba11ef9da --- /dev/null +++ b/DesktopEditor/doctrenderer/editors.cpp @@ -0,0 +1,249 @@ +#include "./editors.h" + +#include "../common/StringBuilder.h" + +namespace NSDoctRenderer +{ + namespace + { + void AppendScript(NSStringUtils::CStringBuilderA* builder, const std::wstring& path) + { + NSFile::CFileBinary oFile; + + if (!oFile.OpenFile(path)) + return; + + int size = (int)oFile.GetFileSize(); + if (size < 3) + return; + + BYTE* pData = new BYTE[size]; + DWORD dwReadSize = 0; + oFile.ReadFile(pData, (DWORD)size, dwReadSize); + oFile.CloseFile(); + + int nOffset = 0; + if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) + nOffset = 3; + + builder->WriteString((char*)(pData + nOffset), size - nOffset); + builder->WriteString("\n\n"); + RELEASEARRAYOBJECTS(pData); + } + + bool RunScript(JSSmart& context, JSSmart& try_catch, const std::wstring& path) + { + NSFile::CFileBinary oFile; + + if (!oFile.OpenFile(path)) + return false; + + int size = (int)oFile.GetFileSize(); + if (size < 3) + return false; + + BYTE* pData = new BYTE[size]; + DWORD dwReadSize = 0; + oFile.ReadFile(pData, (DWORD)size, dwReadSize); + oFile.CloseFile(); + + int nOffset = 0; + if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) + nOffset = 3; + + context->runScript(std::string((char*)(pData + nOffset), size - nOffset), try_catch); + RELEASEARRAYOBJECTS(pData); + + return !try_catch->Check(); + } + + std::wstring GetAllScript(NSStringUtils::CStringBuilderA* builder, const DoctRendererEditorType& type, CDoctRendererConfig* config, const bool& isSnapshot = false) + { + for (std::vector::const_iterator i = config->m_arrFiles.cbegin(); i != config->m_arrFiles.cend(); i++) + AppendScript(builder, *i); + + std::wstring sFontsPath = config->m_strSdkPath + L"/common/libfont/engine"; +#ifdef SUPPORT_HARFBUZZ_SHAPER + sFontsPath += L"/fonts_native.js"; +#else + sFontsPath += L"/fonts_ie.js"; +#endif + + std::wstring sCachePath = L""; + + switch (type) + { + case DoctRendererEditorType::WORD: + { + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all.js"); + sCachePath = config->m_strSdkPath + L"/word/sdk-all"; + break; + } + case DoctRendererEditorType::SLIDE: + { + AppendScript(builder, config->m_strSdkPath + L"/slide/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/slide/sdk-all.js"); + sCachePath = config->m_strSdkPath + L"/slide/sdk-all"; + break; + } + case DoctRendererEditorType::CELL: + { + AppendScript(builder, config->m_strSdkPath + L"/cell/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/cell/sdk-all.js"); + builder->WriteString("\n$.ready();", 11); + sCachePath = config->m_strSdkPath + L"/cell/sdk-all"; + break; + } + case DoctRendererEditorType::VISIO: + { + if (!NSFile::CFileBinary::Exists(config->m_strSdkPath + L"/draw/sdk-all-min.js")) + return L""; + AppendScript(builder, config->m_strSdkPath + L"/draw/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/draw/sdk-all.js"); + sCachePath = config->m_strSdkPath + L"/draw/sdk-all"; + break; + } + case DoctRendererEditorType::PDF: + { + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all.js"); + AppendScript(builder, config->m_strSdkPath + L"/pdf/src/engine/drawingfile_native.js"); + sCachePath = config->m_strSdkPath + L"/pdf/sdk-all"; + break; + } + default: + break; + } + + if (!sCachePath.empty()) + sCachePath += (isSnapshot ? L".bin" : L".cache"); + + return sCachePath; + } + + std::wstring GetSnapshotPath(const DoctRendererEditorType& type, CDoctRendererConfig* config) + { + std::wstring sCachePath = L""; + + switch (type) + { + case DoctRendererEditorType::WORD: + { + return config->m_strSdkPath + L"/word/sdk-all.bin"; + } + case DoctRendererEditorType::SLIDE: + { + return config->m_strSdkPath + L"/slide/sdk-all.bin"; + } + case DoctRendererEditorType::CELL: + { + return config->m_strSdkPath + L"/cell/sdk-all.bin"; + } + case DoctRendererEditorType::VISIO: + { + return config->m_strSdkPath + L"/draw/sdk-all.bin"; + } + case DoctRendererEditorType::PDF: + { + return config->m_strSdkPath + L"/pdf/sdk-all.bin"; + } + default: + break; + } + return L""; + } + + bool RunEditorFooter(JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config) + { + if (!RunScript(context, try_catch, config->m_strAllFonts)) + return false; + + std::string sFooter = "window.InitNativeEditors();"; + + if (context->isSnapshotUsed()) + { + sFooter += "\ +if (undefined === String.prototype.replaceAll)\ +{\ +String.prototype.replaceAll = function(str, newStr)\ +{\ + if (Object.prototype.toString.call(str).toLowerCase() === '[object regexp]')\ + return this.replace(str, newStr);\ + return this.split(str).join(newStr);\ +};\ +}\n"; + } + + context->runScript(sFooter, try_catch); + return !try_catch->Check(); + } + } // namespace + + bool RunEditor(const DoctRendererEditorType& type, JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config) + { + if (context->isSnapshotUsed()) + return RunEditorFooter(context, try_catch, config); + + NSStringUtils::CStringBuilderA builder; + builder.AddSize(10 * 1024 * 1024); + std::wstring sCachePath = GetAllScript(&builder, type, config); + + if (!sCachePath.empty()) + { + context->runScript(builder.GetData(), try_catch, config->m_bIsUseCache ? sCachePath : L""); + RunEditorFooter(context, try_catch, config); + } + + return !try_catch->Check(); + } + + bool GenerateEditorSnapshot(const DoctRendererEditorType& type, CDoctRendererConfig* config) + { + NSStringUtils::CStringBuilderA builder; + builder.AddSize(10 * 1024 * 1024); + std::wstring sCachePath = GetAllScript(&builder, type, config, true); + + builder.WriteString("delete String.prototype.replaceAll;"); + + if (sCachePath.empty()) + return false; + + return NSJSBase::CJSContext::generateSnapshot(builder.GetData(), sCachePath); + } + + namespace + { + JSSmart RunEditorWithSnapshot(const DoctRendererEditorType& type, CDoctRendererConfig* config) + { + #ifndef V8_SUPPORT_SNAPSHOTS + return NULL; + #endif + + std::wstring sCachePath = GetSnapshotPath(type, config); + if (!NSFile::CFileBinary::Exists(sCachePath)) + return NULL; + + if (sCachePath.empty()) + return NULL; + + JSSmart context = new NSJSBase::CJSContext(false); + context->Initialize(sCachePath); + + return context; + } + } // namespace + + JSSmart CreateEditorContext(const DoctRendererEditorType& type, CDoctRendererConfig* config) + { + JSSmart context = RunEditorWithSnapshot(type, config); + if (context.is_init()) + return context; + return new NSJSBase::CJSContext(); + } +} // namespace NSDoctRenderer diff --git a/DesktopEditor/doctrenderer/editors.h b/DesktopEditor/doctrenderer/editors.h index e570b8f25d..13f008f05b 100644 --- a/DesktopEditor/doctrenderer/editors.h +++ b/DesktopEditor/doctrenderer/editors.h @@ -34,7 +34,6 @@ #include "./config.h" #include "../js_internal/js_base.h" -#include "../common/StringBuilder.h" #ifdef CreateFile #undef CreateFile @@ -53,242 +52,11 @@ namespace NSDoctRenderer INVALID = 255 }; - static void AppendScript(NSStringUtils::CStringBuilderA* builder, const std::wstring& path) - { - NSFile::CFileBinary oFile; + bool RunEditor(const DoctRendererEditorType& type, JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config); - if (!oFile.OpenFile(path)) - return; + bool GenerateEditorSnapshot(const DoctRendererEditorType& type, CDoctRendererConfig* config); - int size = (int)oFile.GetFileSize(); - if (size < 3) - return; - - BYTE* pData = new BYTE[size]; - DWORD dwReadSize = 0; - oFile.ReadFile(pData, (DWORD)size, dwReadSize); - oFile.CloseFile(); - - int nOffset = 0; - if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) - nOffset = 3; - - builder->WriteString((char*)(pData + nOffset), size - nOffset); - builder->WriteString("\n\n"); - RELEASEARRAYOBJECTS(pData); - } - - static bool RunScript(JSSmart& context, JSSmart& try_catch, const std::wstring& path) - { - NSFile::CFileBinary oFile; - - if (!oFile.OpenFile(path)) - return false; - - int size = (int)oFile.GetFileSize(); - if (size < 3) - return false; - - BYTE* pData = new BYTE[size]; - DWORD dwReadSize = 0; - oFile.ReadFile(pData, (DWORD)size, dwReadSize); - oFile.CloseFile(); - - int nOffset = 0; - if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) - nOffset = 3; - - context->runScript(std::string((char*)(pData + nOffset), size - nOffset), try_catch); - RELEASEARRAYOBJECTS(pData); - - return !try_catch->Check(); - } - - static std::wstring GetAllScript(NSStringUtils::CStringBuilderA* builder, const DoctRendererEditorType& type, CDoctRendererConfig* config, const bool& isSnapshot = false) - { - for (std::vector::const_iterator i = config->m_arrFiles.cbegin(); i != config->m_arrFiles.cend(); i++) - AppendScript(builder, *i); - - std::wstring sFontsPath = config->m_strSdkPath + L"/common/libfont/engine"; -#ifdef SUPPORT_HARFBUZZ_SHAPER - sFontsPath += L"/fonts_native.js"; -#else - sFontsPath += L"/fonts_ie.js"; -#endif - - std::wstring sCachePath = L""; - - switch (type) - { - case DoctRendererEditorType::WORD: - { - AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all-min.js"); - AppendScript(builder, sFontsPath); - AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all.js"); - sCachePath = config->m_strSdkPath + L"/word/sdk-all"; - break; - } - case DoctRendererEditorType::SLIDE: - { - AppendScript(builder, config->m_strSdkPath + L"/slide/sdk-all-min.js"); - AppendScript(builder, sFontsPath); - AppendScript(builder, config->m_strSdkPath + L"/slide/sdk-all.js"); - sCachePath = config->m_strSdkPath + L"/slide/sdk-all"; - break; - } - case DoctRendererEditorType::CELL: - { - AppendScript(builder, config->m_strSdkPath + L"/cell/sdk-all-min.js"); - AppendScript(builder, sFontsPath); - AppendScript(builder, config->m_strSdkPath + L"/cell/sdk-all.js"); - builder->WriteString("\n$.ready();", 11); - sCachePath = config->m_strSdkPath + L"/cell/sdk-all"; - break; - } - case DoctRendererEditorType::VISIO: - { - if (!NSFile::CFileBinary::Exists(config->m_strSdkPath + L"/draw/sdk-all-min.js")) - return L""; - AppendScript(builder, config->m_strSdkPath + L"/draw/sdk-all-min.js"); - AppendScript(builder, sFontsPath); - AppendScript(builder, config->m_strSdkPath + L"/draw/sdk-all.js"); - sCachePath = config->m_strSdkPath + L"/draw/sdk-all"; - break; - } - case DoctRendererEditorType::PDF: - { - AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all-min.js"); - AppendScript(builder, sFontsPath); - AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all.js"); - AppendScript(builder, config->m_strSdkPath + L"/pdf/src/engine/drawingfile_native.js"); - sCachePath = config->m_strSdkPath + L"/pdf/sdk-all"; - break; - } - default: - break; - } - - if (!sCachePath.empty()) - sCachePath += (isSnapshot ? L".bin" : L".cache"); - - return sCachePath; - } - - static std::wstring GetSnapshotPath(const DoctRendererEditorType& type, CDoctRendererConfig* config) - { - std::wstring sCachePath = L""; - - switch (type) - { - case DoctRendererEditorType::WORD: - { - return config->m_strSdkPath + L"/word/sdk-all.bin"; - } - case DoctRendererEditorType::SLIDE: - { - return config->m_strSdkPath + L"/slide/sdk-all.bin"; - } - case DoctRendererEditorType::CELL: - { - return config->m_strSdkPath + L"/cell/sdk-all.bin"; - } - case DoctRendererEditorType::VISIO: - { - return config->m_strSdkPath + L"/draw/sdk-all.bin"; - } - case DoctRendererEditorType::PDF: - { - return config->m_strSdkPath + L"/pdf/sdk-all.bin"; - } - default: - break; - } - return L""; - } - - static bool RunEditorFooter(JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config) - { - if (!RunScript(context, try_catch, config->m_strAllFonts)) - return false; - - std::string sFooter = "window.InitNativeEditors();"; - - if (context->isSnapshotUsed()) - { - sFooter += "\ -if (undefined === String.prototype.replaceAll)\ -{\ -String.prototype.replaceAll = function(str, newStr)\ -{\ - if (Object.prototype.toString.call(str).toLowerCase() === '[object regexp]')\ - return this.replace(str, newStr);\ - return this.split(str).join(newStr);\ -};\ -}\n"; - } - - context->runScript(sFooter, try_catch); - return !try_catch->Check(); - } - - static bool RunEditor(const DoctRendererEditorType& type, JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config) - { - if (context->isSnapshotUsed()) - return RunEditorFooter(context, try_catch, config); - - NSStringUtils::CStringBuilderA builder; - builder.AddSize(10 * 1024 * 1024); - std::wstring sCachePath = GetAllScript(&builder, type, config); - - if (!sCachePath.empty()) - { - context->runScript(builder.GetData(), try_catch, config->m_bIsUseCache ? sCachePath : L""); - RunEditorFooter(context, try_catch, config); - } - - return !try_catch->Check(); - } - - static bool GenerateEditorSnapshot(const DoctRendererEditorType& type, CDoctRendererConfig* config) - { - NSStringUtils::CStringBuilderA builder; - builder.AddSize(10 * 1024 * 1024); - std::wstring sCachePath = GetAllScript(&builder, type, config, true); - - builder.WriteString("delete String.prototype.replaceAll;"); - - if (sCachePath.empty()) - return false; - - return NSJSBase::CJSContext::generateSnapshot(builder.GetData(), sCachePath); - } - - static JSSmart RunEditorWithSnapshot(const DoctRendererEditorType& type, CDoctRendererConfig* config) - { -#ifndef V8_SUPPORT_SNAPSHOTS - return NULL; -#endif - - std::wstring sCachePath = GetSnapshotPath(type, config); - if (!NSFile::CFileBinary::Exists(sCachePath)) - return NULL; - - if (sCachePath.empty()) - return NULL; - - JSSmart context = new NSJSBase::CJSContext(false); - context->Initialize(sCachePath); - - return context; - } - - static JSSmart CreateEditorContext(const DoctRendererEditorType& type, CDoctRendererConfig* config) - { - JSSmart context = RunEditorWithSnapshot(type, config); - if (context.is_init()) - return context; - return new NSJSBase::CJSContext(); - } + JSSmart CreateEditorContext(const DoctRendererEditorType& type, CDoctRendererConfig* config); } #endif // DOC_BUILDER_EDITORS_CONFIG From ddf33fb4413b8b5a5bd10fe5558524ddb28a4eb6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 29 Aug 2024 18:07:35 +0600 Subject: [PATCH 09/82] Fix bug #69889 --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 3 +- .../Biff12_structures/LPByteBuf.cpp | 8 +++ .../XlsbFormat/Biff12_structures/LPByteBuf.h | 1 + OOXML/XlsxFormat/Workbook/Metadata.cpp | 8 ++- .../Worksheets/WorksheetChildOther.cpp | 52 +++++++++++-------- 5 files changed, 48 insertions(+), 24 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 66193a030e..736d66036d 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -926,7 +926,8 @@ namespace OOX ptr->m_DYNAMICARRAYMETADATA = XLS::BaseObjectPtr{ptr1}; ptr1->m_EndDynamicArrayPr = i->m_oDynamicArrayProperties->toBin(); } - else if(i->m_sUri == L"{3E2802C4-A4D2-4D8B-9148-E3BE6C30E623}") + else if(i->m_sUri == L"{3E2802C4-A4D2-4D8B-9148-E3BE6C30E623}" + || i->m_sUri == L"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}") { auto ptr(new XLSB::FMD); objectPtr = XLS::BaseObjectPtr(ptr); diff --git a/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.cpp b/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.cpp index 95a5b92917..5488d090da 100644 --- a/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.cpp +++ b/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.cpp @@ -82,5 +82,13 @@ namespace XLSB rgbData.push_back(val); } } + void LPByteBuf::save(XLS::CFRecord& record) + { + record << cbLength; + for(auto i:rgbData) + { + record << i; + } + } } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.h b/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.h index 63f8fbe408..2619c7eb72 100644 --- a/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.h +++ b/OOXML/XlsbFormat/Biff12_structures/LPByteBuf.h @@ -49,6 +49,7 @@ namespace XLSB static const XLS::ElementType type = XLS::typeBiffStructure; virtual void load(XLS::CFRecord& record); + virtual void save(XLS::CFRecord& record); std::wstring GetBase64(); diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp index 0488a968a3..af68d8fb6c 100644 --- a/OOXML/XlsxFormat/Workbook/Metadata.cpp +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -1331,9 +1331,13 @@ namespace OOX ptr1->stName = m_oName.get(); else ptr1->stName = L""; - ptr1->cFmd = m_arrItems.size(); for(auto i:m_arrItems) - ptr->FMDs.push_back(i->toBin()); + { + auto fmd = i->toBin(); + if(fmd) + ptr->FMDs.push_back(fmd); + } + ptr1->cFmd = ptr->FMDs.size(); return objectPtr; } void CFutureMetadata::fromBin(XLS::BaseObjectPtr& obj) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index c2b25cece8..da9d39d6fc 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -153,17 +153,19 @@ namespace OOX if (m_oName.IsInit()) ptr->rangeProtectionTitleSDRel.rgchTitle = m_oName.get(); - BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + BYTE * temp; auto tempSize = 0; NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + ptr->ipdPasswordData.rgbHash.rgbData = std::vector(temp, temp + tempSize); + delete[] temp; - BYTE* temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); - auto tempSize2 = 0; NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), - m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); - ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize; + ptr->ipdPasswordData.rgbSalt.rgbData = std::vector(temp, temp + tempSize); + delete[] temp; } else { @@ -2827,25 +2829,29 @@ namespace OOX auto ptr(new XLSB::SheetProtectionIso); XLS::BaseObjectPtr castedPtr(ptr); if(m_oAlgorithmName.IsInit()) - ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->ToString(); if(m_oSpinCount.IsInit()) ptr->dwSpinCount = m_oSpinCount->GetValue(); if(m_oHashValue.IsInit()) { - BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); - auto tempSize = 0; - NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), - m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); - ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + BYTE * temp; + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + ptr->ipdPasswordData.rgbHash.rgbData = std::vector(temp, temp + tempSize); + delete[] temp; } if(m_oSaltValue.IsInit()) { - BYTE * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); - auto tempSize2 = 0; + BYTE * temp; + auto tempSize = 0; NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), - m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); - ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize; + ptr->ipdPasswordData.rgbSalt.rgbData = std::vector(temp, temp + tempSize); + delete[] temp; } if (m_oAutoFilter.IsInit()) @@ -2954,7 +2960,7 @@ namespace OOX objectPtr = XLS::BaseObjectPtr{ptr}; if(m_oAlgorithmName.IsInit()) - ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->ToString(); else ptr->ipdPasswordData.szAlgName = false; if(m_oSpinCount.IsInit()) @@ -2964,20 +2970,24 @@ namespace OOX if(m_oHashValue.IsInit()) { - BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + BYTE * temp; auto tempSize = 0; NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + ptr->ipdPasswordData.rgbHash.rgbData = std::vector(temp, temp + tempSize); + delete[] temp; } if(m_oSaltValue.IsInit()) { - BYTE * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); - auto tempSize2 = 0; + BYTE * temp; + auto tempSize = 0; NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), - m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); - ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize; + ptr->ipdPasswordData.rgbSalt.rgbData = std::vector(temp, temp + tempSize); + delete[] temp; } if(m_oObjects.IsInit()) From 7d804f1c705d645fb7fb69640b77daa4ade4f4ba Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 6 Aug 2024 01:19:19 +0300 Subject: [PATCH 10/82] Fix bug #44363 --- OdfFile/Reader/Format/text_elements.cpp | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/OdfFile/Reader/Format/text_elements.cpp b/OdfFile/Reader/Format/text_elements.cpp index 35683ff86b..1d552e51f1 100644 --- a/OdfFile/Reader/Format/text_elements.cpp +++ b/OdfFile/Reader/Format/text_elements.cpp @@ -252,6 +252,41 @@ size_t paragraph::drop_cap_docx_convert(oox::docx_conversion_context & Context) } return index; } + +void static process_list_bullet_style(oox::docx_conversion_context& Context, office_element_ptr_array& content) +{ + if (content.size() <= 0) + return; + + span* first_span = dynamic_cast(content[0].get()); + if (!first_span) + return; + + style_instance* span_style = Context.root()->odf_context().styleContainer().style_by_name(first_span->text_style_name_, style_family::Text, false); + if (!span_style) + return; + + style_content* span_style_content = span_style->content(); + if (!span_style_content) + return; + + std::wstringstream ss; + style_text_properties* text_props = span_style_content->get_style_text_properties(); + + if (text_props) + { + const _CP_OPT(odf_types::font_weight)& font_weight = text_props->content_.fo_font_weight_; + const _CP_OPT(odf_types::font_style)& font_style = text_props->content_.fo_font_style_; + + if (font_weight && font_weight->get_type() == odf_types::font_weight::WBold) + ss << ""; + if (font_style && font_style->get_type() == odf_types::font_style::Italic) + ss << ""; + } + + Context.get_text_tracked_context().dumpRPrInsDel_ = ss.str(); +} + void paragraph::docx_convert(oox::docx_conversion_context & Context, _CP_OPT(std::wstring) next_element_style_name) { std::wstring styleName = attrs_.text_style_name_; @@ -347,6 +382,8 @@ void paragraph::docx_convert(oox::docx_conversion_context & Context, _CP_OPT(std } Context.start_paragraph_style(styleName); + + process_list_bullet_style(Context, content_); int textStyle = Context.process_paragraph_attr(&attrs_); From a14e684528cc0d2834b78a39b6cf6780f343532d Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 29 Aug 2024 18:00:26 +0300 Subject: [PATCH 11/82] Fix Bug 69900 --- OfficeUtils/src/ZipUtilsCP.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/OfficeUtils/src/ZipUtilsCP.cpp b/OfficeUtils/src/ZipUtilsCP.cpp index 306304fa7d..184dbb95d2 100644 --- a/OfficeUtils/src/ZipUtilsCP.cpp +++ b/OfficeUtils/src/ZipUtilsCP.cpp @@ -206,7 +206,7 @@ namespace ZLibZipUtils #endif } static void change_file_date( const wchar_t *filename, uLong dosdate, tm_unz tmu_date ); - static int do_extract_currentfile( unzFile uf, const wchar_t* unzip_dir, const int* popt_extract_without_path, int* popt_overwrite, const char* password ); + static int do_extract_currentfile( unzFile uf, const wchar_t* unzip_dir, const int* popt_extract_without_path, int* popt_overwrite, const char* password, bool is_replace_slash = false ); static int do_extract( unzFile uf, const wchar_t* unzip_dir, int opt_extract_without_path, int opt_overwrite, const char* password, const OnProgressCallback* progress ); static bool is_file_in_archive(unzFile uf, const wchar_t *filename); @@ -237,7 +237,7 @@ namespace ZLibZipUtils } } - static int do_extract_currentfile( unzFile uf, const wchar_t* unzip_dir, const int* popt_extract_without_path, int* popt_overwrite, const char* password ) + static int do_extract_currentfile( unzFile uf, const wchar_t* unzip_dir, const int* popt_extract_without_path, int* popt_overwrite, const char* password, bool is_replcace_slash ) { char filename_inzipA[4096]; int err = UNZ_OK; @@ -257,6 +257,12 @@ namespace ZLibZipUtils for(std::wstring::size_type i = 0, len = filenameW.length(); i < len; ++i) if(filenameW[i] == L'/') filenameW[i] = L'\\'; +#else + if (is_replcace_slash) + for (std::wstring::size_type i = 0, len = filenameW.length(); i < len; ++i) + if(filenameW[i] == L'\\') + filenameW[i] = L'/'; + #endif std::wstring filenameW_withoutpath = L""; @@ -399,13 +405,20 @@ namespace ZLibZipUtils int err; FILE* fout=NULL; + // [Content-Types.xml] check + // if found - it is a office file, so we can replace '\' to '/' for non-windows + // fixes bad zips + const char* content_types = "[Content_Types].xml"; + bool is_office = UNZ_OK == unzLocateFile(uf, content_types, true); + unzGoToFirstFile(uf); + err = unzGetGlobalInfo (uf,&gi); for (i = 0; i < gi.number_entry; i++) { if (do_extract_currentfile(uf, unzip_dir, &opt_extract_without_path, &opt_overwrite, - password) == UNZ_OK) + password, is_office) == UNZ_OK) { number_extract++; } From a748b0814348a5e3ec22eb1c4efff9af682d71e7 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Thu, 29 Aug 2024 18:08:37 +0300 Subject: [PATCH 12/82] for bug #69781 --- OOXML/Binary/Document/BinReader/Readers.cpp | 11 ++++++++-- .../BinWriter/BinReaderWriterDefines.h | 3 ++- .../Binary/Document/BinWriter/BinWriters.cpp | 20 +++++++++++++++---- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/OOXML/Binary/Document/BinReader/Readers.cpp b/OOXML/Binary/Document/BinReader/Readers.cpp index 79a97075cf..4c88fba09f 100644 --- a/OOXML/Binary/Document/BinReader/Readers.cpp +++ b/OOXML/Binary/Document/BinReader/Readers.cpp @@ -1365,8 +1365,15 @@ int Binary_pPrReader::ReadBorder(BYTE type, long length, void* poResult) { pBorder->m_oVal.Init(); - BYTE border_type = m_oBufferedStream.GetUChar(); // todooo change to int - pBorder->m_oVal->SetValueFromByte(border_type); + if (0 != m_oBufferedStream.GetUChar()) + pBorder->m_oVal->SetValue(SimpleTypes::bordervalueSingle); + else + pBorder->m_oVal->SetValue(SimpleTypes::bordervalueNone); + } + else if (c_oSerBorderType::ValueType == type) + { + pBorder->m_oVal.Init(); + pBorder->m_oVal->SetValue((SimpleTypes::EBorder)m_oBufferedStream.GetLong()); } else if ( c_oSerBorderType::ColorTheme == type ) { diff --git a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h index b1fd86542b..51ef40ee6a 100644 --- a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h +++ b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h @@ -760,7 +760,8 @@ extern int g_nCurFormatVersion; Value = 3, ColorTheme = 4, SpacePoint = 5, - Size8Point = 6 + Size8Point = 6, + ValueType = 7 };} namespace c_oSerShdType{enum c_oSerShdType { diff --git a/OOXML/Binary/Document/BinWriter/BinWriters.cpp b/OOXML/Binary/Document/BinWriter/BinWriters.cpp index 03e1de696b..cdf9c6c3c3 100644 --- a/OOXML/Binary/Document/BinWriter/BinWriters.cpp +++ b/OOXML/Binary/Document/BinWriter/BinWriters.cpp @@ -157,7 +157,9 @@ void BinaryCommonWriter::WriteBorder(const ComplexTypes::Word::CBorder& border) { if (border.m_oColor.IsInit()) WriteColor(c_oSerBorderType::Color, border.m_oColor.get()); + WriteThemeColor(c_oSerBorderType::ColorTheme, border.m_oColor, border.m_oThemeColor, border.m_oThemeTint, border.m_oThemeShade); + if (border.m_oSpace.IsInit()) { m_oStream.WriteBYTE(c_oSerBorderType::SpacePoint); @@ -174,9 +176,16 @@ void BinaryCommonWriter::WriteBorder(const ComplexTypes::Word::CBorder& border) m_oStream.WriteBYTE(c_oSerBorderType::Value); m_oStream.WriteBYTE(c_oSerPropLenType::Byte); - int border_type = border.m_oVal.get().GetValue(); - if (border_type > 0x0ff) border_type = 1; - m_oStream.WriteBYTE((BYTE)border_type); // todooo change to long type + switch (border.m_oVal.get().GetValue()) + { + case SimpleTypes::bordervalueNone: + case SimpleTypes::bordervalueNil: m_oStream.WriteBYTE(0); break; + default: m_oStream.WriteBYTE(1); break; + } + + m_oStream.WriteBYTE(c_oSerBorderType::ValueType); + m_oStream.WriteBYTE(c_oSerPropLenType::Long); + m_oStream.WriteLONG(border.m_oVal.get().GetValue()); } } void BinaryCommonWriter::WriteTblBorders(const OOX::Logic::CTblBorders& Borders) @@ -9546,7 +9555,10 @@ void BinaryFileWriter::WriteMainTableStart(bool bSigTable) if (bSigTable) { //BinarySigTableWriter - int nCurPos = WriteTableStart(c_oSerTableTypes::Signature); + memset(m_oBcw.m_oStream.GetBuffer() + m_oBcw.m_oStream.GetPosition(), 0, 5 + nTableCount * nmtItemSize); + + int nCurPos = WriteTableStart(c_oSerTableTypes::Signature); + BinarySigTableWriter oBinarySigTableWriter(m_oParamsWriter); oBinarySigTableWriter.Write(); WriteTableEnd(nCurPos); From 2685f2807ca92f132bb845526a7a22085e4349e3 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Thu, 29 Aug 2024 18:11:58 +0300 Subject: [PATCH 13/82] fix bug #69947 --- .../PptFile/PPTXWriter/TableWriter.cpp | 3 +- .../ASCOfficeDrawingConverter.cpp | 7 +- OOXML/PPTXFormat/Logic/LineJoin.h | 3 +- OOXML/PPTXFormat/Logic/Ln.cpp | 84 ++++++++++--------- OOXML/PPTXFormat/Logic/Ln.h | 2 +- 5 files changed, 51 insertions(+), 48 deletions(-) diff --git a/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp index 47245d0fe1..47a9ce4e2a 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp @@ -744,7 +744,8 @@ void TCell::FillLn(PPTX::Logic::Ln &Ln, TCell::eBorderPossition eBP, CElementPtr pLineEnd->len = new PPTX::Limit::LineEndSize; Ln.tailEnd = pLineEnd; - Ln.Join.type = PPTX::Logic::eJoin::JoinRound; + Ln.Join.Init(); + Ln.Join->type = PPTX::Logic::eJoin::JoinRound; } void TCell::SetLnName(PPTX::Logic::Ln &Ln, eBorderPossition eBP) const diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 5eeac71200..4b97f14b09 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -5667,9 +5667,10 @@ void CDrawingConverter::CheckPenShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils:: if (!pSpPr->ln.is_init()) pSpPr->ln = new PPTX::Logic::Ln(); - if (*sLineJoin == L"bevel") pSpPr->ln->Join.type = PPTX::Logic::JoinBevel; - else if (*sLineJoin == L"miter") pSpPr->ln->Join.type = PPTX::Logic::JoinMiter; - else if (*sLineJoin == L"round") pSpPr->ln->Join.type = PPTX::Logic::JoinRound; + pSpPr->ln->Join.Init(); + if (*sLineJoin == L"bevel") pSpPr->ln->Join->type = PPTX::Logic::JoinBevel; + else if (*sLineJoin == L"miter") pSpPr->ln->Join->type = PPTX::Logic::JoinMiter; + else if (*sLineJoin == L"round") pSpPr->ln->Join->type = PPTX::Logic::JoinRound; } } nullable_string sStroked; diff --git a/OOXML/PPTXFormat/Logic/LineJoin.h b/OOXML/PPTXFormat/Logic/LineJoin.h index 465376be40..695cfd6788 100644 --- a/OOXML/PPTXFormat/Logic/LineJoin.h +++ b/OOXML/PPTXFormat/Logic/LineJoin.h @@ -62,8 +62,7 @@ namespace PPTX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - eJoin type; + eJoin type = Logic::JoinEmpty; nullable_int lim; protected: diff --git a/OOXML/PPTXFormat/Logic/Ln.cpp b/OOXML/PPTXFormat/Logic/Ln.cpp index 24b3477b5a..c4c7ab867a 100644 --- a/OOXML/PPTXFormat/Logic/Ln.cpp +++ b/OOXML/PPTXFormat/Logic/Ln.cpp @@ -54,30 +54,30 @@ namespace PPTX while ( oReader.ReadNextSiblingNode( nCurDepth ) ) { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if (_T("bevel") == sName || - _T("miter") == sName || - _T("round") == sName ) + if (L"bevel" == sName || + L"miter" == sName || + L"round" == sName ) { - Join.fromXML(oReader); + Join = oReader; } - else if ( _T("tailEnd") == sName ) + else if ( L"tailEnd" == sName ) tailEnd = oReader; - else if ( _T("headEnd") == sName ) + else if ( L"headEnd" == sName ) headEnd = oReader; - else if ( _T("gradFill") == sName || - _T("noFill") == sName || - _T("pattFill") == sName || - _T("solidFill") == sName ) + else if ( L"gradFill" == sName || + L"noFill" == sName || + L"pattFill" == sName || + L"solidFill" == sName ) { Fill.fromXML(oReader); } - else if ( _T("custDash") == sName ) + else if ( L"custDash" == sName ) { //custDash = oReader; //m_eDashType = OOX::Drawing::linedashtypeCustom; } - else if ( _T("prstDash") == sName ) + else if ( L"prstDash" == sName ) { prstDash = oReader; //m_eDashType = OOX::Drawing::linedashtypePreset; @@ -113,20 +113,20 @@ namespace PPTX XmlMacroReadAttributeBase(node, L"w", w); Fill.GetFillFrom(node); - prstDash = node.ReadNodeNoNS(_T("prstDash")); - Join.GetJoinFrom(node); - headEnd = node.ReadNodeNoNS(_T("headEnd")); - tailEnd = node.ReadNodeNoNS(_T("tailEnd")); + prstDash = node.ReadNodeNoNS(L"prstDash"); + Join.Init(); Join->GetJoinFrom(node); + headEnd = node.ReadNodeNoNS(L"headEnd"); + tailEnd = node.ReadNodeNoNS(L"tailEnd"); FillParentPointersForChilds(); } void Ln::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start_No_NS( oReader ) - WritingElement_ReadAttributes_Read_if ( oReader, _T("algn"), algn ) - WritingElement_ReadAttributes_Read_else_if( oReader, _T("cap"), cap ) - WritingElement_ReadAttributes_Read_else_if( oReader, _T("cmpd"), cmpd ) - WritingElement_ReadAttributes_Read_else_if( oReader, _T("w"), w ) + WritingElement_ReadAttributes_Read_if ( oReader, L"algn", algn ) + WritingElement_ReadAttributes_Read_else_if( oReader, L"cap", cap ) + WritingElement_ReadAttributes_Read_else_if( oReader, L"cmpd", cmpd ) + WritingElement_ReadAttributes_Read_else_if( oReader, L"w", w ) WritingElement_ReadAttributes_End_No_NS( oReader ) Normalize(); @@ -135,23 +135,23 @@ namespace PPTX { std::wstring _name = m_name; if (_name.empty()) - _name = _T("a:ln"); + _name = L"a:ln"; std::wstring sAttrNamespace; if (_name == L"w14:textOutline") - sAttrNamespace = _T("w14:"); + sAttrNamespace = L"w14:"; XmlUtils::CAttribute oAttr; - oAttr.Write (sAttrNamespace + _T("w"), w); - oAttr.WriteLimitNullable(sAttrNamespace + _T("cap"), cap); - oAttr.WriteLimitNullable(sAttrNamespace + _T("cmpd"), cmpd); - oAttr.WriteLimitNullable(sAttrNamespace + _T("algn"), algn); + oAttr.Write (sAttrNamespace + L"w", w); + oAttr.WriteLimitNullable(sAttrNamespace + L"cap", cap); + oAttr.WriteLimitNullable(sAttrNamespace + L"cmpd", cmpd); + oAttr.WriteLimitNullable(sAttrNamespace + L"algn", algn); XmlUtils::CNodeValue oValue; oValue.Write(Fill); oValue.WriteNullable(prstDash); - oValue.Write(Join); + oValue.WriteNullable(Join); oValue.WriteNullable(headEnd); oValue.WriteNullable(tailEnd); @@ -161,27 +161,27 @@ namespace PPTX { std::wstring _name = m_name; if (_name.empty()) - _name = _T("a:ln"); + _name = L"a:ln"; std::wstring sAttrNamespace; if (XMLWRITER_DOC_TYPE_WORDART == pWriter->m_lDocType) { - _name = _T("w14:textOutline"); - sAttrNamespace = _T("w14:"); + _name = L"w14:textOutline"; + sAttrNamespace = L"w14:"; } pWriter->StartNode(_name); pWriter->StartAttributes(); - pWriter->WriteAttribute(sAttrNamespace + _T("w"), w); - pWriter->WriteAttribute(sAttrNamespace + _T("cap"), cap); - pWriter->WriteAttribute(sAttrNamespace + _T("cmpd"), cmpd); - pWriter->WriteAttribute(sAttrNamespace + _T("algn"), algn); + pWriter->WriteAttribute(sAttrNamespace + L"w", w); + pWriter->WriteAttribute(sAttrNamespace + L"cap", cap); + pWriter->WriteAttribute(sAttrNamespace + L"cmpd", cmpd); + pWriter->WriteAttribute(sAttrNamespace + L"algn", algn); pWriter->EndAttributes(); Fill.toXmlWriter(pWriter); pWriter->Write(prstDash); - Join.toXmlWriter(pWriter); + pWriter->Write(Join); pWriter->Write(headEnd); pWriter->Write(tailEnd); @@ -198,13 +198,13 @@ namespace PPTX pWriter->WriteRecord1(0, Fill); pWriter->WriteRecord2(1, prstDash); - pWriter->WriteRecord1(2, Join); + pWriter->WriteRecord2(2, Join); pWriter->WriteRecord2(3, headEnd); pWriter->WriteRecord2(4, tailEnd); } void Ln::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { - m_name = _T("a:ln"); + m_name = L"a:ln"; LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4; pReader->Skip(1); // start attributes @@ -260,20 +260,21 @@ namespace PPTX } case 2: { - Join.fromPPTY(pReader); + Join.Init(); + Join->fromPPTY(pReader); break; } case 3: { headEnd = new Logic::LineEnd(); - headEnd->m_name = _T("a:headEnd"); + headEnd->m_name = L"a:headEnd"; headEnd->fromPPTY(pReader); break; } case 4: { tailEnd = new Logic::LineEnd(); - tailEnd->m_name = _T("a:tailEnd"); + tailEnd->m_name = L"a:tailEnd"; tailEnd->fromPPTY(pReader); break; } @@ -334,7 +335,8 @@ namespace PPTX void Ln::FillParentPointersForChilds() { Fill.SetParentPointer(this); - Join.SetParentPointer(this); + if (Join.IsInit()) + Join->SetParentPointer(this); if(prstDash.IsInit()) prstDash->SetParentPointer(this); if(headEnd.IsInit()) diff --git a/OOXML/PPTXFormat/Logic/Ln.h b/OOXML/PPTXFormat/Logic/Ln.h index 56100730ca..26f7f3a682 100644 --- a/OOXML/PPTXFormat/Logic/Ln.h +++ b/OOXML/PPTXFormat/Logic/Ln.h @@ -77,7 +77,7 @@ namespace PPTX nullable prstDash; //custDash (Custom Dash) ยง20.1.8.21 - LineJoin Join; + nullable Join; nullable headEnd; nullable tailEnd; From 7f23f778663c01a3a875c1ac165afd26839404f2 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Mon, 2 Sep 2024 10:31:01 +0300 Subject: [PATCH 14/82] fix bug #69770 --- HtmlFile2/htmlfile2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 302b9cb57a..c53563ecbe 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -4288,7 +4288,7 @@ std::wstring CTableRow::ConvertToOOXML(const CTable& oTable, int nInstruction) oRow.WriteNodeEnd(L"w:trPr"); } - for (UINT unIndex = 0; unIndex < m_arCells.size();) + for (UINT unIndex = 0; unIndex < m_arCells.size(); ++unIndex) { int nNewInstruction{nInstruction}; @@ -4299,7 +4299,7 @@ std::wstring CTableRow::ConvertToOOXML(const CTable& oTable, int nInstruction) else if (0 != unIndex) nNewInstruction |= MID_ELEMENT; - oRow += m_arCells[unIndex]->ConvertToOOXML(oTable, ++unIndex, nNewInstruction); + oRow += m_arCells[unIndex]->ConvertToOOXML(oTable, unIndex, nNewInstruction); } oRow.WriteNodeEnd(L"w:tr"); From 0567de6d9fa8ed6cdc8b800560eab4bb19e305ed Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Mon, 2 Sep 2024 11:49:18 +0300 Subject: [PATCH 15/82] . --- OOXML/PPTXFormat/Logic/LineJoin.cpp | 4 ---- OOXML/PPTXFormat/Logic/LineJoin.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/OOXML/PPTXFormat/Logic/LineJoin.cpp b/OOXML/PPTXFormat/Logic/LineJoin.cpp index 8e3c1bc24c..e6ae369521 100644 --- a/OOXML/PPTXFormat/Logic/LineJoin.cpp +++ b/OOXML/PPTXFormat/Logic/LineJoin.cpp @@ -36,10 +36,6 @@ namespace PPTX { namespace Logic { - bool LineJoin::is_init() const - { - return (type==JoinEmpty); - } void LineJoin::fromXML(XmlUtils::CXmlLiteReader& oReader) { std::wstring name = XmlUtils::GetNameNoNS(oReader.GetName()); diff --git a/OOXML/PPTXFormat/Logic/LineJoin.h b/OOXML/PPTXFormat/Logic/LineJoin.h index 695cfd6788..ad2573177c 100644 --- a/OOXML/PPTXFormat/Logic/LineJoin.h +++ b/OOXML/PPTXFormat/Logic/LineJoin.h @@ -47,8 +47,6 @@ namespace PPTX WritingElement_AdditionMethods(LineJoin) PPTX_LOGIC_BASE2(LineJoin) - virtual bool is_init() const; - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); virtual OOX::EElementType getType () const; From 4c9c79628fece8193b509cead133de9aaa085c48 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 3 Sep 2024 13:20:36 +0500 Subject: [PATCH 16/82] Fix bug #69957 --- OdfFile/Reader/Converter/pptx_drawing.cpp | 23 +++++++++++-------- .../Reader/Converter/pptx_slide_context.cpp | 13 +++++++++++ OdfFile/Reader/Converter/pptx_slide_context.h | 2 ++ OdfFile/Reader/Format/draw_frame_pptx.cpp | 16 +++++++++---- OdfFile/Reader/Format/draw_page.cpp | 4 ++++ 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_drawing.cpp b/OdfFile/Reader/Converter/pptx_drawing.cpp index 155ccb3482..3a8563756d 100644 --- a/OdfFile/Reader/Converter/pptx_drawing.cpp +++ b/OdfFile/Reader/Converter/pptx_drawing.cpp @@ -226,19 +226,24 @@ void pptx_serialize_shape(std::wostream & strm, _pptx_drawing & val) } CP_XML_NODE(L"p:nvPr") { - if (val.place_holder_) + if (val.place_holder_type_.length() > 0) { CP_XML_NODE(L"p:ph") { - if (val.place_holder_type_.length() > 0) - { - CP_XML_ATTR(L"type", val.place_holder_type_); - CP_XML_ATTR(L"idx", (uint32_t)val.place_holder_idx_); + CP_XML_ATTR(L"type", val.place_holder_type_); - if (val.place_holder_type_ == L"dt") { CP_XML_ATTR(L"sz", L"half"); } - if (val.place_holder_type_ == L"ftr") { CP_XML_ATTR(L"sz", L"quarter"); } - if (val.place_holder_type_ == L"sldNum") { CP_XML_ATTR(L"sz", L"quarter"); } - } + if (val.place_holder_type_ == L"dt") { CP_XML_ATTR(L"sz", L"half"); } + if (val.place_holder_type_ == L"ftr") { CP_XML_ATTR(L"sz", L"quarter"); } + if (val.place_holder_type_ == L"sldNum") { CP_XML_ATTR(L"sz", L"quarter"); } + + CP_XML_ATTR(L"idx", (uint32_t)val.place_holder_idx_); + } + } + else if (val.place_holder_) + { + CP_XML_NODE(L"p:ph") + { + CP_XML_ATTR(L"idx", (uint32_t)val.place_holder_idx_); } } } diff --git a/OdfFile/Reader/Converter/pptx_slide_context.cpp b/OdfFile/Reader/Converter/pptx_slide_context.cpp index 71fc5f9521..8ba4b3f0fc 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.cpp +++ b/OdfFile/Reader/Converter/pptx_slide_context.cpp @@ -81,6 +81,7 @@ public: _transition transition_; bool use_image_replacement_; + bool processing_notes; bool header, footer, date_time, slideNum; @@ -127,6 +128,8 @@ public: transition_.Enabled = false; transition_.Speed = boost::none; transition_.onClick = true; + + processing_notes = false; } size_t next_rId() @@ -437,6 +440,16 @@ void pptx_slide_context::set_connector_draw_type(const std::wstring& drawType) impl_->object_description_.draw_type_ = drawType; } +void pptx_slide_context::processing_notes(bool processing_notes) +{ + impl_->processing_notes = processing_notes; +} + +bool pptx_slide_context::processing_notes() +{ + return impl_->processing_notes; +} + std::wstring pptx_slide_context::add_hyperlink(std::wstring const & href) { ++hlinks_size_; diff --git a/OdfFile/Reader/Converter/pptx_slide_context.h b/OdfFile/Reader/Converter/pptx_slide_context.h index 58f14104e7..75a6535bce 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.h +++ b/OdfFile/Reader/Converter/pptx_slide_context.h @@ -87,6 +87,8 @@ public: void set_is_placeHolder(bool is_placeholder); void set_placeHolder_type (std::wstring typeHolder); void set_placeHolder_idx (int idx); + void processing_notes (bool processing_notes); + bool processing_notes(); std::wstring add_hyperlink(std::wstring const & ref); diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 1e713a4c40..0312ec1dfc 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -186,17 +186,25 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) Context.get_slide_context().set_fill(fill); - const bool is_placeholder = common_presentation_attlist_.presentation_placeholder_.get_value_or(Bool(false)).get(); - Context.get_slide_context().set_is_placeHolder(is_placeholder); - if (common_presentation_attlist_.presentation_class_) { - const std::wstring type = common_presentation_attlist_.presentation_class_->get_type_ms(); + std::wstring type = common_presentation_attlist_.presentation_class_->get_type_ms(); + if (Context.process_masters_ && type.empty()) + { + type = L"body"; + } + Context.get_slide_context().set_placeHolder_type(type); if (idx_in_owner >= 0) Context.get_slide_context().set_placeHolder_idx(idx_in_owner); + + if (!Context.get_slide_context().processing_notes()) + { + bool is_placeholder = common_presentation_attlist_.presentation_placeholder_.get_value_or(Bool(false)).get(); + Context.get_slide_context().set_is_placeHolder(is_placeholder); + } } if (common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_) diff --git a/OdfFile/Reader/Format/draw_page.cpp b/OdfFile/Reader/Format/draw_page.cpp index 04e7f8297c..072f262248 100644 --- a/OdfFile/Reader/Format/draw_page.cpp +++ b/OdfFile/Reader/Format/draw_page.cpp @@ -320,6 +320,8 @@ void presentation_notes::pptx_convert_placeHolder(oox::pptx_conversion_context & void presentation_notes::pptx_convert(oox::pptx_conversion_context & Context) { + Context.get_slide_context().processing_notes(true); + const std::wstring pageStyleName = attlist_.draw_style_name_.get_value_or(L""); const std::wstring layoutName = attlist_.page_layout_name_.get_value_or(L""); const std::wstring masterName = attlist_.master_page_name_.get_value_or(L""); @@ -373,6 +375,8 @@ void presentation_notes::pptx_convert(oox::pptx_conversion_context & Context) pptx_convert_placeHolder(Context, name, presentation_class::date_time); } + Context.get_slide_context().processing_notes(false); + } } From eddfd2abe4fb9d38bd37dce197a8e16c9cdc3d46 Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 4 Sep 2024 12:25:02 +0300 Subject: [PATCH 17/82] Fix non-existing dicts bug --- Common/3dParty/hunspell/test/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Common/3dParty/hunspell/test/main.cpp b/Common/3dParty/hunspell/test/main.cpp index 49e6bae235..34b91a2874 100644 --- a/Common/3dParty/hunspell/test/main.cpp +++ b/Common/3dParty/hunspell/test/main.cpp @@ -135,6 +135,10 @@ int main(int argc, char *argv[]) std::wstring sAff = sDictionariesDir + L"/" + sName + L"/" + sName + L".aff"; std::wstring sDic = sDictionariesDir + L"/" + sName + L"/" + sName + L".dic"; + // skip check diffs if dictionary is not exists + if (!NSFile::CFileBinary::Exists(sAff) || !NSFile::CFileBinary::Exists(sDic)) + continue; + std::string sAffA = U_TO_UTF8(sAff); std::string sDicA = U_TO_UTF8(sDic); From ae98f0551a923561f06cb9b17b7c95782856a2a2 Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 4 Sep 2024 12:27:52 +0300 Subject: [PATCH 18/82] Delete src/dst dictionariestester --- .../3dParty/hunspell/test/dst/az_Latn_AZ.txt | 213 -------------- Common/3dParty/hunspell/test/dst/bg_BG.txt | 212 -------------- Common/3dParty/hunspell/test/dst/ca_ES.txt | 112 -------- .../hunspell/test/dst/ca_ES_valencia.txt | 212 -------------- Common/3dParty/hunspell/test/dst/cs_CZ.txt | 206 -------------- Common/3dParty/hunspell/test/dst/da_DK.txt | 129 --------- Common/3dParty/hunspell/test/dst/de_AT.txt | 131 --------- Common/3dParty/hunspell/test/dst/de_CH.txt | 116 -------- Common/3dParty/hunspell/test/dst/de_DE.txt | 211 -------------- Common/3dParty/hunspell/test/dst/el_GR.txt | 123 -------- Common/3dParty/hunspell/test/dst/en_AU.txt | 116 -------- Common/3dParty/hunspell/test/dst/en_CA.txt | 125 --------- Common/3dParty/hunspell/test/dst/en_GB.txt | 122 -------- Common/3dParty/hunspell/test/dst/en_US.txt | 218 --------------- Common/3dParty/hunspell/test/dst/en_ZA.txt | 114 -------- Common/3dParty/hunspell/test/dst/es_ES.txt | 208 -------------- Common/3dParty/hunspell/test/dst/eu_ES.txt | 132 --------- Common/3dParty/hunspell/test/dst/fr_FR.txt | 211 -------------- Common/3dParty/hunspell/test/dst/gl_ES.txt | 120 -------- Common/3dParty/hunspell/test/dst/hr_HR.txt | 215 -------------- Common/3dParty/hunspell/test/dst/hu_HU.txt | 114 -------- Common/3dParty/hunspell/test/dst/id_ID.txt | 121 -------- Common/3dParty/hunspell/test/dst/it_IT.txt | 200 ------------- Common/3dParty/hunspell/test/dst/kk_KZ.txt | 209 -------------- Common/3dParty/hunspell/test/dst/ko_KR.txt | 157 ----------- Common/3dParty/hunspell/test/dst/lb_LU.txt | 118 -------- Common/3dParty/hunspell/test/dst/lt_LT.txt | 127 --------- Common/3dParty/hunspell/test/dst/lv_LV.txt | 205 -------------- Common/3dParty/hunspell/test/dst/mn_MN.txt | 103 ------- Common/3dParty/hunspell/test/dst/nb_NO.txt | 113 -------- Common/3dParty/hunspell/test/dst/nl_NL.txt | 115 -------- Common/3dParty/hunspell/test/dst/nn_NO.txt | 116 -------- Common/3dParty/hunspell/test/dst/oc_FR.txt | 108 -------- Common/3dParty/hunspell/test/dst/pl_PL.txt | 225 --------------- Common/3dParty/hunspell/test/dst/pt_BR.txt | 108 -------- Common/3dParty/hunspell/test/dst/pt_PT.txt | 135 --------- Common/3dParty/hunspell/test/dst/ro_RO.txt | 210 -------------- Common/3dParty/hunspell/test/dst/ru_RU.txt | 197 ------------- Common/3dParty/hunspell/test/dst/sk_SK.txt | 205 -------------- Common/3dParty/hunspell/test/dst/sl_SI.txt | 210 -------------- .../3dParty/hunspell/test/dst/sr_Cyrl_RS.txt | 227 --------------- .../3dParty/hunspell/test/dst/sr_Latn_RS.txt | 173 ------------ Common/3dParty/hunspell/test/dst/sv_SE.txt | 210 -------------- Common/3dParty/hunspell/test/dst/tr_TR.txt | 205 -------------- Common/3dParty/hunspell/test/dst/uk_UA.txt | 210 -------------- .../3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt | 262 ------------------ .../3dParty/hunspell/test/dst/uz_Latn_UZ.txt | 200 ------------- Common/3dParty/hunspell/test/dst/vi_VN.txt | 128 --------- .../3dParty/hunspell/test/src/az_Latn_AZ.txt | 213 -------------- Common/3dParty/hunspell/test/src/bg_BG.txt | 212 -------------- Common/3dParty/hunspell/test/src/ca_ES.txt | 112 -------- .../hunspell/test/src/ca_ES_valencia.txt | 212 -------------- Common/3dParty/hunspell/test/src/cs_CZ.txt | 206 -------------- Common/3dParty/hunspell/test/src/da_DK.txt | 129 --------- Common/3dParty/hunspell/test/src/de_AT.txt | 131 --------- Common/3dParty/hunspell/test/src/de_CH.txt | 116 -------- Common/3dParty/hunspell/test/src/de_DE.txt | 211 -------------- Common/3dParty/hunspell/test/src/el_GR.txt | 123 -------- Common/3dParty/hunspell/test/src/en_AU.txt | 116 -------- Common/3dParty/hunspell/test/src/en_CA.txt | 125 --------- Common/3dParty/hunspell/test/src/en_GB.txt | 122 -------- Common/3dParty/hunspell/test/src/en_US.txt | 216 --------------- Common/3dParty/hunspell/test/src/en_ZA.txt | 114 -------- Common/3dParty/hunspell/test/src/es_ES.txt | 208 -------------- Common/3dParty/hunspell/test/src/eu_ES.txt | 132 --------- Common/3dParty/hunspell/test/src/fr_FR.txt | 211 -------------- Common/3dParty/hunspell/test/src/gl_ES.txt | 120 -------- Common/3dParty/hunspell/test/src/hr_HR.txt | 215 -------------- Common/3dParty/hunspell/test/src/hu_HU.txt | 114 -------- Common/3dParty/hunspell/test/src/id_ID.txt | 121 -------- Common/3dParty/hunspell/test/src/it_IT.txt | 200 ------------- Common/3dParty/hunspell/test/src/kk_KZ.txt | 209 -------------- Common/3dParty/hunspell/test/src/ko_KR.txt | 157 ----------- Common/3dParty/hunspell/test/src/lb_LU.txt | 118 -------- Common/3dParty/hunspell/test/src/lt_LT.txt | 127 --------- Common/3dParty/hunspell/test/src/lv_LV.txt | 205 -------------- Common/3dParty/hunspell/test/src/mn_MN.txt | 103 ------- Common/3dParty/hunspell/test/src/nb_NO.txt | 113 -------- Common/3dParty/hunspell/test/src/nl_NL.txt | 115 -------- Common/3dParty/hunspell/test/src/nn_NO.txt | 116 -------- Common/3dParty/hunspell/test/src/oc_FR.txt | 108 -------- Common/3dParty/hunspell/test/src/pl_PL.txt | 225 --------------- Common/3dParty/hunspell/test/src/pt_BR.txt | 108 -------- Common/3dParty/hunspell/test/src/pt_PT.txt | 135 --------- Common/3dParty/hunspell/test/src/ro_RO.txt | 210 -------------- Common/3dParty/hunspell/test/src/ru_RU.txt | 197 ------------- Common/3dParty/hunspell/test/src/sk_SK.txt | 205 -------------- Common/3dParty/hunspell/test/src/sl_SI.txt | 210 -------------- .../3dParty/hunspell/test/src/sr_Cyrl_RS.txt | 227 --------------- .../3dParty/hunspell/test/src/sr_Latn_RS.txt | 173 ------------ Common/3dParty/hunspell/test/src/sv_SE.txt | 210 -------------- Common/3dParty/hunspell/test/src/tr_TR.txt | 205 -------------- Common/3dParty/hunspell/test/src/uk_UA.txt | 210 -------------- .../3dParty/hunspell/test/src/uz_Cyrl_UZ.txt | 262 ------------------ .../3dParty/hunspell/test/src/uz_Latn_UZ.txt | 200 ------------- Common/3dParty/hunspell/test/src/vi_VN.txt | 128 --------- 96 files changed, 15912 deletions(-) delete mode 100644 Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt delete mode 100644 Common/3dParty/hunspell/test/dst/bg_BG.txt delete mode 100644 Common/3dParty/hunspell/test/dst/ca_ES.txt delete mode 100644 Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt delete mode 100644 Common/3dParty/hunspell/test/dst/cs_CZ.txt delete mode 100644 Common/3dParty/hunspell/test/dst/da_DK.txt delete mode 100644 Common/3dParty/hunspell/test/dst/de_AT.txt delete mode 100644 Common/3dParty/hunspell/test/dst/de_CH.txt delete mode 100644 Common/3dParty/hunspell/test/dst/de_DE.txt delete mode 100644 Common/3dParty/hunspell/test/dst/el_GR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/en_AU.txt delete mode 100644 Common/3dParty/hunspell/test/dst/en_CA.txt delete mode 100644 Common/3dParty/hunspell/test/dst/en_GB.txt delete mode 100644 Common/3dParty/hunspell/test/dst/en_US.txt delete mode 100644 Common/3dParty/hunspell/test/dst/en_ZA.txt delete mode 100644 Common/3dParty/hunspell/test/dst/es_ES.txt delete mode 100644 Common/3dParty/hunspell/test/dst/eu_ES.txt delete mode 100644 Common/3dParty/hunspell/test/dst/fr_FR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/gl_ES.txt delete mode 100644 Common/3dParty/hunspell/test/dst/hr_HR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/hu_HU.txt delete mode 100644 Common/3dParty/hunspell/test/dst/id_ID.txt delete mode 100644 Common/3dParty/hunspell/test/dst/it_IT.txt delete mode 100644 Common/3dParty/hunspell/test/dst/kk_KZ.txt delete mode 100644 Common/3dParty/hunspell/test/dst/ko_KR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/lb_LU.txt delete mode 100644 Common/3dParty/hunspell/test/dst/lt_LT.txt delete mode 100644 Common/3dParty/hunspell/test/dst/lv_LV.txt delete mode 100644 Common/3dParty/hunspell/test/dst/mn_MN.txt delete mode 100644 Common/3dParty/hunspell/test/dst/nb_NO.txt delete mode 100644 Common/3dParty/hunspell/test/dst/nl_NL.txt delete mode 100644 Common/3dParty/hunspell/test/dst/nn_NO.txt delete mode 100644 Common/3dParty/hunspell/test/dst/oc_FR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/pl_PL.txt delete mode 100644 Common/3dParty/hunspell/test/dst/pt_BR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/pt_PT.txt delete mode 100644 Common/3dParty/hunspell/test/dst/ro_RO.txt delete mode 100644 Common/3dParty/hunspell/test/dst/ru_RU.txt delete mode 100644 Common/3dParty/hunspell/test/dst/sk_SK.txt delete mode 100644 Common/3dParty/hunspell/test/dst/sl_SI.txt delete mode 100644 Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt delete mode 100644 Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt delete mode 100644 Common/3dParty/hunspell/test/dst/sv_SE.txt delete mode 100644 Common/3dParty/hunspell/test/dst/tr_TR.txt delete mode 100644 Common/3dParty/hunspell/test/dst/uk_UA.txt delete mode 100644 Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt delete mode 100644 Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt delete mode 100644 Common/3dParty/hunspell/test/dst/vi_VN.txt delete mode 100644 Common/3dParty/hunspell/test/src/az_Latn_AZ.txt delete mode 100644 Common/3dParty/hunspell/test/src/bg_BG.txt delete mode 100644 Common/3dParty/hunspell/test/src/ca_ES.txt delete mode 100644 Common/3dParty/hunspell/test/src/ca_ES_valencia.txt delete mode 100644 Common/3dParty/hunspell/test/src/cs_CZ.txt delete mode 100644 Common/3dParty/hunspell/test/src/da_DK.txt delete mode 100644 Common/3dParty/hunspell/test/src/de_AT.txt delete mode 100644 Common/3dParty/hunspell/test/src/de_CH.txt delete mode 100644 Common/3dParty/hunspell/test/src/de_DE.txt delete mode 100644 Common/3dParty/hunspell/test/src/el_GR.txt delete mode 100644 Common/3dParty/hunspell/test/src/en_AU.txt delete mode 100644 Common/3dParty/hunspell/test/src/en_CA.txt delete mode 100644 Common/3dParty/hunspell/test/src/en_GB.txt delete mode 100644 Common/3dParty/hunspell/test/src/en_US.txt delete mode 100644 Common/3dParty/hunspell/test/src/en_ZA.txt delete mode 100644 Common/3dParty/hunspell/test/src/es_ES.txt delete mode 100644 Common/3dParty/hunspell/test/src/eu_ES.txt delete mode 100644 Common/3dParty/hunspell/test/src/fr_FR.txt delete mode 100644 Common/3dParty/hunspell/test/src/gl_ES.txt delete mode 100644 Common/3dParty/hunspell/test/src/hr_HR.txt delete mode 100644 Common/3dParty/hunspell/test/src/hu_HU.txt delete mode 100644 Common/3dParty/hunspell/test/src/id_ID.txt delete mode 100644 Common/3dParty/hunspell/test/src/it_IT.txt delete mode 100644 Common/3dParty/hunspell/test/src/kk_KZ.txt delete mode 100644 Common/3dParty/hunspell/test/src/ko_KR.txt delete mode 100644 Common/3dParty/hunspell/test/src/lb_LU.txt delete mode 100644 Common/3dParty/hunspell/test/src/lt_LT.txt delete mode 100644 Common/3dParty/hunspell/test/src/lv_LV.txt delete mode 100644 Common/3dParty/hunspell/test/src/mn_MN.txt delete mode 100644 Common/3dParty/hunspell/test/src/nb_NO.txt delete mode 100644 Common/3dParty/hunspell/test/src/nl_NL.txt delete mode 100644 Common/3dParty/hunspell/test/src/nn_NO.txt delete mode 100644 Common/3dParty/hunspell/test/src/oc_FR.txt delete mode 100644 Common/3dParty/hunspell/test/src/pl_PL.txt delete mode 100644 Common/3dParty/hunspell/test/src/pt_BR.txt delete mode 100644 Common/3dParty/hunspell/test/src/pt_PT.txt delete mode 100644 Common/3dParty/hunspell/test/src/ro_RO.txt delete mode 100644 Common/3dParty/hunspell/test/src/ru_RU.txt delete mode 100644 Common/3dParty/hunspell/test/src/sk_SK.txt delete mode 100644 Common/3dParty/hunspell/test/src/sl_SI.txt delete mode 100644 Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt delete mode 100644 Common/3dParty/hunspell/test/src/sr_Latn_RS.txt delete mode 100644 Common/3dParty/hunspell/test/src/sv_SE.txt delete mode 100644 Common/3dParty/hunspell/test/src/tr_TR.txt delete mode 100644 Common/3dParty/hunspell/test/src/uk_UA.txt delete mode 100644 Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt delete mode 100644 Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt delete mode 100644 Common/3dParty/hunspell/test/src/vi_VN.txt diff --git a/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt b/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt deleted file mode 100644 index 5365bb7974..0000000000 --- a/Common/3dParty/hunspell/test/dst/az_Latn_AZ.txt +++ /dev/null @@ -1,213 +0,0 @@ -A [Ü, Ha, Ağ, Ac, Ad, Da, Fa, Ah, Ka, Al, An, Na, Qa] -qocalmaq [almayacaq, almamaq] -Alderaan'ın [Federasiyanın] -hamısı -həmçinin -Və -cavab -dir -incəsənət -kimi -da -uzaq -körpə -zirzəmi [zəmində] -ol -olub -doğuldu [doğulduğu, doğurduğu] -bulvar [bunlar] -fasilə -nəsllər [nəsillər, nəsnələri, nəslə, nələrlə, səslər] -gəlin -lakin -al -ilə -Kaliforniya [Kanalizasiya] -Kalifornikasiya [Kommunikasiya] -bilər -kartlar -şans -Çin -çənə [dənə, çəkə, mənə, nənə, sənə, tənə, çənəyə] -klublar -Cobain [] -bürc [borc, gürcü] -nəzarət -qiymət -edə bilməzdim [bilməzdim] -yaratmaq -lənət -rəqs -saziş -sövdələşmələr [məsləhətləşmələr] -dağıdıcı -almazlar [almanlar, almaz lar, almaz-lar, almaları, marallar, mallara] -etməz -etməyərik [etmərik, etmədikləri] -arzu -xülyalar [yalanlar] -Şərq -kənar -kənarları [kənar ları, kənar-ları, kənarına, kənarında, kəlamları, aparılarkən] -məmnunluq -hamının -uzaq -peri [şeri, geri, meri, yeri] -solğun [dolğun] -üz -son -tap -ilk -üçün --dan [-dam, -da, -an, -dana, -adan, -nda, -daş, -dən, -dağ, -can, -dad, -din, -lan, -don, -qan, adan, andan] -sərhəd -qız -qızın -yaxşı -gitara [artaraq] -əl -hardcore [hardadır] -var -yoxdur -o [od, ol, on, ot, ov, ox, ü, ı] -eşitmək -ürək -O'nun [Onun, Oyununu] -ona -gizli -yüksək -ona -onun -Hollivud [Holland] -Mən -Mənəm -əgər -içində -məlumat -içində -dir -bu -jack [janra] -sadəcə -kral -qohum -bilmək -qoyulmuş -qanun -yerləşdirilmək [yerləşdirilməsi, yerləşdirilmiş, yerləşdirilib, yerləşdirildiyini] -qurğuşun [quruluşunun] -aparmaq -yerləşdirilmə [yerləşdirilməsi, yerləşdirilmiş, yerləşdirilib, yerləşdirildiyini] -məkan -sevmək -şans -edilmiş -adam -çox -Evlənmək -maska [masa, marka] -o bilər [bilərlər, bilər] -bəlkə də [bəlkə] -mənası -mən -meditasiya [dissertasiya] -xatirə -ağılın -pul -mənim -heç vaxt [vaxtsa] -deyil -heç nə [heçə] -nömrələr [nömrələri, nömrə lər, nömrə-lər, nömrəli, nömrə] -of [od, əf, ol, on, ot, ov, ox, ofis] -of [od, əf, ol, on, ot, ov, ox, ofis] -üstündə -bir -yalnız -və ya [vəla] -nəticə -öz -Ödə [Də, Ədə, Adə, Edə, Idə, Öndə, Ölə, Önə] -Şəftəli [Həftəlik] -yerlər -oynayır -oynamaq -əhali -porno [sponsor] -tərifləmək [təriflər, təklifləri, təkliflərlə, təkliflərə] -ehtimal ki [ehtimal] -ehtimal -psixik [psixi, psixoloji] -kraliça [kralı] -qaldırmaq -qalan -hörmət -qalxmaq -yol -xam -müqəddəs -Xilas et [Xilası] -elmi -çığırmaq [çağırmaq, çıxarmaq] -satılır -şəkil -xəstələnmək [xəstələnməyi, dəstəklənməsi] -gümüşçü [gümüş] -dəri -əsgər -bir şey [şeydir] -Mahnı -mahnılar -qılınclar [qılınc lar, qılınc-lar, qılıncı] -büyü [böyüyü] -casuslar [ruslar] -ulduz -Stansiya -oğurlamaq [vurğulamaq] -daşlar -günəş -şübhəli -İsveç -qılınclar [qılınc lar, qılınc-lar, qılıncı] -yeniyetmə -test -dandan [andan, candan, qandan, yandan, danışanda, adından, yanından, canından] -bu ki [builki] -bu ki [builki] -bu -onların -bu -onlar -düşünmək -bu -onlar -gel-git [get-gedə] -üçün -deyilmişəm [deyilmiş əm, deyilmiş-əm, deyilmişdi, deyilmiş, deyilmi, deyiləm] -çox -cəhd et [cəhdlər] -başa düşdüm [] -qilin [ilin, bilin, dilin] -titrəmək [itirməmək, itirmək] -mübarizə aparır? [] -istəyirəm -müharibə -idi -dalğalar [qadağalar, dağlarda, adalar, dağlar] -geymək [getmək, getməmək] -silahlar -yaxşı -idarə olunan [olunanlardan] -Qərbi [Hərbi, Qəbri, Qərb, Qərbin, Qəbir, Qərbə, Qəlbi] -nə -arasında -qalib gəlmək [qaliblərin] -qalib gəlir [qalibləri] -ilə -qadın -dünya -səhv -siz -sizə -sənsən [səndən, sən sən, sən-sən, nədənsə, mənsə, sənə, səslənən] -sənin diff --git a/Common/3dParty/hunspell/test/dst/bg_BG.txt b/Common/3dParty/hunspell/test/dst/bg_BG.txt deleted file mode 100644 index 57cc73c5c7..0000000000 --- a/Common/3dParty/hunspell/test/dst/bg_BG.txt +++ /dev/null @@ -1,212 +0,0 @@ -A [А, Е, О, И, В, С, Я, У] -остаряване -Алдераан [Дерайлиран] -всичко -също -и -отговор -са -изкуство -като -в -далеч -бебе -мазе -бъда -било -роден -булевард -почивка -породи -невеста -но -купувам -от -Калифорния -Калифорникация [Калифорнийския, Калифорнийка, Калифорния] -може -карти -шанс -Китай -брадичка -клубове -Кобейн [Кобен] -съзвездие -контрол -цена -не можех [можехме] -създаване -проклятие -танц -сделка -сделки -унищожение -диаманти -не прави [неправи, неуправии, неправдиви] -не правим [непоправим] -мечта -мечти -Изток -ръб -ръбове -екстаз -всеки -далеч -приказка -избледнява -лица -краен -намирам -първи -за -от -предел -момиче -момичето -добре -китара -ръка -хардкор [хардуер] -има -няма -той -чуя -сърце -той е [той] -нейни -скрит -висок -него -негов -Холивуд -аз -аз съм [разсъмна] -ако -в -информация -вътре -е -това е [товарен] -вале -просто -крал -родственик -знам -определен -закон -поставям -водя -води -местоположение -обичам -късмет -направен -човек -много -Ожени се [Брожение] -маска -май -може би [можещи] -означава -аз -медитация -спомен -ума -пари -моя -никога -не -нищо -числа -от -изключен -на -един -само -или -изход -свой -Плати -праскова -места -играе -играя -население -порно [бурно, орно, порено, опорно, спорно, упорно, порна, парно, порне, поено, порни, потно, торно, морно, горно] -похвала -вероятно -вероятен -психичен -кралица -въздигам -останал -почит -възход -път -груб -светия -Спасявам -наука -крясък -продава -форма -по-болен -златар -кожа -войник -някаква -Песен -песни -пикове -заклинание -шпиони -звезда -стация [станция, стария, статия, стадия, атестация, стагнация] -крада -камъни -слънце -подозрителен -Швеция -мечове -тийнейджър [тинейджър, пейджър] -тест -отколкото -това -това е [товарен] -на -техни -тези -те с [тесте] -мисли -този -той -прилив -до -каза -също -опитайте -разбрано -еднорог [едно рог, еднороден] -вибрация -водене? [водене, неводен, воден] -искам -война -беше -вълни -носете -оръжия -Ами -бяха -Западна -какво -докато -победа -победи -със -жена -свят -грешка -ти -ти би [табиети] -ти си [тифуси] -вашият diff --git a/Common/3dParty/hunspell/test/dst/ca_ES.txt b/Common/3dParty/hunspell/test/dst/ca_ES.txt deleted file mode 100644 index be726d0d8a..0000000000 --- a/Common/3dParty/hunspell/test/dst/ca_ES.txt +++ /dev/null @@ -1,112 +0,0 @@ -amor -llum -lluum [lluu, llum, lluus, lluïm, lluu m] -esperança -espirança [esperança, espirant, espinçadora, espinça, espira] -llibertat -força -forrça [forra, força, forçar] -pau -somni -llibre -mar -amistat -cançó -flor -cel -estrella -temps -camí -vent -muntanya -mumntanya [muntanya, muntanyà, muntant] -riu -soroll -silenci -viatge -foc -gel -paraula -vida -dia -nit -tarda -matí -lluna -sol -llac -marbre -ferro -sal -mel -sucre -peix -ocell -oceoll [ocell] -joc -ritme -melodia -pintura -pentura [puntera, entura, pintura, puntura, ventura, penetrant, apertura, parapent] -teatre -dansa -poema -història -llegenda -mitologia -festa -música -vi -cervesa -cervessa [cervesa, cer vessa, cer-vessa, cerves sa, cerves-sa, cervesera, cerveseria, cerveser, cessava] -formatge -pa -ciutat -poble -natura -camp -bosc -platja -sorra -sorrà -pedra -ànima -cos -ment -cor -somriure -somriàre [somriure, somrient] -abraçada -bes -parla -oida [oidà, oïda, ioda, odia, aido, oia, oda, oiada, oxida, aida, sida, onda, mida, dida, vida] -vista -tacte -gust -olfacte -color -forma -número -lletra -sistema -regla -escola -universitat -univversitat [universitat, universitari, universalitat, universalitzat, universalista] -mestre -estudiant -sabiduria [sabuderia] -lliçó -pregunta -resposta -risposta [resposta, disposta, ris posta, ris-posta, risp osta, risp-osta, trasposta, posteritat, riosta, polvorista] -dubte -certesa -veritat -mentida -promesa -secret -descoberta -descaberta [descoberta, desca berta, desca-berta, descabestrat, descartable, descabota, descarta] -aventura -destinació diff --git a/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt b/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt deleted file mode 100644 index 87fc1cc63b..0000000000 --- a/Common/3dParty/hunspell/test/dst/ca_ES_valencia.txt +++ /dev/null @@ -1,212 +0,0 @@ -A -envellir -Alderaan [Aldebaran, Aldebrand, Aldeana, Anedera] -tot -també -I -resposta -és -art -com -a -lluny -nadó -celler -ser -ha estat [hastat] -nat -bulevard -pausa -generacions -núvia -però -comprar -amb -Califòrnia -Californication [Californiana, Californita] -pot -cartes -oportunitat -Xina -mentó -clubs -Cobain [Cobai, Cobais, Cobrin, Cob ain, Cob-ain, Cobalamina] -signe del zodíac [signé del zodíac, signè del zodíac, sígne del zodíac, sïgne del zodíac, signE del zodíac, Signe del zodíac, sIgne del zodíac, sigNe del zodíac, siGne del zodíac] -control -preu -no podria [nodriria, podriria, nodria] -crear -maleït -ballar -acord -negocis -destructiu -diamants -no fer [noosfera] -no fem [nomenem] -desitjar -somnis -Est -vora -voreres -satisfacció -tots -llunyà -fada -pallid [pallis, palli, pallin, pali] -cara -final -trobar -primer -per -de -frontera -noia -la noia [la noïa, la Noia] -bé -guitarra -mà -hardcore [recordar] -hi ha [hifa] -no hi ha [nó hi ha, nò hi ha, nO hi ha, No hi ha] -ell -sentir -cor -ell és [estellés] -seva -secret -alt -ell -seu -Hollywood -jo -sóc -si -en -informació -interior -és -és -jack -només -rei -parent -saber -fixat -llei -col·locar -plom -portar -col·locació -lloc -estimar -oportunitat -fet -home -molts -casar-se -màscara -podria -potser -sentit -jo -meditació -memòria -ment -diners -meu -mai -no -res -números -de -fora -sobre -un -només -o -resultat -seu -pagar -préssec -llocs -jugar -joc -població -porno -elogiar -probablement -probable -psíquic -reina -elevar -restant -respecte -pujar -camí -cru -sant -salvar -ciència -crit -vendre’s [vendre's, vendre] -figura -malalt -joier -pell -soldat -alguna cosa [glucosamina] -cançó -cançons -cims -encanteri -espies -estrella -estació -robar -pedres -sol -sospitós -Suècia -espases -adolescent -prova -que -que -això -seu -aqueixos -ells -pensar -aqueix -ells -marees -per -no he estat [nó he estat, nò he estat, nO he estat, No he estat] -molt -intentar -entendre -fer -tremolar -lluitar -desitjar -guerra -va ser [vaser, serva] -ones -portar -armes -bé -administrat -Oest -què -entre -guanyar -guanya -amb -dona -món -equivocat -tu -vostè -tu ets [tubets] -teu diff --git a/Common/3dParty/hunspell/test/dst/cs_CZ.txt b/Common/3dParty/hunspell/test/dst/cs_CZ.txt deleted file mode 100644 index 916cc8419c..0000000000 --- a/Common/3dParty/hunspell/test/dst/cs_CZ.txt +++ /dev/null @@ -1,206 +0,0 @@ -pomaliý [pomalý, pomaličku] -šťstný [šťastný] -smuutný [smutný, smutnu] -horcký [horký, horácký, horecký, horský, hornický, horňácký] -studiený [studený, studie] -záludnast [záludnost, záludný] -náhodillost [nahodilost, náhodnost] -úpěnlevý [úpěnlivý, úpletový] -rozspačitý [rozpačitý, rozpačitěný] -svéhllavý [svéhlavý, svéhlavička] -jablko -slunce -voda -dům -pták -káva -chleba -květina -kniha -pes -kočka -město -zelený -modrý -červený -bílý -černý -velký -malý -rychlý -pomalý -šťastný -smutný -horký -studený -nový -starý -hezký -ošklivý -dobrý -špatný -zdravý -nemocný -silný -slabý -chytrý -hloupý -pracovat -jíst -pít -spát -číst -psát -mluvit -smát se [smát] -plakat -zpívat -hrát -tančit -učit se [učitele] -nakupovat -vařit -telefonovat -dívat se [sedívat] -poslouchat -chodit -běžet -létat -plavat -psát -učit se [učitele] -dělat -mít -být -jít -přijít -odejít -dát -vzít -říct -vidět -slyšet -cítit -myslet -chtít -moct -muset -rád -nerad -ano -ne -prosím -děkuji -na shledanou [shledanou, dohledanou, shledávanou, ohledanou] -omlouvám se [omlouvání] -sbohem -ahoj -čau -hej -jo -fakt -super -blbost -paráda -no jo [nojo] -jasně -takže -vlastně -třeba -snad -leštěnka -pochmurný -živelný -ponaučení -záhada -pochybnost -nádhera -soucit -záludnost -náhodilost [nahodilost, náhodnost] -úpěnlivý -rozpačitý -svéhlavý -marnivost -blahodar [blaho dar, blaho-dar, lahoda] -rozčarování -odchylka -přelud -vytrvalost -neústupnost -lehkost -souznění -rozmarnost -roztržitost -úskočnost -rozkoš -marasmus -rozpolcenost -neúprosnost -ztřeštěnost -chmurnost -okouzlení -zářivost -vyrovnanost -neochvějnost -neúcta -bizarnost -rozmařilost -nepochopení -nevýslovný -pomíjivost -beznaděj -úzkost -odtažitost -rozerv [rozerve, rozervi, rozervu, rezerv, rozervat] -rozervanost -vyčerpanost -bezcitnost -záludnost -nezdolnost -rozkošátnost [rozkošnost, rozkošatěnost, rozkošnickost, rozkoktanost] -nezdolatelnost -rozmarnost -živelnost -bezútěšnost -záhadnost -neposkvrnitelnost [nepotiskovatelnost, nepopisovatelnost, nepřemostitelnost, nezvratitelnost] -rozkošnělost [rozkošatělost, rozkošnost, rozkošnickost, rozkošatěnost] -bezradnost -neuchopitelnost -pošetilost -opojení -rozervanost -marnost -bezstarostnost -nevinnost -náladovost -vyrovnanost -ztracenost -bezbřehost -rozervanost -opojení -bezradnost -neuchopitelnost -pošetilost -opojení -rozervanost -marnost -bezstarostnost -nevinnost -náladovost -vyrovnanost -ztracenost -bezbřehost -opojení -bezradnost -neuchopitelnost -pošetilost -opojení -rozervanost -marnost -bezstarostnost -nevinnost -náladovost -vyrovnanost -bezbřehost diff --git a/Common/3dParty/hunspell/test/dst/da_DK.txt b/Common/3dParty/hunspell/test/dst/da_DK.txt deleted file mode 100644 index b7a362e12d..0000000000 --- a/Common/3dParty/hunspell/test/dst/da_DK.txt +++ /dev/null @@ -1,129 +0,0 @@ -Hej -Goddag -Tak -Ja -Nej -Måske -Mad -Vand -Hus -Bil -Tog -Cykel -Skole -Børn -Far -Mor -Søster -Bror -Hund -Kat -Fisk -Fugl -Træ -Blomst -Græs -Sol -Måne -Himmel -Regn -Sne -Sommer -Vinter -Forår -Efterår -Aften -Nat -Dag -Uge -Måned -År -Læse -Skrive -Tale -Lære [Lære, Læres, Lærer, Læren, Læreø, Læreå, læreå] -Arbejde -Sove -Vågne -Løbe -Gå -Sidde -Stå -Lytte -Se -Høre [Høre, Høres, Hører, Høreø, Høreå, høreå] -Spise -Drikke -Kød -Frugt -Grøntsager -Ost -Brød -Vand -Juice -Kaffe -Te -Mælk -Smør [Smør, Smøre, Smørs, Smør'] -Æg -Salt -Peber -Sukker -Bolle -Smørrebrød -Køkken -Stue -Soveværelse -Badeværelse -Toilet -Bord -Stol -Sofa -Lampe -Vindue -Dør -Gulv -Loft -Væg -Sofa -Pude -Tæppe -Badekar -Håndvask -Spejl -Håndklæde -Seng -Dyne -Dynee [Dynes, Dyner, Dyne, Dynen, Dynge, Dynees, Dynete, Dyneel, Dynele, Dyneed, Dyneeg, Dyneem, Dynefe, Dyneve] -Pude -Pudee [Pudene, Pudre, Puder, Pude, Pudes, Pudse, Puden, Pudet, Pudel] -Alarm -Alarmm [Alarm, Alarms] -Skrivebord -Stol -Hus -Hund -Kat -Katt [Kett, Katy, Katty, Kate, Kitt, Kata, Kato, Matt, Watt, Kat, Kast, Kats, Takt, Kart, Katte] -Bil -Skole -Skolee [Skolie, Skolede, Skoler, Skole, Skoles, Skolen, Skolet, Skolde] -Sol -Soll [Sol, Sole, Sols, Soli, Sola, Sall, Sold, Solo, Soul] -Vand -Vandd [Vanda, Vandy, Vandt, Vand, Vands, Vande, Vandr] -Mad -Madd [Mads, Maud, Mad, Made, Mand] -By -Barn -Barnn [Barni, Baran, Barny, Barn, Baren, Barns, Baron] -Tørklæde -Skæbne -Uafhængighed -Kærlighed -Kærligheed [Kærlighed, Ærlighed, Hæderlighed, Herlighed, Liderlighed] -overbelastning -Modstandsbevægelsen -Uafhængighedserklæringen -Forårssommertemperaturen -Stabiliseringsperioden diff --git a/Common/3dParty/hunspell/test/dst/de_AT.txt b/Common/3dParty/hunspell/test/dst/de_AT.txt deleted file mode 100644 index 060081d011..0000000000 --- a/Common/3dParty/hunspell/test/dst/de_AT.txt +++ /dev/null @@ -1,131 +0,0 @@ -Ägyptologie -Ährenamt [Ährensamt, Ährenast, Ährenart, Ährenact, Ährenabt, Ährenakt, Ährenaxt, Ehrenamt, Ohrenamt, -ährenamt, Ährenartig] -Ängstlichkeit -Äquatoria -Abarbeiten -Abbild -Abbilden -Abbildungs [Abbildung, Abbildungs-, Bildungsnah, Unbildung] -Abbreviatur -Abbrüche -Abfassen -Abfertigen -Abfolge -Abfuhr -Ableugnen -Ablichten -Ablöse -Absätze -Abschnitts -Abwechseln -Abwehren -Aktiv -Britannia -Browserfenster -Budgetieren -Bugpartie -Bukarester -Burgundersoße -Butterkrem -Button -Cabriolet -Campanile -Canapé -Caprice -Celsius -Chamäleon -Charakteristik -Chronometer -Chronometrie -Cölln -Connectzustände -Cursorspur -Däne -Dachs -Dahindämmern -Darbringen -Daten -Datenbankserver -Desktopsystem -Detektivfilm -Dichtertum -Dinosaurier -Direktion -Diskantgambe -Diskothek -Druckereicode -Kapsel -Karausche -Katzen -Klinge -Klinke -Kohlrabi -Koinzidenz -Kolleg -Komplott -Meereis -Mehrphasigkeit -Memorieren -Messen -Methode -Metrowaggon -Meute -Migräne -Milieuforschung -Mindern -Mineralien -Mitternacht -Mobiliar -Mohrrübe -Mühelosigkeit -Normativität -Notifikation -Ökonomie -Orangeton -Osten -Subjekt -Subsidiarität -Subsumieren -Tagfalter -Speicher -Spielzeugsammlung -Zahler - -Сложные слова [] -Zurückgezogenheit -Äquipotentialfläche -Äußerungsbedeutung -Abfassungszeitraum -Abgeschlossenheits [Abgeschlossenheit, Abgeschlossenheits-, Unabgeschlossenheit, Aufgeschlossenheit, Abgeschlagenheit, Geschlossenheit] -Adjunktionsbeseitigung -Anknüpfungsgrundsätze -Chiffrierschlüssel -Knochenmarktransplantation -Bundeskaderathlet -Carbonsäurechlorid -Cardiazoltherapie -Chancenungleichheit -Charakterisierungsmöglichkeit -Chlorophyllkonzentration -Computerspielemarkt -Deindustrialisieren -Dekodierungsmöglichkeit -Kartoffelschälmesser -Kernspinresonanztomographie -Merkmalskombination -Nachbarschaftszentren -Opportunitätsprinzip -Tiefenstaffelung -Tourismusfachmann -Sequenzbetrachtung - -Слова с ошибками [] -Dechifrierprogramm [Dechiffrierprogramm, Liederprogramm] -Administratorkenwort [Administratorkennwort, Administratorkonto, Administratorrecht, Distriktadministrator, Distriktsadministrator] -Spigeln [Spiegeln] -Tätigkeite [Tätigkeit, Tätigkeiten, Untätigkeit, Nagetätigkeit, Mildtätigkeit, Regietätigkeit] -Draufgangertum [Draufgängertum, Draufgänger] -Abschnit [Abschnitt, Abschritt] -Komunikation [Kommunikation, Exkommunikation, Kommunikativ, Kommunikator, Komplikation] -Drackereicode [Druckereicode, Dreidecker] -Bumeln [Baumeln, Bummeln, Blumen, Brummeln, Bummel] diff --git a/Common/3dParty/hunspell/test/dst/de_CH.txt b/Common/3dParty/hunspell/test/dst/de_CH.txt deleted file mode 100644 index 196e03636b..0000000000 --- a/Common/3dParty/hunspell/test/dst/de_CH.txt +++ /dev/null @@ -1,116 +0,0 @@ -Alpinist -Alteration -Alternative -Alumne -Amateurfilmer -Ambulanz -Amtmänner -Analogie -Analytik -Ananas -Angabe -Ankünfte -Dynastie -Ebenbürtigkeit -Echtheitszertifikat -Editionspläne -Editor -Ehrenamtlichkeit -Eigentümerschaft -Einbau -Eindringling -Eingabequittungsbetrieb -Einhüllen -Einkommen -Einloggen -Einschließen [Einschliessen, Einschliefen] -Einsortier [Einsortier-, Einsorter, Eintortier, Einportier, Einvortier, Einsortiere, Einsortiert, Unsortierter, Unsortiert, Einzusortieren, Sortieren] -Elaboration -Elementar -Entertainer -Entkuppeln -Entschädigungs [Entschädigung, Entschädigungs-, Entschädigungslos, Entschädigens, Entschädigen] -Enumerator -Erbringen -Erdichten -Erfahrenheit -Erhalt -Erleichtern -Ersparnis -Erstatten -Erzählliteratur -Helikopter -Helpdesk -Herunterladen -Hindeuten -Hinterlassenschaft -Hiob -Landesprache [Landessprache, Landesrache, Landsprache, Ladesprache, -landesprache] -flexibilität [Flexibilität, -flexibilität, flexibilisiert] -floristisch -flugbillet [Flugbillet, -flugbillet, flugbereit] -heroben -herrichten -herstellen -herübereilen -herunterzubücken -hie -hieraus -hilfe [Hilfe, hilf, hilfe-, -hilfe, helfe, hilft, hälfe] -himbeere [Himbeere, -himbeere, himbeer-, himbeerrot] -justiz [Justiz, justiz-, -justiz, justiziell] -kältebeständig -kärtchen [Kärtchen, -kärtchen, Gärtchen, Bärtchen, kärglichen] -känguru [Känguru, -känguru] -kaktusgewächs [Kaktusgewächs, -kaktusgewächs, ausgewechselt] -kalligrafie [Kalligrafie, -kalligrafie, kalligrafiere, kalligrafische, kalligrafisch] -kamel [Kamel, kamel-, -kamel, kamen, rammel] -kampagnendirektor [Kampagnendirektor, -kampagnendirektor, kampagnenartig] -kapazitär -kapitalist [Kapitalist, -kapitalist, kapital ist, kapital-ist, kapitalistisch, kapitalisierst, kapitalisiert, kapitalstark] -karamell [Karamell, karamell-, -karamell, lamellar] -kardieren -karpfen [Karpfen, -karpfen, krampfen] -katalogdaten [Katalogdaten, -katalogdaten, katalogartigen] -lyzeum [Lyzeum, -lyzeum] -mahagonirot -makkaroni [Makkaroni, -makkaroni, marokkanisch] -malerausbildung [Malerausbildung, -malerausbildung, ausbildungsreif] -management [Management, -management, managen, gemanagt, angemahnt] -mangel -maniküre -manneskraft [Manneskraft, -manneskraft, maskenhaft] -mansarde [Mansarde, -mansarde, ansparende] -mark [Mark, -mark, merk, park, Sark, Park, Bark, markig] -marketingpraktiker [Marketingpraktiker, -marketingpraktiker, marketingorientiert, marketingwirksamer] -maschinell -massage [Massage, massage-, -massage, massige, Passage, Gassage, passagere] -massengutschifffahrt [Massengutschifffahrt, -massengutschifffahrt, maschinenschriftlich] -materie [Materie, -materie, materiell, materiefrei, maturiere, mattier] -medaille [Medaille, -medaille, medaillenlos] -medizinalshampoo [Medizinalshampoo, -medizinalshampoo, sozialmedizinisch] -meeresfrüchte [Meeresfrüchte, -meeresfrüchte, Heeresfrüchte, meeresfeuchte, meeresfeucht, früchtereiche, früchtereich] -quotient [Quotient, -quotient, quotiert, quotieren, quotiere, quotisieren] -salonwagen [Salonwagen, -salonwagen, lossagen] -satzeinleitend -trilateral -tristesse [Tristesse, -tristesse, tristeste, trist esse, trist-esse, triste, rissfeste, stresse, rissfest] -tropen [Tropen, tropfen, tropen-, -tropen, trogen, tropenfest] -vereisen -verfahren -verfügungs [verfügungs-, verfügen] -verhindern -verkäufer [Verkäufer, -verkäufer, verkämpfe, verkaufe, verkupfer] - -Слова с ошибками [] -Anbindungsystem [Anbindungssystem] -Anglistikdocent [Anglistikdozent, Anglistikstudent, Linguistikdozent] -Ecco [Echo, Codec] -Economclass [Economyclass, Economyklasse] -Einverstandnis [Einverständnis, Einverstandanis, Einverstandnils, Einverstandeis, Einverstandnil, Einverstanden, Seinsverständnis, Koranverständnis, Unverständnis] -Electrik [Elektrik, Electrabel] -Historique [Historisiere, Historie] -herüberzurucken [herüberzugucken, herüberzurücken, herüberzulocken, herüberzustrecken, herüberzublicken, herüberzuschicken] -kartofel [kartoniere] -salade [malade, lade] -sanddornbere [versandbereite] diff --git a/Common/3dParty/hunspell/test/dst/de_DE.txt b/Common/3dParty/hunspell/test/dst/de_DE.txt deleted file mode 100644 index 36cde4a624..0000000000 --- a/Common/3dParty/hunspell/test/dst/de_DE.txt +++ /dev/null @@ -1,211 +0,0 @@ -Hallo -Guten Morgen [Morgenläuten, Morgenröten] -Danke -Bitte -Ja -Nein -Entschuldigung -Tschüss -Liebe -Freund -Familie -Glück -Gesundheit -Schule -Arbeit -Essen -Trinken -Wasser -Brot -Käse -Fleisch -Gemüse -Obst -Kaffee -Tee -Milch -Zucker -Salz -Pfeffer -Haus -Wohnung -Bett -Stuhl -Tisch -Sofa -Fernseher -Telefon -Computer -Buch -Zeitung -Schreiben -Lesen -Hören -Sehen -Fühlen -Laufen -Springen -Schwimmen -Tanzen -Singen -Lachen -Weinen -Freude -Trauer -Angst -Mut -Liebe -Hass -Freundschaft -Beziehung -Familie -Eltern -Kinder -Geschwister -Großeltern -Onkel -Tante -Cousin -Cousine -Ehemann -Ehefrau -Verlobung -Hochzeit -Scheidung -Geburt -Tod -Krankheit -Arzt -Krankenhaus -Medikament -Apotheke -Gesundheit -Wohlbefinden -Fitness -Diät -Schlaf -Ruhe -Entspannung -Sport -Fußball -Tennis -Schwimmen -Laufen -Radfahren -Wandern -Reisen -Urlaub -Strand -Sonne -Meer -Komplementär -Perspektive -Konsens -Integrität -Konsequenz -Authentizität -Korrelation -Charakteristik -Akzeptanz -Flexibilität -Assoziation -Dekomposition -Komplexität -Positivismus -Universalität -Stabilität -Individualität -Konsistenz -Konformität -Dezentralisierung -Kollaboration -Partizipation -Präzision -Transformation -Konkurrenz -Paradoxie -Redundanz -Regeneration -Integration -Isolation -Asymmetrie -Aggregation -Disziplin -Resilienz -Relevanz -Konfusion -Komplikation -Koordination -Harmonie -Ineffizienz -Konstruktion -Konversion -Kollusion -Gerontologie -Differenzierung -Dimensionalität -Inferenz -Fluktuation -Kontraktion -Rezession -Inflation -Dekontamination -Exzellenz -Innovation -Isomorphie -Konnotation -Insuffizienz -Konversion -Kompensation -Koalition -Inkongruenz -Inkontinenz -Kontrahent -Konfiskation -Konjunktur -Aggression -Konfrontation -Kompatibilität -Prognose -Akzeleration -Konstruktion -Diversifikation -Prävention -Sanktion -Indikation -Reduktion -Konkurrenz -Konfiguration -Konnotation -Rezession -Transformation -Interaktion -Kooperation -Innovation -Kollision -Proklamation -Konnotation -Konfrontation -Disposition -Konkordanz -Deklamation -Kollaboration -Isolation -Inflation -Diversifikation -Konnotation -Kompensation -Diffusion -Dekadenz -Konserve -Deklomotion [Deklamation, Deklination, Deletionsklon] -Kolaboration [Kollaboration, Kollaborativ, Elaboration, Korporation, Inkorporation] -Isollation [Isolation, Installation, Kollation, Solmisation, Spallation] -Infllation [Inflation, Inflationär, Inflammation, Inflationiere, Installation] -Divirsifikation [Diversifikation, Ossifikation, Kodifikation, Ratifikation] -Konotation [Konnotation, Korotation, Kinotation, Kontotation, Ökonotation, Konnotativ, Annotation, Notation, Konfrontation] -Kompenssation [Kompensation] -Difusion [Diffusion, Gasdiffusion, Infusion, Diskussion, Fusion] -Dekadens [Dekaden, Dekadenz, Dekadent, Dekade, Dekans, Dekagons, Dekkans] -Kanzerve [Verwanze] - diff --git a/Common/3dParty/hunspell/test/dst/el_GR.txt b/Common/3dParty/hunspell/test/dst/el_GR.txt deleted file mode 100644 index cc8cf011f2..0000000000 --- a/Common/3dParty/hunspell/test/dst/el_GR.txt +++ /dev/null @@ -1,123 +0,0 @@ -Αβαντάζ -Αβασταγά -Αβγάτισες -αβέβαιο -αβέλτερο -αβέλτεροι -αβίαστους -άβλαβοι -αβοκάντο -αβράδιαστης -άβραστη -αβράχυντου -άβρεχτα -αβρή -αβρότης -άβυσσον -αγαθόν -αγαθούς -αγάλακτο -αγγούρι -αγελαδινού -αγέρα -αγεωμέτρητων -αγίνωτοι -άγκυρες -αγορεύσεις -αγόρευσή -αγορίνα -Αγοριού -Αγροληψία -Αρμόνια -βγαίνοντας -βεβαιώσεων -διάθεση -διαίρεση -Διαιρέσου -Διαιτολογίου -διαψεύσουν -διδασκάλισσας -ενασκήσεις -ενασχόληση -ενασχόλησή -ενδείξεις -ενδεχόμενον -ενδιαμέσου -Επιστήθιες -Επιστημο [Επιστημοσύνη] -Επιστολές -Επιστολή -εύπορους -ευρέα -ευρημάτων -ευρύτητά -ευσταθών -εύστροφα -ευσυνειδησία -εύτακτε -ευτελείς -ευτελίζουν -ιδρυτικό -ιεροψάλτες -Ιζόλα -Ιθαγένειάς -ικανότατος -ιλαρότης -κεφαλής -κεφαλιάτικες -κεφαλωτές -κήπε -κήπευση -Κήρυξής -Λεξικογραφιών -Λεξιλογικός -λεοντή -λεοντής -ολιγοχρόνιου -ολικέ -ολικές -ολική -πελαγώνω -πελατών -πελάων -προστατεύει -προστασίας -σούρουπου -σουρούπωμα -σούρτης -Σούρωνα -Σπαγέτα -Σφάλμα -Σφάλματά -σφικτά -σφικτέ -σφοδρότητας -σφοδρού -σφραγίσω -σχεδιάζουμε -σχεδιάζουν -σχηματίσου -σχηματίσουμε -σχολιάζεσαι -Σχολιάζεστε -Ενδιαφέροντα - -Слова с ошибками [] -Αβασiλευτου [Αβασίλευτου, Αβασίλευτο, Αβόλευτου] -αγαπούσαv [αγαπούσα, αγαπούσαν, αγαπούσε] -βeβαιωμένοι [βεβαιωμένοι, βεβαιωμένο] -εvασxόλησης [ενασχόλησης] -επιoτολικέ [επιστολικέ, επιστολικό] -ιδιωτικοποιήσειc [ιδιωτικοποιήσει, ιδιωτικοποιήσεις, ιδιωτικοποιήσετε, ιδιωτικοποιήσεως, ιδιωτικοποιήσεων, ιδιωτικοποιήστε] -λεπταίσθnτη [λεπταίσθητη, λεπταίσθητα, λεπταίσθητε, λεπταίσθητο] -πρoστιμάρισμα [προστιμάρισμα, στιμάρισμα] -σφάλμαtα [σφάλματα, σφάλμα] -προστάτεuε [προστάτευε, προστάτεψε, προστάτευσε, προστάτες, προστάτευα, προστάτευσα] -κεxριμπαριού [κεχριμπαριού, κεχριμπαρένιο] -διαισθnτικότητες [διαισθητικότητες, διαισθητικότητας, διαισθητικότητα, διαισθητικότης, αισθητικότητες] -αγκιστpώσουv [αγκιστρώσουν] -αγαθoεργiας [αγαθοεργίας] -αβεβαιoτητά [αβεβαιότητά, βεβαιότητά] -αγέρεc [αγέρες] -διδαxθούμε [διδαχθούμε, διδαχτούμε] -εuσταθειώv [ευσταθειών] diff --git a/Common/3dParty/hunspell/test/dst/en_AU.txt b/Common/3dParty/hunspell/test/dst/en_AU.txt deleted file mode 100644 index 55691a415f..0000000000 --- a/Common/3dParty/hunspell/test/dst/en_AU.txt +++ /dev/null @@ -1,116 +0,0 @@ -Acknowledge -acrophobia -adventurousness -aeronautics -algal -Alligator -allegation -alphabetise -Analogy -appropriable -assembly -attempt -Average -barbecue -bathtub -begun -belongingness -Better -binary -blackberry -boatswain -bow-tie -brambly -bright-eyed -bubble -Calender -cancellous -cantankerousness -carefree -categorized [categorised, categorise, categorisation, category, decorticated, cauterised, avant-grist] -cellular -chaos -cheerfulise -childlike -circumstance -close-mouthed -Cocoa -coherent -co-located -Colours -controversial -cottage -creditworthiness -cut-down -dedicated -deep-freeze -Definitive -Designs -digital -distensible -dollar -dyslexia -Egyptian -effectively -etiquette -excess -exotica -fairly -feedback -features -figure's -fjord -forty-seven -government -haematomata -helpless -homologous -implant -Indemnify -inexpert -interior -localises -loquaciousness -maelstrom -mechanizable -melodious -mezzo-soprano -mozzie -municipalisation -mystifier -Neoclassicism -newsletter -non-professional -officiation -orientalisation -palaeoanthropography -parrot -pickpocket -pioneer -cryptanalytic -simplifying -sommelier -spicy -steward -subcontinental -swimwear -Technical -trajectory -wholesomeness -Advantageously -interindustry -red-eye -sub-group - -Слова с ошибками [] -Acredited [Credited, A credited, Accredited, Accredit, Accreted, Creditable, Discredit, Acridity, Aegritude] -agressive [aggressive, regressive, digressive, progressive, transgressive, aggressor, expressive] -appreciativiness [appreciativeness, appreciatively, appreciative, appreciation, apprehensiveness, operativeness, provocativeness] -aritmetical [arithmetical, arithmetica, arithmetic, hermetical, antithetical, paramedical, grammatical] -biosyntesized [biosynthesized, nonsynthesised, synthesised, amniocenteses, amniocentesis] -lisense [license, senilise, linenise, sensualise, sensise, licence, licensable] -paranoa [paranoia, paranoid, paranormal, paragon, panorama, Paringa, parental] -fotoelectronic [photoelectronic] -semi transparent [semitransparent, transparentise, non-transparent, transparency, semi-permanent, transpiration, superintendence] -synonymus [synonyms, synonymous, synonym's, synonym us, synonym-us, synonym, anonymous, synchronous, synoecious, anonymise, unanimous] -wordprocessing [word-processing] diff --git a/Common/3dParty/hunspell/test/dst/en_CA.txt b/Common/3dParty/hunspell/test/dst/en_CA.txt deleted file mode 100644 index a23012fcfa..0000000000 --- a/Common/3dParty/hunspell/test/dst/en_CA.txt +++ /dev/null @@ -1,125 +0,0 @@ -admire -admittance -aggrandizement -Airmen -Albatross -amateur -angling -apparatus -Architecture -assessment -attempt's -awakening -backgrounder -Balance's -barometric -bashfulness -beautiful -belletristic -blatancy -bonbon -border -Bottom -bountifulness -breakpoints -bulkiness -businesslike -can't -cash -castle -Casual -cauliflower -celebrity -childish -chokecherry -choreographically -chronological -classification -clearheaded -coalesce -Coexistence -collaborative -coloured's -concentration -draconian -drainpipe -demonstrativeness -dependence -dependency -dream -duplication -epidemiological -equitable -Essence -Exemption -exonerate -fainthearted -falsification -ferromagnetic -flammable -fraternization -French -frontier -gadget -galleria -Gallery -gateaux -geocache -ginger -glace -glacier -globalization -hockey -holiday -housemate -intensifier -joystick -Language -leaseholder -non-breakable -northerly -o'clock -oeuvre -openhandedness -oscillation -outface -outlaw -overladen -package -palazzo -panama -Paragraphs -Parliament -particular -pasteurization -pathogen -perception -phenomena -philanthropically -physical -populations -repugnance -request -resplendence -retroactive -rigidity -schedule's -School -scintillation -sensibility -settlement -taxiway -bereft - -Слова с ошибками [] -acomplishment [accomplishment, accomplish, compliment] -anihilate [annihilate, annihilator, annihilation] -caprise [caprice, cap rise, cap-rise, apprise] -chambre [chamber, chambray] -etnographically [ethnographically, pornographically, photographically, typographically, topographically] -horsmanship [horsemanship, sportsmanship, swordsmanship, marksmanship, showmanship] -innundation [inundation, foundation, annunciation, insinuation, intimidation] -lemongras [lemongrass, lemonades] -omelete [omelette, telemeter] -retorical [rhetorical, oratorical, categorical, theoretical, reportorial] -shepishness [sheepishness, snappishness, waspishness, impishness, foppishness] diff --git a/Common/3dParty/hunspell/test/dst/en_GB.txt b/Common/3dParty/hunspell/test/dst/en_GB.txt deleted file mode 100644 index 3b8b7a1426..0000000000 --- a/Common/3dParty/hunspell/test/dst/en_GB.txt +++ /dev/null @@ -1,122 +0,0 @@ -Abbreviation -Acceptability -acquirable -Addressee -afterthought -airworthiness -all-powerful -amateurishness -amorphousness -anthology -Auspiciousness -Bibliographer -Bilberry -birthday -bodyguard -broadleaved -brontosaurus -bumptiousness -Cabaret -Californian -calumny -cancellation -cantonal -capitalize -careful -carry-on -casino -clown -co-ordinate -cockleshell -decennial -deckchair -decryption -deep-freeze -Democracy -financial -fish-plate -Flamenco -housing -Hybrid -hydroelectricity -iceboat -ichthyology -idiomatic -ill-humoured -imperatrix -individuality -interocular -intrasectoral -ironwoods -Jolliness -Jurisprudent -knowledgable -kopeks -labour-intensive -laboratory -lake -language -larynx -latching -leakiness -License -licensed -licensee -life-threatening -linguistics -long-lived -machinable -mainsheet -Major -malleability -man-hour -Mango -ninety-five -nobody -non-blocking -non-judicial -nonconforming -north-Western -nutritiousness -quasi-synchronous -question -racoon [raccoon, racoon's, contra] -radish -Railway -Rarity -saucer -Save -Saying -supplely -tallish -target -Taxi -teach-in -technician -ultramodern -umbrae -uncertainness -unconstitutionality -washing -wasn't -waxen -weather -well-formed -what's-his-name -whereupon -Wi-Fi -Wikipedia - -Слова с ошибками [] -Abstractnes [Abstractness, Abstractedness, Abstracter, Abstraction, Abstracted] -advantageusness [advantageousness, advantageous] -arhythmical [rhythmical, arrhythmical, a rhythmical, arrhythmic, arrhythmia] -autosuggestibility [auto-suggestibility] -kaptor [captor] -coldshouldering [cold-shouldering] -humaneneses [humaneness, humanenesses, humannesses, humanness, humanises, humblenesses] -imaginativness [imaginativeness, imaginative, imaginableness, imitativeness] -knight-erantry [knight-errantry, straight-eight] -magasine [magazine, magnesia, imagine] -night-wachman [night-watchman, nightmarish] -qualifidly [qualifiedly, qualified, squalidly] diff --git a/Common/3dParty/hunspell/test/dst/en_US.txt b/Common/3dParty/hunspell/test/dst/en_US.txt deleted file mode 100644 index a1cd136a72..0000000000 --- a/Common/3dParty/hunspell/test/dst/en_US.txt +++ /dev/null @@ -1,218 +0,0 @@ -apple -banana -cat -dog -egg -fish -gold -house -ice -juice -kite -lion -mouse -night -orange -pencil -queen -rabbit -sun -tea -umbrella -vase -watch -xylophone -yellow -zebra -arrow -book -cake -car -day -elephant -flower -hat -island -jelly -king -lamp -moon -nose -owl -pink -quilt -radio -sunflower -tree -unicorn -violin -water -xylophone -yellow -zoo -apple juice [applesauce] -blue -calculator -desk -elephant -fire -goat -hat -ice cream [creamer] -jacket -key -lemon -map -notebook -owl -pear -quilt -rose -soccer -table -umbrella -vegetable -whale -xylophone -yellow -zebra -apple pie [pineapple] -beach -computer -drum -elephant -goat cheese [headcheese] -hat -ice skate [cheapskate] -juice box [jukebox] -kite festival [quite festival] -lemonade -mountain -notebook paper [] -orange juice [orangeade] -pizza -queen bee [quin bee, queen bi, keen bee, ween bee] -rainbow -snow -turtle -umbrella hat [umbrella] -valley -Aberration -Absolution -Acquiesce -Adumbrate -Aesthete -Altruistic -Ambivalent -Anomalous -Antediluvian -Antipathy -Aphorism -Apocryphal -Apostasy -Apparition -Arduous -Assiduous -Audacious -Austere -Autonomy -Avaricious -Axiomatic -Baleful -Bellicose -Belligerent -Bereft -Bilious -Bombastic -Cacophony -Capricious -Cartography -Castigate -Clandestine -Coalesce -Cogent -Cognizant -Colloquy -Concomitant -Confabulate -Congenial -Conundrum -Copious -Corpulent -Coven -Credulous -Culpable -Dearth -Debilitate -Deleterious -Denigrate -Despondent -Diatribe -Dilapidated -Disparage -Dissemble -Dissonance -Duplicity -Ebullient -Egregious -Ephemeral -Equanimity -Esoteric -Euphemism -Evanescent -Exacerbate -Exhort -Expatriate -Extol -Facetious -Fatuous -Feckless -Felicitous -Feral -Fervent -Fetter -Flummox -Fractious -Garrulous -Hegemony -Iconoclast -Idiosyncrasy -Ignominious -Impecunious -Ineffable -Inexorable -Inscrutable -Insidious -Intrepid -Intransigent -Invective -Irascible -Juxtapose -Kowtow -Languid -Lassitude -Lurid -Malinger -Maudlin -Mawkish -Mendacious -Metaphysical -Antransigent [Intransigent, Intransigence, Transient, Intransitive, Transcendent] -Inwective [Infective, Invective, Ineffective, Instinctive, Inactive] -Iracible [Irascible, Acquirable] -Juxtopose [Juxtapose, Juxtaposition] -Kovtow [Kowtow, Kowloon] -Langued [Languid, Languished] -Lasitude [Lassitude, Latitude] -Larid [Arid, L arid, La rid, La-rid, Laird, Lard, Laid, Lurid] -Mallinger [Malinger, Salinger, Lingering, Lingerer, Germinal] -Haudlin [Maudlin, Handling] -Mavkish [Mawkish, Mavis] -Mendocious [Mendacious, Mendocino] -Mitaphysical [Metaphysical, Physicality, Physical] -timeline [time line, time-line, timberline] -rollout [roll out, roll-out, rollover] -workshopped [work shopped, work-shopped, works hopped, works-hopped, workshop] -deliverables [deliverable, deliverable s, deliverers, deliberative, desirable] - - diff --git a/Common/3dParty/hunspell/test/dst/en_ZA.txt b/Common/3dParty/hunspell/test/dst/en_ZA.txt deleted file mode 100644 index 89bb91d321..0000000000 --- a/Common/3dParty/hunspell/test/dst/en_ZA.txt +++ /dev/null @@ -1,114 +0,0 @@ -Acceptably -Achievement -administrate -all-day -amount -average -bilayer -blasé -boutique -breezy -byers -cabdriver -carefree -categorised -Chameleon -cheerful -chronology -cliché -cooling-off -courage -crudités -decorates -dooryard -débâcle -electromotive -equalled -Exotica -fellow-traveller -forests -full-timer -graded -habitué -haven't -hide-and-seek -home-building -interaxial -kingdom -largeness -long-distance -Majority -manoeuvre -Matrix -metier -mightn't -multidisciplinary -night-time -officio -old-style -organize -overaggressive -packing -parenthesis -pince-nez -Plaint -play-act -policy-making -Preheat -prohibit -puzzle -queue -quite -re-enact -reason -ready-made -renewal -resize -rooihout -scampi -schoolteacher -sea-green -shop-boy -sidebar -skyscraper -soundless -spelling -stakeout -synchronizing -take-off -Thereof -Trademark -transportable -treatment -tweeness -under-age -unmake -Variate -Visitant -volume -webmaster -well-prepared -window -yesteryear -first-aid -Hydrant -inconstant -network -northernmost -nowhere -souvenir -telecommunicate - -Слова с ошибками [] -afordable [fordable, affordable, a fordable, formidable, recordable, foreseeable, adorable, avoidable, avoidably] -anthropologie [anthropology, anthropologies] -bagage [baggage, bag age, bag-age, Babbage, garbage, bagged, bagel, bakgat, ribcage] -comparatif [comparative, comparator, compatriot, comparable, comparability, comparably] -flammeble [flammable, flamelike, lamentable, blameless, flamed, flammability, flamboyance] -indivizible [indivisible, individualize, indiscernible, divisible, invincible, indefeasible, inadvisability] -jetlag [jet-lag] -lettrebox [letterbox, treble, storybook, legislature] -panoramma [panorama, Panorama, panoramic, paranormal, Panamanian, pentagram, paramagnet] -posessor [possessor, possess, assessor, processor, professor, poses, posses] -selfdoubt [self-doubt] -abandonner [abandoner, abandon, bandoleer, Ndondondwane, Bannerman, abundance, abundant] diff --git a/Common/3dParty/hunspell/test/dst/es_ES.txt b/Common/3dParty/hunspell/test/dst/es_ES.txt deleted file mode 100644 index c68b9446d3..0000000000 --- a/Common/3dParty/hunspell/test/dst/es_ES.txt +++ /dev/null @@ -1,208 +0,0 @@ -nosotros -vosotros -ellos -ellas -aquí -allí -ahora -antes -después -siempre -nunca -también -solamente -verdad -mentira -bien -mal -grande -pequeño -rápido -lento -nuevo -viejo -bueno -malo -feliz -triste -bonito -feo -caliente -frío -dulce -amargo -fuerte -débil -cerca -lejos -fácil -difícil -cierto -falso -caro -barato -limpio -sucio -fuerte -débil -alto -bajo -claro -oscuro -abierto -cerrado -joven -viejo -corto -largo -alegre -tranquilo -nervioso -amable -grosero -conocido -desconocido -cortés -rudo -agradable -desagradable -sabroso -insípido -difícil -fácil -cansado -descansado -moderno -antiguo -último -primero -posible -imposible -rápido -lento -sencillo -complicado -propio -ajeno -abierto -cerrado -amable -desagradable -seguro -inseguro -correcto -incorrecto -dulce -amargo -Anacoreta -Sobrentender -Embriaguez -Inquebrantable -Empedernido -Derramamiento -Despotricar -Escafandra -Aletargamiento -Estancamiento -Descarado -Exégesis [Génesis] -Contrariedad -Espeluznante -Conspiración -Impedimenta -Deglutir -Engreído -Enmascarado -Exterminio -Embelesar -Permutación [Permutan] -Desesperanza -Impenetrable -Enarbolamiento [Enarbola miento, Enarbola-miento, Enrollamiento, Arrollamiento, Encarcelamiento, Eslabonamiento] -Errabundo -Deslinde -Inefable -Soliviantar -Embriaguez -Perdurable -Opulencia -Trémulo -Desembolso -Empedernido -Anquilosar -Enigmático -Inquebrantable -Contrincante -Desmesurado -Vanagloriar -Exasperar -Desvanecer -Perpetuidad -Desbaratar -Ineficaz -Zozobra -Elucubración -Ineludible -Desgarramiento -Atestiguar -Encascarar [Encascara, Encascaran, Encascaras, Enmascarar, Encascar, Encascar ar, Encascar-ar, Encascabelar, Encascotar, Enmascaran, Enmascara] -Desembozar -Irreverente -Soslayar -Despiadado -Embaucar -Moflete -Endilgar -Desfalco -Embelesamiento -Desestimar -Enajenación -Desavenencia -Inexorable -Atolladero -Egrégoro [Negror] -Desafiar -Afable -Enervar -Belicoso -Enervar -Descacharrante -Entramado -Inigualable -Perplejidad -Descabellado -Diligencia -Enaltecimiento -Desvergonzado -Arrebato -Empatía [Empata, Empate] -Endiosar -Peripecia -Desidia -Subversión -Desfachatado -Desfalco -Desvirtuar -Errático -Desahuciar -Envilecimiento -Empecinado -Estolidez -Despropósito -Engatusar -Culminante -Sobrentender -Enseñorear -Desacato -segguro [seguro, seg guro, seg-guro, seguiros, segur] -insseguro [inseguro, insegura] -correcto -incarrecto [incorrecto, insurrecto] -dalce [salce, dale, alce, dance, calce, dalle, dulce, d alce, cendal, cebadal, celda] -amergo [amero, mergo, amargo, amelgo, a mergo, amorgone] -Anasoreta [Anacoreta, Masoreta, Trasfretana, Asotanas, Asotanara] -Sobrententter [Sobrestante, Soberanamente, Sobriamente, Soberbiamente] -Embreagues [Embregues, Embragues, Embriagues, Embriaguemos, Embragares, Embrague, Embriague] -Inquebranttable [Inquebrantable, Quebrantable, Infranqueable, Intransitable] -Empidernedo [Empedernido, Empedernecer, Empedernir] - diff --git a/Common/3dParty/hunspell/test/dst/eu_ES.txt b/Common/3dParty/hunspell/test/dst/eu_ES.txt deleted file mode 100644 index a0335c41c0..0000000000 --- a/Common/3dParty/hunspell/test/dst/eu_ES.txt +++ /dev/null @@ -1,132 +0,0 @@ -Abantza -ñabar -abasto -abegikortasun -aberaskeria -aberetzar -abezedario -abialdi -Abiatzaile -abizari -Aboli -abonatu -absenta -absolutibo -accelerando -adabegitsu -adberbio -adiaka -adierazle -adierazkizun -adikuntza -adin -adinaro -adineratu -adin-txikitasun -administratzaile -adoleszentzia -adopzio -adostu -aerolabangailu -Aeroplano -afalordu -agente -agertezin -agiantza -agoran -arradatze -arrakasta -Batata -baterakuntza -baterakor -Bateri -batuar -baud-abiadura -batzuenganako -batzuengandik -batzuengan -batzuengatik -batzuen -baxera -berezi -berezikeria -beritzete -beroa -Beroate -beroatza -berorri -berrabiatu -berra -berresgarri -berripaper -chap -dabilzkidake -dabilzkie -dagitza -dagokik -dagozkieke -erdiondu -galdera -galtzada -garaitiar -garantia -Garaztaketa -garbitasun -gastronomiko -Gaurgero -gaurgoitik -legizkie -legokizue -legozkidake -lehenbizi -nindoakio -publikotasun -publizitate -subsidiario -substantibo -sugestio -superbalorazio -taidun -taldeburu -Talent -Teknografia -xantxa -xerbitor -xerokopia -zabaldura -Zabalkor -Zabaltza -zabilzkieken -zabilzkio -zaharkote -zeneritzeketen -zenerra -zenezagu -zengozkigute -zeniharduke -zenioke -zenioketez -zeniraute -zenizkien -zenizkiguke -Zintut -Zintuzkedan -isiltasun - -Слова с ошибками [] -abriсot [abrikot, abrigo] -absenzia [absentzia] -addikzio [adikzio, dikzio, adukzio, adizio] -administraziozerbizu [administrazio-zerbitzu, administrazio-zuzenbide, administraziopean] -bat-bates [bat-batez] -bermagari [bermagarri, bermagailuari, bermagailuri, armagaberi, bermaguneari] -cataluniar [kataluniar, catalunyar, kataluniera] -dakarza [dakartza, dakarna, dakarzu] -erdemin [erremin, erdimin, iminerdi] -garatienetarikoa [garatuenetarikoa, ugarienetarikoa, gogoratuenetarikoa, argienetarikoa, aberatsenetarikoa] -ishil [isil, istil] -nindezaguane [nindezaguena, nindezaguan, nindezaguanez, nindezaguanek, nindezaguanen, nindezaguanei, nindezaguana, nindezagunan, nindezagutean, nindezagutenan, nindezaguzue] -nintzainaken [nintzainanek, nintzainake, nintzainakeen, nintzainanen, nintzaiakeenen, nintzaiakeen, nintzakenanen, nintzaiekenan] -summa [suma, susma, sumoa] -technologiko [teknologikoko, teknologiko, terminologiko, etnologikoko] -charmant [charmat, xarmant] diff --git a/Common/3dParty/hunspell/test/dst/fr_FR.txt b/Common/3dParty/hunspell/test/dst/fr_FR.txt deleted file mode 100644 index 9b4428ca52..0000000000 --- a/Common/3dParty/hunspell/test/dst/fr_FR.txt +++ /dev/null @@ -1,211 +0,0 @@ -Bonjour -Merci -Oui -Non -S'il -Excusez-moi -Pardon -Bien -Mal -Grosse -Petit -Beau -Moche -Fort -Faible -Chaud -Froid -Vite -Lent -Haut -Bas -Loin -Près -Heureux -Triste -Facile -Difficile -Simple -Compliqué -Bon -Mauvais -Nouveau -Vieux -Jeune -Âgé -Bienvenue -Amitié -Amour -Famille -Travail -Maison -Voiture -Manger -Boire -Courir -Marcher -Nager -Chanter -Dormir -Jouer -Parler -Écouter -Regarder -Lire -Écrire -Acheter -Vendre -Aller -Venir -Faire -Dire -Voir -Savoir -Apprendre -Aimer -Détester -Partir -Rester -Arriver -Revenir -Partager -Aider -Aimer -Ouvrir -Fermer -Manger -Boire -Avoir -Être -Pouvoir -Vouloir -Devoir -Parler -Écouter -Rire -Pleurer -Danse -Étudier -Travailler -Voyager -Vivre -Connaître -Reconnaître -Voyager -Exister -Choisir -Donner -Recevoir -Aimer -Oser -Phénoménologie -Électroencéphalographie -Parallélépipède -Anticonstitutionnellement -Transsubstantiation -Éclectisme -Anachronisme -Catéchuménat -Démagogie -Fructueux -Ineffable -Hypothèque -Propriété -Procrastination -Complaisance -Réminiscence -Éthique -Équinoxe -Exponentiel -Hétérogénéité -Imbroglio -Incorrigible -Maelström -Métaphysique -Protagoniste -Subliminal -Verrouillage -Volumétrique -Énigmatique -Époustouflant -Immatériel -Infini -Polyglotte -Recrudescence -Prophylactique -Symbiotique -Vestibulaire -Épistémologie -Faramineux -Géopolitique -Hypnotique -Inamovible -Intemporel -Labyrinthe -Pacifiste -Quémandeur -Soporifique -Ubuesque -Volumineux -Effervescence -Électrophorèse -Paradoxe -Prorata -Quadrupède -Sarcophage -Trigonométrie -Vaccinologie [Carcinologie, Actinologie, Vaccinogène, Accidentologie] -Xenophobe [Xénophobe, Technophobe] -Zéphyr -Génétique -Labyrintique [Labyrinthique] -Mégalo -Nostalgie -Omniprésent -Pangramme -Périlleux -Quinquennat -Rémunération -Scolopendre -Tautologique -Utopiste -Vexatoire -Wolof -Xanthine -Yacht -Zanzibar -Axiomatique -Chronométrer -Dilettante -Énervement -Facétieux -Générique -Harmonique -Illusoire -Juridique -Kabbaliste -Longetivité [Longévité] -Médiane -Néologisme -Oxygène -Patronymique -Quotidien -Rétorique [Rétorque, Rhétorique, Rotorique, Ré torique, Ré-torique, Météorique, Torique, Théorétique, Théorique] -Sémantique -Tautologie -Utopique -Vaccinologie [Carcinologie, Actinologie, Vaccinogène, Accidentologie] -Xénophobie -Yachting -Zoroastrisme -Voager [Viager, Voyager, Ouvrager] -Exisster [Exister] -Chaiser [Chaires, Chaise, Chaisier, Chaises, Chasser, Chaise r, Chamoiser, Tchadiser] -Doner [Toner, Zoner, Donner, Drone, Doser, Doter, Dorer, Douer, Doler, Doper, Dîner] -Resevoir [Redevoir, Recevoir, Revoir, Reversoir, Ivoire, Voire] -Aimmer [Aimer] -Osero [Oser, Osera, Oser o, Rosser, Roeser, Rose] -Phénoménollogie [Phénoménologie] -Électraencéphallographie [] -Parallélépepède [Parallélépipède] - diff --git a/Common/3dParty/hunspell/test/dst/gl_ES.txt b/Common/3dParty/hunspell/test/dst/gl_ES.txt deleted file mode 100644 index 74cc688633..0000000000 --- a/Common/3dParty/hunspell/test/dst/gl_ES.txt +++ /dev/null @@ -1,120 +0,0 @@ -ola -tipo -Si -non -nonnr [nono] -comida -comidaa [comídaa, comidas, comida, comidan] -auga -augaa [áugaa, augas, auga, augaba, augada, augala, augara, augar] -casa -coche -cochee [coches, coche, chochee, cachee, checo] -un tren [oin tren] -bicicleta -escola -escolaa [escóraa, escoala, escolas, escola, escálaa, escolla, escolma, escolar, escolta] -niños -pai -paii [paio, pai, pii, aii, pali, pais] -nai -naii [nai, nii, aii, naif, nais, nazi] -irmá -irmán -cachorro -gato -gatoo [gato, atoo, gateo, gatos] -peixe -peixee [peidee, peixes, peixe, peitee] -aves -avess [aveas, avesa, aves, avesas, avesos, vesas, aveso, aveces, escave] -árbore -flor -herba -o sol [ou sol] -lúa -o ceo [ou ceo, o ceou] -chuvia -neve -vexa -inverno -primavera -outono -noite -noite -día -unha semana [semanalmente] -mes -ano -para ler [parable] -escribir -fala -ensinar -traballo -durmir -durmir -correr -vai -senta -estado -para escoitar [parasitario] -vexa -escoita -hai -beber -carne -furtas -verduras -queixo -pan -auga -zume -café -té -leite -aceite -ovo -sal -impacienta -azucre -un bocadillo [oin bocadillo] -cociña -sala de estar [sala dei estar] -dormitorio -baño -batela -sofá -lámpada -fiestra -a porta [aporta, portara, portador, porta] -piso -teito -parede -sofá -alfombra -baño -afundir -espello -toalla -cama -manta -almofada -reloxo de alarma [riloxo de alarma, ríloxo de alarma, reiloxo de alarma, reloxo dei alarma, relouxo de alarma, reloxou de alarma, relollo de alarma] -escritorio -cadeira -marabilloso -adverbio -obviamente -Dominante -residenciais -convidado -perigo -cuestión -deporte -mina -cordeiro -cabeza -tratar -avogado -intelixente -guapo diff --git a/Common/3dParty/hunspell/test/dst/hr_HR.txt b/Common/3dParty/hunspell/test/dst/hr_HR.txt deleted file mode 100644 index 6ce3b0a071..0000000000 --- a/Common/3dParty/hunspell/test/dst/hr_HR.txt +++ /dev/null @@ -1,215 +0,0 @@ -boliestan [bolestan, obijestan] -jyak [jak] -slaby [slabu, slab, slaba, slabe, slabi, slabo] -pameetan [pametan, pametna, napamet] -gllup [glup] -bezuspješhno [bezuspješno, bezuspješnih, bezuspješan, bezuspješna] -besimeni [besi meni, besi-meni, bezimeni, besanim] -bezuzban [bezuman, bezuba] -blagastanje [blagostanje, blaga stanje, blaga-stanje, blagostanja, blistanje, oblaganje] -bljeskovica [bljeskovima, bljeskovi, bljeskova, bljeskalica, bljeskavi] -jabuka -sunce -voda -kuća -ptica -kava -kruh -cvijet -knjiga -pas -mačka -grad -zelen -plav -crven -bijel -crn -velik -malen -brz -spor -sretan -tužan -vruć -hladan -nov -star -lijep -ružan -dobar -loš -zdrav -bolestan -jak -slab -pametan -glup -raditi -jesti -piti -spavati -čitati -pisati -govoriti -smijati se [smijati] -plakati -pjevati -igrati -plesati -učiti se [učiti] -kupovati -kuhati -telefonirati -gledati -slušati -hodati -trčati -letjeti -plivati -čitati -pisati -raditi -imati -biti -ići -doći -otići -dati -uzeti -reći -vidjeti -čuti -osjetiti -misliti -htjeti -moći -morati -rado -nerado -da -ne -molim -hvala -doviđenja -oprosti -zbogom -zdravo -čau [ča, ču, čađu, čaju, čamu, času, čađ, čaj, čak, čar, čas, ča u] -ej -da -baš -super -glupost -fantastično -jasno -tako -zapravo -možda -lako -teško -prozračnost -usplahirenost -neoblomivost [neslomivom] -prezir -proigranost [prostranost, programiranosti, razigranosti, pristranost] -uznemirenost -besprijekornost -besprizornost [besprizornom, besprizornoj, besprijekornost, besprizorni] -nepredvidivost -beznadnost -promašenost [promašenosti, promašen, osiromašenom, raspršenost] -protivljenje -neizreciv -bezizlaznost -neuspjelost [neuspjeloj, neuspješnost, neuspjelog, neuspjelom] -zbunjenost -neodlučnost -protivština -nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] -bezduhovitost [bez duhovitost, bez-duhovitost, duhovitostu, duhovitosti, duhovitosta, duhovitost] -ravnodušnost -prolaznost -neobaveznost [neobaveznosti, neobaveznom, neobaveznoj, neobavezna, neobavezni] -bezbrižnost -nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] -promašenost [promašenosti, promašen, osiromašenom, raspršenost] -neprepoznatljivost [neprepoznatljivosti, ne prepoznatljivost, ne-prepoznatljivost, prepoznatljivosti, prepoznatljivost, neprepoznatljiva, neraspoznatljivosti] -neukrotivost [neukrotivog, neukrotiv, neučtivost, neotuđivosti] -bezobzirnost -nevinost -nestalnost -nepostojanost -bezizlaznost -nepovratnost [nepovratnoj, nepovratnom, nepovratna, nepovratnima] -prolaznost -neodgovornost -bezbrižnost -nevolja -nezadovoljstvo -prolaznost -bezuspješno -bezimeni -bezuzdan [bez uzdan, bez-uzdan, bezdan, bezdušan, beznadan] -blagostanje -bljeskavica [bljeskalica, bljeskavima, bljeska vica, bljeska-vica, bljeskavi, bljeskalici, bljeskava, bljeskalicu] -boren [borne, obrne, bore, oboren, borbena] -carovnija [otrovnija, darovnica] -crpeža [crteža] -dostojanstvo -duhovitost -egzaltacija -gorkoća [gorkoga, gorkošću] -histerija -idila -ironija -izdaja -janjetina -kajanje -kavana -krhotina -ljepljivost -lukavstvo -magnutizam [zategnutima, zamahnutima, izdignutima, vagnutima] -melankolija -misticizam -naivnost -nelagoda -neraspoloženje -obmana -okrutnost -opojenost [opojnost, obojenost, opojenoj, popunjenost, podvojenost, opčinjenost] -prezir -propast -ravnodušnost -sjenka -skitnica -spletka -stid -sudbina -susret -sudbina -šapat -tišina -trepet -utopija -uzaludnost -veličanstvo -zaborav -zanesenost -zanos -zavjera -zbunjenost -zluradost [zluradosti, zlu radost, zlu-radost, zlurad] -zloslutnost [zloslutnoj, zloslutnom, zloslutnu, zloslutna] -žargon -žártva [žrtva] -šaptanje -čarobnost -dileme -hodočasće [hodočaste, hodočašće] -lebdjeti -iznimka -preobilje [preobilne, preoblikuje] -probuditi se [probuditi] -surov diff --git a/Common/3dParty/hunspell/test/dst/hu_HU.txt b/Common/3dParty/hunspell/test/dst/hu_HU.txt deleted file mode 100644 index c925ed03d0..0000000000 --- a/Common/3dParty/hunspell/test/dst/hu_HU.txt +++ /dev/null @@ -1,114 +0,0 @@ -Szorzótábla -Réges-régen -normálméret -nemeslelkűség -mindegyik -milliós -Mikroflóra -Mezőgazdaságigép -meséskönyv -mennyiség -Memória -kártya -kuráre -Kurzor -jégkorong -jellemesség -Javak -irányzás -iromány -Inkluzíve -hűtőedény -hőmérséklet -hír -hétszázas -hátrány -háromszáz -Hintó -generátor -gavallérság -explozíva -eső -esdeklés -epilógus -Energia -Előélet -előterjesztés -előnézet -elvonás -elszigetelés -ellátmány -Elevátor -egynémelykor -egyenlőség -eddzenek -dzsungel -ananász -akvárium -Szépül -Sztorizik -szobroz -szimbolizál -szemlélődik -sugdolózik -majmol -Macskáz -Létesít -Lokalizálódik -litografál -levelesedik -lepet -közömbösít -kételkedik -kivirágoz -kerekez -kedvez -járkál -jegyzőkönyvez -iskolázik -individualizál -csendesít -borsoz -billentet -bajmolódik -anyagozik -alkonyodik -Aktualizál -színes -szemelt -lassú -hatékony -hasznos -gyúlékony -gyári -abszurd -örökjog -öregkor -ömlő -Zászlaj [Zászlajú, Zászlaja, Zászlai, Zászlóalj] -Zseblámpa -regényirodalom -realitás -raktárhelyiség -pötty -pótlék -pótdíj -pályafutás -Promóció -Processzus -poloska -pernye -pediáter -parancsnoklás - -Слова с ошибками [] -sponzorálás [szponzorálás, szponzorál, zongorálás] -mihamarábiak [mihamarábbiak, mihamarabbiak, mihamarábbi, hamarábbiak, mihamarább] -idohatár [időhatár] -hypnotizmus [hipnotizmus, nepotizmus] -departement [département] -légiesul [légiesül, légiósul] -kutagat [kutatgat, kutazgat, kutasat, kutakat, kutadat, kutamat, kútagát, kútágat, kútágát, kutat] -költségtakkarékos [költségtakarékos, költségtakarékkos, költséghatékony] -redukzió [redukció, redukáló] -pilanatfelvétel [pillanatfelvétel, pialantfelvétel, adatfelvétel] diff --git a/Common/3dParty/hunspell/test/dst/id_ID.txt b/Common/3dParty/hunspell/test/dst/id_ID.txt deleted file mode 100644 index 2d95d3b740..0000000000 --- a/Common/3dParty/hunspell/test/dst/id_ID.txt +++ /dev/null @@ -1,121 +0,0 @@ -acang-acang -Adiksi -Adventisius -Advokat -afirmatif -agroindustry [agroindustri, nonindustri] -agrisilvikultur -akhir-akhir -akomodatif -aksi -aljabar -anggul -anotasi -antusiasme -apoteker -bahagia -bakat -bangkang -Bankir -Barikade -bebaru -belar -beleid -bencana -bentangur -beritawan -besuk -bilingualisme -Cecak -Celempong -cencawan -cengkar -ceremai -cermin -cudang -Dampal -dampan -dansa -datung -debitur -defensi -defisit -demper -dendang -Derivasi -Desember -deskripsi -diskotek -diskusi -distansi -dragon -dramatisasi -Eksamen -Eksistensi -eksperimen -ekstensifikasi -ekuitas -elektron -gelut -Geofisikawan -Gerbang -gerempang -influenza -Informasi -Inisiator -insekta -institusional -instruksional -jelajah -Kamrad -Kapilaritas -kapster -kardiovaskular -karismatik -keranjingan -komunal -Limitatif -Linguistik -lintang -masabodoh [masa bodoh, masa-bodoh, mastodon] -matematikus -medisinal -Melankolia -Memorabilia -nasional -nasionisme -Panen -pangkek -peranti -perian -persekusi -perunjung -regenerasi -reglementer -robotika -runjang -Sabtu -Simbang -simpati -tebing -topi -Unggal -unsuri -urbanisasi -variabel -wahana -warganegara [warga negara, warga-negara, negarawan, antarnegara, mancanegara, waranggana] - -Слова с ошибками [] -Abonement [Abonemen, Bombardemen] -Abcente [Absente, Centet] -ambivalan [ambivalen, ambilan, ambalan] -bakteriostatic [bakteriostatik, bakteriolisis] -cekaw [cekat, cekak, cekau, cekam, cekal, cekah, kacek] -darmavisata [darmawisata, darmatirta, mandataris] -declarasi [deklarasi, deflagrasi] -duplex [dupleks] -ecozona [ekozona, eco zona, eco-zona] -gempur-mengempur [gempur-menggempur, gempul-gempul] -jejengok [jejengkok, jengkeng] -transitive [transitif, transvetisme, transit, transisi] diff --git a/Common/3dParty/hunspell/test/dst/it_IT.txt b/Common/3dParty/hunspell/test/dst/it_IT.txt deleted file mode 100644 index 5b9d3363bd..0000000000 --- a/Common/3dParty/hunspell/test/dst/it_IT.txt +++ /dev/null @@ -1,200 +0,0 @@ -Ciao -Ciaoo [Ciao, Ciano, Ciao o, Ciocia] -Buongiorno -Buonasera -Buonassera [Buonasera, Buon assera, Buon-assera, Buonalbergo] -Grazie -Prego -Arrivederci -Buonanotte -Scusa -Per favore [Favorevole] -Amore -Amico -Famiglia -Casa -Città -Strada -Montagna -Montaga [Montagna, Montata, Montana, Montala, Montava, Montaggi, Montaguto, Montano, Montato] -Mare -Sole -Luna -Stelle -Giorno -Notte -Colazione -Clazione [Colazione, Coazione, Cl azione, Cl-azione, Clonazione, Collazione, Clorazione, Chelazione] -Pranzo -Cena -Acqua -Vino -Caffè -Pane -Formaggio -Pasta -Pizza -Gelato -Dolce -Salato -Frutta -Verdura -Carne -Pesce -Pollo -Uovo -Sale -Pepe -Olio -Burro -Zucchero -Latte -Yogurt -Insalata -Zuppa -Bistecca -Prosciutto -Parmigiano -Biscotti -Cioccolato -Spagggrhetti [Spaghetti, Spaghetteria] -Spaghetti -Lasagne -Risotto -Gnocchi -Penne -Ravioli -Cannelloni -Pesto -Caprese -Limoncello -Espresso -Cappuccino -Tiramisù -Panna cotta [Panbiscotto] -Cannoli -Panettone -Brioche -Focaccia -Foacdccia [Focaccia] -Crostini -Arancini -Antipasto -Primo piatto [Rimpiattato, Primariato, Rimpiatto, Rimpatriato] -Secondo piatto [Attosecondo] -Contorno -Pane tostato [Tostapane] -Marmellata -Accoglienza -Affascinante -Aggressività -Alleviare -Appassionato -Armonioso -Autonomia -Autovfnomia [Autonomia, Autotomia] -Barbarie -Beneficiare -Bizzarro -Burocrazia -Cambiamento -Capriccioso -Cautela -Commemorare -Comportamento -Conseguenza -Controverso -Coraggioso -Debolezza -Decisivo -Delizioso -Desiderare -Destrezza -Determinato -Determin [Determina, Determini, Determino, Determinò, Termine] -Difficoltà -Disponibilità -Divertimento -Eccentrico -Efficienza -Elettrizzante -Emergere -Empatia -Energia -Equilibrio -Esperienza -Fantastico -Fenomenale -Generosità -Gratitudine -Immaginazione -Impressionante -Impressiante [Impressi ante, Impressi-ante, Impressionante, Impressionate, Imprestante, Impressioniste] -Indipendenza -Ingenuità -Innovazione -Intelligenza -Intensità -Intrigante -Ispirazione -Instabilità -Irresistibile -Leggenda -Libertà -Luminoso -Magistrale -Malinconia -Meraviglioso -Metamorfosi -Miracolo -Misterioso -Nostalgia -Opportunità -Originalità -Passione -Pericoloso -Prestigioso -Prodigioso -Prospettiva -Raffinato -Rafinato [Raffinato, Rapinato, Affinato, Trainato, Raffrenato, Raffilato] -Ricchezza -Rispettoso -Sensibilità -Sorprendente -Spontaneità -Spontaneita [Spontaneità, Spontaneista] -Stravagante -Suggestivo -Surreale -Tenerezza -Trasformazione -Unicità -Vibrante -Vittoria -Volontà -Amicizia -Avventura -Bellezza -Calma -Danza -Eleganza -Felicità -Gioia -Incanto -Magia -Natura -Odore -Passatempo -Quotidiano -Relax -Serenità -Tesoro -Umorismo -Vacanza -Zelo -Avventuriero -Speranza -Risate -Armonia -Incanto diff --git a/Common/3dParty/hunspell/test/dst/kk_KZ.txt b/Common/3dParty/hunspell/test/dst/kk_KZ.txt deleted file mode 100644 index 3547d29f05..0000000000 --- a/Common/3dParty/hunspell/test/dst/kk_KZ.txt +++ /dev/null @@ -1,209 +0,0 @@ -сөз -адам -қала -тау -ауа -су -аспан -жер -бала -ата -ана -тамақ -кітап -ұстаз -оқу -тұтыну -тыныш -тұз -ауру -денсаулық -топ -маусым -төс -көз -жүрек -сарғыш -көп -аз -ертең -түн -түс -жас -қара -ақ -көк -қызыл -шай -салт -ыстық -суық -қазақ -жеті -он -жүз -мың -бір -екі -үш -төрт -бес -алты -жеті -сегіз -тоғыз -он -бақша -бұлақ -қиыр -досым -ақша -патша -таң -кеш -тауар -күн -апат -риза -ауырсыну -орман -жаңбыр -бауыр -жел -тұман -үй -бұлақ -көше -айнала -шайыр -тағам -сусын -топ -бас -әрекет -тіл -кеме -сиыр -қой -ешкі -шөп -ит -тұқым -қарындаш -апа -ана -әке -дала -тарлау -дәуір -таңдай -жыл -басқарушылар -басқарушшылар [басқарушылар, басқарушы, басқармасылар, басқаруғалар, бақылаушыларлар] -жауапкер -ерекшеліктерімендерге -тұмылдырықтатқыздан -білімділігінге -білімдарды -алалықсыздар -айырмашылықтарын -тұрақтандырып -сылтауратқандарыңызды -қолдар -байланысқадан -жетілдірілген -зарарсыздандырады -ескеріп -ескеріпп [ескеріп, ескеріпі, ескеріле] -міндеттемелеріндерге -кезеңдердің -себепсіздік -біреудейлер -беделілерің -кездестіріңіз -шектердің -көңіл -көңл [көң, көл, көңіл, көңі] -мол -алайда -мәселе -мәселеу [мәселе, мәселең, мәселен, мәселес, мәпелеу, мәуелеу, мәселем, мә селеу, селеу] -сендің -келер -келерр [келер, керлер, келері, кереле, еркеле, кермеле, келекеле] -кәне -көпір -күндіз -сана -белгілер -дайын -ез -қайшы -саф -рең -шақ -үміткер -бақыт -бақытт [бақыт, бақытта, бақытты, бақырт, бақыты] -республика -консервациялау -мемлекеттік -тағатсыздан -адамда -бәрі -бең -беңр [бең, бер] -жасағанда -жасағоанда [жасағанда, жасалғанда, жасасқанда, жасаманда, жасақанда] -жабайылық -заманда -көшірдік -мерейі -Мерейій [Мерейі, Мерейің, Мерейім, Мерейлі, Мерей, Мейір] -мөлшерсіздікк [мөлшерсіздік, өлшемсіздік, мөлшерсіз, өлшеусіздік] -мөлшерсіздік -пенді -тылда -мәртебесімен -аппаратпен -тегінді -кездеме -ересектік -көңілсіздік -тәуекелсіздік -қанағатсыздық -ғаділетсіздік -сайдақы -басым -тәжікеден -тұрғын -қонақ -қауіпсіздік -қадірсіздік -білгішсінбейсіңдер -талқандас -кешікті -қоздырғышы -бас -емдейсіңдер -құқылы -тақылет -әдемі -көткеншектейсіңдер -әжет -қайтар -белсену -түсінбеймін -жағымсыздық -сыздар -мәртебесі -тұрғыны -мезгіл -әлбетте -барысын -оқылған -безге -жаса -аламаңдайсыңдар -кереметті -епетейсіздік diff --git a/Common/3dParty/hunspell/test/dst/ko_KR.txt b/Common/3dParty/hunspell/test/dst/ko_KR.txt deleted file mode 100644 index 5d30797f0c..0000000000 --- a/Common/3dParty/hunspell/test/dst/ko_KR.txt +++ /dev/null @@ -1,157 +0,0 @@ -안녕하세요 -감사합니다 -사랑해요 -미안합니다 -음식 -친구 -가방 -집 -학교 -컴퓨터 -물 -밥 -책 -산 -바다 -날씨 -일 -노래 -치킨 -반찬 -꽃 -숙제 -가족 -아이 -게임 -영화 -생일 -시간 -동물 -여행 -차 -쇼핑 -추천 -대화 -전화 -사진 -운동 -잠 -병원 -음료수 -능력 -주말 -전자기기 -고양이 -강아지 -바나나 -가을 -겨울 -봄 -여름 -옷 -신발 -지하철 -택시 -버스 -비행기 -샴푸 -브러시 -삼계탕 -국수 -불고기 -된장 -김치 -먹다 -마시다 -보다 -듣다 -놀다 -하다 -가다 -오다 -서다 -늦다 -일어나다 -자다 -빨갛다 -파랗다 -노랗다 -녹색 -보라색 -맛있다 -시원하다 -덥다 -추운 -기분 -슬프다 -즐겁다 -정신이 -바쁘다 -참새 -나비 -병아리 -돌 -물고기 -향신료 -시장 -기차 -공원 -해변 -지갑 -병원 -대학 -교통 -공항 -천재 -연구 -일본 -중국 -사업 -지식 -성격 -자금 -기술 -정부 -전략 -협력 -혁신 -경제 -철학 -신체 -영감 -현상 -역사 -태양 -설명 -사회 -환경 -자연 -현실 -존경 -정확 -장애 -낙관 -발전 -절망 -일상 -소멸 -도전 -반복 -포기 -파괴 -혁혹 [현혹, 혈족] -소외 [쇠오, 소아, 시외, 소오, 소에, 소의, 소와, 소요, 소유, 소위, 소야, 소되, 소뇌, 소 외, 소외감] -식민지 -혐오 -출산 -행복 -불평 -판매 -위험 -안녕하ㅎ요 [안녕하다] -감사합ㅅ다 [감사하다, 감사하여가다, 감사해가다] -사랑ㄱ해요 [사랑해요, 사랑해내요] -미안ㅎ합니다 [미안합니다, 미안한체합니다, 미안할만합니다, 미안해갑니다, 미안하여갑니다] -친ㅔ구 [친구] -가ㅎ방 [가방, 감방] - diff --git a/Common/3dParty/hunspell/test/dst/lb_LU.txt b/Common/3dParty/hunspell/test/dst/lb_LU.txt deleted file mode 100644 index 37c698dbc9..0000000000 --- a/Common/3dParty/hunspell/test/dst/lb_LU.txt +++ /dev/null @@ -1,118 +0,0 @@ -Aarbecht -Aarbechtszäitorganisatioun -Aartgenoss -Abenteuer -abrëll [Abrëll, brëll] -absence [Absence] -Abusives -Abzebillercher -Acquéreur -Adjointeë -Affischéiertes -Airbussen -Alldeegleches -Angschtzoustä -Basketballspiller -Baufirme -bauren [Bauren, bauen, brauen] -bekanntes -Beleg -Berodung -Bewältegung -Datentransfer -Dateschutz -Decisives -Donneschden -Drangsaléiertes -Dränk -Giischtgen -Grondlag -grondreegel [Grondreegel, grondleeënd] -Géies -Handelsdag -hausaufgab [Hausaufgab, ausbaufäheg] -hierschtdag [Hierschtdag, hierarchescht] -Häerzi -Industriell -Infrastrukturelles -Interessi -Internetfore -Intervall -Kamell -Kantoner -Karamell -Klenges -Nopeschhaus -Motors -Muer -Muerenter -Musek -Nettoverméige -niess [miess, Niess, iess, giess, Siess, Fiess] -Protektioun -Prouf -Provisioun -Prozessor -Präis -Präsens -Sanitäres -Schauspiller -Schema -Taxatioun -Telefonsgespréich -termingrë [Termingrë, verminnte] -terrass [Terrass, zerrass] -Textdatei -Textsprooch -Titulaire -Titel -erausféieren -erausjoe -gëeicht -onglécklecherweis -unzesammelen -unzespille -Approvisionnement - -Сложные слова [] -Aktiegesellschaft -Aktivitéitsdéclaratioun -Alarmstëmmung -Allgemengverständleches -Bankenoperatioun -Bensinsreserven -Besteierungsofkommes -Diskriminéierungsmoossnam -Dokumentatiounsaarbecht -Haaptrecommandatioun -Héchstgeschwindegkeet -Héichproblematesches -Hëllefsdéngscht -Integratiounsméisseges -Iwwersetzungsprogramm -Kapitaliséierungsdimensioun -Museksinstrument -Publicitéitsmarché -Transportproblem - -Слова с ошибками [] -Abonnnement [Abonnement, Joresabonnement, Abonnenti, Abonnent, Agebonnent] -Accomodéiertes [Accommodéiertes, Accommodéiert, Accordéiertes, Accommodéiers] -Agrarcenter [Agrarzenter, Agrozenter] -Begrennung [Begrënnung, Begrenzung, Benennung, Verbrennung, Begrenzen, Trennung] -Berodunszentren [Berodungszentren, Berodungszentre, Berodungszentr, Berodungszenter] -Deeluung [Deelung, Andeelung, Opdeelung, Verdeelung, Zelldeelung] -Dialogue [Dialoge, Dialog] -Dictaten [Diktaten, Dichten] -Inspektor -Iwereileges [Iwwereileges, Iwwereilegtes, Iwwereileg, Iwwerfälleges] -Pedagogik -Televisionschaîn [Televisiounschaîn, Televisiounsgeschäft] -Bechäftegungsméiglechkeet [Beschäftegungsméiglechkeet] -Gläicheetspolitik [Gläichheetspolitik, Sécherheetspolitik, Gesondheetspolitik, Geschäftspolitik, Dechetspolitik] -Musekheichschoul [Musekhéichschoul, Museksschoul] -Satelliten [Satellitten, Satellitte, Satellit] -Addressbichelchen [Adressbichelchen, Reklammbichelchen] -Aarbechtsfield [Aarbechtsfeld, Aarbechtsgefier, Aarbechtsblieder, Aarbechtsatelier, Aarbechtsalldag] - - diff --git a/Common/3dParty/hunspell/test/dst/lt_LT.txt b/Common/3dParty/hunspell/test/dst/lt_LT.txt deleted file mode 100644 index 09068f6d85..0000000000 --- a/Common/3dParty/hunspell/test/dst/lt_LT.txt +++ /dev/null @@ -1,127 +0,0 @@ -Abstraktus -šachmatai -žadintoja -agurkas -Aikštė -Akinukai -akmuo -šakoti -aktualinti -aktorius -šalinis -šaltinis -bernystė -beskuo -būgnelis -Bilietas -bilingvizmas -daržavietė -Darbadienis -Darbas -darbuotoja -dargi -daržinė -daugintoja -Daugiaveiksmis -delnė -įdelnis -detalizuoti -šerdelė -erdvėti -šeriškas -šeštadienis -etiketas -Evoliucija -fabrikantė -Fantastika -Fenomenas -fikusas -gaudinėti -gausėja -gūbrinti -geležis -geležtė -gelsvis -geranoris -Gertys -gerviukas -giesmininkė -Gikas -Goža -griaustinis -grįžinys -gėrioja -griozdas -grizijo -gryčia -grožėja -grįžti -grupė -gąstauti -Jaukas -jodinėjo -jodyti -keturnagis -Kiaušina -Kiaurymė -kiausta -kietakaktis -ūkiškas -kilimėlis -kilometrinis -ūkininkaitė -ūkinis -krykti -lapuotis -laukas -laupti -laužtė -Maudulys -Maumedis -mažutėlis -mazgotuvė -mechanikė -medeinė -medikamentinis -meduolinis -Nūdien -nebrendėlė -Negu -neiginys -parudenys -pasakotojas -pasausė -pasieninis -paskyriui -paslapčiom -Pasodas -Pat -Pataikūniškas -patarška -patentinis -proskyna -protekiniais -provizoriškas -rėkčioti -rūmas -rodyklinis -Romanistas -Skylmatis -Skyriklis -skolininkas -skraidžioja -skruzdėda -skėtrus - -Слова с ошибками [] -Abbreviatūra [Abreviatūra, Klaviatūra] -alpinismas [alpinsimas, alpinimas, alpinistas, alpinizmas, alpinistinis, alpinistini, alpinamas, alpinariumas] -amortizacia [amortizacija, amortizacini, amortizavo, amortizuoti] -daugiamžis [daugiaamžis, daugiaamži, daugiamatis, daugiametis, daugiažiedis] -deziderativinis [dezideratyvinis, dezideratyvini, prezidentinis, rezidentinis] -generazija [generacija, energija] -keturiasdešimtūkstantas [keturiasdešimttūkstantas, keturiasdešimttūkstanta, aštuoniasdešimttūkstantas, šešiasdešimttūkstantas, aštuoniasdešimttūkstanta] -krivuluoja [krivuliuoja, kreivuliuoja, kultivuoja] -Šnaukstai [Šnaukštai, Niaukstai, Šniauktai, Šniaukštai, Auksintai] -pazintinis [pažintinis, parazitinis, pantinis, patentinis, panteistinis] -progresa [progresai, progresas, progreso, progrese, progresu, progresą, progresų, progresavo, progresija] diff --git a/Common/3dParty/hunspell/test/dst/lv_LV.txt b/Common/3dParty/hunspell/test/dst/lv_LV.txt deleted file mode 100644 index 6cd9ccc2a0..0000000000 --- a/Common/3dParty/hunspell/test/dst/lv_LV.txt +++ /dev/null @@ -1,205 +0,0 @@ -Sveiks -Sveikks [Sveiks, Sveikas, Sveikās, Sveikts, Sveikus, Sveikos, Sveikt, Saveiks, Ieveiks, Veiks] -Labrīt -Lbrīt [Larīt, Lorīt, Labrīt] -Paldies -Paldiess [Paldies, Paliess, Palaidies] -Lūdzu -Luzu [Lizu, Ludzu, Auzu, Zuzu, Guzu, Lauzu, Lupu, Lubu, Lugu, Lūzu, Luču] -Atvainojiet -Atvainvfojiet [Atvaimanājiet] -Prieks -Perieks [Peries, Prieks, Persiks] -Draugs -Dravfugs [Draugs] -Ģimene -Gimene [Ķimene, Ģimene] -Māja -Maja [Maija, Paja, Raja, Laja, Maža, Maka, Mija, Mana, Masa, Māja, Mata, Maša, Maza, Mala] -Pilsēta -Pilseta [Pilsēta, Pil seta, Pil-seta, Piebilsta] -Ceļš -Ceļšs [Ceļš, Ceļošs, Ceļas, Ceļus, Ceļos] -Kalns -Jūra -Sauls [Auls, Kauls, Rauls, Pauls, Salus, Sauks, Sals, Saules, Sakuls, Saulēs, Saguls, Sulas, Salsu, Sauli, Sauss] -Mēness -Zvaigznes -Diena -Nakts -Brokastis -Pusdienas -Vakariņas -Vīns -Kafija -Maize -Siers -Makaroni -Pica -Saldējums -Deserts -Sāļš -Augļi -Dārzeņi -Gaļa -Zivis -Vistas -Ola -Sāls -Pipari -Eļļa -Sviests -Cukurs -Piens -Jogurts -Salāti -Zupa -Salds -Šokolāde -Spageti -Rīsi -Kakao -Biezpiens -Kūka -Tēja -Karalis -Zelts -Ezis -Tulpe -Lācis -Kaķis -Suns -Putns -Vārna -Zaķis -Pele -Ābols -Aita -Zirgs -Lauva -Pūķis -Lasis -Vilks -Vējš -Uguns -Ūdens -Zeme -Debesis -Saule -Rūpniecība -Aizkustinošs -Izdzīvošana -Nepieciešamība -Atbildība -Lieliski -Apmierināts -Neparasts -Izglītība -Sarežģīts -Atsevišķs -Pamatots -Organizācija -Sadarbība -Efektīvs -Daudzveidīgs -Novērtēt -Pārsteidzošs -Inovatīvs -Vērtība -Aizraujošs -Nopietns -Komunikācija -Māksla -Dzīvība -Ekskluzīvs -Tehnoloģijas -Rezultāts -Atbalsts -Nodrošinātība -Pārbaudīt -Radošs -Sociāls -Izteiksmīgs -Brīvība -Pieredze -Ietekme -Pārmaiņas -Drosmīgs -Racionāls -Empātija -Izpratne -Risinājums -Iespējas -Atklāts -Vadošais -Eksperimentāls -Neatkarība -Tīrība -Samierināšanās -Motivācija -Harmonija -Dinamisks -Iedvesma -Izglītojošs -Komplicēts -Pieejamība -Sadarbība -Tūlītējs -Saprotams -Neizsakāms -Lieliskums -Inovācijas -Aizrautība -Pārdomas -Sapratne -Rezultatīvs -Iespējams -Pārbaude -Sociālais -Izteiksme -Brīvība -Pieredzējis -Ietekmīgs -Pārmaiņu -Racionāla -Izpratni -Risinājumi -Iespējams -Atklāta -Vadošā -Eksperimentāla -Neatkarība -Tīra -Motivējošs -Harmonisks -Dinamika -Iedvesmojošs -Spēks -Mīlestība -Pasaule -Daba -Skaistums -Miers -Sapnis -Prieks -Rītausma -Brīnums -Izcils -Saikne -Dzirksts -Pārmaiņas -Atbalsts -Izcilība -Satriecošs -Dzīvīgums -Pārveidošana -Uzdrīkstēšanās -Uzticamība -Ieguldījums -Vērtība -Līdzsvars -Saskaņa -Izsmalcinātība -Pateicība -Atzinība -Pārsteigums diff --git a/Common/3dParty/hunspell/test/dst/mn_MN.txt b/Common/3dParty/hunspell/test/dst/mn_MN.txt deleted file mode 100644 index b590811bfc..0000000000 --- a/Common/3dParty/hunspell/test/dst/mn_MN.txt +++ /dev/null @@ -1,103 +0,0 @@ -Баатар -Багаа -Базар -Барра -Бат-Очир -Баттуул -Батхэсэн -Баярмаа -Билгэх -Бор -Бөөнцагаан -Бүрэнхайрхан -Бямбагар -Бэх -Гарам -Гантиг -Гурвантэс -Гүр -Гэрэлтуяа -Давст -Дангаа -Дансран -Дарь-Эх -Дөргөн -Дундбүрд -Дэмүүл -Дэлгэрцэцэг -Жавзан -Жарантай -Заглул -Зүүнхөвөө -Кир -Корона -Лүн -Лха -Лхаваан -Майхан -Манлай -Мөндөөхөө -Мөнхөт -Мөрөн -Мөнххаан -Мөст -Мэгэд -Мухар -Найдалмаа -Найтингейл -Налайх -Нарантуул -Намтай -Насантогтох -Номин -Нямсамбуу -Нэүдэй -Орог -Очир -Өнөржаргал -Өөдөс -Өргөн -Паган -Пас -Пүрэвдорж -Пүрэвхүү -Сайнаа -Сайхандулаан -Сундуй -Сэлх -Сүүж -Сээр -Тайван -Тарав -Тогтуун -Төрболд -Төхөм -Төмөр -Түргэн -Түшиг -Түгтөмөр -Түшиг -Удвал -Улиастай -Улаандэл -гүедэцгээчих -дэвхэрлүүлсхийчих -дэвхэлцгээчих -дэвшигдүүлгэчих -дэвшилцчих -дэвээ -дэггүйчүүд -наламгардуулалц -налбаруулзна - -Слова с ошибками [] -Батарчулуун [Баатарчулуун, Батар чулуун, Батарч улуун] -Баруунхарааа [Баруунхарааг, Баруунхараа, Баруунхараагаа, Баруунхараад] -Даважаргал [Даваажаргал] -Дөрволжин [Дөрвөлжин] -Мягмараран [Мягмараар, Мягмарнаран] -Оюунтулхуур [Унтуурхуул] -оторчилсхилгэ [оторчилсхийлгэ, оторчилсхийчих, оторчилсхий, отогчилсхийлгэ, хорчилсхийлгэ] -Асрамжлулгацгаачих [Асрамжлуулгацгаачих] -гүентүүлгэцгэээ [гүентүүлгэцгээе, гүентүүлгэцгээ, гүентүүлгэцгээгээ, гүентүүлгэцгээж, гүентүүлгэцгээн, гүентүүлгэцгээнэ, гүентүүлгэцгээв, гүентүүлгэцгээг, гүентүүлгэцгээх, гүентүүлгэцгээм] -наладаадуулга [налдаадуулга, наадалдуулгаа, наадалдуулга, налдаадуулцгаа, наадамдуулгаа] diff --git a/Common/3dParty/hunspell/test/dst/nb_NO.txt b/Common/3dParty/hunspell/test/dst/nb_NO.txt deleted file mode 100644 index 37cb4b46e6..0000000000 --- a/Common/3dParty/hunspell/test/dst/nb_NO.txt +++ /dev/null @@ -1,113 +0,0 @@ -Bahamasøyene -Festarrangement -Festarrangemang [Festarrangement, Festarrangør, Fellesarrangement, Storarrangementa] -Festival -festligheta -festnummer -forhandlernett -forgylle -fotballstyre -Fotgå -fotoamatørene -Fotogalleri -fotokopiere -generalkostnadene -generaltabbe -generøs -Generell -genmodifisertst -handlingsresymeet -hardhet -Harmfull -hastighetsregulering -havbanke -havforskningsundersøkelsene -informasjonsutveksling -Infrarødest -kaffeautomat -kaldslig -kalenderåra -kjekk -kjendisstoffa -kjærlighetslyrikk -kjøkken -Kontantautomat -kontantlån -kontrahere -kontraheringsplikt -Låskasse -læregutt -læreprosess -Museums -museumssamling -musikkorps -myggstikka -myndighetsaldere -omløpstider -omregn -områdeplan -omriss -omsetningsgjeld -omsjaltning -omsetningsvolumer -omslutning -omslyngning -omsonst -omstendeligheta -Omstart -Omstreifende -Omsyn -omtåketheta -oppdagelse -oppbygning -oppebære -oppfølgingsapparat -oppgjørsbank -oppgjørsblankett -opphøringene -partisipere -randverdi -rapportskriver -rasjonalisering -Rate -selsak -selskapsinntekt -selskapsoverskudd -selvbetjeningene -snabbingene -Snadderene -Sytti -søkekriterium -søkemulighetene -søkeargumenter -søkingen -søkne -sølvlaga -sørlandsk -søtningene -tabellrad -Tabellkolonne -Takhalm -taksene -takseringssystema -tal -trolsk -trosinnholdene -utfoldelsesmuligheta -Utformingsmetode -Utgift -vekstfaktor -vekstforhold - -Слова с ошибками [] -Arbeidstagerorganisasion [Arbeidstagerorganisasjon, Arbeidstakerorganisasjon, Arbeidsgiverorganisasjon, Sosialarbeiderorganisasjon, Arbeiderorganisasjon] -festsprel [festsprell, festsprek, festsprelt, festspell, feltprest, fengselsprest] -forhandlingsdirektor [forhandlingsdirektør, forhandlingssekretær, forhandlingstekniskere, forhandlingstaktiskere, forhandlingskontor] -handlingforløpa [handlingsforløpa, handling forløpa, handling-forløpa, handlingsforløp, lønnsforhandlinga, lønnsforhandling, forhandlingspart] -kjempeflinktt [kjempeflinkt, kjempeflinkest, kjempeflink, kjempeflott, kjempefint] -lanetilbud [lånetilbud, langetilbud, landetilbud, linetilbud, laketilbud, langtilbud, lagetilbud, landtilbud, danetilbud, lunetilbud, vanetilbud, fanetilbud, banetilbud, hanetilbud, kantinetilbud] -omraming [omramming, omringing, omringning, ramming, omring] -omsvøpssfull [omsvøpsfull, omsvøpslaus] -raportmateriale [rapportmateriale, kartmaterialer, kartmateriale, programmateriale, skrapmateriale] -serstilt [særstilt, ser stilt, ser-stilt, seerstilt, tverrstilt, storstilt, lederstil, stiliser] -taksamst [takksamst, takksamt, takksam, samletakst, samstav] diff --git a/Common/3dParty/hunspell/test/dst/nl_NL.txt b/Common/3dParty/hunspell/test/dst/nl_NL.txt deleted file mode 100644 index ce7cdbafcc..0000000000 --- a/Common/3dParty/hunspell/test/dst/nl_NL.txt +++ /dev/null @@ -1,115 +0,0 @@ -Advertentie -Advocate -affirmatie -afgevaardigd -afneemster -allerbekendst -alternatieveling -annulering -anticycloon -Backtrackroute [Jacktrackroute, Backtrackrouten, Baktrackroute, Backtrackroute-, Backtrack-route, Back-trackroute, Backtrackroutes] -Bearbeiden -becijfer -bediening -bedrag -beduiden -beïnvloeding -benadeling -bepaaldelijk -Catalogiseer -Catering -cellulair -classificator -collaboreren -collectiviteit -comfortabel -complimenteus -contractant -correctionaliseren -daaraanvolgend -dagelijks -deelgenoot -degelijkheid -demarqueren -Denotative [Denotatie, Denominatieve] -deposant -dergelijken -detail -deugen -diakritisch -Directioneel -dusgenaamd -eendrachtigheid -Eenzaamheid -eersteklascoupé -Eigenschap -felicitatietelegram -centerkanaal [centerkabaal, enterkanaal, centerkanaal-, center-kanaal, callcenter] -Chargeer -filiaal -klare -Klassikaal -kleinhandel -evolutie -exemplaar -exequiën -familiaal -fauteuil -luister -magistratelijk -perelaar -Permitteren -Perseveratie -persoonlijk -pictogram -pixel -sloten -sluimer -sneltoets -Soldij -Solliciteren -zegepraal -zelfbeeld -zevendaags -aangeslotene -meermaals -expedieert -jaargetijden -kaderleden -Kapitelen - -Сложные слова [] -avontuurlijkheid -bedrijfsmaatschappelijk -begrotingstechnisch -belangstellingssfeer -concurrentievoordeel -conferentieganger -democratisch-liberaal -discontoverhoging -doctoraatsverhandeling -dubbeldeksbus -economisch-financieel -energiezuinig -erkentelijkheid -evenwichtigheid -klimaatsverandering -koffiezetmachine -koopmansgebruik -maatschapsovereenkomst -personeelsconsulent -sociaalwetenschappelijk -zelfverzekerdheid -fondsenwervende - -Слова с ошибками [] -afficher [affiche, afficheer, affiche-, affiches] -algorithme [algoritme, algoritmiek] -beeindiging [beëindiging] -client [cliënt] -consnteren [consenteren, contesteren, constateren, consulteren, confronteren] -deactivieren [deactiveren, deactiveerde, reactiveren, deactiveert, geactiveerden] -deblockering [deblokkering] -electrisch [elektrisch] -certificat [certificaat, certificatie, certificeert, certificeer, certificeren] -sovereiniteit [soevereiniteit, suzereiniteit, sereniteit, universiteit] diff --git a/Common/3dParty/hunspell/test/dst/nn_NO.txt b/Common/3dParty/hunspell/test/dst/nn_NO.txt deleted file mode 100644 index 90d328d8e3..0000000000 --- a/Common/3dParty/hunspell/test/dst/nn_NO.txt +++ /dev/null @@ -1,116 +0,0 @@ -Ankeret -Anleggsbedrift -Annandag -annonseavis -annuell -ansats -ansvarsmedviten -Antibiotikai -apal -apoteki -apparattavlor -appetitt -Aprikos -arbeidsdokument -arbeidsmarknad -barndom -bastematte -bautingi -Bedriftsleiar -befolkningi -begynnarkurs -Beheld -belastningi -beredskapsnivå -beredskapsperiode -berglandskapi -berrfrost -beskjedi -beskrivingi -betalingsoppdrag -betalingsplikt -bevismateriale -bildeband -bildebruki -bildespråki -bildeteksti -bilingval -billettlukone -binær -bione -bjørkegreini -bjørnebæri -blenge -blokkeringi -blomsterbordi -blyerts -bogen -bokstavrekningi -bokstavteikni -Borddisk -effektevaluering -elgkalv -Elone -emballer -faktainformasjon -familiebedrifti -familieterapeut -fastbuande -Februar -feili -fisketom -hengelåsi -istandsetjingi -Item -jaguar -jamlig -janen -jarnbanestasjon -kjende -kjentfolki -kjæleri -kjøledisk -kjørety -midli -Mideftnar -midtstrek -multiplikasjonstabell -museumsdirektør -onsdag -operasjon -operasjonskode -opinionsskapingi -opningi -Personalkonsulent -Personligdom -persontryggleik -petroleumspris -redningsaksjon -reduksjon -refusnik -seinst -sekretær -seljande -sendeferd -Standpunkt -støyisolering -støytvis -terminoppgåve -tidløysone -tidsfølgjone -Tilbakebetalingstid -uprofesjonell -upåklageleg - -Слова с ошибками [] -Anlegsarbeid [Anleggsarbeid, Tvangsarbeid, Grunnlagsarbeid, Føregangsarbeid, Bergingsarbeid] -anonse [annonse, nonsens, anse] -ansversproblematikk [ansvarsproblematikk, vurderingsproblematikk, ventelisteproblematikk, valdsproblematikk, drivhusproblematikk] -barneforteling [barneforteljing, barnefordeling, barneforsking, barnefarforelegg, barnebefolkning, barnebortføring] -besoksliste [besøksliste, sortsliste] -bilophoggingi [bilopphoggingi, bilopphogging, opphogging] -effektivitetskontrol [effektivitetskontroll, effektivitetsforskjell, effektivitetsproblem, effektivitetsnøytral, effektivitetsforbetring] -fakturaerklering [fakturaerklæring, faktureringsliste, overfakturering] -miljøbyrad [miljøbyråd, miljøby rad, miljøby-rad, miljøbragd] -selskapskat [selskap skat, selskap-skat, selskaps kat, selskaps-kat, selskapsskatt, selskapskapital, selskapsrett, selskapstype] -cement [sement, dement, centime, cent] diff --git a/Common/3dParty/hunspell/test/dst/oc_FR.txt b/Common/3dParty/hunspell/test/dst/oc_FR.txt deleted file mode 100644 index 26c580cdf5..0000000000 --- a/Common/3dParty/hunspell/test/dst/oc_FR.txt +++ /dev/null @@ -1,108 +0,0 @@ -Ajustaira -alaguiar -alausièr -alberguèri -alcaloïdic -alègrament -alenament -algorisme -Alimentacion -allergologia -alpèstra -amaisament -amorteirar -analista -analogic -atucament -Audicion -auquièr -auscultacion -auscultar -ausèri -autenticament -brilhant -brumós -Burgada -cabelièira -cadeçar -Caducèu -çaicontra -calcièrs -Calmar -camarilha -cambièra -canalhariá -casse -cedar -cendrós -cèrca -cèrtes -cestòdes -chantièr -chartrós -Chassís -dimensionar -diptèrs -dirèctament -discrecionària -discriminar -Distraire -dòler -Enòrme -enqueriái -espicifòrme -esquelèt -Esquèrra -estetic -innocéncia -innocentàs -Maniquèu -mantelejar -Nauchièr -natièr -oxigèn -pacanariá -pagés -pagesiá -Primièirament -requereguèri -requisitòria -saumelèri -S'autodeterminar -sautarèl -scientament -scientologia -secador -secretèri -sècta -sectorial -s'efarcimar -s'endeven -s'engarrar -sentimental -s'entrepausar -shampó -sextant -sòli -Solidament -soquèla [soquèla, roquèla] -subrejornada -suedés -utilitària -Utilizaire -vacàs -vaisselèri -valiái -validament - -Слова с ошибками [] -albatros [albatròs] -amistanza [amistança, amistat, animista] -brunonièr [brunhonièr, prunhonièr] -carpentier [carpentièr] -centrifugation [centrifugacion, centrifugadoira, centrifugador, centrifugar, centrifuga] -estelhad [estelhas, estelha, estelhada, estelhar, estelhan, estelhat, estelham, estrelhada, estervelhada, estenalhada, estendalha] -primaria [primariá, primària, primarai, primaris, primari, primariam, primacia, primarga] -s'embractar [s'embracetar, s'embraceta, s'embodracar, s'embarrassar, embracetar] -sosembrançament [sosembrancament, embraçament, asombrament] -vascularisacion [vascularizacion, secularizacion, cardiovascular] diff --git a/Common/3dParty/hunspell/test/dst/pl_PL.txt b/Common/3dParty/hunspell/test/dst/pl_PL.txt deleted file mode 100644 index 3cb6dba99f..0000000000 --- a/Common/3dParty/hunspell/test/dst/pl_PL.txt +++ /dev/null @@ -1,225 +0,0 @@ -dom -pies -kot -auto -drzewo -książka -szkoła -przyjaciel -mama -tata -dziecko -jabłko -czekolada -kawa -herbata -telefon -telewizor -komputer -muzyka -sport -zdrowie -piękno -praca -miłość -szczęście -czas -pieniądze -język -kraj -miasto -zima -lato -jesień -wiosna -morze -góry -jezioro -rzeka -park -zwierzę -ptak -ryba -drewno -złoto -srebro -metal -szkło -buty -sukienka -spodnie -koszula -czapka -płaszcz -ręka -noga -oko -ucho -nos -usta -ząb -głowa -serce -mózg -król -królowa -książę -księżniczka -chłopak -dziewczyna -mężczyzna -kobieta -staruszek -staruszka -lekarz -pielęgniarka -nauczyciel -uczennica -student -studentka -kucharz -kelner -wojna -pokój -mapa -flaga -śmiech -płacz -sen -marzenie -praca -nauka -sztuka -teatr -kino -muzeum -kaplica -kościół -zamek -most -droga - -Сложные слова на польском языке [] - -1. konstantynopolitańczykowianeczka [nicejsko-konstantynopolitańskiego] -2. niezadogłębienieńskujący [] -3. antykontraatakujący [finansująco-kontraktujący] -4. supersamoobsługiwalnymi [kancelaryjno-archiwalnymi] -5. rozpierduchlanoculka [nieporozpierdzielanie] -6. nieodezwawiałobyś [nieodprzedmiotawiany] -7. przystawieniowy [przedstawieniowy, nieprzystawienie, niepoprzystawianie, nieprzystawianie] -8. nieprzeżyciowakościami [nieprzewartościowywaniami, nieprzewartościowaniami] -9. nieprzekazywających [nieprzekrzywiających, nieprzejednywających, nieprzywdziewających, nieprzepoczwarzających] -10. przeciwzakwaszeniowych [zatokowo-przedsionkowych] -11. nieszczęściodrapańskiego [ogrodniczo-pszczelarskiego] -12. społeczno-wychowawczyniami [socjalizacyjno-wychowawczymi] -13. seledynowo-fioletowymi [mięśniowo-szkieletowymi] -14. przeciwdeszczową [przeciwdeszczową, przeciwdeszczowy] -15. mikroelektroniczno-kwalitacyjną [reumatologiczno-rehabilitacyjną] -16. nieokreślonościowo-losowo-obiektywnie [] -17. zagubieniecioburakowatej [] -18. antyneuroleptyzanckim [] -19. nieupubliczniającymi [nieuwieloznaczniającymi] -20. splądrowałbyś [wyeksplorowałbyś] -21. konserwowano-spożywczymi [konserwiarsko-zamrażalniczymi] -22. ożelośćiowo-miłosnej [] -23. nieprzyzwoitolicjią [nieprzypieczętowującą] -24. nieodporowościę [nieodpoliturowanie] -25. rzeszołkofiołkowatymi [] -26. niezakapiactwuja [niezakatrupiająca] -27. nieoszczędniewczelnianków [oszczędnościowo-rozliczeniowa] -28. przekształconowaczkołępów [] -29. rozwińczywianiu [nieporozwiązywaniu] -30. nieprzeskakiwalnościami [nieprzewartościowywaniami] -31. modernizująco-rewolucyjnego [reumatologiczno-rehabilitacyjnego] -32. nadzwyczajnieuzdolnionymi [] -33. przemocno-wsparciański [warciańsko-odrzańskiemu] -34. przepyszno-peltzerowskiego [faszystowsko-hitlerowskiego] -35. kwestionowano-wzmocnieniami [] -36. nieodczynieństwującą [nieodrzeczywistniającą] -37. niezasłużonowypasionego [] -38. likwidującego/zarządzającego [odchudzająco-oczyszczającego] -39. szeszcześtoplutowanych [nieprzeinstrumentowanych] -40. niewpadkowościowi [wielonarodowościowi] -41. antynazizhownemu [niebizantynizowanemu] -42. nieuchronnieprzekroczeniowym [oszczędnościowo-rozliczeniowym] -43. niezatrawialnieprzyjemnego [] -44. kardiopulmonologiczno-angiologów [endokrynologiczno-ginekologicznemu] -45. gorączkowointensywnościowego [wydolnościowo-sprawnościowego] -46. antykonstytucyjnorozpadowego [konstytucyjno-monarchicznego] -47. nieobawiamysię/źródleni [] -48. prerewolucyjnolphillipsowi [] -49. szóstkaniewygranych [niewykrystalizowywanych] -50. nieupadkokogeneracyjnymi [korekcyjno-kompensacyjnymi] -51. społeczno-humanitarnarządzaniami [] -52. nieodziewowiędzy [nieumiędzynarodowienie] -53. przemocnochamować [] -54. społecznosensacyjnosądowym [kompensacyjno-wyrównawczymi] -55. przerażającorzymskiego [kobylińsko-borzymskiego] -56. nieprzemontowanych/zamuzowych [] -57. referendumkonstytucyjno-reformujące [] -58. niezniesłowiałszymi [niezesłowiańszczonymi] -59. niebohaterystycznymi [charakterystyczniejszymi] -60. produktodenarodowomenopauzalem [] -61. odrywającopierdolca [niedopierdzielająca] -62. niegotowożywione [żywieniowo-noclegowi] -63. niepostronnynarodzonemu [kilkudziesięciostronicowemu] -64. przedniaautochtonicznym [urbanistyczno-architektonicznym] -65. nadciągniono-wchodzących [] -66. promocjostworczym [czteromocarstwowym] -67. niezapowiadającychkoalicji [] -68. bezgłupinczłapie [] -69. wyomjaził [] -70. wagotonizacyjno-radiofonizowanego [] -71. gospodarczo-zasadotwórczej [organizacyjno-gospodarczej] -72. skrupulatno-rzeźniczobardziej [] -73. samokiedy-konstytucyjnej [konstytucyjno-monarchicznej] -74. niedomętnością [nieumiejętnością] -75. nieoszustamiwykorzystana [] -76. przeprowadzonoświeckie [nieprzeprojektowywanie] -77. nieuniknionaobowiązkowo-plastycznej [] -78. poduszkowo-nicościowych [porządkowo-czystościowych] -79. niepowodzeńbutmizeryjewego [] -80. skojarzeniowocolorowymi [wypoczynkowo-szkoleniowymi] -81. przytułkamiwciągarkowych [] -82. wchodziłoprzeciwniepowszechny [] -83. karaublicznociągana [publiczno-prywatnego] -84. przedpolitycznilubelskim [hemolityczno-mocznicowemu] -85. niezapowiedziano-date-expanded [] -86. licznościłodziennej [termiczno-wilgotnościowej] -87. niezawinieniomatołek [] -88. pakujączwobilardowego [] -89. rewersdopisek [] -90. przeprosinoworadosną [nieprzeprojektowywaną] -91. nieakceptacyjnoprospekcyjnymi [adaptacyjno-rehabilitacyjnymi] -92. jedniżużytym [nienadużytymi] -93. ainikopciksemilitechnikowany [] -94. motszynopiszącym [niewspółtowarzyszącym] -95. nieprzerejestrowanasezonowanie [] -96. słupotartackimoblikiem [] -97. nieodbieraniemniedostępności [] -98. dorozwinięcówkobiet [] -99. szybopojabytesłowickiego [] -100. przystępnoracjmujacych [] - -Слова с ошибками [] - -jedniiżużytym [nienadużytymi] - -wiomjaził [jaziowy] - -niezzniesłoowiałszymi [niezesłowiańszczonymi, niezesłowiańszczanymi, niezesłowiańszczającymi, najniesłowniejszymi] - -superrsammoobsługiwalnymi [muzealno-archiwalnymi] - -przemoocnochamować [przeprogramować] - -staruszzka [staruszka, staruszeczka, staruszek, staroruska, starszaka] - -tiatr [tiar, titr, tatr, teatr, wiatr, otiatra, otiatria, tristia] - -woina [wpina, wona, wina, wozina, dwoina, wolina, wonna, wcina, toina, wodna, doina, wolna, wojna, wgina, woźna] - -teleffon [telefon, telef fon, telef-fon, telefoto] - -zołoto [złoto, gołoto, hołoto, Gołoto, Hołoto, zołotnik] diff --git a/Common/3dParty/hunspell/test/dst/pt_BR.txt b/Common/3dParty/hunspell/test/dst/pt_BR.txt deleted file mode 100644 index 1f66fc5565..0000000000 --- a/Common/3dParty/hunspell/test/dst/pt_BR.txt +++ /dev/null @@ -1,108 +0,0 @@ -que -eu -não -de -você -para -ele -se -é -um -sim -por -isso -em -uma -uuma [u uma, uma, usma, suma, numa, ruma, duma, puma, fuma, juma] -está -como -com -bem -na -me -mas -do -era -quando -então -tudo -tydo [tudo, tido, todo] -aqui -disse -estava -esâtava [estava, tavares] -lá -fazer -vai -sobre -vamos -homem -hollmem [homem-gol] -bom -ok [o k, o, k, oó, os, oi, oc, ou, om, oh] -agora -coisa -coissa [coisca, coiça, coisas, coisa, cossa, comissa, cisosa, cissoa, cossai] -quero -foi -meu -seu -só -eles -as -posso -pocso [posso, poco, poso, psoco, poiso, pouso, pocho] -estou -mais -mim -certo -dizer -dizdizerr [dizer] -os -no -sei -ela -vocês -sua -todos -sabe -minha -alguma -algyyma [amalgama] -casa -muito -oh -quallquer [qualquer, alquerque, malquerer, alqueria, alquermes] -qualquer -da -estamos -até -onde -onede [enode, onde, monede, neode, onere, olede, nedendo] -ao -tenho -nós -tem -tinha -tiinha [tinão ha, tiazinha, toinha, tinha, tirinha, tidinha, tipinha, tianha, tainha] -quê -ir -ou -pode -quer -vou -seus -dia -estão -nos -cabeça -quem -anos -depois -sou -vez -vá -fez -irmão -câmera -câmeara [cameara, cameará, câmera, câmara, acâmera, comeara] diff --git a/Common/3dParty/hunspell/test/dst/pt_PT.txt b/Common/3dParty/hunspell/test/dst/pt_PT.txt deleted file mode 100644 index 9477e3d006..0000000000 --- a/Common/3dParty/hunspell/test/dst/pt_PT.txt +++ /dev/null @@ -1,135 +0,0 @@ -pan [pana, pane, pano, pen, par, pai, pau, paz, San, Van, Dan, pança] -manteiga -menteiga [manteiga, antigamente] -queijo -salchichón [salsicha] -saуlchichón [] -óleo -pimenta -pimmenta [pimenta, pigmenta, pimenteira, pavimenta, implementa, impiamente] -sal -baga -mel -geléia [geleia] -cogumelo -cebola -cóbola [cebola] -banana -cenoura -pêra [pera, para, pira, pura] -beterraba -frutas -melão -melancia -bolo -chocolate -carne -batatas -salada -salóda [salda, salada, salsada] -tomate -pepino -pipino [pepino, pi pino, pi-pino, pipi no, pipi-no, filipino, pino] -col [cola, cole, colo, coa, cal, coe, cor, rol, sol, coo, com] -mingau [mingua, mingai, minga, mingar, mingas, mingou, mingam] -sopa -sanduíche -refrigerante -refrigarante [refrigerante, refrigerar, intrigante] -água -café -chá -leite -suco -scuco [suco, cuco, cucos] -maçã -uvas -laranja -abacaxi -adacaxi [abacaxi, cacada] -damasco -demasco [damasco, demarco, remasco, de masco, de-masco, descasco] -açucar [açúcar, açucara, açucare, açucaro, açudar] -arroz -macarrão -res [rés, ser, ares, reis, ires, ores, dres, rei, ris, ses, rãs, rês] -porco -frango -costeleta -cãsteleta [costeleta, chapeleta] -limão -ervilha -pão -peixe -caramelo -sorvete -nogueira -ovo -pêssego -xícara -xíícara [xícara, caraíba] -vidro -prato -colher -garfo -faca -pires -garrafa -guardanapo -café da manhã [ssafé da manhã] -almoço -jantar -avião -carro -bonde -ônibus [ónibus] -trem -bicicleta -janeiro -fevereiro -fevíreiro [fevereiro, ferreiro] -março -abril -maio -junho -julho -agosto -setembro -setembra [setembro, seteara] -outubro -novembro -dezembro -desembro [desmembro, dezembro, deslumbro, setembro, desdobro] -caneta -livro -xadrez -telefone -relógio -pente -televisão -ferro -sabão -rádio -bolsa -cartão -mala -presente -câmera [câmara, comera] -computador -camputador [computador, captador] -filme -flor -vaso -quadro -lenço -bola -balão -brinquedo -brinqueedo [brinquedo, branqueado] -conta -sobre -papel -pepel [papel, repele, pele] -jornal -letra -bilhete diff --git a/Common/3dParty/hunspell/test/dst/ro_RO.txt b/Common/3dParty/hunspell/test/dst/ro_RO.txt deleted file mode 100644 index b1bd892905..0000000000 --- a/Common/3dParty/hunspell/test/dst/ro_RO.txt +++ /dev/null @@ -1,210 +0,0 @@ -casă -copil -carte -masă -școală -lumină -apă -munte -soare -lună -pâine -fruct -floare -stradă -mașină -aer -timp -zi -noapte -nor -vânt -ochi -gură -nas -mână -picior -inimă -sânge -cap -ureche -voce -melodie -culoare -formă -linie -cerc -dreptunghi -cercetare -știință -limbă -frază -literă -cifră -număr -sunet -zgomot -telefon -internet -computer -program -ecran -tastatură -mouse -joc -sport -muzică -artă -film -televizor -radio -planetă -stea -univers -galaxie -atom -moleculă -substanță -energie -lumină -căldură -frig -aparat -instrument -mașinărie -unelte -hrană -băutură -haine -pantofi -păr -piele -ochelari -ceas -bijuterie -pământ -apă -aer -foc -metal -lemn -piatră -hârtie -cerneală -pix -carte -cadru -tablou -sculptură -model -formă -anticonstituționalitate [anti constituționalitate, anti-constituționalitate, anticonstituționali tate, anticonstituționali-tate, anticonstituționale, neconstituționalitate, anticonstituțională, constituționalitate] -dezvoltare -inexpugnabil -nefast -concomitent -antiseptic -recalcitrant -perseverență -extravagant -inexorabil -colosal -plauzibil -efervescent -perspicacitate -superfluu [superfluă, superfulger] -subversiv -incoruptibil -inefabil -hiperbolic -indefectibil [indestructibil, indefinibil] -peremptoriu -ambivalent -paradoxal -heterogen [eterogen, heterogonie] -indiferent -periferic -subliminal -ultraviolet -indeferent [indiferent, interferent, deferent, inaderent, independent] -conglomerație -circumstanțial -contraproducător [contra producător, contra-producător, contraproductivă, contraproductiv, neproducător] -conglomerat -insurmontabil -intransigent -insidios -inerent -consternant -ambiguitate -inerție -inconsolabil -oniric -remarcabil -repudiat -subiectiv -periculos -infatigabil -abnegare -exuberant -facet [face, falet, facem] -represiune -implacabil -indiferent -infatigabil -insolit -intempestiv -incandescent -letargic -magistral -magnanim [magnaliu] -nefast -oblivial [bolivian] -oportun -periculos -plutitor -propice -reprobabil -risipitor -robust -salutar -simetric -solicitant -stringent -sufocant -superficial -tranzitoriu -tributar -trivial -umilitor -unic -vehement -vernal -vicios -victorios -vindicativ -virtuos -vizibil -volatil -vorace -vulnerabil -xenofob -xerofil -yonder [pondere] -yang -yodel [model] -zonal -zodiac -zoon [ozon, zono, zoom, zoo, zon, zobon, zovon, zvon, zoo n] -zoomorf -zurbagiu -Caaă [Casă, Cară, Cată, Cală, Cană, Cauă, Camă, Capă, Cadă, Cață, Cază, Cavă, Cașă] -Soaare [Soare, Sotare, Solare, Sonare, Somare, Soțioare] -Cartr [Carte, Cart, Carter, Carta, Carto, Cartu, Cartă] -Appă [Papă, Apă, Arpă, Aptă] -Coopil [Copil, Copilo, Copiilor] -Frumoss [Frumos, Frumos s, Frumoasă] -Feriсire [Fericire, Rereferire, Ferire] -Prietenn [Prieten, Prieteni, Prietena, Prietene, Prieteno, Prietenu, Prietenă, Prieten n, Prietinie, Prietin, Pretenție] -Muziică [Muzică, Muzic, Muică] -Exeplu [Exemplu] diff --git a/Common/3dParty/hunspell/test/dst/ru_RU.txt b/Common/3dParty/hunspell/test/dst/ru_RU.txt deleted file mode 100644 index 938369e89b..0000000000 --- a/Common/3dParty/hunspell/test/dst/ru_RU.txt +++ /dev/null @@ -1,197 +0,0 @@ -должен -доллжен [должен, доложен] -наш -думаю -думмаю [думаю] -свою -сам -всем -ни -нас -пока -этом -этой -ваша -всеми -возьми -моей -сама -вся -день -само -всей -бывает -себе -пойду -куда -ими -твоей -всю -своего -твой -пусть -ним -про -точно -иметь -которые -тогда -сюда -наше -самой -взять -наверное -домой -совсем -те -тобой -наверно -что-то -будто -твои -пути -дома -такие -тех -такое -его -самой -вашей -наверное -мои -например -типа -значит -люблю -минут -пор -случае -искусство -лучше -того -такому -ждать -видеть -мною -ждал -имя -важно -чего-то -самому -обычно -представляет -мечтать -стало -помните -взять -моих -самим -своим -вообще -самими -здесь -обратно -сразу -таким -ежели -наоборот -куда -таков -мечтает -значит -покажи -такими -кстати -почти -всякий -научит -вдоль -тогдашний -толком -занимает -Аквапланирование -Барокамера -Библиографирование -Биосинтез -Взаимодействующий -Вибраторный -Виртуальность -Вооруженность -Господствующий -Десантно-штурмовой -Диагностировать -Дипломатический -Дисгармония -Дискриминационный -Достопримечательный -Жизнеустройство -Интернациональный -Инфицированный -Кальцинировать -Ключичный -Коннотация -Лиловатый -Люминесцентный -Метрополитен -Многоплановый -Модернизировать -Наивысший -Наименее -Неопределенный -Нераскрытый -Неоднократный -Неохотно -Непостижимый -Неусыпный -Обезьяноподобный -Обзавестись -Оптический -Оптимизировать -Осуществиться -Очистительный -Парафинировать -Переключатель -Пограничный -Подготовительный -Подрядчик -Полиморфный -Почитать -Преисполниться -Преподаватель -Преследователь -Прирожденный -Проектирование -Профанация -Разграничительный -Распоряжающийся -Реконструктивный -Революционный -Рентгенологический -Рискованный -Роскошествовать -Самоунижение -Сверхъестественный -Светочувствительный -Семантика -Сингулярность -Совершенствовать -Соединительный -Сосуществование -Спорообразующий -Стационарный -Столовая -Сторицей -Сцепной -Трансформирующий -Триумвират -Укротитель -Универсальный -Федеративный -Хронометраж -Целостность -Криумвират [Триумвират] -Укратитель [Укротитель] -Универссальный [Универсальный] -Фидиративный [] -Хранометраж [Хронометраж] -Целосность [Целостность] diff --git a/Common/3dParty/hunspell/test/dst/sk_SK.txt b/Common/3dParty/hunspell/test/dst/sk_SK.txt deleted file mode 100644 index d8167476c9..0000000000 --- a/Common/3dParty/hunspell/test/dst/sk_SK.txt +++ /dev/null @@ -1,205 +0,0 @@ -hiša [šiša, Riša, Miša, hi ša, hi-ša] -pes -mačka -avto [atto, asto, auto, zavito] -drevo -knjiga [kvadriga] -šola [šila, šoka, šla, švola, škola, šosa, vola, šora, rola, kola, mola, dola, šopa, pola, hola] -prijatelj [prijatej, prijate, prijatie] -mama -oče [očne, otče, toče, očke, koče, moče, očeš, oči, one, ose, oke, oje, obe, očí, očú] -otrok -jabolko [jablko] -čokolada [čokoláda] -kava -čaj -telefon [telefón, telefot] -televizija [televízia] -računalnik [račianski] -glasba [glasnosť] -šport -zdravje [zdravej, zdravie, zdravte, zdravme, zdrav je, zdrav-je] -lepota [pelota, slepota, lopota, lehota, klepotať, epoleta, poleptať] -delo -ljubezen [lezeniu] -sreča [srnča, skeča, smeča] -čas -denar [denár, nedar] -jezik [veziko] -država [držiava, držala, dŕžava, dĺžava] -mesto -zima -poletje [polejte, poleje, poletuje, polje] -jesen [jeseň, jesne, nesej, jeden, jesene, jeseni, jesení] -pomlad [omlad, poklad, p omlad, pomlka] -morje [morke, more, moje, morte, morme, mor je, mor-je, morčej] -gore [hore, gofre, nore, kore, more, zore, bore, šore, Nore, Tore, Lore, Zore, gágore] -jezero [jazero, je zero, je-zero, zero] -reka [areka, rieka, rekta, repka, rezka, raka, roka, rekt, seka, reva, veka, deka, repa, reku, ruka] -park -žival [žuval, živa, živel, živil, rival, ži val, ži-val, živ al, živ-al, živa l, žičieval] -ptica [pica, pätica, psica, štica] -riba [rabi, roba, ria, iba, raba, ribi, ryba, rúba, róba, Tiba, r iba, babri] -les -zlato -srebro [rebro, s rebro, striebro] -kovina [okovina, krovina, ovinka, konina, novina, korina, rovina, kozina, košina, kofina, rakovina, kávovina] -steklo [šteklo, seklo, stekalo, stieklo, stenklo, streklo, stoklo, steblo, stĺklo] -čevlji [nevlhči] -obleka -hlače [hláče, tlače, hlase, hlave, hlade, plače] -srajca [rajca, krajca, s rajca] -kapa -plašč [plaš, plač, plaší, plaš č] -roka -noga [noha, nota, nosa, nova, nora, loga, koga, doga, joga, noža, noša, noxa, Toga, neogab] -oko -uho [ujo, ho, tuho, uhor, uhol, uhlo, ucho, uhoľ, uňho, hou, oho, uto, uhm, cho, uhú] -nos -ustnice [ustrice, kapustnice] -zob -glava [hlava, Ilava, Slava] -srce [drce, srnce, srdce, srne, srde, síce, súce] -možgani [moganie] -kralj [kraj, kraal] -kraljica [kraslica] -princ -princesa -fant -dekle [deke, dele, pekle, de kle, de-kle, debakle] -moški [košmi, kamoši] -ženska [ženská, ženiska, žensky, ženskí, ženský, ženskú, ženské] -starec -starka [starká, straka, statka, starla, stara, ostarka, staríka, starca, starkí, starký, starkú, starké] -zdravnik [zdrav nik, zdrav-nik, zdravenia] -medicinska sestra [medicínska sestra] -učitelj [učitelík] -učenka [učeníka, učenia, učenca, utečenka] -študent -študentka -kuhar [kurare] -natakar [katakana, katarakta, katarakt] -vojna -mir [mri, mor, mi, mira, mire, mier, emir, miri, miru, mar, air, mer, min, sir, mil] -zemljevid [zemediel] -zastava [zástava, zastáva, zastav, zastavia, zastaval, zastavaj, zastavať, zostava, zastala, zastaví] -smeh [sneh, smej, sme, steh, smer, smel, smeč, smeť, sme h] -jok [koj, kok, joj, jol, ojok, jak, jot, tok, sok, vok, rok, lok, mok, dok, job] -spanje [spanie] -sanje [sane, saje, sanuje, banje] -delo -učenje [učenej, učene, učenie] -umetnost [etnosti] -gledališče [nepojedali] -kino -muzej [mušej, muzeálnej] -kapela -cerkev -grad [grád, gard, hrad, graf, rad, grand, gram, gray, úrad, Arad] -most -cesta - -Сложные слова [] - -1. Neparlamentarna [parlamentarizmus] -2. Samozadosten [rozradostene] -3. Nepristranski [protistranícki] -4. Pretirano [pretrénovanosti] -5. Nepredušno [nepriedušnosť] -6. Nesreča [] -7. Razpršeno [zhoršenou] -8. Nesprejemljiv [nesprejazdňujeme] -9. Prekomeren [rekompenzovať] -10. Prostovoljstvo [sprostredkovateľstvo] -11. Izolirati [] -12. Trmast [] -13. Brezpogojno [] -14. Neodvisnost [neodôvodnenosti] -15. Skupnost [ústupnosti] -16. Neizvedljiv [] -17. Nelegitimen [nelegitimizuje] -18. Nevzdržen [] -19. Preobremenjenost [] -20. Ogrevalni sistem [] -21. Preoblikovati [aplikovateľnosti] -22. Nezaslišano [nezasluhujúci] -23. Neugoden [] -24. Prezasedenost [prezamestnanosť] -25. Nesreča [] -26. Neupravičeno [nenapraviteľnosť] -27. Mednaroden [mŕtvonarodeným] -28. Kompatibilnost [najkompatibilnejšom] -29. Neuspeh [neusporte] -30. Neobvladljiv [] -31. Neskončen [neskončenej] -32. Neprimeren [neprimeranie] -33. Amortizacija [amortizovaných] -34. Koncentracija [dekoncentrácia] -35. Cirkulacija [recirkulácia] -36. Obremenitev [odbremenenie] -37. Gromozanski [] -38. Simbol [] -39. Vinjeta [] -40. Digitalizacija [digitalizovaný] -41. Funkcionalnost [funkcionalistické] -42. Rentabilnost [nerentabilnosti] -43. Ekshibicionizem [exhibicionizmus] -44. Frustracija [frustrujúci] -45. Neprilagodljiv [] -46. Severnoameriški [] -47. Ekskluzivnost [] -48. Preverjanje [preverovanej] -49. Celoživljenjsko [] -50. Privlačnost [neprivlastňovala] -51. Periferija [periferický] -52. Sokrivda [dokrivkať] -53. Kompromis [kompromisník] -54. Strpnost [ostrovtipnosť] -55. Racionalizacija [zracionalizovania] -56. Birokracija [gerontokracia] -57. Odraslost [odrastenými] -58. Stabilnost [nestabilnosti] -59. Nepredvidljivost [najnepredstaviteľnejšou] -60. Razkošje [] -61. Smrtnost [úmrtnostným] -62. Obveščenost [presvedčenosti] -63. Produktivnost [neproduktívnosti] -64. Neugodje [] -65. Zapletenost [zakrpatenosti] -66. Hegemonija [] -67. Umetnost [menostatikum] -68. Tranzicija [tranzitivita] -69. Individualnost [individualisticky] -70. Kontaminacija [kontaminantmi] -71. Inkubacija [] -72. Prikrito [prikrátko] -73. Etnični [Letničie] -74. Sovražnost [samovražednosť] -75. Atraktivnost [abstraktnosti] -76. Nestrpnost [nepriestupnosti] -77. Divergenca [divergencia] -78. Digitalna pismenost [] -79. Stabilizacija [autostabilizácia] -80. Raznolikost [] - -Слова с ошибками [] - - Kontamenacija [Kontaminácia] - - Grommozanski [Grobianski] - - Neobvladlliv [Neobkradli] - - Neparlametarna [Neparlamentný, Parlamentárnej, Parlamentne] - - Nevrzdržen [Združene, Zdražene] - - voina [vonia, vina, vojna, voľna, voština] - - muzei [muzeálni] - - ryba - - serebro [se rebro, se-rebro, rebro] - - televiziia [televízia] diff --git a/Common/3dParty/hunspell/test/dst/sl_SI.txt b/Common/3dParty/hunspell/test/dst/sl_SI.txt deleted file mode 100644 index 6bd9384141..0000000000 --- a/Common/3dParty/hunspell/test/dst/sl_SI.txt +++ /dev/null @@ -1,210 +0,0 @@ -Hiša -Sonce -Miza -Stol -Ptica -Trava -Drevo -Noč -Luna -Morje -Gora -Cvet -Riba -Rdeča -Modra -Zelena -Rumena -Bela -Črna -Kamen -Pes -Mačka -Roka -Noga -Glava -Oči -Uho -Nos -Usta -Jabolko -Hruška -Sliva -Jagoda -Malina -Lubenica -Kruh -Mleko -Sir -Mesnica -Sadje -Zelenjava -Voda -Zrak -Ogenj -Sneg -Dež -Oblak -Veter -Zima -Poletje -Jesen -Pomlad -Zajec -Lisica -Volk -Medved -Lev -Tigrica -Slon -Konj -Krava -Ovca -Piščanec -Jajce -Mleko -Kava -Čaj -Sok -Vino -Pivo -Hrana -Pecivo -Testo -Marmelada -Kruh -Sir -Olje -Sol -Poper -Sladkor -Kava -Čaj -Vino -Pivo -Šola -Učitelj -Učenec -Knjiga -Pisarna -Računalnik -Telefon -Glasba -Slika -Film -Gledališče -Mesto -Vas -Trg -Cesta -Reka -Avtomatizacija -Razvoj -Komunikacija -Kompjuter [Juterškov] -Programiranje -Elektronski -Inženiring -Elektrifikacija -Kombinacija -Sistem -Informacija -Univerza -Biblioteka -Univerzitetni -Laboratorij -Raziskava -Razvojna -Inovacija -Intelektualni -Integriteta -Izobraževanje -Izvajanje -Preverjanje -Tehnologija -Implementacija -Program -Sodelovanje -Proizvodnja -Industrija -Organizacija -Administracija -Proaktivnost [Retroaktivnost, Produktivnosti, Produktivnost, Provokativnost] -Kreativnost -Projektni -Razumevanje -Kvaliteta -Upravljanje -Ocenjevanje -Statistika -Kompetentnost -Konsolidacija -Realizacija -Kapaciteta -Distribucija -Kompatibilnost -Konceptualizacija [Konceptualizem] -Povezava -Posodobitev -Fleksibilnost -Ekonomija -Organiziranje -Konkurenca -Stabilnost -Ekologija -Osebnost -Zavzetost -Entuziazem [Entuziast] -Motivacija -Avtorizacija -Kreacija -Akumulacija -Monotonija -Diferenciacija -Transformacija -Koncentracija -Inovativnost -Aktivnost -Vzpostavljanje -Reorganizacija -Kategorizacija -Partikularnost -Homogenost -Izjemenost [Izjemnost, Izjemen ost, Izjemen-ost, Zmenjenosti, Izrojenost, Izmišljenost, Izrinjenost] -Generalizacija -Hierarhija -Koordinacija -Inspiracija -Evaluacija -Ustvarjalnost -Oblikovanje -Kompatibilnost -Konkretizacija -Proaktivnost [Retroaktivnost, Produktivnosti, Produktivnost, Provokativnost] -Identifikacija -Kapaciteta -Intervencija -Konsolidacija -Realizacija -Eksplozivnost -Abstrakcija -Individualnost -Integracija -Segmentacija [Sedimentacija, Sedimentacij, Argumentacija, Alimentacija] -Asimilacija -Artikulacija [Artikuliranja, Artikulirala, Cirkulacija, Kalkulacija] -Kolaboracija -Asociacija -Stabilizacija -Kooperacija -Transformacija -Hšza [Hrza] -Kmojnikacija [Komunikacija] -Progrramiranjee [Programiranje, Reprogramiranj, Programiranega, Programiranj] -Elektornkski [Elektorski, Elektorkin, Elektronski, Elektorki] -Inženeirrng [Inženiring] -Izzobraževanjee [Izobraževanje, Izobraževanj, Izobraževanega, Izobraževane] -Infomracija [Informacija, Informacij, Rafinacijam] -Razvoojnaa [Razvojen] -Proizvdonja [Proizvodnja, Proizvajanja, Proizvajanj, Proizvaja] -Akitvnostt [Aktivnost] diff --git a/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt b/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt deleted file mode 100644 index ef1ecd7824..0000000000 --- a/Common/3dParty/hunspell/test/dst/sr_Cyrl_RS.txt +++ /dev/null @@ -1,227 +0,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. Акредитација [рехабилитација] -32. Петиција [петицијама] -33. Каустичан [аутистичан] -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. Хируршки [хируршких] -59. Шампионат [шампионати] -60. Геостационаран [револуционарност] -61. Опустошан [опустошености] -62. Клема [] -63. Стационарни [стационарна] -64. Секуларни [секуларних] -65. Исегментација [сегментацијом] -66. Дебелина [дебелића] -67. Прецизан [непрецизан] -68. Рафиниран [рафинирани] -69. Психолошки [психолошких, психолошки] -70. Турбулентан [корпулентан] -71. Интегритет [интегритет] -72. Идеолошки [идеолошких] -73. Манифестација [манифестација] -74. Имплицитан [имплицитан] -75. Хомогеност [хомогеност] -76. Изолација [хидроизолација] -77. Хетерогеност [] -78. Спекулативан [спекулативна] -79. Вагу [превагу] -80. Математички [математичким, математички] -81. Гематолошки [стоматолошки] -82. Психијатријски [психијатријске] -83. Блокада [блокадама] -84. Заплена [заплетена] -85. Монопол [монополом] -86. Дисидент [дисидентски] -87. Екстрадиција [екстрадиција] -88. Ревизија [ревизијама] -89. Ваидан [] -90. Колонизација [колонизација] -91. Мотивација [мотивација] -92. Просек [просектор] -93. Ресурс [ресурсу] -94. Хуманизам [хуманизам] -95. Дравски [Подравских] -96. Коалиција [коалиција] -97. Картеля [картелима] -98. Резолуција [резолуција] -99. Менталитет [менталитет] -100. Епидемиологија [дијалектологија] - -С ошибками [] - - Колонизакаија [Колонизација, Колонизацији, Колонијализам, Колонијализма] - - Епидемиогија [Епидемија, Епидемијом, Демагогија] - - Казуистикаки [Казуистика, Казуистике, Статистика] - - Хуманкзам [Хуманизам, Хуманизма] - - Манитулативан [Манипулативна, Ултимативан, Ултимативни] - - сањваење [сањање] - - утење [хтење, утање, стење, умење, утеше, утече, учење, утехе, утеже, уђење, утезање] - - автомобил [аутомобил, обилатом] - - мекицинска сестра [војномедицинска] - - стукло [стукли, тукло, стукла, стакло, стекло, свукло] diff --git a/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt b/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt deleted file mode 100644 index 8996675c19..0000000000 --- a/Common/3dParty/hunspell/test/dst/sr_Latn_RS.txt +++ /dev/null @@ -1,173 +0,0 @@ -ananas -anarhistički -antidepresiv [depresivan, depresivna, represivan, depresivne] -Anđeo -avion -banana -banka -belina -bespomoćnost -bibliotekar -bibliaoteikar [bibliotekarka, bibliotekar, biblioteka] -brod -citat -crkva -cvet -cveće -demokratija -demackratija [demokratija, demokratizacija, demokratiji, demokratije] -demokratizacija -Dobrota -dom -Dragi -ekran -eksperimentalni -eksplozija -epidemiologija [epistemologija, ideologija] -farmakologija -filantropija -flaša -frizura -fudbal [fudbal, fudbala, fudbalu] -garaža -generalitet -geografski -globalizam -gnezdo -grad -građanstvo -grlo -hamburger -Harmonija -himalaji [Himalaji, malajski] -hiperbola -hipotermija [hidroterapija] -hleb -Hrabrost -hrana [hrana] -Hvala -igra -igračka -individualnost -infrastruktura -internet -inmternet [internet, interne] -jabuka -jahač -jastuk -jednakost -jubilej -jurisprudencija -kafa -krevet -kriminalisticki [kriminalistički, kriminalistika, kriminalistička, kriminalistiku, kriminalističke] -kriminalistika -kuća -kvantitativni -lampa -latiaratura [mlatarati, rasturati, maturirala, landarati] -Lepota -lingvistika -literatura -ljubav -Ljubavi -ljubavnica -Ljubazan -Ljubim -lubenica -majica -majka -mašina -mikroorganizama -mikroskopija [mikroskop ija, mikroskop-ija, mikroskopi ja, mikroskopi-ja, mikroskopi, mikroskopska, mikroskopa, mikroskopski] -Milost -Mir -Mirno -nacionalizam -nedopustiv -neurologija -novčanik -noć -nož -oktobar -okultizam -optimističan [optimistička, optimistički, optimističke, optimističku] -optimističnost [optimistički, optimističke, optimistička, optimističku] -ormar -Osoba -oči -pas -peškir -planina [planina, planinar, planinac, planinčina, planini, planinčini, planin] -poniženje -Porodica -Prijatelj -psihologija -psihoterapija -Radost -računar -reka -rekonvalescencija -reumatologija [dermatologija, hematologija, stomatologija] -revolucija -sendvič -Slatko -Sloboda -Slobodan -Snaga -socijalizacija [socijalizam, specijalizacija, specijalizacijom, socijalizma] -socijalizam -Spreman -Sreća -Srećan -Srećno -sunce -superiornost -Svetlost -tata -tehnologija -telefon -telekomunikacije -top -tradicionalni -ulica -univerzalnost -univerzitet -univirzdalnost [univerzalnost] -Usmena -Znanje -usta -Vedar -vegetarijanstvo -velikodušnost -voda -voz -Zabava -zavisnost -Zdravlje -zemlja -Zima -zjmlja [zemlja] -zločinački -zoološki -Zvezda -ćilim -čarapa -čarobnjak -časopis -čizme -đak -đevrek -đumbir -šešir -šišmiš -škola -šljiva -šuma -žaba -ženskara -žirafa -život -životinjski -žurka - diff --git a/Common/3dParty/hunspell/test/dst/sv_SE.txt b/Common/3dParty/hunspell/test/dst/sv_SE.txt deleted file mode 100644 index 408fca774d..0000000000 --- a/Common/3dParty/hunspell/test/dst/sv_SE.txt +++ /dev/null @@ -1,210 +0,0 @@ -Hus -Sol -Mjölk -Vatten -Fisk -Stol -Grön -Blomma -Träd -Katt -Hund -Bok -Cykel -Kaffe -Frukt -Kött -Fönster -Dörr -Säng -Lampa -Bord -Hår -Ögon -Hand -Fötter -Näsa -Mun -Öra -Huvud -Arm -Ben -Kläder -Hatt -Skor -Väska -Papper -Penna -Skrivbord -Telefon -Radio -Musik -Film -Teater -Konst -Sport -Spel -Resa -Bil -Tåg -Buss -Flygplan -Båt -Stad -Land -Hav -Sjö -Flod -Berg -Dal -Park -Skog -Sjukhus -Apotek -Skola -Universitet -Affär -Restaurang -Café -Hotell -Turist -Vän -Familj -Mamma -Pappa -Bror -Syster -Barn -Morfar -Mormor -Vänster -Höger -Framåt -Bakåt -Upp -Ner -Snäll -Osnäll [Snäll, Osäll] -Glad -Ledsen -Trött -Stark -Svag -Tyst -Bullrig -Ren -Smutsig -Vacker -Ful -Liten -Stor -Komplexitet -Oproportionerlig -Ovillkorlig -Efterklokhet -Komplicerad -Desorientering -Konstellation -Otillgänglighet -Irreversibel -Förlåtelse -Overksamhet -Indifferent -Hierarki -Kombinatorik [Kombinatorisk, Kombination] -Inkompatibilitet -Absorption -Konsekvens -Verklighetsfrånvänd -Retrospektiv -Förändringsbarhet [Förändringsbarnet, Förhandlingsbart, Förhandlingsbar] -Ambivalens -Besvikenhet [Besviken, Besviket] -Ineffektivitet -Intrikat -Dilemma -Hesitation -Absurditet -Kompromisslös -Konsolidering -Föresats -Tillfredsställelse -Delegering -Rekommendation -Detaljrikedom -Oanvändbar -Stagnation -Nostalgi -Hemlighetsfull -Avsaknad -Perseverans [Perseverera, Reverseras, Reversera] -Existentialism -Repetitivitet [Repetitivt, Receptivitet, Repetitiv, Representativitet] -Intolerans -Anonymitet -Obetydlig -Paradox -Förvirring -Juxtaposition -Reflektion -Självständighet -Kollision -Kreativitet -Djupgående -Abstraktion -Eufori -Autentisk -Insinuation -Omöjlig -Pessimism -Inkonsekvens -Revisionism -Sensationell -Obeveklig -Subjektivitet -Universalitet -Entropi -Omvälvande -Infiltration -Konservativ -Atypisk -Provokation -Konfrontation -Anarki -Konkurrenskraft -Defensivitet [Defensivt, Sensitivitet, Defensiv, Densitet] -Nihilism -Konklusion -Apori [Apor, Apors, Porig] -Korrespondens -Prioritering -Exponentiell -Fragmentering -Aversion -Harmoni -Vanmakt -Signifikans -Katalysator -Förlust -Enhällighet -Ambition -Tendens -Alienation -Artificiell -Uppfyllelse -Psykosomatisk -Virtuos -Egensinnig -Anpassning -Hållbarhet -Konstitution -Kompleksitet [Komplexitet, Komplementet] -Oproporsjonerlig [Oproportionerlig, Proportionerlig] -Uvilkorlig [Villkorlig] -Etterklokhed [Efterklok] -Komplisert [Komplicerat] -Desorientering -Konstelasjon [Konstellation] -Utilgjengelighet [Tillgänglighet] -Irreversibel -Forlatelse [Förlåtelse] diff --git a/Common/3dParty/hunspell/test/dst/tr_TR.txt b/Common/3dParty/hunspell/test/dst/tr_TR.txt deleted file mode 100644 index 0ea601fe67..0000000000 --- a/Common/3dParty/hunspell/test/dst/tr_TR.txt +++ /dev/null @@ -1,205 +0,0 @@ -Akşam -Almak -Altın -Anahtar -Anlamak -Araba -Atmak -Ayakkabı -Açmak -Ağaç -Bahçe -Bakır -Bakkal -Bakmak -Balık -Beyaz -Bilgisayar -Bilmek -Binmek -Bulmak -Ceket -Cevaplamak -Deniz -Dinlemek -Doktor -Duyurulmamış -Düzenleştirme -Düşmek -Düşünmek -Ekmek -Elbise -Eldiven -Elma -Erkek -Etek -Etmek -Ev -Eşarp -Gelgit -Geliştiricilikle -Geliştirilebilir -Geliştirme -Gerçekleştirme -Gezmek -Geçmek -Gitar -Gitmek -Giymek -Gri -Gömlek -Görülebilirlik -Görünümlü -Görünüşlü -Gözlük -Gümüş -Günaydın -Hareketlendi -Hareketlilik -Hava -Hayalperest -Hüzün -Kahve -Kahverengi -Kalabalıklar -Kalem -Kalkmak -Kalmak -Kapatmak -Kararlılık -Kararlılıkla -Kararsızlık -Kararsızlıkla -Karpuz -Kedi -Kemer -Kemdkcer [Kemerler] -Kırmızı -Kitap -Kız -Kızgınmak [Kızgın] -Koklamak -Koalye [Kolye, Kavalye] -Kolye -Konservatuvar -Konuşmak -Korkmak -Koymak -Koşmak -Kravat -Kullanılabilir -Kullanılmış -Kullanılmışlık -Kullanışlılık -Kurumsallaşma -Köpek -Küpe -Kütüphane -Mavi -Mazbut -Melankoli -Merdiven -Merhaba -Merhabalar -Meurhaba [Merhaba, Murabaha] -Meydan -Meyhane -Meyve -Mor -Muhafazakar -Muhteşem -Mukadderatlarınızdanmışçasına [] -Muvaffak -Muzaffer -Muzafferiyet -Muzip -Mükemmeldik -Münasebet -Münzevi -Müsrif -Mütevazi -Müteessir -Mütercim -Mütereddit -Mütevazı -Müzmin -Okul -Okumak -Otobüs -Otoriterlik -Oynamak -Pantolon -Pasta -Pembe -Pembei [Pembe, Pembeyi, Pembeli, Pembeci, Pembe i, Pembesi, Pemben] -Plaj -Platin -Saat -Sandalye -Sarı -Satmak -Sevinmek -Sevmek -Sıcak -Sıradaymışız -Siyah -Sormak -Soymak -Soğuk -Su -Sükûnet [Sükunet, Sünnet] -Sürrealist -Süt -Tabak -Tadına bakmak [Alınamamaktadır] -Tatlı -Tavuk -Telefoncu -Televizyon -Temizlemek -Teşekkürler -Türkuaz -Tuirkuazu [Türkuaz] -Turuncu -Tutmak -Ulaştırılabilir -Uygulanabilir -Uyumak -Uçak -Yapmak -Yatak -Yazmak -Yemek -Yeşil -Yıkanmak -Yıldız -Yol -Yöneltilmezken -Yüzme -Yüzük -Zenginleştirmek -Çalışamamıştı -Çalışmak -Çalışmamıştır -Çanta -Çay -Çıkarmak -Çiçek -Çorap -Özelleştirilmiş -Özelleştirme -Özgürleştirme -Üzülmek -İnmek -İsteksizlik -İsteksizlikle -İstikrarlı -İstikrarlılık -İstisnai -İslamiyetle -İzlemek -İçmek -İşbirliği -İşitmek -Şapka -Şemsiye diff --git a/Common/3dParty/hunspell/test/dst/uk_UA.txt b/Common/3dParty/hunspell/test/dst/uk_UA.txt deleted file mode 100644 index be4941540b..0000000000 --- a/Common/3dParty/hunspell/test/dst/uk_UA.txt +++ /dev/null @@ -1,210 +0,0 @@ -абдукція -абіогенез -амбівалентнасть [амбівалентність, амбівалентний, бівалентність, біоеквівалентність, внівалентність] -амбівалентність -анахранізм [анахронізм, брахманізм, анархізм, нанізм] -анахронізм -антропогенез -антропологія -антропоморфізм -апатія -археологія -архетип -аскетизм -астрономія -афект -бачити -бігти -білий -біллий [білий, збілілий] -біологія -бувай -будинок -будь ласка [будь ласку] -бути -важко -велиикий [великий, великоокий] -великий -веселка -взяти -вибачте -відчувати -вода -волюнтаризм -втаємниченість -вчитися -гарний -гарячий -гегемонія -географія -герменевтика -герменевтика -гештальт [штатгальтер] -говорити -гойдалка -готувати -грати -дати -дедукція -деконструктивізм [де конструктивізм, де-конструктивізм, конструктивізм, неконструктивно] -деконструкція -демаркація -детермінізм -дзвіночок -дивитися -дисгарммонія [дисгармонія, дисгармоніям, дисгармонійний, фісгармонія] -дисгармонія -дисфункція -дисфункця [дисфункція, дистинкція] -дихотомія -до побачення [побачення] -добрий -доктрина -думати -дурний -дурня -дякую -евфемізм -езотерика -ей -екзистенціалізм -екзистенціалізм -екзистенцілізм [екзистенціалізм, екзистенціаліст, екзистенція] -екзистенція -економіка -емерджентність -ентелехія -епістемологія -ефемерність -ефемерність -занепадництво -звісно -здоровий -зелений -йти -ілюзорність -ілюзорність -імплікація -інвектива -індукція -інтроспекціїя [інтроспекції, інтроспекція, інтроспекції я, ретроспекція] -їсти -історія -каблучка -кава -казус -калюжа -катарсис -каченя -каштани -квітка -кішка -класно -книга -когнітивістика [когнітивність, когнітивна] -комаха -консенсус -космогенез [номогенез, екогенез] -купувати -легко -лінгвістика -літати -маленький -марнослів'я -математика -мати -метаморфоза -метелик -метелиця -містифікація -місто -могти -можливо -мусити -насправді -не радий [нерадий, незрадний] -незворушність -ні -нігілізм -новий -нонсенс -ностальгія -павучок -парадокс -пес -писати -пити -піти -плавати -плакати -повільний -поганий -політологія -постмодернізм -потворний -працювати -привіт -прийти -психоаналіз -птах -радий -ремінісценція -рефлексія -робити -розбурхання [розбухання, розбурханий, розпухання, бурхання] -розумний -сильний -сингулярність -синестезія [кінестезія, анестезія] -синій -синішй [синій, синішай, синішати] -синкретизм -сказати -скатертина -слабкий -слухати -сміятися -сніг -соліпсизм -соломинка -сонечко -сонце -соціологія -спати -співати -справді -старий -структуралізм -сумний -так -так -танцювати -телефонувати -тож -трансцендентність -фантастично -фаталізм -фемінізм -феномен -феноменологія -фізика -філософія -фрактал -хворий -хімія -хліб -хліб -ходити -холодний -хотіти -чао [чадо, чан, чат, чар, час, чад, дао, чаш, чай, чаї, чаю] -червонй [червоний, червоній, червоно, червона, червоні, червону, червоне, червоню, червонявий] -червоний -черевики -читати -чорнй [чорний, чорній, чорно, чорна, чорни, чорні, чорну, чорне, чорню] -чорний -чути -швидкий -щасливий -яблуко diff --git a/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt b/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt deleted file mode 100644 index 7aee309965..0000000000 --- a/Common/3dParty/hunspell/test/dst/uz_Cyrl_UZ.txt +++ /dev/null @@ -1,262 +0,0 @@ -Mарт [Арт, Ғарт, Қарт, Карт, Шарт, Фарт, Варт, Парт, Сарт, Март] -Ёз -Ём -Ёхуд -Август -Адвакат [Адвокат, Адэкват] -Адреси -айтган-лирангиз -айқин -амалга -анча -Апрел -арзонроқ -аҳамият [аҳамият, аҳамияти, ҳамият, ҳамжамият] -аҳднома -бажарилади -бажарилди -баланд -ихтисослан -банкрот -баҳона -Баҳор -бераман -берасизми -беринг -бериш -бешинчи -биз -Бизга -Бизнинг -билан [билан, биланг, билани] -Бирор -Бозорнинг -бор -бошқа -Бу -Бугун -будингиз -бунга -бундай -Бухгалтерлик -бўлади -бўладими -бўлиши -бўлмаган -бўлса -бўш -бўшайди -бўшатасиз -вазифасига -вазият -вариант -вақт -газетадаги -газетадан -даромад -Декабрь -Душанба -Эрталаб -Етказиб -Жисмоний -Жуда -Жума -зарур -зиёфат -Ижара -ижарага -икки -Илтимос -Индинга -информатизациялари -Иситгич -иши -ишлатсак -Ишхона -Июль -Июнь -Йўқ -йил -йилдан -кам -Шинамгина -кампанияси -келдим -келишимдан -келмоқчи -келсам -келтириш -керак -керакдир -керакми -кета-ди [кетади, кетарди, кета-чи, кета-кета, дискета] -кеч -Кеча -кечага -Кечаси -Кечир -Кечирдинг -кирла -кирадими -кондиционер -коррупциядир -кран -Куз -Кун -куни -кўрмоқчи -кўчиб -лойиҳа -Май -маълумоти -маълумотларни -Маъмурият -маъруза -Мен -музлатгич -мумкин -муфмкин [мумкин] -мутахассис -мушовир -муҳим -нарса -нархи -Нархини -нақд -ўшанақасини -неча -Номардлик -Ноябри -интернетдаги -ойнаси -ойнинг -Октябри -олдин -олдиндан -олмаймиз -олмоқчи -орқали -шоти -шорти [шоти, орти, ортиш, шотир, корти, форти, шарти, порти, сорти, ширти, торти, борти, шомурти] -Оқшом -пайдо -Панжшанба -пулини -Раҳмат -резюме -реклама -Салом -Сармоядор -Сентябрь -Сешанба -Сиз -сизга -сизда -Сизнинг -синган -сифатида -совуқ -софвуқ [совуқ] -Солиқларни -Статистик -сўм -тажрибали -тайёргарлик -тайёрладик -тайёрладингизми -таклиф -талафот -талафоти -таъминловчилардан -танишинг -таржимон -тарржимон [таржимон, тарраксимон] -тахминан -ташкил -Телефонни -технология -Безантирани -тозалан -тозалигига [тозалигига, газтозалагич] -Тонгда -топширишимиз -топшириқ -турли -турмоқчи -тутсак -Тушлик -ўладиганингиз -тўлай -тўлаймиз -тилдиришинг -тўлиқ -уйингиз -уйни -уч -учун -ўқидим -фақат -Феврал -хабар -Хайрли кун [Хайрли кўн] -Мотамхонаси -хонлик -Чек -Чоршанба -Шанба -шарт-номани -шартини -шартлар -шартлари -шартни -шартнома -шахс -шовқин -Шом -Шу -эди -Эртага -Эртадан сўнг [Эртасиганг] -Эшитишимга -эълон -эълонингиз -эълонингизни -эътироф -Юклаш -Якшанба -Январи -Ярим кеча [Яримкеча, Яримчиликча] -яхши -қабул -қаерда -Қанақа -қаноатманда -қанча -қачон -қизиқарлидир -қиламиз -қилганим [қилганим, қилганими, қилгандайин] -қилдим -қилинг -қилинди -қилишди -қиммат -қиммати -Қимматидан -қирқ -Қиш -қувонарлими -қўнғироқ -Қўшимча -ҳайвонини -ҳам -ҳамза -Ҳар -ҳафтага -ҳақиқатан -ҳисоблаб -Ҳозир -ҳужжатни -Ўтган кун [Ўтган кўн] - - diff --git a/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt b/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt deleted file mode 100644 index 0b2717d0ce..0000000000 --- a/Common/3dParty/hunspell/test/dst/uz_Latn_UZ.txt +++ /dev/null @@ -1,200 +0,0 @@ -Salom -Sallom [Slalom, Salom, Musallo, Alloma, Salo] -Rahmat -Rhmat [Rahmat, Marhamat] -Iltimos -Iltimo [Iltimos, Tilsimot, Timol] -Kattalar -Kattalarvf [Kattalashtir] -Yaxshi -Yashi [Ayshi, Tashi, Yash, Yasashi, Yarashish, Yalashish, Yaxshi] -Kelajak -Keljajak [Kelajak] -Oilaviy -Oilaaviy [Oilaviy, Hosilaviy] -Qarindosh -Qarinndosh [Qarindosh, Qayindoshlar, Oqarinish] -Shahar -Shaha [Shah, Shalha] -Dengiz -Dengizzz [Dengiz] -Quyosh -Quyyosh [Quyosh, Quysh] -Yulduz -Oyim -Kechqurun -Tushun -Suvchi -Sharob -Choyxona -Nonushta -Tushlik -Muzqaymoq -Desert -Tuzluq -Mevalar -Sabzavot -Baliq -Tuxumli -Sabza -Sariq -Salatlar -Shirinlik -Shokolad -Rishta -Kakao -Pishloq -Tort -Qaymoq -Sutli -Qatiq -Salomatlik -Temir -Zahar -Oqimli -Shamol -Olov -Yer -Osmon -Shanba -Dushanba -Seshanba -Chorshanba -Payshanba -Juma -Yakshanba -Oltin -Tong -Bomdod -Asr -Shom -Kun -Oqsoqol -Shoshqaloq -Kulgili -Muxlislilar -Tavsiflash -Tuzilishga -Mustaqillik -Tushuntirish -Boshqarish -Mashhurlik -Tarkibiy -Tahlil -Ishchi -Xalqaro -Tarjima -Mustahkamlik -Chaqaloq -Istiqbol -Tasvir -Taklif -Tasavvur -Jiddiy -Majburiyat -Asosiy -Tahdid -Tushunmovchilik -Ishonch -Maqomi -Ijodkor -Tadbirkor -Hayotiy -Mashhur -Bemorlik -Tadbir -Jismoniy -Madaniyat -Xavfsizlik -Sifatli -Suvli -Sotuvchi -Chetel -Tashqi -Sotuv -Tarbiyalanish -Murabbo -Sariqcha -Qovun -Shaharlik -Muhimlik -Tarbiyachilik -Xatolik -Balandlik -Yuzaki -Kuyov -Qiziquvchan -Orzular -Mashq -Qalampir -Muammo -Sadoqatli -Yovuzlik -Fikr-mulohaza -Boylik -Tushuncha -Zanjir -Eslatma -Tabassum -Ishonuvchi -Chidamlilik -Ilova -Birodarlik -Oqilona -Ijodiyot -Tayanch -Hurmat -Baxtli -Tajriba -Samimiylik -Shifokor -Ishrat -Baho -Namoyish -Qiyinchilik -Bolalar -Ishonchli -Taqdir -Shovqinli -Xalqaro -Baxt -Fursat -Hurmatli -Qulaylik -Zamonaviy -Sadoqat -Sabr -Nikoh -Jasorat -Barkamollik -Dunyoqarash -Omadli -Foydali -Yorqin -Mehribonlik -Fazilatli -Kutubxona -Istiqomatli -Fido -Bahor -Shafqatsizlik -Tafakkur -Fazilat -Qochish -Laziz -Uzoq -Ilhom -Omad -Hurmatli -Tandir -Sherzod -Bahoriy -Dilshod -Baxtli -Shonli -Nurli -Shafqatsizlik -Oqqush -Boylik -Toza -Sabrli diff --git a/Common/3dParty/hunspell/test/dst/vi_VN.txt b/Common/3dParty/hunspell/test/dst/vi_VN.txt deleted file mode 100644 index bcc3ab3150..0000000000 --- a/Common/3dParty/hunspell/test/dst/vi_VN.txt +++ /dev/null @@ -1,128 +0,0 @@ -Bánh -Bang -bênh -bướng -bậy -Chanh -chum -chuyện -chép -Chùng -chắp -chệnh -chới -chữ -công -cạc -cột -cứu -Doanh -duyên -dùng -dể -dọng -gia -giày -giêng -Giảng -giềng -hon -Hoẳn -Hài -hôm -hước -hấu -hớt -hữu -Khiển -Khoào -khuya -khuyến -khách -khén -khẩn -khắp -khựng -kẻo -lang -liền -Loàng -Luỗng -lình -lương -lấp -lệnh -lịnh -lốn -lời -lựng -Muộn -Mãnh -mại -mạn -mổ -mởn -nghiễm -nghều -Ngoáy -Nguyên -ngóp -người -ngỏ -ngớp -ngụa -ngửng -nhiếp -nhu -nhà -nhân -Nhóm -nhưỡng -nhắm -nhổn -nhứt -ninh -noi -nãy -nạn -nốt -ong -pao -phiên -phiêu -Phên -Phương tiện [] -phẩm chất [] -phố đi bộ [phố đì bộ, phố đĩ bộ] -quan trọng [quàn trọng, quản trọng, quán trọng, quăn trọng, quằn trọng, quắn trọng, quặn trọng, quân trọng, quần trọng, quẩn trọng, quẫn trọng, quấn trọng, quận trọng] -quyền lợi [quyền] -quán cà phê [qùán cà phê, qủán cà phê, qũán cà phê, qúán cà phê, qụán cà phê, qưán cà phê, qừán cà phê, qửán cà phê, qữán cà phê, qứán cà phê, qựán cà phê] -quảng cáo [quảng] -Quốc -Quốc tế [Quốc] -riêng biệt [triêng] -rưỡi -Rải -Rẻng -rộng rãi [rộng] -siễn -sum -Sõng -Sưu -sưu tập [] -sử dụng [sử đụng] -Thiệt thòi [] -Thuộc về [Thuộc] -thuộc tính [] - -Слова с ошибками [] -thiệte [thiệt, thiệt e, thiện] -quốq tế [] -nguên [nguyên, nguồn] -khoao [khoào, khoai, khoa, khao, khoeo, khoèo, khoan] -chenh [chênh, chềnh, chểnh, chễnh, chếnh, chệnh, cheng, chen, chanh, chành, chảnh, chánh, chạnh, chinh, chình] -chhùng [chùng, chùn, hùng] -man -doah [doa, doanh, doan, doa h] -khien [khiên, khiền, khiển, khiến, khin, khen] -ngoay diff --git a/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt b/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt deleted file mode 100644 index 4d97adce04..0000000000 --- a/Common/3dParty/hunspell/test/src/az_Latn_AZ.txt +++ /dev/null @@ -1,213 +0,0 @@ -A -qocalmaq -Alderaan'ın -hamısı -həmçinin -Və -cavab -dir -incəsənət -kimi -da -uzaq -körpə -zirzəmi -ol -olub -doğuldu -bulvar -fasilə -nəsllər -gəlin -lakin -al -ilə -Kaliforniya -Kalifornikasiya -bilər -kartlar -şans -Çin -çənə -klublar -Cobain -bürc -nəzarət -qiymət -edə bilməzdim -yaratmaq -lənət -rəqs -saziş -sövdələşmələr -dağıdıcı -almazlar -etməz -etməyərik -arzu -xülyalar -Şərq -kənar -kənarları -məmnunluq -hamının -uzaq -peri -solğun -üz -son -tap -ilk -üçün --dan -sərhəd -qız -qızın -yaxşı -gitara -əl -hardcore -var -yoxdur -o -eşitmək -ürək -O'nun -ona -gizli -yüksək -ona -onun -Hollivud -Mən -Mənəm -əgər -içində -məlumat -içində -dir -bu -jack -sadəcə -kral -qohum -bilmək -qoyulmuş -qanun -yerləşdirilmək -qurğuşun -aparmaq -yerləşdirilmə -məkan -sevmək -şans -edilmiş -adam -çox -Evlənmək -maska -o bilər -bəlkə də -mənası -mən -meditasiya -xatirə -ağılın -pul -mənim -heç vaxt -deyil -heç nə -nömrələr -of -of -üstündə -bir -yalnız -və ya -nəticə -öz -Ödə -Şəftəli -yerlər -oynayır -oynamaq -əhali -porno -tərifləmək -ehtimal ki -ehtimal -psixik -kraliça -qaldırmaq -qalan -hörmət -qalxmaq -yol -xam -müqəddəs -Xilas et -elmi -çığırmaq -satılır -şəkil -xəstələnmək -gümüşçü -dəri -əsgər -bir şey -Mahnı -mahnılar -qılınclar -büyü -casuslar -ulduz -Stansiya -oğurlamaq -daşlar -günəş -şübhəli -İsveç -qılınclar -yeniyetmə -test -dandan -bu ki -bu ki -bu -onların -bu -onlar -düşünmək -bu -onlar -gel-git -üçün -deyilmişəm -çox -cəhd et -başa düşdüm -qilin -titrəmək -mübarizə aparır? -istəyirəm -müharibə -idi -dalğalar -geymək -silahlar -yaxşı -idarə olunan -Qərbi -nə -arasında -qalib gəlmək -qalib gəlir -ilə -qadın -dünya -səhv -siz -sizə -sənsən -sənin diff --git a/Common/3dParty/hunspell/test/src/bg_BG.txt b/Common/3dParty/hunspell/test/src/bg_BG.txt deleted file mode 100644 index a09b554067..0000000000 --- a/Common/3dParty/hunspell/test/src/bg_BG.txt +++ /dev/null @@ -1,212 +0,0 @@ -A -остаряване -Алдераан -всичко -също -и -отговор -са -изкуство -като -в -далеч -бебе -мазе -бъда -било -роден -булевард -почивка -породи -невеста -но -купувам -от -Калифорния -Калифорникация -може -карти -шанс -Китай -брадичка -клубове -Кобейн -съзвездие -контрол -цена -не можех -създаване -проклятие -танц -сделка -сделки -унищожение -диаманти -не прави -не правим -мечта -мечти -Изток -ръб -ръбове -екстаз -всеки -далеч -приказка -избледнява -лица -краен -намирам -първи -за -от -предел -момиче -момичето -добре -китара -ръка -хардкор -има -няма -той -чуя -сърце -той е -нейни -скрит -висок -него -негов -Холивуд -аз -аз съм -ако -в -информация -вътре -е -това е -вале -просто -крал -родственик -знам -определен -закон -поставям -водя -води -местоположение -обичам -късмет -направен -човек -много -Ожени се -маска -май -може би -означава -аз -медитация -спомен -ума -пари -моя -никога -не -нищо -числа -от -изключен -на -един -само -или -изход -свой -Плати -праскова -места -играе -играя -население -порно -похвала -вероятно -вероятен -психичен -кралица -въздигам -останал -почит -възход -път -груб -светия -Спасявам -наука -крясък -продава -форма -по-болен -златар -кожа -войник -някаква -Песен -песни -пикове -заклинание -шпиони -звезда -стация -крада -камъни -слънце -подозрителен -Швеция -мечове -тийнейджър -тест -отколкото -това -това е -на -техни -тези -те с -мисли -този -той -прилив -до -каза -също -опитайте -разбрано -еднорог -вибрация -водене? -искам -война -беше -вълни -носете -оръжия -Ами -бяха -Западна -какво -докато -победа -победи -със -жена -свят -грешка -ти -ти би -ти си -вашият diff --git a/Common/3dParty/hunspell/test/src/ca_ES.txt b/Common/3dParty/hunspell/test/src/ca_ES.txt deleted file mode 100644 index 3fd8739062..0000000000 --- a/Common/3dParty/hunspell/test/src/ca_ES.txt +++ /dev/null @@ -1,112 +0,0 @@ -amor -llum -lluum -esperança -espirança -llibertat -força -forrça -pau -somni -llibre -mar -amistat -cançó -flor -cel -estrella -temps -camí -vent -muntanya -mumntanya -riu -soroll -silenci -viatge -foc -gel -paraula -vida -dia -nit -tarda -matí -lluna -sol -llac -marbre -ferro -sal -mel -sucre -peix -ocell -oceoll -joc -ritme -melodia -pintura -pentura -teatre -dansa -poema -història -llegenda -mitologia -festa -música -vi -cervesa -cervessa -formatge -pa -ciutat -poble -natura -camp -bosc -platja -sorra -sorrà -pedra -ànima -cos -ment -cor -somriure -somriàre -abraçada -bes -parla -oida -vista -tacte -gust -olfacte -color -forma -número -lletra -sistema -regla -escola -universitat -univversitat -mestre -estudiant -sabiduria -lliçó -pregunta -resposta -risposta -dubte -certesa -veritat -mentida -promesa -secret -descoberta -descaberta -aventura -destinació \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt b/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt deleted file mode 100644 index 8b31af1a39..0000000000 --- a/Common/3dParty/hunspell/test/src/ca_ES_valencia.txt +++ /dev/null @@ -1,212 +0,0 @@ -A -envellir -Alderaan -tot -també -I -resposta -és -art -com -a -lluny -nadó -celler -ser -ha estat -nat -bulevard -pausa -generacions -núvia -però -comprar -amb -Califòrnia -Californication -pot -cartes -oportunitat -Xina -mentó -clubs -Cobain -signe del zodíac -control -preu -no podria -crear -maleït -ballar -acord -negocis -destructiu -diamants -no fer -no fem -desitjar -somnis -Est -vora -voreres -satisfacció -tots -llunyà -fada -pallid -cara -final -trobar -primer -per -de -frontera -noia -la noia -bé -guitarra -mà -hardcore -hi ha -no hi ha -ell -sentir -cor -ell és -seva -secret -alt -ell -seu -Hollywood -jo -sóc -si -en -informació -interior -és -és -jack -només -rei -parent -saber -fixat -llei -col·locar -plom -portar -col·locació -lloc -estimar -oportunitat -fet -home -molts -casar-se -màscara -podria -potser -sentit -jo -meditació -memòria -ment -diners -meu -mai -no -res -números -de -fora -sobre -un -només -o -resultat -seu -pagar -préssec -llocs -jugar -joc -població -porno -elogiar -probablement -probable -psíquic -reina -elevar -restant -respecte -pujar -camí -cru -sant -salvar -ciència -crit -vendre’s -figura -malalt -joier -pell -soldat -alguna cosa -cançó -cançons -cims -encanteri -espies -estrella -estació -robar -pedres -sol -sospitós -Suècia -espases -adolescent -prova -que -que -això -seu -aqueixos -ells -pensar -aqueix -ells -marees -per -no he estat -molt -intentar -entendre -fer -tremolar -lluitar -desitjar -guerra -va ser -ones -portar -armes -bé -administrat -Oest -què -entre -guanyar -guanya -amb -dona -món -equivocat -tu -vostè -tu ets -teu diff --git a/Common/3dParty/hunspell/test/src/cs_CZ.txt b/Common/3dParty/hunspell/test/src/cs_CZ.txt deleted file mode 100644 index a76fe6803e..0000000000 --- a/Common/3dParty/hunspell/test/src/cs_CZ.txt +++ /dev/null @@ -1,206 +0,0 @@ -pomaliý -šťstný -smuutný -horcký -studiený -záludnast -náhodillost -úpěnlevý -rozspačitý -svéhllavý -jablko -slunce -voda -dům -pták -káva -chleba -květina -kniha -pes -kočka -město -zelený -modrý -červený -bílý -černý -velký -malý -rychlý -pomalý -šťastný -smutný -horký -studený -nový -starý -hezký -ošklivý -dobrý -špatný -zdravý -nemocný -silný -slabý -chytrý -hloupý -pracovat -jíst -pít -spát -číst -psát -mluvit -smát se -plakat -zpívat -hrát -tančit -učit se -nakupovat -vařit -telefonovat -dívat se -poslouchat -chodit -běžet -létat -plavat -psát -učit se -dělat -mít -být -jít -přijít -odejít -dát -vzít -říct -vidět -slyšet -cítit -myslet -chtít -moct -muset -rád -nerad -ano -ne -prosím -děkuji -na shledanou -omlouvám se -sbohem -ahoj -čau -hej -jo -fakt -super -blbost -paráda -no jo -jasně -takže -vlastně -třeba -snad -leštěnka -pochmurný -živelný -ponaučení -záhada -pochybnost -nádhera -soucit -záludnost -náhodilost -úpěnlivý -rozpačitý -svéhlavý -marnivost -blahodar -rozčarování -odchylka -přelud -vytrvalost -neústupnost -lehkost -souznění -rozmarnost -roztržitost -úskočnost -rozkoš -marasmus -rozpolcenost -neúprosnost -ztřeštěnost -chmurnost -okouzlení -zářivost -vyrovnanost -neochvějnost -neúcta -bizarnost -rozmařilost -nepochopení -nevýslovný -pomíjivost -beznaděj -úzkost -odtažitost -rozerv -rozervanost -vyčerpanost -bezcitnost -záludnost -nezdolnost -rozkošátnost -nezdolatelnost -rozmarnost -živelnost -bezútěšnost -záhadnost -neposkvrnitelnost -rozkošnělost -bezradnost -neuchopitelnost -pošetilost -opojení -rozervanost -marnost -bezstarostnost -nevinnost -náladovost -vyrovnanost -ztracenost -bezbřehost -rozervanost -opojení -bezradnost -neuchopitelnost -pošetilost -opojení -rozervanost -marnost -bezstarostnost -nevinnost -náladovost -vyrovnanost -ztracenost -bezbřehost -opojení -bezradnost -neuchopitelnost -pošetilost -opojení -rozervanost -marnost -bezstarostnost -nevinnost -náladovost -vyrovnanost -bezbřehost \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/da_DK.txt b/Common/3dParty/hunspell/test/src/da_DK.txt deleted file mode 100644 index 1581a61660..0000000000 --- a/Common/3dParty/hunspell/test/src/da_DK.txt +++ /dev/null @@ -1,129 +0,0 @@ -Hej -Goddag -Tak -Ja -Nej -Måske -Mad -Vand -Hus -Bil -Tog -Cykel -Skole -Børn -Far -Mor -Søster -Bror -Hund -Kat -Fisk -Fugl -Træ -Blomst -Græs -Sol -Måne -Himmel -Regn -Sne -Sommer -Vinter -Forår -Efterår -Aften -Nat -Dag -Uge -Måned -År -Læse -Skrive -Tale -Lære -Arbejde -Sove -Vågne -Løbe -Gå -Sidde -Stå -Lytte -Se -Høre -Spise -Drikke -Kød -Frugt -Grøntsager -Ost -Brød -Vand -Juice -Kaffe -Te -Mælk -Smør -Æg -Salt -Peber -Sukker -Bolle -Smørrebrød -Køkken -Stue -Soveværelse -Badeværelse -Toilet -Bord -Stol -Sofa -Lampe -Vindue -Dør -Gulv -Loft -Væg -Sofa -Pude -Tæppe -Badekar -Håndvask -Spejl -Håndklæde -Seng -Dyne -Dynee -Pude -Pudee -Alarm -Alarmm -Skrivebord -Stol -Hus -Hund -Kat -Katt -Bil -Skole -Skolee -Sol -Soll -Vand -Vandd -Mad -Madd -By -Barn -Barnn -Tørklæde -Skæbne -Uafhængighed -Kærlighed -Kærligheed -overbelastning -Modstandsbevægelsen -Uafhængighedserklæringen -Forårssommertemperaturen -Stabiliseringsperioden diff --git a/Common/3dParty/hunspell/test/src/de_AT.txt b/Common/3dParty/hunspell/test/src/de_AT.txt deleted file mode 100644 index fccb06c431..0000000000 --- a/Common/3dParty/hunspell/test/src/de_AT.txt +++ /dev/null @@ -1,131 +0,0 @@ -Ägyptologie -Ährenamt -Ängstlichkeit -Äquatoria -Abarbeiten -Abbild -Abbilden -Abbildungs -Abbreviatur -Abbrüche -Abfassen -Abfertigen -Abfolge -Abfuhr -Ableugnen -Ablichten -Ablöse -Absätze -Abschnitts -Abwechseln -Abwehren -Aktiv -Britannia -Browserfenster -Budgetieren -Bugpartie -Bukarester -Burgundersoße -Butterkrem -Button -Cabriolet -Campanile -Canapé -Caprice -Celsius -Chamäleon -Charakteristik -Chronometer -Chronometrie -Cölln -Connectzustände -Cursorspur -Däne -Dachs -Dahindämmern -Darbringen -Daten -Datenbankserver -Desktopsystem -Detektivfilm -Dichtertum -Dinosaurier -Direktion -Diskantgambe -Diskothek -Druckereicode -Kapsel -Karausche -Katzen -Klinge -Klinke -Kohlrabi -Koinzidenz -Kolleg -Komplott -Meereis -Mehrphasigkeit -Memorieren -Messen -Methode -Metrowaggon -Meute -Migräne -Milieuforschung -Mindern -Mineralien -Mitternacht -Mobiliar -Mohrrübe -Mühelosigkeit -Normativität -Notifikation -Ökonomie -Orangeton -Osten -Subjekt -Subsidiarität -Subsumieren -Tagfalter -Speicher -Spielzeugsammlung -Zahler - -Сложные слова -Zurückgezogenheit -Äquipotentialfläche -Äußerungsbedeutung -Abfassungszeitraum -Abgeschlossenheits -Adjunktionsbeseitigung -Anknüpfungsgrundsätze -Chiffrierschlüssel -Knochenmarktransplantation -Bundeskaderathlet -Carbonsäurechlorid -Cardiazoltherapie -Chancenungleichheit -Charakterisierungsmöglichkeit -Chlorophyllkonzentration -Computerspielemarkt -Deindustrialisieren -Dekodierungsmöglichkeit -Kartoffelschälmesser -Kernspinresonanztomographie -Merkmalskombination -Nachbarschaftszentren -Opportunitätsprinzip -Tiefenstaffelung -Tourismusfachmann -Sequenzbetrachtung - -Слова с ошибками -Dechifrierprogramm -Administratorkenwort -Spigeln -Tätigkeite -Draufgangertum -Abschnit -Komunikation -Drackereicode -Bumeln \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/de_CH.txt b/Common/3dParty/hunspell/test/src/de_CH.txt deleted file mode 100644 index 12c4663080..0000000000 --- a/Common/3dParty/hunspell/test/src/de_CH.txt +++ /dev/null @@ -1,116 +0,0 @@ -Alpinist -Alteration -Alternative -Alumne -Amateurfilmer -Ambulanz -Amtmänner -Analogie -Analytik -Ananas -Angabe -Ankünfte -Dynastie -Ebenbürtigkeit -Echtheitszertifikat -Editionspläne -Editor -Ehrenamtlichkeit -Eigentümerschaft -Einbau -Eindringling -Eingabequittungsbetrieb -Einhüllen -Einkommen -Einloggen -Einschließen -Einsortier -Elaboration -Elementar -Entertainer -Entkuppeln -Entschädigungs -Enumerator -Erbringen -Erdichten -Erfahrenheit -Erhalt -Erleichtern -Ersparnis -Erstatten -Erzählliteratur -Helikopter -Helpdesk -Herunterladen -Hindeuten -Hinterlassenschaft -Hiob -Landesprache -flexibilität -floristisch -flugbillet -heroben -herrichten -herstellen -herübereilen -herunterzubücken -hie -hieraus -hilfe -himbeere -justiz -kältebeständig -kärtchen -känguru -kaktusgewächs -kalligrafie -kamel -kampagnendirektor -kapazitär -kapitalist -karamell -kardieren -karpfen -katalogdaten -lyzeum -mahagonirot -makkaroni -malerausbildung -management -mangel -maniküre -manneskraft -mansarde -mark -marketingpraktiker -maschinell -massage -massengutschifffahrt -materie -medaille -medizinalshampoo -meeresfrüchte -quotient -salonwagen -satzeinleitend -trilateral -tristesse -tropen -vereisen -verfahren -verfügungs -verhindern -verkäufer - -Слова с ошибками -Anbindungsystem -Anglistikdocent -Ecco -Economclass -Einverstandnis -Electrik -Historique -herüberzurucken -kartofel -salade -sanddornbere \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/de_DE.txt b/Common/3dParty/hunspell/test/src/de_DE.txt deleted file mode 100644 index 3ab503f810..0000000000 --- a/Common/3dParty/hunspell/test/src/de_DE.txt +++ /dev/null @@ -1,211 +0,0 @@ -Hallo -Guten Morgen -Danke -Bitte -Ja -Nein -Entschuldigung -Tschüss -Liebe -Freund -Familie -Glück -Gesundheit -Schule -Arbeit -Essen -Trinken -Wasser -Brot -Käse -Fleisch -Gemüse -Obst -Kaffee -Tee -Milch -Zucker -Salz -Pfeffer -Haus -Wohnung -Bett -Stuhl -Tisch -Sofa -Fernseher -Telefon -Computer -Buch -Zeitung -Schreiben -Lesen -Hören -Sehen -Fühlen -Laufen -Springen -Schwimmen -Tanzen -Singen -Lachen -Weinen -Freude -Trauer -Angst -Mut -Liebe -Hass -Freundschaft -Beziehung -Familie -Eltern -Kinder -Geschwister -Großeltern -Onkel -Tante -Cousin -Cousine -Ehemann -Ehefrau -Verlobung -Hochzeit -Scheidung -Geburt -Tod -Krankheit -Arzt -Krankenhaus -Medikament -Apotheke -Gesundheit -Wohlbefinden -Fitness -Diät -Schlaf -Ruhe -Entspannung -Sport -Fußball -Tennis -Schwimmen -Laufen -Radfahren -Wandern -Reisen -Urlaub -Strand -Sonne -Meer -Komplementär -Perspektive -Konsens -Integrität -Konsequenz -Authentizität -Korrelation -Charakteristik -Akzeptanz -Flexibilität -Assoziation -Dekomposition -Komplexität -Positivismus -Universalität -Stabilität -Individualität -Konsistenz -Konformität -Dezentralisierung -Kollaboration -Partizipation -Präzision -Transformation -Konkurrenz -Paradoxie -Redundanz -Regeneration -Integration -Isolation -Asymmetrie -Aggregation -Disziplin -Resilienz -Relevanz -Konfusion -Komplikation -Koordination -Harmonie -Ineffizienz -Konstruktion -Konversion -Kollusion -Gerontologie -Differenzierung -Dimensionalität -Inferenz -Fluktuation -Kontraktion -Rezession -Inflation -Dekontamination -Exzellenz -Innovation -Isomorphie -Konnotation -Insuffizienz -Konversion -Kompensation -Koalition -Inkongruenz -Inkontinenz -Kontrahent -Konfiskation -Konjunktur -Aggression -Konfrontation -Kompatibilität -Prognose -Akzeleration -Konstruktion -Diversifikation -Prävention -Sanktion -Indikation -Reduktion -Konkurrenz -Konfiguration -Konnotation -Rezession -Transformation -Interaktion -Kooperation -Innovation -Kollision -Proklamation -Konnotation -Konfrontation -Disposition -Konkordanz -Deklamation -Kollaboration -Isolation -Inflation -Diversifikation -Konnotation -Kompensation -Diffusion -Dekadenz -Konserve -Deklomotion -Kolaboration -Isollation -Infllation -Divirsifikation -Konotation -Kompenssation -Difusion -Dekadens -Kanzerve - diff --git a/Common/3dParty/hunspell/test/src/el_GR.txt b/Common/3dParty/hunspell/test/src/el_GR.txt deleted file mode 100644 index badd16854f..0000000000 --- a/Common/3dParty/hunspell/test/src/el_GR.txt +++ /dev/null @@ -1,123 +0,0 @@ -Αβαντάζ -Αβασταγά -Αβγάτισες -αβέβαιο -αβέλτερο -αβέλτεροι -αβίαστους -άβλαβοι -αβοκάντο -αβράδιαστης -άβραστη -αβράχυντου -άβρεχτα -αβρή -αβρότης -άβυσσον -αγαθόν -αγαθούς -αγάλακτο -αγγούρι -αγελαδινού -αγέρα -αγεωμέτρητων -αγίνωτοι -άγκυρες -αγορεύσεις -αγόρευσή -αγορίνα -Αγοριού -Αγροληψία -Αρμόνια -βγαίνοντας -βεβαιώσεων -διάθεση -διαίρεση -Διαιρέσου -Διαιτολογίου -διαψεύσουν -διδασκάλισσας -ενασκήσεις -ενασχόληση -ενασχόλησή -ενδείξεις -ενδεχόμενον -ενδιαμέσου -Επιστήθιες -Επιστημο -Επιστολές -Επιστολή -εύπορους -ευρέα -ευρημάτων -ευρύτητά -ευσταθών -εύστροφα -ευσυνειδησία -εύτακτε -ευτελείς -ευτελίζουν -ιδρυτικό -ιεροψάλτες -Ιζόλα -Ιθαγένειάς -ικανότατος -ιλαρότης -κεφαλής -κεφαλιάτικες -κεφαλωτές -κήπε -κήπευση -Κήρυξής -Λεξικογραφιών -Λεξιλογικός -λεοντή -λεοντής -ολιγοχρόνιου -ολικέ -ολικές -ολική -πελαγώνω -πελατών -πελάων -προστατεύει -προστασίας -σούρουπου -σουρούπωμα -σούρτης -Σούρωνα -Σπαγέτα -Σφάλμα -Σφάλματά -σφικτά -σφικτέ -σφοδρότητας -σφοδρού -σφραγίσω -σχεδιάζουμε -σχεδιάζουν -σχηματίσου -σχηματίσουμε -σχολιάζεσαι -Σχολιάζεστε -Ενδιαφέροντα - -Слова с ошибками -Αβασiλευτου -αγαπούσαv -βeβαιωμένοι -εvασxόλησης -επιoτολικέ -ιδιωτικοποιήσειc -λεπταίσθnτη -πρoστιμάρισμα -σφάλμαtα -προστάτεuε -κεxριμπαριού -διαισθnτικότητες -αγκιστpώσουv -αγαθoεργiας -αβεβαιoτητά -αγέρεc -διδαxθούμε -εuσταθειώv \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_AU.txt b/Common/3dParty/hunspell/test/src/en_AU.txt deleted file mode 100644 index f9404bce0d..0000000000 --- a/Common/3dParty/hunspell/test/src/en_AU.txt +++ /dev/null @@ -1,116 +0,0 @@ -Acknowledge -acrophobia -adventurousness -aeronautics -algal -Alligator -allegation -alphabetise -Analogy -appropriable -assembly -attempt -Average -barbecue -bathtub -begun -belongingness -Better -binary -blackberry -boatswain -bow-tie -brambly -bright-eyed -bubble -Calender -cancellous -cantankerousness -carefree -categorized -cellular -chaos -cheerfulise -childlike -circumstance -close-mouthed -Cocoa -coherent -co-located -Colours -controversial -cottage -creditworthiness -cut-down -dedicated -deep-freeze -Definitive -Designs -digital -distensible -dollar -dyslexia -Egyptian -effectively -etiquette -excess -exotica -fairly -feedback -features -figure's -fjord -forty-seven -government -haematomata -helpless -homologous -implant -Indemnify -inexpert -interior -localises -loquaciousness -maelstrom -mechanizable -melodious -mezzo-soprano -mozzie -municipalisation -mystifier -Neoclassicism -newsletter -non-professional -officiation -orientalisation -palaeoanthropography -parrot -pickpocket -pioneer -cryptanalytic -simplifying -sommelier -spicy -steward -subcontinental -swimwear -Technical -trajectory -wholesomeness -Advantageously -interindustry -red-eye -sub-group - -Слова с ошибками -Acredited -agressive -appreciativiness -aritmetical -biosyntesized -lisense -paranoa -fotoelectronic -semi transparent -synonymus -wordprocessing \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_CA.txt b/Common/3dParty/hunspell/test/src/en_CA.txt deleted file mode 100644 index f3bf6608a7..0000000000 --- a/Common/3dParty/hunspell/test/src/en_CA.txt +++ /dev/null @@ -1,125 +0,0 @@ -admire -admittance -aggrandizement -Airmen -Albatross -amateur -angling -apparatus -Architecture -assessment -attempt's -awakening -backgrounder -Balance's -barometric -bashfulness -beautiful -belletristic -blatancy -bonbon -border -Bottom -bountifulness -breakpoints -bulkiness -businesslike -can't -cash -castle -Casual -cauliflower -celebrity -childish -chokecherry -choreographically -chronological -classification -clearheaded -coalesce -Coexistence -collaborative -coloured's -concentration -draconian -drainpipe -demonstrativeness -dependence -dependency -dream -duplication -epidemiological -equitable -Essence -Exemption -exonerate -fainthearted -falsification -ferromagnetic -flammable -fraternization -French -frontier -gadget -galleria -Gallery -gateaux -geocache -ginger -glace -glacier -globalization -hockey -holiday -housemate -intensifier -joystick -Language -leaseholder -non-breakable -northerly -o'clock -oeuvre -openhandedness -oscillation -outface -outlaw -overladen -package -palazzo -panama -Paragraphs -Parliament -particular -pasteurization -pathogen -perception -phenomena -philanthropically -physical -populations -repugnance -request -resplendence -retroactive -rigidity -schedule's -School -scintillation -sensibility -settlement -taxiway -bereft - -Слова с ошибками -acomplishment -anihilate -caprise -chambre -etnographically -horsmanship -innundation -lemongras -omelete -retorical -shepishness \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_GB.txt b/Common/3dParty/hunspell/test/src/en_GB.txt deleted file mode 100644 index f50273dd01..0000000000 --- a/Common/3dParty/hunspell/test/src/en_GB.txt +++ /dev/null @@ -1,122 +0,0 @@ -Abbreviation -Acceptability -acquirable -Addressee -afterthought -airworthiness -all-powerful -amateurishness -amorphousness -anthology -Auspiciousness -Bibliographer -Bilberry -birthday -bodyguard -broadleaved -brontosaurus -bumptiousness -Cabaret -Californian -calumny -cancellation -cantonal -capitalize -careful -carry-on -casino -clown -co-ordinate -cockleshell -decennial -deckchair -decryption -deep-freeze -Democracy -financial -fish-plate -Flamenco -housing -Hybrid -hydroelectricity -iceboat -ichthyology -idiomatic -ill-humoured -imperatrix -individuality -interocular -intrasectoral -ironwoods -Jolliness -Jurisprudent -knowledgable -kopeks -labour-intensive -laboratory -lake -language -larynx -latching -leakiness -License -licensed -licensee -life-threatening -linguistics -long-lived -machinable -mainsheet -Major -malleability -man-hour -Mango -ninety-five -nobody -non-blocking -non-judicial -nonconforming -north-Western -nutritiousness -quasi-synchronous -question -racoon -radish -Railway -Rarity -saucer -Save -Saying -supplely -tallish -target -Taxi -teach-in -technician -ultramodern -umbrae -uncertainness -unconstitutionality -washing -wasn't -waxen -weather -well-formed -what's-his-name -whereupon -Wi-Fi -Wikipedia - -Слова с ошибками -Abstractnes -advantageusness -arhythmical -autosuggestibility -kaptor -coldshouldering -humaneneses -imaginativness -knight-erantry -magasine -night-wachman -qualifidly \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/en_US.txt b/Common/3dParty/hunspell/test/src/en_US.txt deleted file mode 100644 index f910ca76ce..0000000000 --- a/Common/3dParty/hunspell/test/src/en_US.txt +++ /dev/null @@ -1,216 +0,0 @@ -apple -banana -cat -dog -egg -fish -gold -house -ice -juice -kite -lion -mouse -night -orange -pencil -queen -rabbit -sun -tea -umbrella -vase -watch -xylophone -yellow -zebra -arrow -book -cake -car -day -elephant -flower -hat -island -jelly -king -lamp -moon -nose -owl -pink -quilt -radio -sunflower -tree -unicorn -violin -water -xylophone -yellow -zoo -apple juice -blue -calculator -desk -elephant -fire -goat -hat -ice cream -jacket -key -lemon -map -notebook -owl -pear -quilt -rose -soccer -table -umbrella -vegetable -whale -xylophone -yellow -zebra -apple pie -beach -computer -drum -elephant -goat cheese -hat -ice skate -juice box -kite festival -lemonade -mountain -notebook paper -orange juice -pizza -queen bee -rainbow -snow -turtle -umbrella hat -valley -Aberration -Absolution -Acquiesce -Adumbrate -Aesthete -Altruistic -Ambivalent -Anomalous -Antediluvian -Antipathy -Aphorism -Apocryphal -Apostasy -Apparition -Arduous -Assiduous -Audacious -Austere -Autonomy -Avaricious -Axiomatic -Baleful -Bellicose -Belligerent -Bereft -Bilious -Bombastic -Cacophony -Capricious -Cartography -Castigate -Clandestine -Coalesce -Cogent -Cognizant -Colloquy -Concomitant -Confabulate -Congenial -Conundrum -Copious -Corpulent -Coven -Credulous -Culpable -Dearth -Debilitate -Deleterious -Denigrate -Despondent -Diatribe -Dilapidated -Disparage -Dissemble -Dissonance -Duplicity -Ebullient -Egregious -Ephemeral -Equanimity -Esoteric -Euphemism -Evanescent -Exacerbate -Exhort -Expatriate -Extol -Facetious -Fatuous -Feckless -Felicitous -Feral -Fervent -Fetter -Flummox -Fractious -Garrulous -Hegemony -Iconoclast -Idiosyncrasy -Ignominious -Impecunious -Ineffable -Inexorable -Inscrutable -Insidious -Intrepid -Intransigent -Invective -Irascible -Juxtapose -Kowtow -Languid -Lassitude -Lurid -Malinger -Maudlin -Mawkish -Mendacious -Metaphysical -Antransigent -Inwective -Iracible -Juxtopose -Kovtow -Langued -Lasitude -Larid -Mallinger -Haudlin -Mavkish -Mendocious -Mitaphysical -timeline -rollout -workshopped -deliverables diff --git a/Common/3dParty/hunspell/test/src/en_ZA.txt b/Common/3dParty/hunspell/test/src/en_ZA.txt deleted file mode 100644 index f509809717..0000000000 --- a/Common/3dParty/hunspell/test/src/en_ZA.txt +++ /dev/null @@ -1,114 +0,0 @@ -Acceptably -Achievement -administrate -all-day -amount -average -bilayer -blasé -boutique -breezy -byers -cabdriver -carefree -categorised -Chameleon -cheerful -chronology -cliché -cooling-off -courage -crudités -decorates -dooryard -débâcle -electromotive -equalled -Exotica -fellow-traveller -forests -full-timer -graded -habitué -haven't -hide-and-seek -home-building -interaxial -kingdom -largeness -long-distance -Majority -manoeuvre -Matrix -metier -mightn't -multidisciplinary -night-time -officio -old-style -organize -overaggressive -packing -parenthesis -pince-nez -Plaint -play-act -policy-making -Preheat -prohibit -puzzle -queue -quite -re-enact -reason -ready-made -renewal -resize -rooihout -scampi -schoolteacher -sea-green -shop-boy -sidebar -skyscraper -soundless -spelling -stakeout -synchronizing -take-off -Thereof -Trademark -transportable -treatment -tweeness -under-age -unmake -Variate -Visitant -volume -webmaster -well-prepared -window -yesteryear -first-aid -Hydrant -inconstant -network -northernmost -nowhere -souvenir -telecommunicate - -Слова с ошибками -afordable -anthropologie -bagage -comparatif -flammeble -indivizible -jetlag -lettrebox -panoramma -posessor -selfdoubt -abandonner \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/es_ES.txt b/Common/3dParty/hunspell/test/src/es_ES.txt deleted file mode 100644 index 05520c2d2f..0000000000 --- a/Common/3dParty/hunspell/test/src/es_ES.txt +++ /dev/null @@ -1,208 +0,0 @@ -nosotros -vosotros -ellos -ellas -aquí -allí -ahora -antes -después -siempre -nunca -también -solamente -verdad -mentira -bien -mal -grande -pequeño -rápido -lento -nuevo -viejo -bueno -malo -feliz -triste -bonito -feo -caliente -frío -dulce -amargo -fuerte -débil -cerca -lejos -fácil -difícil -cierto -falso -caro -barato -limpio -sucio -fuerte -débil -alto -bajo -claro -oscuro -abierto -cerrado -joven -viejo -corto -largo -alegre -tranquilo -nervioso -amable -grosero -conocido -desconocido -cortés -rudo -agradable -desagradable -sabroso -insípido -difícil -fácil -cansado -descansado -moderno -antiguo -último -primero -posible -imposible -rápido -lento -sencillo -complicado -propio -ajeno -abierto -cerrado -amable -desagradable -seguro -inseguro -correcto -incorrecto -dulce -amargo -Anacoreta -Sobrentender -Embriaguez -Inquebrantable -Empedernido -Derramamiento -Despotricar -Escafandra -Aletargamiento -Estancamiento -Descarado -Exégesis -Contrariedad -Espeluznante -Conspiración -Impedimenta -Deglutir -Engreído -Enmascarado -Exterminio -Embelesar -Permutación -Desesperanza -Impenetrable -Enarbolamiento -Errabundo -Deslinde -Inefable -Soliviantar -Embriaguez -Perdurable -Opulencia -Trémulo -Desembolso -Empedernido -Anquilosar -Enigmático -Inquebrantable -Contrincante -Desmesurado -Vanagloriar -Exasperar -Desvanecer -Perpetuidad -Desbaratar -Ineficaz -Zozobra -Elucubración -Ineludible -Desgarramiento -Atestiguar -Encascarar -Desembozar -Irreverente -Soslayar -Despiadado -Embaucar -Moflete -Endilgar -Desfalco -Embelesamiento -Desestimar -Enajenación -Desavenencia -Inexorable -Atolladero -Egrégoro -Desafiar -Afable -Enervar -Belicoso -Enervar -Descacharrante -Entramado -Inigualable -Perplejidad -Descabellado -Diligencia -Enaltecimiento -Desvergonzado -Arrebato -Empatía -Endiosar -Peripecia -Desidia -Subversión -Desfachatado -Desfalco -Desvirtuar -Errático -Desahuciar -Envilecimiento -Empecinado -Estolidez -Despropósito -Engatusar -Culminante -Sobrentender -Enseñorear -Desacato -segguro -insseguro -correcto -incarrecto -dalce -amergo -Anasoreta -Sobrententter -Embreagues -Inquebranttable -Empidernedo - diff --git a/Common/3dParty/hunspell/test/src/eu_ES.txt b/Common/3dParty/hunspell/test/src/eu_ES.txt deleted file mode 100644 index 9cbd124e59..0000000000 --- a/Common/3dParty/hunspell/test/src/eu_ES.txt +++ /dev/null @@ -1,132 +0,0 @@ -Abantza -ñabar -abasto -abegikortasun -aberaskeria -aberetzar -abezedario -abialdi -Abiatzaile -abizari -Aboli -abonatu -absenta -absolutibo -accelerando -adabegitsu -adberbio -adiaka -adierazle -adierazkizun -adikuntza -adin -adinaro -adineratu -adin-txikitasun -administratzaile -adoleszentzia -adopzio -adostu -aerolabangailu -Aeroplano -afalordu -agente -agertezin -agiantza -agoran -arradatze -arrakasta -Batata -baterakuntza -baterakor -Bateri -batuar -baud-abiadura -batzuenganako -batzuengandik -batzuengan -batzuengatik -batzuen -baxera -berezi -berezikeria -beritzete -beroa -Beroate -beroatza -berorri -berrabiatu -berra -berresgarri -berripaper -chap -dabilzkidake -dabilzkie -dagitza -dagokik -dagozkieke -erdiondu -galdera -galtzada -garaitiar -garantia -Garaztaketa -garbitasun -gastronomiko -Gaurgero -gaurgoitik -legizkie -legokizue -legozkidake -lehenbizi -nindoakio -publikotasun -publizitate -subsidiario -substantibo -sugestio -superbalorazio -taidun -taldeburu -Talent -Teknografia -xantxa -xerbitor -xerokopia -zabaldura -Zabalkor -Zabaltza -zabilzkieken -zabilzkio -zaharkote -zeneritzeketen -zenerra -zenezagu -zengozkigute -zeniharduke -zenioke -zenioketez -zeniraute -zenizkien -zenizkiguke -Zintut -Zintuzkedan -isiltasun - -Слова с ошибками -abriсot -absenzia -addikzio -administraziozerbizu -bat-bates -bermagari -cataluniar -dakarza -erdemin -garatienetarikoa -ishil -nindezaguane -nintzainaken -summa -technologiko -charmant \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/fr_FR.txt b/Common/3dParty/hunspell/test/src/fr_FR.txt deleted file mode 100644 index 5ab592e094..0000000000 --- a/Common/3dParty/hunspell/test/src/fr_FR.txt +++ /dev/null @@ -1,211 +0,0 @@ -Bonjour -Merci -Oui -Non -S'il -Excusez-moi -Pardon -Bien -Mal -Grosse -Petit -Beau -Moche -Fort -Faible -Chaud -Froid -Vite -Lent -Haut -Bas -Loin -Près -Heureux -Triste -Facile -Difficile -Simple -Compliqué -Bon -Mauvais -Nouveau -Vieux -Jeune -Âgé -Bienvenue -Amitié -Amour -Famille -Travail -Maison -Voiture -Manger -Boire -Courir -Marcher -Nager -Chanter -Dormir -Jouer -Parler -Écouter -Regarder -Lire -Écrire -Acheter -Vendre -Aller -Venir -Faire -Dire -Voir -Savoir -Apprendre -Aimer -Détester -Partir -Rester -Arriver -Revenir -Partager -Aider -Aimer -Ouvrir -Fermer -Manger -Boire -Avoir -Être -Pouvoir -Vouloir -Devoir -Parler -Écouter -Rire -Pleurer -Danse -Étudier -Travailler -Voyager -Vivre -Connaître -Reconnaître -Voyager -Exister -Choisir -Donner -Recevoir -Aimer -Oser -Phénoménologie -Électroencéphalographie -Parallélépipède -Anticonstitutionnellement -Transsubstantiation -Éclectisme -Anachronisme -Catéchuménat -Démagogie -Fructueux -Ineffable -Hypothèque -Propriété -Procrastination -Complaisance -Réminiscence -Éthique -Équinoxe -Exponentiel -Hétérogénéité -Imbroglio -Incorrigible -Maelström -Métaphysique -Protagoniste -Subliminal -Verrouillage -Volumétrique -Énigmatique -Époustouflant -Immatériel -Infini -Polyglotte -Recrudescence -Prophylactique -Symbiotique -Vestibulaire -Épistémologie -Faramineux -Géopolitique -Hypnotique -Inamovible -Intemporel -Labyrinthe -Pacifiste -Quémandeur -Soporifique -Ubuesque -Volumineux -Effervescence -Électrophorèse -Paradoxe -Prorata -Quadrupède -Sarcophage -Trigonométrie -Vaccinologie -Xenophobe -Zéphyr -Génétique -Labyrintique -Mégalo -Nostalgie -Omniprésent -Pangramme -Périlleux -Quinquennat -Rémunération -Scolopendre -Tautologique -Utopiste -Vexatoire -Wolof -Xanthine -Yacht -Zanzibar -Axiomatique -Chronométrer -Dilettante -Énervement -Facétieux -Générique -Harmonique -Illusoire -Juridique -Kabbaliste -Longetivité -Médiane -Néologisme -Oxygène -Patronymique -Quotidien -Rétorique -Sémantique -Tautologie -Utopique -Vaccinologie -Xénophobie -Yachting -Zoroastrisme -Voager -Exisster -Chaiser -Doner -Resevoir -Aimmer -Osero -Phénoménollogie -Électraencéphallographie -Parallélépepède - diff --git a/Common/3dParty/hunspell/test/src/gl_ES.txt b/Common/3dParty/hunspell/test/src/gl_ES.txt deleted file mode 100644 index 1fa4436b77..0000000000 --- a/Common/3dParty/hunspell/test/src/gl_ES.txt +++ /dev/null @@ -1,120 +0,0 @@ -ola -tipo -Si -non -nonnr -comida -comidaa -auga -augaa -casa -coche -cochee -un tren -bicicleta -escola -escolaa -niños -pai -paii -nai -naii -irmá -irmán -cachorro -gato -gatoo -peixe -peixee -aves -avess -árbore -flor -herba -o sol -lúa -o ceo -chuvia -neve -vexa -inverno -primavera -outono -noite -noite -día -unha semana -mes -ano -para ler -escribir -fala -ensinar -traballo -durmir -durmir -correr -vai -senta -estado -para escoitar -vexa -escoita -hai -beber -carne -furtas -verduras -queixo -pan -auga -zume -café -té -leite -aceite -ovo -sal -impacienta -azucre -un bocadillo -cociña -sala de estar -dormitorio -baño -batela -sofá -lámpada -fiestra -a porta -piso -teito -parede -sofá -alfombra -baño -afundir -espello -toalla -cama -manta -almofada -reloxo de alarma -escritorio -cadeira -marabilloso -adverbio -obviamente -Dominante -residenciais -convidado -perigo -cuestión -deporte -mina -cordeiro -cabeza -tratar -avogado -intelixente -guapo diff --git a/Common/3dParty/hunspell/test/src/hr_HR.txt b/Common/3dParty/hunspell/test/src/hr_HR.txt deleted file mode 100644 index 6fbcfb98f7..0000000000 --- a/Common/3dParty/hunspell/test/src/hr_HR.txt +++ /dev/null @@ -1,215 +0,0 @@ -boliestan -jyak -slaby -pameetan -gllup -bezuspješhno -besimeni -bezuzban -blagastanje -bljeskovica -jabuka -sunce -voda -kuća -ptica -kava -kruh -cvijet -knjiga -pas -mačka -grad -zelen -plav -crven -bijel -crn -velik -malen -brz -spor -sretan -tužan -vruć -hladan -nov -star -lijep -ružan -dobar -loš -zdrav -bolestan -jak -slab -pametan -glup -raditi -jesti -piti -spavati -čitati -pisati -govoriti -smijati se -plakati -pjevati -igrati -plesati -učiti se -kupovati -kuhati -telefonirati -gledati -slušati -hodati -trčati -letjeti -plivati -čitati -pisati -raditi -imati -biti -ići -doći -otići -dati -uzeti -reći -vidjeti -čuti -osjetiti -misliti -htjeti -moći -morati -rado -nerado -da -ne -molim -hvala -doviđenja -oprosti -zbogom -zdravo -čau -ej -da -baš -super -glupost -fantastično -jasno -tako -zapravo -možda -lako -teško -prozračnost -usplahirenost -neoblomivost -prezir -proigranost -uznemirenost -besprijekornost -besprizornost -nepredvidivost -beznadnost -promašenost -protivljenje -neizreciv -bezizlaznost -neuspjelost -zbunjenost -neodlučnost -protivština -nepovratnost -bezduhovitost -ravnodušnost -prolaznost -neobaveznost -bezbrižnost -nepovratnost -promašenost -neprepoznatljivost -neukrotivost -bezobzirnost -nevinost -nestalnost -nepostojanost -bezizlaznost -nepovratnost -prolaznost -neodgovornost -bezbrižnost -nevolja -nezadovoljstvo -prolaznost -bezuspješno -bezimeni -bezuzdan -blagostanje -bljeskavica -boren -carovnija -crpeža -dostojanstvo -duhovitost -egzaltacija -gorkoća -histerija -idila -ironija -izdaja -janjetina -kajanje -kavana -krhotina -ljepljivost -lukavstvo -magnutizam -melankolija -misticizam -naivnost -nelagoda -neraspoloženje -obmana -okrutnost -opojenost -prezir -propast -ravnodušnost -sjenka -skitnica -spletka -stid -sudbina -susret -sudbina -šapat -tišina -trepet -utopija -uzaludnost -veličanstvo -zaborav -zanesenost -zanos -zavjera -zbunjenost -zluradost -zloslutnost -žargon -žártva -šaptanje -čarobnost -dileme -hodočasće -lebdjeti -iznimka -preobilje -probuditi se -surov \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/hu_HU.txt b/Common/3dParty/hunspell/test/src/hu_HU.txt deleted file mode 100644 index aae52a65b7..0000000000 --- a/Common/3dParty/hunspell/test/src/hu_HU.txt +++ /dev/null @@ -1,114 +0,0 @@ -Szorzótábla -Réges-régen -normálméret -nemeslelkűség -mindegyik -milliós -Mikroflóra -Mezőgazdaságigép -meséskönyv -mennyiség -Memória -kártya -kuráre -Kurzor -jégkorong -jellemesség -Javak -irányzás -iromány -Inkluzíve -hűtőedény -hőmérséklet -hír -hétszázas -hátrány -háromszáz -Hintó -generátor -gavallérság -explozíva -eső -esdeklés -epilógus -Energia -Előélet -előterjesztés -előnézet -elvonás -elszigetelés -ellátmány -Elevátor -egynémelykor -egyenlőség -eddzenek -dzsungel -ananász -akvárium -Szépül -Sztorizik -szobroz -szimbolizál -szemlélődik -sugdolózik -majmol -Macskáz -Létesít -Lokalizálódik -litografál -levelesedik -lepet -közömbösít -kételkedik -kivirágoz -kerekez -kedvez -járkál -jegyzőkönyvez -iskolázik -individualizál -csendesít -borsoz -billentet -bajmolódik -anyagozik -alkonyodik -Aktualizál -színes -szemelt -lassú -hatékony -hasznos -gyúlékony -gyári -abszurd -örökjog -öregkor -ömlő -Zászlaj -Zseblámpa -regényirodalom -realitás -raktárhelyiség -pötty -pótlék -pótdíj -pályafutás -Promóció -Processzus -poloska -pernye -pediáter -parancsnoklás - -Слова с ошибками -sponzorálás -mihamarábiak -idohatár -hypnotizmus -departement -légiesul -kutagat -költségtakkarékos -redukzió -pilanatfelvétel \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/id_ID.txt b/Common/3dParty/hunspell/test/src/id_ID.txt deleted file mode 100644 index dff2ed986e..0000000000 --- a/Common/3dParty/hunspell/test/src/id_ID.txt +++ /dev/null @@ -1,121 +0,0 @@ -acang-acang -Adiksi -Adventisius -Advokat -afirmatif -agroindustry -agrisilvikultur -akhir-akhir -akomodatif -aksi -aljabar -anggul -anotasi -antusiasme -apoteker -bahagia -bakat -bangkang -Bankir -Barikade -bebaru -belar -beleid -bencana -bentangur -beritawan -besuk -bilingualisme -Cecak -Celempong -cencawan -cengkar -ceremai -cermin -cudang -Dampal -dampan -dansa -datung -debitur -defensi -defisit -demper -dendang -Derivasi -Desember -deskripsi -diskotek -diskusi -distansi -dragon -dramatisasi -Eksamen -Eksistensi -eksperimen -ekstensifikasi -ekuitas -elektron -gelut -Geofisikawan -Gerbang -gerempang -influenza -Informasi -Inisiator -insekta -institusional -instruksional -jelajah -Kamrad -Kapilaritas -kapster -kardiovaskular -karismatik -keranjingan -komunal -Limitatif -Linguistik -lintang -masabodoh -matematikus -medisinal -Melankolia -Memorabilia -nasional -nasionisme -Panen -pangkek -peranti -perian -persekusi -perunjung -regenerasi -reglementer -robotika -runjang -Sabtu -Simbang -simpati -tebing -topi -Unggal -unsuri -urbanisasi -variabel -wahana -warganegara - -Слова с ошибками -Abonement -Abcente -ambivalan -bakteriostatic -cekaw -darmavisata -declarasi -duplex -ecozona -gempur-mengempur -jejengok -transitive \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/it_IT.txt b/Common/3dParty/hunspell/test/src/it_IT.txt deleted file mode 100644 index 02852a870c..0000000000 --- a/Common/3dParty/hunspell/test/src/it_IT.txt +++ /dev/null @@ -1,200 +0,0 @@ -Ciao -Ciaoo -Buongiorno -Buonasera -Buonassera -Grazie -Prego -Arrivederci -Buonanotte -Scusa -Per favore -Amore -Amico -Famiglia -Casa -Città -Strada -Montagna -Montaga -Mare -Sole -Luna -Stelle -Giorno -Notte -Colazione -Clazione -Pranzo -Cena -Acqua -Vino -Caffè -Pane -Formaggio -Pasta -Pizza -Gelato -Dolce -Salato -Frutta -Verdura -Carne -Pesce -Pollo -Uovo -Sale -Pepe -Olio -Burro -Zucchero -Latte -Yogurt -Insalata -Zuppa -Bistecca -Prosciutto -Parmigiano -Biscotti -Cioccolato -Spagggrhetti -Spaghetti -Lasagne -Risotto -Gnocchi -Penne -Ravioli -Cannelloni -Pesto -Caprese -Limoncello -Espresso -Cappuccino -Tiramisù -Panna cotta -Cannoli -Panettone -Brioche -Focaccia -Foacdccia -Crostini -Arancini -Antipasto -Primo piatto -Secondo piatto -Contorno -Pane tostato -Marmellata -Accoglienza -Affascinante -Aggressività -Alleviare -Appassionato -Armonioso -Autonomia -Autovfnomia -Barbarie -Beneficiare -Bizzarro -Burocrazia -Cambiamento -Capriccioso -Cautela -Commemorare -Comportamento -Conseguenza -Controverso -Coraggioso -Debolezza -Decisivo -Delizioso -Desiderare -Destrezza -Determinato -Determin -Difficoltà -Disponibilità -Divertimento -Eccentrico -Efficienza -Elettrizzante -Emergere -Empatia -Energia -Equilibrio -Esperienza -Fantastico -Fenomenale -Generosità -Gratitudine -Immaginazione -Impressionante -Impressiante -Indipendenza -Ingenuità -Innovazione -Intelligenza -Intensità -Intrigante -Ispirazione -Instabilità -Irresistibile -Leggenda -Libertà -Luminoso -Magistrale -Malinconia -Meraviglioso -Metamorfosi -Miracolo -Misterioso -Nostalgia -Opportunità -Originalità -Passione -Pericoloso -Prestigioso -Prodigioso -Prospettiva -Raffinato -Rafinato -Ricchezza -Rispettoso -Sensibilità -Sorprendente -Spontaneità -Spontaneita -Stravagante -Suggestivo -Surreale -Tenerezza -Trasformazione -Unicità -Vibrante -Vittoria -Volontà -Amicizia -Avventura -Bellezza -Calma -Danza -Eleganza -Felicità -Gioia -Incanto -Magia -Natura -Odore -Passatempo -Quotidiano -Relax -Serenità -Tesoro -Umorismo -Vacanza -Zelo -Avventuriero -Speranza -Risate -Armonia -Incanto diff --git a/Common/3dParty/hunspell/test/src/kk_KZ.txt b/Common/3dParty/hunspell/test/src/kk_KZ.txt deleted file mode 100644 index 69010faa9b..0000000000 --- a/Common/3dParty/hunspell/test/src/kk_KZ.txt +++ /dev/null @@ -1,209 +0,0 @@ -сөз -адам -қала -тау -ауа -су -аспан -жер -бала -ата -ана -тамақ -кітап -ұстаз -оқу -тұтыну -тыныш -тұз -ауру -денсаулық -топ -маусым -төс -көз -жүрек -сарғыш -көп -аз -ертең -түн -түс -жас -қара -ақ -көк -қызыл -шай -салт -ыстық -суық -қазақ -жеті -он -жүз -мың -бір -екі -үш -төрт -бес -алты -жеті -сегіз -тоғыз -он -бақша -бұлақ -қиыр -досым -ақша -патша -таң -кеш -тауар -күн -апат -риза -ауырсыну -орман -жаңбыр -бауыр -жел -тұман -үй -бұлақ -көше -айнала -шайыр -тағам -сусын -топ -бас -әрекет -тіл -кеме -сиыр -қой -ешкі -шөп -ит -тұқым -қарындаш -апа -ана -әке -дала -тарлау -дәуір -таңдай -жыл -басқарушылар -басқарушшылар -жауапкер -ерекшеліктерімендерге -тұмылдырықтатқыздан -білімділігінге -білімдарды -алалықсыздар -айырмашылықтарын -тұрақтандырып -сылтауратқандарыңызды -қолдар -байланысқадан -жетілдірілген -зарарсыздандырады -ескеріп -ескеріпп -міндеттемелеріндерге -кезеңдердің -себепсіздік -біреудейлер -беделілерің -кездестіріңіз -шектердің -көңіл -көңл -мол -алайда -мәселе -мәселеу -сендің -келер -келерр -кәне -көпір -күндіз -сана -белгілер -дайын -ез -қайшы -саф -рең -шақ -үміткер -бақыт -бақытт -республика -консервациялау -мемлекеттік -тағатсыздан -адамда -бәрі -бең -беңр -жасағанда -жасағоанда -жабайылық -заманда -көшірдік -мерейі -Мерейій -мөлшерсіздікк -мөлшерсіздік -пенді -тылда -мәртебесімен -аппаратпен -тегінді -кездеме -ересектік -көңілсіздік -тәуекелсіздік -қанағатсыздық -ғаділетсіздік -сайдақы -басым -тәжікеден -тұрғын -қонақ -қауіпсіздік -қадірсіздік -білгішсінбейсіңдер -талқандас -кешікті -қоздырғышы -бас -емдейсіңдер -құқылы -тақылет -әдемі -көткеншектейсіңдер -әжет -қайтар -белсену -түсінбеймін -жағымсыздық -сыздар -мәртебесі -тұрғыны -мезгіл -әлбетте -барысын -оқылған -безге -жаса -аламаңдайсыңдар -кереметті -епетейсіздік diff --git a/Common/3dParty/hunspell/test/src/ko_KR.txt b/Common/3dParty/hunspell/test/src/ko_KR.txt deleted file mode 100644 index 3ef2abd2ce..0000000000 --- a/Common/3dParty/hunspell/test/src/ko_KR.txt +++ /dev/null @@ -1,157 +0,0 @@ -안녕하세요 -감사합니다 -사랑해요 -미안합니다 -음식 -친구 -가방 -집 -학교 -컴퓨터 -물 -밥 -책 -산 -바다 -날씨 -일 -노래 -치킨 -반찬 -꽃 -숙제 -가족 -아이 -게임 -영화 -생일 -시간 -동물 -여행 -차 -쇼핑 -추천 -대화 -전화 -사진 -운동 -잠 -병원 -음료수 -능력 -주말 -전자기기 -고양이 -강아지 -바나나 -가을 -겨울 -봄 -여름 -옷 -신발 -지하철 -택시 -버스 -비행기 -샴푸 -브러시 -삼계탕 -국수 -불고기 -된장 -김치 -먹다 -마시다 -보다 -듣다 -놀다 -하다 -가다 -오다 -서다 -늦다 -일어나다 -자다 -빨갛다 -파랗다 -노랗다 -녹색 -보라색 -맛있다 -시원하다 -덥다 -추운 -기분 -슬프다 -즐겁다 -정신이 -바쁘다 -참새 -나비 -병아리 -돌 -물고기 -향신료 -시장 -기차 -공원 -해변 -지갑 -병원 -대학 -교통 -공항 -천재 -연구 -일본 -중국 -사업 -지식 -성격 -자금 -기술 -정부 -전략 -협력 -혁신 -경제 -철학 -신체 -영감 -현상 -역사 -태양 -설명 -사회 -환경 -자연 -현실 -존경 -정확 -장애 -낙관 -발전 -절망 -일상 -소멸 -도전 -반복 -포기 -파괴 -혁혹 -소외 -식민지 -혐오 -출산 -행복 -불평 -판매 -위험 -안녕하ㅎ요 -감사합ㅅ다 -사랑ㄱ해요 -미안ㅎ합니다 -친ㅔ구 -가ㅎ방 - diff --git a/Common/3dParty/hunspell/test/src/lb_LU.txt b/Common/3dParty/hunspell/test/src/lb_LU.txt deleted file mode 100644 index e7dd0e3d59..0000000000 --- a/Common/3dParty/hunspell/test/src/lb_LU.txt +++ /dev/null @@ -1,118 +0,0 @@ -Aarbecht -Aarbechtszäitorganisatioun -Aartgenoss -Abenteuer -abrëll -absence -Abusives -Abzebillercher -Acquéreur -Adjointeë -Affischéiertes -Airbussen -Alldeegleches -Angschtzoustä -Basketballspiller -Baufirme -bauren -bekanntes -Beleg -Berodung -Bewältegung -Datentransfer -Dateschutz -Decisives -Donneschden -Drangsaléiertes -Dränk -Giischtgen -Grondlag -grondreegel -Géies -Handelsdag -hausaufgab -hierschtdag -Häerzi -Industriell -Infrastrukturelles -Interessi -Internetfore -Intervall -Kamell -Kantoner -Karamell -Klenges -Nopeschhaus -Motors -Muer -Muerenter -Musek -Nettoverméige -niess -Protektioun -Prouf -Provisioun -Prozessor -Präis -Präsens -Sanitäres -Schauspiller -Schema -Taxatioun -Telefonsgespréich -termingrë -terrass -Textdatei -Textsprooch -Titulaire -Titel -erausféieren -erausjoe -gëeicht -onglécklecherweis -unzesammelen -unzespille -Approvisionnement - -Сложные слова -Aktiegesellschaft -Aktivitéitsdéclaratioun -Alarmstëmmung -Allgemengverständleches -Bankenoperatioun -Bensinsreserven -Besteierungsofkommes -Diskriminéierungsmoossnam -Dokumentatiounsaarbecht -Haaptrecommandatioun -Héchstgeschwindegkeet -Héichproblematesches -Hëllefsdéngscht -Integratiounsméisseges -Iwwersetzungsprogramm -Kapitaliséierungsdimensioun -Museksinstrument -Publicitéitsmarché -Transportproblem - -Слова с ошибками -Abonnnement -Accomodéiertes -Agrarcenter -Begrennung -Berodunszentren -Deeluung -Dialogue -Dictaten -Inspektor -Iwereileges -Pedagogik -Televisionschaîn -Bechäftegungsméiglechkeet -Gläicheetspolitik -Musekheichschoul -Satelliten -Addressbichelchen -Aarbechtsfield - - diff --git a/Common/3dParty/hunspell/test/src/lt_LT.txt b/Common/3dParty/hunspell/test/src/lt_LT.txt deleted file mode 100644 index 1f04ae6ce1..0000000000 --- a/Common/3dParty/hunspell/test/src/lt_LT.txt +++ /dev/null @@ -1,127 +0,0 @@ -Abstraktus -šachmatai -žadintoja -agurkas -Aikštė -Akinukai -akmuo -šakoti -aktualinti -aktorius -šalinis -šaltinis -bernystė -beskuo -būgnelis -Bilietas -bilingvizmas -daržavietė -Darbadienis -Darbas -darbuotoja -dargi -daržinė -daugintoja -Daugiaveiksmis -delnė -įdelnis -detalizuoti -šerdelė -erdvėti -šeriškas -šeštadienis -etiketas -Evoliucija -fabrikantė -Fantastika -Fenomenas -fikusas -gaudinėti -gausėja -gūbrinti -geležis -geležtė -gelsvis -geranoris -Gertys -gerviukas -giesmininkė -Gikas -Goža -griaustinis -grįžinys -gėrioja -griozdas -grizijo -gryčia -grožėja -grįžti -grupė -gąstauti -Jaukas -jodinėjo -jodyti -keturnagis -Kiaušina -Kiaurymė -kiausta -kietakaktis -ūkiškas -kilimėlis -kilometrinis -ūkininkaitė -ūkinis -krykti -lapuotis -laukas -laupti -laužtė -Maudulys -Maumedis -mažutėlis -mazgotuvė -mechanikė -medeinė -medikamentinis -meduolinis -Nūdien -nebrendėlė -Negu -neiginys -parudenys -pasakotojas -pasausė -pasieninis -paskyriui -paslapčiom -Pasodas -Pat -Pataikūniškas -patarška -patentinis -proskyna -protekiniais -provizoriškas -rėkčioti -rūmas -rodyklinis -Romanistas -Skylmatis -Skyriklis -skolininkas -skraidžioja -skruzdėda -skėtrus - -Слова с ошибками -Abbreviatūra -alpinismas -amortizacia -daugiamžis -deziderativinis -generazija -keturiasdešimtūkstantas -krivuluoja -Šnaukstai -pazintinis -progresa \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/lv_LV.txt b/Common/3dParty/hunspell/test/src/lv_LV.txt deleted file mode 100644 index 5198404759..0000000000 --- a/Common/3dParty/hunspell/test/src/lv_LV.txt +++ /dev/null @@ -1,205 +0,0 @@ -Sveiks -Sveikks -Labrīt -Lbrīt -Paldies -Paldiess -Lūdzu -Luzu -Atvainojiet -Atvainvfojiet -Prieks -Perieks -Draugs -Dravfugs -Ģimene -Gimene -Māja -Maja -Pilsēta -Pilseta -Ceļš -Ceļšs -Kalns -Jūra -Sauls -Mēness -Zvaigznes -Diena -Nakts -Brokastis -Pusdienas -Vakariņas -Vīns -Kafija -Maize -Siers -Makaroni -Pica -Saldējums -Deserts -Sāļš -Augļi -Dārzeņi -Gaļa -Zivis -Vistas -Ola -Sāls -Pipari -Eļļa -Sviests -Cukurs -Piens -Jogurts -Salāti -Zupa -Salds -Šokolāde -Spageti -Rīsi -Kakao -Biezpiens -Kūka -Tēja -Karalis -Zelts -Ezis -Tulpe -Lācis -Kaķis -Suns -Putns -Vārna -Zaķis -Pele -Ābols -Aita -Zirgs -Lauva -Pūķis -Lasis -Vilks -Vējš -Uguns -Ūdens -Zeme -Debesis -Saule -Rūpniecība -Aizkustinošs -Izdzīvošana -Nepieciešamība -Atbildība -Lieliski -Apmierināts -Neparasts -Izglītība -Sarežģīts -Atsevišķs -Pamatots -Organizācija -Sadarbība -Efektīvs -Daudzveidīgs -Novērtēt -Pārsteidzošs -Inovatīvs -Vērtība -Aizraujošs -Nopietns -Komunikācija -Māksla -Dzīvība -Ekskluzīvs -Tehnoloģijas -Rezultāts -Atbalsts -Nodrošinātība -Pārbaudīt -Radošs -Sociāls -Izteiksmīgs -Brīvība -Pieredze -Ietekme -Pārmaiņas -Drosmīgs -Racionāls -Empātija -Izpratne -Risinājums -Iespējas -Atklāts -Vadošais -Eksperimentāls -Neatkarība -Tīrība -Samierināšanās -Motivācija -Harmonija -Dinamisks -Iedvesma -Izglītojošs -Komplicēts -Pieejamība -Sadarbība -Tūlītējs -Saprotams -Neizsakāms -Lieliskums -Inovācijas -Aizrautība -Pārdomas -Sapratne -Rezultatīvs -Iespējams -Pārbaude -Sociālais -Izteiksme -Brīvība -Pieredzējis -Ietekmīgs -Pārmaiņu -Racionāla -Izpratni -Risinājumi -Iespējams -Atklāta -Vadošā -Eksperimentāla -Neatkarība -Tīra -Motivējošs -Harmonisks -Dinamika -Iedvesmojošs -Spēks -Mīlestība -Pasaule -Daba -Skaistums -Miers -Sapnis -Prieks -Rītausma -Brīnums -Izcils -Saikne -Dzirksts -Pārmaiņas -Atbalsts -Izcilība -Satriecošs -Dzīvīgums -Pārveidošana -Uzdrīkstēšanās -Uzticamība -Ieguldījums -Vērtība -Līdzsvars -Saskaņa -Izsmalcinātība -Pateicība -Atzinība -Pārsteigums diff --git a/Common/3dParty/hunspell/test/src/mn_MN.txt b/Common/3dParty/hunspell/test/src/mn_MN.txt deleted file mode 100644 index ac86b087ab..0000000000 --- a/Common/3dParty/hunspell/test/src/mn_MN.txt +++ /dev/null @@ -1,103 +0,0 @@ -Баатар -Багаа -Базар -Барра -Бат-Очир -Баттуул -Батхэсэн -Баярмаа -Билгэх -Бор -Бөөнцагаан -Бүрэнхайрхан -Бямбагар -Бэх -Гарам -Гантиг -Гурвантэс -Гүр -Гэрэлтуяа -Давст -Дангаа -Дансран -Дарь-Эх -Дөргөн -Дундбүрд -Дэмүүл -Дэлгэрцэцэг -Жавзан -Жарантай -Заглул -Зүүнхөвөө -Кир -Корона -Лүн -Лха -Лхаваан -Майхан -Манлай -Мөндөөхөө -Мөнхөт -Мөрөн -Мөнххаан -Мөст -Мэгэд -Мухар -Найдалмаа -Найтингейл -Налайх -Нарантуул -Намтай -Насантогтох -Номин -Нямсамбуу -Нэүдэй -Орог -Очир -Өнөржаргал -Өөдөс -Өргөн -Паган -Пас -Пүрэвдорж -Пүрэвхүү -Сайнаа -Сайхандулаан -Сундуй -Сэлх -Сүүж -Сээр -Тайван -Тарав -Тогтуун -Төрболд -Төхөм -Төмөр -Түргэн -Түшиг -Түгтөмөр -Түшиг -Удвал -Улиастай -Улаандэл -гүедэцгээчих -дэвхэрлүүлсхийчих -дэвхэлцгээчих -дэвшигдүүлгэчих -дэвшилцчих -дэвээ -дэггүйчүүд -наламгардуулалц -налбаруулзна - -Слова с ошибками -Батарчулуун -Баруунхарааа -Даважаргал -Дөрволжин -Мягмараран -Оюунтулхуур -оторчилсхилгэ -Асрамжлулгацгаачих -гүентүүлгэцгэээ -наладаадуулга \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nb_NO.txt b/Common/3dParty/hunspell/test/src/nb_NO.txt deleted file mode 100644 index 7218490a61..0000000000 --- a/Common/3dParty/hunspell/test/src/nb_NO.txt +++ /dev/null @@ -1,113 +0,0 @@ -Bahamasøyene -Festarrangement -Festarrangemang -Festival -festligheta -festnummer -forhandlernett -forgylle -fotballstyre -Fotgå -fotoamatørene -Fotogalleri -fotokopiere -generalkostnadene -generaltabbe -generøs -Generell -genmodifisertst -handlingsresymeet -hardhet -Harmfull -hastighetsregulering -havbanke -havforskningsundersøkelsene -informasjonsutveksling -Infrarødest -kaffeautomat -kaldslig -kalenderåra -kjekk -kjendisstoffa -kjærlighetslyrikk -kjøkken -Kontantautomat -kontantlån -kontrahere -kontraheringsplikt -Låskasse -læregutt -læreprosess -Museums -museumssamling -musikkorps -myggstikka -myndighetsaldere -omløpstider -omregn -områdeplan -omriss -omsetningsgjeld -omsjaltning -omsetningsvolumer -omslutning -omslyngning -omsonst -omstendeligheta -Omstart -Omstreifende -Omsyn -omtåketheta -oppdagelse -oppbygning -oppebære -oppfølgingsapparat -oppgjørsbank -oppgjørsblankett -opphøringene -partisipere -randverdi -rapportskriver -rasjonalisering -Rate -selsak -selskapsinntekt -selskapsoverskudd -selvbetjeningene -snabbingene -Snadderene -Sytti -søkekriterium -søkemulighetene -søkeargumenter -søkingen -søkne -sølvlaga -sørlandsk -søtningene -tabellrad -Tabellkolonne -Takhalm -taksene -takseringssystema -tal -trolsk -trosinnholdene -utfoldelsesmuligheta -Utformingsmetode -Utgift -vekstfaktor -vekstforhold - -Слова с ошибками -Arbeidstagerorganisasion -festsprel -forhandlingsdirektor -handlingforløpa -kjempeflinktt -lanetilbud -omraming -omsvøpssfull -raportmateriale -serstilt -taksamst \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nl_NL.txt b/Common/3dParty/hunspell/test/src/nl_NL.txt deleted file mode 100644 index 3efaf4df40..0000000000 --- a/Common/3dParty/hunspell/test/src/nl_NL.txt +++ /dev/null @@ -1,115 +0,0 @@ -Advertentie -Advocate -affirmatie -afgevaardigd -afneemster -allerbekendst -alternatieveling -annulering -anticycloon -Backtrackroute -Bearbeiden -becijfer -bediening -bedrag -beduiden -beïnvloeding -benadeling -bepaaldelijk -Catalogiseer -Catering -cellulair -classificator -collaboreren -collectiviteit -comfortabel -complimenteus -contractant -correctionaliseren -daaraanvolgend -dagelijks -deelgenoot -degelijkheid -demarqueren -Denotative -deposant -dergelijken -detail -deugen -diakritisch -Directioneel -dusgenaamd -eendrachtigheid -Eenzaamheid -eersteklascoupé -Eigenschap -felicitatietelegram -centerkanaal -Chargeer -filiaal -klare -Klassikaal -kleinhandel -evolutie -exemplaar -exequiën -familiaal -fauteuil -luister -magistratelijk -perelaar -Permitteren -Perseveratie -persoonlijk -pictogram -pixel -sloten -sluimer -sneltoets -Soldij -Solliciteren -zegepraal -zelfbeeld -zevendaags -aangeslotene -meermaals -expedieert -jaargetijden -kaderleden -Kapitelen - -Сложные слова -avontuurlijkheid -bedrijfsmaatschappelijk -begrotingstechnisch -belangstellingssfeer -concurrentievoordeel -conferentieganger -democratisch-liberaal -discontoverhoging -doctoraatsverhandeling -dubbeldeksbus -economisch-financieel -energiezuinig -erkentelijkheid -evenwichtigheid -klimaatsverandering -koffiezetmachine -koopmansgebruik -maatschapsovereenkomst -personeelsconsulent -sociaalwetenschappelijk -zelfverzekerdheid -fondsenwervende - -Слова с ошибками -afficher -algorithme -beeindiging -client -consnteren -deactivieren -deblockering -electrisch -certificat -sovereiniteit \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/nn_NO.txt b/Common/3dParty/hunspell/test/src/nn_NO.txt deleted file mode 100644 index 6c0c1b48bc..0000000000 --- a/Common/3dParty/hunspell/test/src/nn_NO.txt +++ /dev/null @@ -1,116 +0,0 @@ -Ankeret -Anleggsbedrift -Annandag -annonseavis -annuell -ansats -ansvarsmedviten -Antibiotikai -apal -apoteki -apparattavlor -appetitt -Aprikos -arbeidsdokument -arbeidsmarknad -barndom -bastematte -bautingi -Bedriftsleiar -befolkningi -begynnarkurs -Beheld -belastningi -beredskapsnivå -beredskapsperiode -berglandskapi -berrfrost -beskjedi -beskrivingi -betalingsoppdrag -betalingsplikt -bevismateriale -bildeband -bildebruki -bildespråki -bildeteksti -bilingval -billettlukone -binær -bione -bjørkegreini -bjørnebæri -blenge -blokkeringi -blomsterbordi -blyerts -bogen -bokstavrekningi -bokstavteikni -Borddisk -effektevaluering -elgkalv -Elone -emballer -faktainformasjon -familiebedrifti -familieterapeut -fastbuande -Februar -feili -fisketom -hengelåsi -istandsetjingi -Item -jaguar -jamlig -janen -jarnbanestasjon -kjende -kjentfolki -kjæleri -kjøledisk -kjørety -midli -Mideftnar -midtstrek -multiplikasjonstabell -museumsdirektør -onsdag -operasjon -operasjonskode -opinionsskapingi -opningi -Personalkonsulent -Personligdom -persontryggleik -petroleumspris -redningsaksjon -reduksjon -refusnik -seinst -sekretær -seljande -sendeferd -Standpunkt -støyisolering -støytvis -terminoppgåve -tidløysone -tidsfølgjone -Tilbakebetalingstid -uprofesjonell -upåklageleg - -Слова с ошибками -Anlegsarbeid -anonse -ansversproblematikk -barneforteling -besoksliste -bilophoggingi -effektivitetskontrol -fakturaerklering -miljøbyrad -selskapskat -cement \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/oc_FR.txt b/Common/3dParty/hunspell/test/src/oc_FR.txt deleted file mode 100644 index 23c82dafd0..0000000000 --- a/Common/3dParty/hunspell/test/src/oc_FR.txt +++ /dev/null @@ -1,108 +0,0 @@ -Ajustaira -alaguiar -alausièr -alberguèri -alcaloïdic -alègrament -alenament -algorisme -Alimentacion -allergologia -alpèstra -amaisament -amorteirar -analista -analogic -atucament -Audicion -auquièr -auscultacion -auscultar -ausèri -autenticament -brilhant -brumós -Burgada -cabelièira -cadeçar -Caducèu -çaicontra -calcièrs -Calmar -camarilha -cambièra -canalhariá -casse -cedar -cendrós -cèrca -cèrtes -cestòdes -chantièr -chartrós -Chassís -dimensionar -diptèrs -dirèctament -discrecionària -discriminar -Distraire -dòler -Enòrme -enqueriái -espicifòrme -esquelèt -Esquèrra -estetic -innocéncia -innocentàs -Maniquèu -mantelejar -Nauchièr -natièr -oxigèn -pacanariá -pagés -pagesiá -Primièirament -requereguèri -requisitòria -saumelèri -S'autodeterminar -sautarèl -scientament -scientologia -secador -secretèri -sècta -sectorial -s'efarcimar -s'endeven -s'engarrar -sentimental -s'entrepausar -shampó -sextant -sòli -Solidament -soquèla -subrejornada -suedés -utilitària -Utilizaire -vacàs -vaisselèri -valiái -validament - -Слова с ошибками -albatros -amistanza -brunonièr -carpentier -centrifugation -estelhad -primaria -s'embractar -sosembrançament -vascularisacion \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pl_PL.txt b/Common/3dParty/hunspell/test/src/pl_PL.txt deleted file mode 100644 index 81c4afafce..0000000000 --- a/Common/3dParty/hunspell/test/src/pl_PL.txt +++ /dev/null @@ -1,225 +0,0 @@ -dom -pies -kot -auto -drzewo -książka -szkoła -przyjaciel -mama -tata -dziecko -jabłko -czekolada -kawa -herbata -telefon -telewizor -komputer -muzyka -sport -zdrowie -piękno -praca -miłość -szczęście -czas -pieniądze -język -kraj -miasto -zima -lato -jesień -wiosna -morze -góry -jezioro -rzeka -park -zwierzę -ptak -ryba -drewno -złoto -srebro -metal -szkło -buty -sukienka -spodnie -koszula -czapka -płaszcz -ręka -noga -oko -ucho -nos -usta -ząb -głowa -serce -mózg -król -królowa -książę -księżniczka -chłopak -dziewczyna -mężczyzna -kobieta -staruszek -staruszka -lekarz -pielęgniarka -nauczyciel -uczennica -student -studentka -kucharz -kelner -wojna -pokój -mapa -flaga -śmiech -płacz -sen -marzenie -praca -nauka -sztuka -teatr -kino -muzeum -kaplica -kościół -zamek -most -droga - -Сложные слова на польском языке - -1. konstantynopolitańczykowianeczka -2. niezadogłębienieńskujący -3. antykontraatakujący -4. supersamoobsługiwalnymi -5. rozpierduchlanoculka -6. nieodezwawiałobyś -7. przystawieniowy -8. nieprzeżyciowakościami -9. nieprzekazywających -10. przeciwzakwaszeniowych -11. nieszczęściodrapańskiego -12. społeczno-wychowawczyniami -13. seledynowo-fioletowymi -14. przeciwdeszczową -15. mikroelektroniczno-kwalitacyjną -16. nieokreślonościowo-losowo-obiektywnie -17. zagubieniecioburakowatej -18. antyneuroleptyzanckim -19. nieupubliczniającymi -20. splądrowałbyś -21. konserwowano-spożywczymi -22. ożelośćiowo-miłosnej -23. nieprzyzwoitolicjią -24. nieodporowościę -25. rzeszołkofiołkowatymi -26. niezakapiactwuja -27. nieoszczędniewczelnianków -28. przekształconowaczkołępów -29. rozwińczywianiu -30. nieprzeskakiwalnościami -31. modernizująco-rewolucyjnego -32. nadzwyczajnieuzdolnionymi -33. przemocno-wsparciański -34. przepyszno-peltzerowskiego -35. kwestionowano-wzmocnieniami -36. nieodczynieństwującą -37. niezasłużonowypasionego -38. likwidującego/zarządzającego -39. szeszcześtoplutowanych -40. niewpadkowościowi -41. antynazizhownemu -42. nieuchronnieprzekroczeniowym -43. niezatrawialnieprzyjemnego -44. kardiopulmonologiczno-angiologów -45. gorączkowointensywnościowego -46. antykonstytucyjnorozpadowego -47. nieobawiamysię/źródleni -48. prerewolucyjnolphillipsowi -49. szóstkaniewygranych -50. nieupadkokogeneracyjnymi -51. społeczno-humanitarnarządzaniami -52. nieodziewowiędzy -53. przemocnochamować -54. społecznosensacyjnosądowym -55. przerażającorzymskiego -56. nieprzemontowanych/zamuzowych -57. referendumkonstytucyjno-reformujące -58. niezniesłowiałszymi -59. niebohaterystycznymi -60. produktodenarodowomenopauzalem -61. odrywającopierdolca -62. niegotowożywione -63. niepostronnynarodzonemu -64. przedniaautochtonicznym -65. nadciągniono-wchodzących -66. promocjostworczym -67. niezapowiadającychkoalicji -68. bezgłupinczłapie -69. wyomjaził -70. wagotonizacyjno-radiofonizowanego -71. gospodarczo-zasadotwórczej -72. skrupulatno-rzeźniczobardziej -73. samokiedy-konstytucyjnej -74. niedomętnością -75. nieoszustamiwykorzystana -76. przeprowadzonoświeckie -77. nieuniknionaobowiązkowo-plastycznej -78. poduszkowo-nicościowych -79. niepowodzeńbutmizeryjewego -80. skojarzeniowocolorowymi -81. przytułkamiwciągarkowych -82. wchodziłoprzeciwniepowszechny -83. karaublicznociągana -84. przedpolitycznilubelskim -85. niezapowiedziano-date-expanded -86. licznościłodziennej -87. niezawinieniomatołek -88. pakujączwobilardowego -89. rewersdopisek -90. przeprosinoworadosną -91. nieakceptacyjnoprospekcyjnymi -92. jedniżużytym -93. ainikopciksemilitechnikowany -94. motszynopiszącym -95. nieprzerejestrowanasezonowanie -96. słupotartackimoblikiem -97. nieodbieraniemniedostępności -98. dorozwinięcówkobiet -99. szybopojabytesłowickiego -100. przystępnoracjmujacych - -Слова с ошибками - -jedniiżużytym - -wiomjaził - -niezzniesłoowiałszymi - -superrsammoobsługiwalnymi - -przemoocnochamować - -staruszzka - -tiatr - -woina - -teleffon - -zołoto \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pt_BR.txt b/Common/3dParty/hunspell/test/src/pt_BR.txt deleted file mode 100644 index 6f39dbef64..0000000000 --- a/Common/3dParty/hunspell/test/src/pt_BR.txt +++ /dev/null @@ -1,108 +0,0 @@ -que -eu -não -de -você -para -ele -se -é -um -sim -por -isso -em -uma -uuma -está -como -com -bem -na -me -mas -do -era -quando -então -tudo -tydo -aqui -disse -estava -esâtava -lá -fazer -vai -sobre -vamos -homem -hollmem -bom -ok -agora -coisa -coissa -quero -foi -meu -seu -só -eles -as -posso -pocso -estou -mais -mim -certo -dizer -dizdizerr -os -no -sei -ela -vocês -sua -todos -sabe -minha -alguma -algyyma -casa -muito -oh -quallquer -qualquer -da -estamos -até -onde -onede -ao -tenho -nós -tem -tinha -tiinha -quê -ir -ou -pode -quer -vou -seus -dia -estão -nos -cabeça -quem -anos -depois -sou -vez -vá -fez -irmão -câmera -câmeara \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/pt_PT.txt b/Common/3dParty/hunspell/test/src/pt_PT.txt deleted file mode 100644 index ed038092d0..0000000000 --- a/Common/3dParty/hunspell/test/src/pt_PT.txt +++ /dev/null @@ -1,135 +0,0 @@ -pan -manteiga -menteiga -queijo -salchichón -saуlchichón -óleo -pimenta -pimmenta -sal -baga -mel -geléia -cogumelo -cebola -cóbola -banana -cenoura -pêra -beterraba -frutas -melão -melancia -bolo -chocolate -carne -batatas -salada -salóda -tomate -pepino -pipino -col -mingau -sopa -sanduíche -refrigerante -refrigarante -água -café -chá -leite -suco -scuco -maçã -uvas -laranja -abacaxi -adacaxi -damasco -demasco -açucar -arroz -macarrão -res -porco -frango -costeleta -cãsteleta -limão -ervilha -pão -peixe -caramelo -sorvete -nogueira -ovo -pêssego -xícara -xíícara -vidro -prato -colher -garfo -faca -pires -garrafa -guardanapo -café da manhã -almoço -jantar -avião -carro -bonde -ônibus -trem -bicicleta -janeiro -fevereiro -fevíreiro -março -abril -maio -junho -julho -agosto -setembro -setembra -outubro -novembro -dezembro -desembro -caneta -livro -xadrez -telefone -relógio -pente -televisão -ferro -sabão -rádio -bolsa -cartão -mala -presente -câmera -computador -camputador -filme -flor -vaso -quadro -lenço -bola -balão -brinquedo -brinqueedo -conta -sobre -papel -pepel -jornal -letra -bilhete \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/ro_RO.txt b/Common/3dParty/hunspell/test/src/ro_RO.txt deleted file mode 100644 index 2cd141c941..0000000000 --- a/Common/3dParty/hunspell/test/src/ro_RO.txt +++ /dev/null @@ -1,210 +0,0 @@ -casă -copil -carte -masă -școală -lumină -apă -munte -soare -lună -pâine -fruct -floare -stradă -mașină -aer -timp -zi -noapte -nor -vânt -ochi -gură -nas -mână -picior -inimă -sânge -cap -ureche -voce -melodie -culoare -formă -linie -cerc -dreptunghi -cercetare -știință -limbă -frază -literă -cifră -număr -sunet -zgomot -telefon -internet -computer -program -ecran -tastatură -mouse -joc -sport -muzică -artă -film -televizor -radio -planetă -stea -univers -galaxie -atom -moleculă -substanță -energie -lumină -căldură -frig -aparat -instrument -mașinărie -unelte -hrană -băutură -haine -pantofi -păr -piele -ochelari -ceas -bijuterie -pământ -apă -aer -foc -metal -lemn -piatră -hârtie -cerneală -pix -carte -cadru -tablou -sculptură -model -formă -anticonstituționalitate -dezvoltare -inexpugnabil -nefast -concomitent -antiseptic -recalcitrant -perseverență -extravagant -inexorabil -colosal -plauzibil -efervescent -perspicacitate -superfluu -subversiv -incoruptibil -inefabil -hiperbolic -indefectibil -peremptoriu -ambivalent -paradoxal -heterogen -indiferent -periferic -subliminal -ultraviolet -indeferent -conglomerație -circumstanțial -contraproducător -conglomerat -insurmontabil -intransigent -insidios -inerent -consternant -ambiguitate -inerție -inconsolabil -oniric -remarcabil -repudiat -subiectiv -periculos -infatigabil -abnegare -exuberant -facet -represiune -implacabil -indiferent -infatigabil -insolit -intempestiv -incandescent -letargic -magistral -magnanim -nefast -oblivial -oportun -periculos -plutitor -propice -reprobabil -risipitor -robust -salutar -simetric -solicitant -stringent -sufocant -superficial -tranzitoriu -tributar -trivial -umilitor -unic -vehement -vernal -vicios -victorios -vindicativ -virtuos -vizibil -volatil -vorace -vulnerabil -xenofob -xerofil -yonder -yang -yodel -zonal -zodiac -zoon -zoomorf -zurbagiu -Caaă -Soaare -Cartr -Appă -Coopil -Frumoss -Feriсire -Prietenn -Muziică -Exeplu diff --git a/Common/3dParty/hunspell/test/src/ru_RU.txt b/Common/3dParty/hunspell/test/src/ru_RU.txt deleted file mode 100644 index 28d99377fc..0000000000 --- a/Common/3dParty/hunspell/test/src/ru_RU.txt +++ /dev/null @@ -1,197 +0,0 @@ -должен -доллжен -наш -думаю -думмаю -свою -сам -всем -ни -нас -пока -этом -этой -ваша -всеми -возьми -моей -сама -вся -день -само -всей -бывает -себе -пойду -куда -ими -твоей -всю -своего -твой -пусть -ним -про -точно -иметь -которые -тогда -сюда -наше -самой -взять -наверное -домой -совсем -те -тобой -наверно -что-то -будто -твои -пути -дома -такие -тех -такое -его -самой -вашей -наверное -мои -например -типа -значит -люблю -минут -пор -случае -искусство -лучше -того -такому -ждать -видеть -мною -ждал -имя -важно -чего-то -самому -обычно -представляет -мечтать -стало -помните -взять -моих -самим -своим -вообще -самими -здесь -обратно -сразу -таким -ежели -наоборот -куда -таков -мечтает -значит -покажи -такими -кстати -почти -всякий -научит -вдоль -тогдашний -толком -занимает -Аквапланирование -Барокамера -Библиографирование -Биосинтез -Взаимодействующий -Вибраторный -Виртуальность -Вооруженность -Господствующий -Десантно-штурмовой -Диагностировать -Дипломатический -Дисгармония -Дискриминационный -Достопримечательный -Жизнеустройство -Интернациональный -Инфицированный -Кальцинировать -Ключичный -Коннотация -Лиловатый -Люминесцентный -Метрополитен -Многоплановый -Модернизировать -Наивысший -Наименее -Неопределенный -Нераскрытый -Неоднократный -Неохотно -Непостижимый -Неусыпный -Обезьяноподобный -Обзавестись -Оптический -Оптимизировать -Осуществиться -Очистительный -Парафинировать -Переключатель -Пограничный -Подготовительный -Подрядчик -Полиморфный -Почитать -Преисполниться -Преподаватель -Преследователь -Прирожденный -Проектирование -Профанация -Разграничительный -Распоряжающийся -Реконструктивный -Революционный -Рентгенологический -Рискованный -Роскошествовать -Самоунижение -Сверхъестественный -Светочувствительный -Семантика -Сингулярность -Совершенствовать -Соединительный -Сосуществование -Спорообразующий -Стационарный -Столовая -Сторицей -Сцепной -Трансформирующий -Триумвират -Укротитель -Универсальный -Федеративный -Хронометраж -Целостность -Криумвират -Укратитель -Универссальный -Фидиративный -Хранометраж -Целосность diff --git a/Common/3dParty/hunspell/test/src/sk_SK.txt b/Common/3dParty/hunspell/test/src/sk_SK.txt deleted file mode 100644 index 1bc44a6dda..0000000000 --- a/Common/3dParty/hunspell/test/src/sk_SK.txt +++ /dev/null @@ -1,205 +0,0 @@ -hiša -pes -mačka -avto -drevo -knjiga -šola -prijatelj -mama -oče -otrok -jabolko -čokolada -kava -čaj -telefon -televizija -računalnik -glasba -šport -zdravje -lepota -delo -ljubezen -sreča -čas -denar -jezik -država -mesto -zima -poletje -jesen -pomlad -morje -gore -jezero -reka -park -žival -ptica -riba -les -zlato -srebro -kovina -steklo -čevlji -obleka -hlače -srajca -kapa -plašč -roka -noga -oko -uho -nos -ustnice -zob -glava -srce -možgani -kralj -kraljica -princ -princesa -fant -dekle -moški -ženska -starec -starka -zdravnik -medicinska sestra -učitelj -učenka -študent -študentka -kuhar -natakar -vojna -mir -zemljevid -zastava -smeh -jok -spanje -sanje -delo -učenje -umetnost -gledališče -kino -muzej -kapela -cerkev -grad -most -cesta - -Сложные слова - -1. Neparlamentarna -2. Samozadosten -3. Nepristranski -4. Pretirano -5. Nepredušno -6. Nesreča -7. Razpršeno -8. Nesprejemljiv -9. Prekomeren -10. Prostovoljstvo -11. Izolirati -12. Trmast -13. Brezpogojno -14. Neodvisnost -15. Skupnost -16. Neizvedljiv -17. Nelegitimen -18. Nevzdržen -19. Preobremenjenost -20. Ogrevalni sistem -21. Preoblikovati -22. Nezaslišano -23. Neugoden -24. Prezasedenost -25. Nesreča -26. Neupravičeno -27. Mednaroden -28. Kompatibilnost -29. Neuspeh -30. Neobvladljiv -31. Neskončen -32. Neprimeren -33. Amortizacija -34. Koncentracija -35. Cirkulacija -36. Obremenitev -37. Gromozanski -38. Simbol -39. Vinjeta -40. Digitalizacija -41. Funkcionalnost -42. Rentabilnost -43. Ekshibicionizem -44. Frustracija -45. Neprilagodljiv -46. Severnoameriški -47. Ekskluzivnost -48. Preverjanje -49. Celoživljenjsko -50. Privlačnost -51. Periferija -52. Sokrivda -53. Kompromis -54. Strpnost -55. Racionalizacija -56. Birokracija -57. Odraslost -58. Stabilnost -59. Nepredvidljivost -60. Razkošje -61. Smrtnost -62. Obveščenost -63. Produktivnost -64. Neugodje -65. Zapletenost -66. Hegemonija -67. Umetnost -68. Tranzicija -69. Individualnost -70. Kontaminacija -71. Inkubacija -72. Prikrito -73. Etnični -74. Sovražnost -75. Atraktivnost -76. Nestrpnost -77. Divergenca -78. Digitalna pismenost -79. Stabilizacija -80. Raznolikost - -Слова с ошибками - - Kontamenacija - - Grommozanski - - Neobvladlliv - - Neparlametarna - - Nevrzdržen - - voina - - muzei - - ryba - - serebro - - televiziia \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sl_SI.txt b/Common/3dParty/hunspell/test/src/sl_SI.txt deleted file mode 100644 index 3a2674932d..0000000000 --- a/Common/3dParty/hunspell/test/src/sl_SI.txt +++ /dev/null @@ -1,210 +0,0 @@ -Hiša -Sonce -Miza -Stol -Ptica -Trava -Drevo -Noč -Luna -Morje -Gora -Cvet -Riba -Rdeča -Modra -Zelena -Rumena -Bela -Črna -Kamen -Pes -Mačka -Roka -Noga -Glava -Oči -Uho -Nos -Usta -Jabolko -Hruška -Sliva -Jagoda -Malina -Lubenica -Kruh -Mleko -Sir -Mesnica -Sadje -Zelenjava -Voda -Zrak -Ogenj -Sneg -Dež -Oblak -Veter -Zima -Poletje -Jesen -Pomlad -Zajec -Lisica -Volk -Medved -Lev -Tigrica -Slon -Konj -Krava -Ovca -Piščanec -Jajce -Mleko -Kava -Čaj -Sok -Vino -Pivo -Hrana -Pecivo -Testo -Marmelada -Kruh -Sir -Olje -Sol -Poper -Sladkor -Kava -Čaj -Vino -Pivo -Šola -Učitelj -Učenec -Knjiga -Pisarna -Računalnik -Telefon -Glasba -Slika -Film -Gledališče -Mesto -Vas -Trg -Cesta -Reka -Avtomatizacija -Razvoj -Komunikacija -Kompjuter -Programiranje -Elektronski -Inženiring -Elektrifikacija -Kombinacija -Sistem -Informacija -Univerza -Biblioteka -Univerzitetni -Laboratorij -Raziskava -Razvojna -Inovacija -Intelektualni -Integriteta -Izobraževanje -Izvajanje -Preverjanje -Tehnologija -Implementacija -Program -Sodelovanje -Proizvodnja -Industrija -Organizacija -Administracija -Proaktivnost -Kreativnost -Projektni -Razumevanje -Kvaliteta -Upravljanje -Ocenjevanje -Statistika -Kompetentnost -Konsolidacija -Realizacija -Kapaciteta -Distribucija -Kompatibilnost -Konceptualizacija -Povezava -Posodobitev -Fleksibilnost -Ekonomija -Organiziranje -Konkurenca -Stabilnost -Ekologija -Osebnost -Zavzetost -Entuziazem -Motivacija -Avtorizacija -Kreacija -Akumulacija -Monotonija -Diferenciacija -Transformacija -Koncentracija -Inovativnost -Aktivnost -Vzpostavljanje -Reorganizacija -Kategorizacija -Partikularnost -Homogenost -Izjemenost -Generalizacija -Hierarhija -Koordinacija -Inspiracija -Evaluacija -Ustvarjalnost -Oblikovanje -Kompatibilnost -Konkretizacija -Proaktivnost -Identifikacija -Kapaciteta -Intervencija -Konsolidacija -Realizacija -Eksplozivnost -Abstrakcija -Individualnost -Integracija -Segmentacija -Asimilacija -Artikulacija -Kolaboracija -Asociacija -Stabilizacija -Kooperacija -Transformacija -Hšza -Kmojnikacija -Progrramiranjee -Elektornkski -Inženeirrng -Izzobraževanjee -Infomracija -Razvoojnaa -Proizvdonja -Akitvnostt \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt b/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt deleted file mode 100644 index 9002894db6..0000000000 --- a/Common/3dParty/hunspell/test/src/sr_Cyrl_RS.txt +++ /dev/null @@ -1,227 +0,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. Акредитација -32. Петиција -33. Каустичан -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. Хируршки -59. Шампионат -60. Геостационаран -61. Опустошан -62. Клема -63. Стационарни -64. Секуларни -65. Исегментација -66. Дебелина -67. Прецизан -68. Рафиниран -69. Психолошки -70. Турбулентан -71. Интегритет -72. Идеолошки -73. Манифестација -74. Имплицитан -75. Хомогеност -76. Изолација -77. Хетерогеност -78. Спекулативан -79. Вагу -80. Математички -81. Гематолошки -82. Психијатријски -83. Блокада -84. Заплена -85. Монопол -86. Дисидент -87. Екстрадиција -88. Ревизија -89. Ваидан -90. Колонизација -91. Мотивација -92. Просек -93. Ресурс -94. Хуманизам -95. Дравски -96. Коалиција -97. Картеля -98. Резолуција -99. Менталитет -100. Епидемиологија - -С ошибками - - Колонизакаија - - Епидемиогија - - Казуистикаки - - Хуманкзам - - Манитулативан - - сањваење - - утење - - автомобил - - мекицинска сестра - - стукло \ No newline at end of file diff --git a/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt b/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt deleted file mode 100644 index 48cd99d072..0000000000 --- a/Common/3dParty/hunspell/test/src/sr_Latn_RS.txt +++ /dev/null @@ -1,173 +0,0 @@ -ananas -anarhistički -antidepresiv -Anđeo -avion -banana -banka -belina -bespomoćnost -bibliotekar -bibliaoteikar -brod -citat -crkva -cvet -cveće -demokratija -demackratija -demokratizacija -Dobrota -dom -Dragi -ekran -eksperimentalni -eksplozija -epidemiologija -farmakologija -filantropija -flaša -frizura -fudbal -garaža -generalitet -geografski -globalizam -gnezdo -grad -građanstvo -grlo -hamburger -Harmonija -himalaji -hiperbola -hipotermija -hleb -Hrabrost -hrana -Hvala -igra -igračka -individualnost -infrastruktura -internet -inmternet -jabuka -jahač -jastuk -jednakost -jubilej -jurisprudencija -kafa -krevet -kriminalisticki -kriminalistika -kuća -kvantitativni -lampa -latiaratura -Lepota -lingvistika -literatura -ljubav -Ljubavi -ljubavnica -Ljubazan -Ljubim -lubenica -majica -majka -mašina -mikroorganizama -mikroskopija -Milost -Mir -Mirno -nacionalizam -nedopustiv -neurologija -novčanik -noć -nož -oktobar -okultizam -optimističan -optimističnost -ormar -Osoba -oči -pas -peškir -planina -poniženje -Porodica -Prijatelj -psihologija -psihoterapija -Radost -računar -reka -rekonvalescencija -reumatologija -revolucija -sendvič -Slatko -Sloboda -Slobodan -Snaga -socijalizacija -socijalizam -Spreman -Sreća -Srećan -Srećno -sunce -superiornost -Svetlost -tata -tehnologija -telefon -telekomunikacije -top -tradicionalni -ulica -univerzalnost -univerzitet -univirzdalnost -Usmena -Znanje -usta -Vedar -vegetarijanstvo -velikodušnost -voda -voz -Zabava -zavisnost -Zdravlje -zemlja -Zima -zjmlja -zločinački -zoološki -Zvezda -ćilim -čarapa -čarobnjak -časopis -čizme -đak -đevrek -đumbir -šešir -šišmiš -škola -šljiva -šuma -žaba -ženskara -žirafa -život -životinjski -žurka - diff --git a/Common/3dParty/hunspell/test/src/sv_SE.txt b/Common/3dParty/hunspell/test/src/sv_SE.txt deleted file mode 100644 index 99b61d1576..0000000000 --- a/Common/3dParty/hunspell/test/src/sv_SE.txt +++ /dev/null @@ -1,210 +0,0 @@ -Hus -Sol -Mjölk -Vatten -Fisk -Stol -Grön -Blomma -Träd -Katt -Hund -Bok -Cykel -Kaffe -Frukt -Kött -Fönster -Dörr -Säng -Lampa -Bord -Hår -Ögon -Hand -Fötter -Näsa -Mun -Öra -Huvud -Arm -Ben -Kläder -Hatt -Skor -Väska -Papper -Penna -Skrivbord -Telefon -Radio -Musik -Film -Teater -Konst -Sport -Spel -Resa -Bil -Tåg -Buss -Flygplan -Båt -Stad -Land -Hav -Sjö -Flod -Berg -Dal -Park -Skog -Sjukhus -Apotek -Skola -Universitet -Affär -Restaurang -Café -Hotell -Turist -Vän -Familj -Mamma -Pappa -Bror -Syster -Barn -Morfar -Mormor -Vänster -Höger -Framåt -Bakåt -Upp -Ner -Snäll -Osnäll -Glad -Ledsen -Trött -Stark -Svag -Tyst -Bullrig -Ren -Smutsig -Vacker -Ful -Liten -Stor -Komplexitet -Oproportionerlig -Ovillkorlig -Efterklokhet -Komplicerad -Desorientering -Konstellation -Otillgänglighet -Irreversibel -Förlåtelse -Overksamhet -Indifferent -Hierarki -Kombinatorik -Inkompatibilitet -Absorption -Konsekvens -Verklighetsfrånvänd -Retrospektiv -Förändringsbarhet -Ambivalens -Besvikenhet -Ineffektivitet -Intrikat -Dilemma -Hesitation -Absurditet -Kompromisslös -Konsolidering -Föresats -Tillfredsställelse -Delegering -Rekommendation -Detaljrikedom -Oanvändbar -Stagnation -Nostalgi -Hemlighetsfull -Avsaknad -Perseverans -Existentialism -Repetitivitet -Intolerans -Anonymitet -Obetydlig -Paradox -Förvirring -Juxtaposition -Reflektion -Självständighet -Kollision -Kreativitet -Djupgående -Abstraktion -Eufori -Autentisk -Insinuation -Omöjlig -Pessimism -Inkonsekvens -Revisionism -Sensationell -Obeveklig -Subjektivitet -Universalitet -Entropi -Omvälvande -Infiltration -Konservativ -Atypisk -Provokation -Konfrontation -Anarki -Konkurrenskraft -Defensivitet -Nihilism -Konklusion -Apori -Korrespondens -Prioritering -Exponentiell -Fragmentering -Aversion -Harmoni -Vanmakt -Signifikans -Katalysator -Förlust -Enhällighet -Ambition -Tendens -Alienation -Artificiell -Uppfyllelse -Psykosomatisk -Virtuos -Egensinnig -Anpassning -Hållbarhet -Konstitution -Kompleksitet -Oproporsjonerlig -Uvilkorlig -Etterklokhed -Komplisert -Desorientering -Konstelasjon -Utilgjengelighet -Irreversibel -Forlatelse diff --git a/Common/3dParty/hunspell/test/src/tr_TR.txt b/Common/3dParty/hunspell/test/src/tr_TR.txt deleted file mode 100644 index 9ad60f3664..0000000000 --- a/Common/3dParty/hunspell/test/src/tr_TR.txt +++ /dev/null @@ -1,205 +0,0 @@ -Akşam -Almak -Altın -Anahtar -Anlamak -Araba -Atmak -Ayakkabı -Açmak -Ağaç -Bahçe -Bakır -Bakkal -Bakmak -Balık -Beyaz -Bilgisayar -Bilmek -Binmek -Bulmak -Ceket -Cevaplamak -Deniz -Dinlemek -Doktor -Duyurulmamış -Düzenleştirme -Düşmek -Düşünmek -Ekmek -Elbise -Eldiven -Elma -Erkek -Etek -Etmek -Ev -Eşarp -Gelgit -Geliştiricilikle -Geliştirilebilir -Geliştirme -Gerçekleştirme -Gezmek -Geçmek -Gitar -Gitmek -Giymek -Gri -Gömlek -Görülebilirlik -Görünümlü -Görünüşlü -Gözlük -Gümüş -Günaydın -Hareketlendi -Hareketlilik -Hava -Hayalperest -Hüzün -Kahve -Kahverengi -Kalabalıklar -Kalem -Kalkmak -Kalmak -Kapatmak -Kararlılık -Kararlılıkla -Kararsızlık -Kararsızlıkla -Karpuz -Kedi -Kemer -Kemdkcer -Kırmızı -Kitap -Kız -Kızgınmak -Koklamak -Koalye -Kolye -Konservatuvar -Konuşmak -Korkmak -Koymak -Koşmak -Kravat -Kullanılabilir -Kullanılmış -Kullanılmışlık -Kullanışlılık -Kurumsallaşma -Köpek -Küpe -Kütüphane -Mavi -Mazbut -Melankoli -Merdiven -Merhaba -Merhabalar -Meurhaba -Meydan -Meyhane -Meyve -Mor -Muhafazakar -Muhteşem -Mukadderatlarınızdanmışçasına -Muvaffak -Muzaffer -Muzafferiyet -Muzip -Mükemmeldik -Münasebet -Münzevi -Müsrif -Mütevazi -Müteessir -Mütercim -Mütereddit -Mütevazı -Müzmin -Okul -Okumak -Otobüs -Otoriterlik -Oynamak -Pantolon -Pasta -Pembe -Pembei -Plaj -Platin -Saat -Sandalye -Sarı -Satmak -Sevinmek -Sevmek -Sıcak -Sıradaymışız -Siyah -Sormak -Soymak -Soğuk -Su -Sükûnet -Sürrealist -Süt -Tabak -Tadına bakmak -Tatlı -Tavuk -Telefoncu -Televizyon -Temizlemek -Teşekkürler -Türkuaz -Tuirkuazu -Turuncu -Tutmak -Ulaştırılabilir -Uygulanabilir -Uyumak -Uçak -Yapmak -Yatak -Yazmak -Yemek -Yeşil -Yıkanmak -Yıldız -Yol -Yöneltilmezken -Yüzme -Yüzük -Zenginleştirmek -Çalışamamıştı -Çalışmak -Çalışmamıştır -Çanta -Çay -Çıkarmak -Çiçek -Çorap -Özelleştirilmiş -Özelleştirme -Özgürleştirme -Üzülmek -İnmek -İsteksizlik -İsteksizlikle -İstikrarlı -İstikrarlılık -İstisnai -İslamiyetle -İzlemek -İçmek -İşbirliği -İşitmek -Şapka -Şemsiye diff --git a/Common/3dParty/hunspell/test/src/uk_UA.txt b/Common/3dParty/hunspell/test/src/uk_UA.txt deleted file mode 100644 index b139dedfbd..0000000000 --- a/Common/3dParty/hunspell/test/src/uk_UA.txt +++ /dev/null @@ -1,210 +0,0 @@ -абдукція -абіогенез -амбівалентнасть -амбівалентність -анахранізм -анахронізм -антропогенез -антропологія -антропоморфізм -апатія -археологія -архетип -аскетизм -астрономія -афект -бачити -бігти -білий -біллий -біологія -бувай -будинок -будь ласка -бути -важко -велиикий -великий -веселка -взяти -вибачте -відчувати -вода -волюнтаризм -втаємниченість -вчитися -гарний -гарячий -гегемонія -географія -герменевтика -герменевтика -гештальт -говорити -гойдалка -готувати -грати -дати -дедукція -деконструктивізм -деконструкція -демаркація -детермінізм -дзвіночок -дивитися -дисгарммонія -дисгармонія -дисфункція -дисфункця -дихотомія -до побачення -добрий -доктрина -думати -дурний -дурня -дякую -евфемізм -езотерика -ей -екзистенціалізм -екзистенціалізм -екзистенцілізм -екзистенція -економіка -емерджентність -ентелехія -епістемологія -ефемерність -ефемерність -занепадництво -звісно -здоровий -зелений -йти -ілюзорність -ілюзорність -імплікація -інвектива -індукція -інтроспекціїя -їсти -історія -каблучка -кава -казус -калюжа -катарсис -каченя -каштани -квітка -кішка -класно -книга -когнітивістика -комаха -консенсус -космогенез -купувати -легко -лінгвістика -літати -маленький -марнослів'я -математика -мати -метаморфоза -метелик -метелиця -містифікація -місто -могти -можливо -мусити -насправді -не радий -незворушність -ні -нігілізм -новий -нонсенс -ностальгія -павучок -парадокс -пес -писати -пити -піти -плавати -плакати -повільний -поганий -політологія -постмодернізм -потворний -працювати -привіт -прийти -психоаналіз -птах -радий -ремінісценція -рефлексія -робити -розбурхання -розумний -сильний -сингулярність -синестезія -синій -синішй -синкретизм -сказати -скатертина -слабкий -слухати -сміятися -сніг -соліпсизм -соломинка -сонечко -сонце -соціологія -спати -співати -справді -старий -структуралізм -сумний -так -так -танцювати -телефонувати -тож -трансцендентність -фантастично -фаталізм -фемінізм -феномен -феноменологія -фізика -філософія -фрактал -хворий -хімія -хліб -хліб -ходити -холодний -хотіти -чао -червонй -червоний -черевики -читати -чорнй -чорний -чути -швидкий -щасливий -яблуко diff --git a/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt b/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt deleted file mode 100644 index b92bea172f..0000000000 --- a/Common/3dParty/hunspell/test/src/uz_Cyrl_UZ.txt +++ /dev/null @@ -1,262 +0,0 @@ -Mарт -Ёз -Ём -Ёхуд -Август -Адвакат -Адреси -айтган-лирангиз -айқин -амалга -анча -Апрел -арзонроқ -аҳамият -аҳднома -бажарилади -бажарилди -баланд -ихтисослан -банкрот -баҳона -Баҳор -бераман -берасизми -беринг -бериш -бешинчи -биз -Бизга -Бизнинг -билан -Бирор -Бозорнинг -бор -бошқа -Бу -Бугун -будингиз -бунга -бундай -Бухгалтерлик -бўлади -бўладими -бўлиши -бўлмаган -бўлса -бўш -бўшайди -бўшатасиз -вазифасига -вазият -вариант -вақт -газетадаги -газетадан -даромад -Декабрь -Душанба -Эрталаб -Етказиб -Жисмоний -Жуда -Жума -зарур -зиёфат -Ижара -ижарага -икки -Илтимос -Индинга -информатизациялари -Иситгич -иши -ишлатсак -Ишхона -Июль -Июнь -Йўқ -йил -йилдан -кам -Шинамгина -кампанияси -келдим -келишимдан -келмоқчи -келсам -келтириш -керак -керакдир -керакми -кета-ди -кеч -Кеча -кечага -Кечаси -Кечир -Кечирдинг -кирла -кирадими -кондиционер -коррупциядир -кран -Куз -Кун -куни -кўрмоқчи -кўчиб -лойиҳа -Май -маълумоти -маълумотларни -Маъмурият -маъруза -Мен -музлатгич -мумкин -муфмкин -мутахассис -мушовир -муҳим -нарса -нархи -Нархини -нақд -ўшанақасини -неча -Номардлик -Ноябри -интернетдаги -ойнаси -ойнинг -Октябри -олдин -олдиндан -олмаймиз -олмоқчи -орқали -шоти -шорти -Оқшом -пайдо -Панжшанба -пулини -Раҳмат -резюме -реклама -Салом -Сармоядор -Сентябрь -Сешанба -Сиз -сизга -сизда -Сизнинг -синган -сифатида -совуқ -софвуқ -Солиқларни -Статистик -сўм -тажрибали -тайёргарлик -тайёрладик -тайёрладингизми -таклиф -талафот -талафоти -таъминловчилардан -танишинг -таржимон -тарржимон -тахминан -ташкил -Телефонни -технология -Безантирани -тозалан -тозалигига -Тонгда -топширишимиз -топшириқ -турли -турмоқчи -тутсак -Тушлик -ўладиганингиз -тўлай -тўлаймиз -тилдиришинг -тўлиқ -уйингиз -уйни -уч -учун -ўқидим -фақат -Феврал -хабар -Хайрли кун -Мотамхонаси -хонлик -Чек -Чоршанба -Шанба -шарт-номани -шартини -шартлар -шартлари -шартни -шартнома -шахс -шовқин -Шом -Шу -эди -Эртага -Эртадан сўнг -Эшитишимга -эълон -эълонингиз -эълонингизни -эътироф -Юклаш -Якшанба -Январи -Ярим кеча -яхши -қабул -қаерда -Қанақа -қаноатманда -қанча -қачон -қизиқарлидир -қиламиз -қилганим -қилдим -қилинг -қилинди -қилишди -қиммат -қиммати -Қимматидан -қирқ -Қиш -қувонарлими -қўнғироқ -Қўшимча -ҳайвонини -ҳам -ҳамза -Ҳар -ҳафтага -ҳақиқатан -ҳисоблаб -Ҳозир -ҳужжатни -Ўтган кун - - diff --git a/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt b/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt deleted file mode 100644 index ee6a1d9356..0000000000 --- a/Common/3dParty/hunspell/test/src/uz_Latn_UZ.txt +++ /dev/null @@ -1,200 +0,0 @@ -Salom -Sallom -Rahmat -Rhmat -Iltimos -Iltimo -Kattalar -Kattalarvf -Yaxshi -Yashi -Kelajak -Keljajak -Oilaviy -Oilaaviy -Qarindosh -Qarinndosh -Shahar -Shaha -Dengiz -Dengizzz -Quyosh -Quyyosh -Yulduz -Oyim -Kechqurun -Tushun -Suvchi -Sharob -Choyxona -Nonushta -Tushlik -Muzqaymoq -Desert -Tuzluq -Mevalar -Sabzavot -Baliq -Tuxumli -Sabza -Sariq -Salatlar -Shirinlik -Shokolad -Rishta -Kakao -Pishloq -Tort -Qaymoq -Sutli -Qatiq -Salomatlik -Temir -Zahar -Oqimli -Shamol -Olov -Yer -Osmon -Shanba -Dushanba -Seshanba -Chorshanba -Payshanba -Juma -Yakshanba -Oltin -Tong -Bomdod -Asr -Shom -Kun -Oqsoqol -Shoshqaloq -Kulgili -Muxlislilar -Tavsiflash -Tuzilishga -Mustaqillik -Tushuntirish -Boshqarish -Mashhurlik -Tarkibiy -Tahlil -Ishchi -Xalqaro -Tarjima -Mustahkamlik -Chaqaloq -Istiqbol -Tasvir -Taklif -Tasavvur -Jiddiy -Majburiyat -Asosiy -Tahdid -Tushunmovchilik -Ishonch -Maqomi -Ijodkor -Tadbirkor -Hayotiy -Mashhur -Bemorlik -Tadbir -Jismoniy -Madaniyat -Xavfsizlik -Sifatli -Suvli -Sotuvchi -Chetel -Tashqi -Sotuv -Tarbiyalanish -Murabbo -Sariqcha -Qovun -Shaharlik -Muhimlik -Tarbiyachilik -Xatolik -Balandlik -Yuzaki -Kuyov -Qiziquvchan -Orzular -Mashq -Qalampir -Muammo -Sadoqatli -Yovuzlik -Fikr-mulohaza -Boylik -Tushuncha -Zanjir -Eslatma -Tabassum -Ishonuvchi -Chidamlilik -Ilova -Birodarlik -Oqilona -Ijodiyot -Tayanch -Hurmat -Baxtli -Tajriba -Samimiylik -Shifokor -Ishrat -Baho -Namoyish -Qiyinchilik -Bolalar -Ishonchli -Taqdir -Shovqinli -Xalqaro -Baxt -Fursat -Hurmatli -Qulaylik -Zamonaviy -Sadoqat -Sabr -Nikoh -Jasorat -Barkamollik -Dunyoqarash -Omadli -Foydali -Yorqin -Mehribonlik -Fazilatli -Kutubxona -Istiqomatli -Fido -Bahor -Shafqatsizlik -Tafakkur -Fazilat -Qochish -Laziz -Uzoq -Ilhom -Omad -Hurmatli -Tandir -Sherzod -Bahoriy -Dilshod -Baxtli -Shonli -Nurli -Shafqatsizlik -Oqqush -Boylik -Toza -Sabrli diff --git a/Common/3dParty/hunspell/test/src/vi_VN.txt b/Common/3dParty/hunspell/test/src/vi_VN.txt deleted file mode 100644 index 2982e9eb45..0000000000 --- a/Common/3dParty/hunspell/test/src/vi_VN.txt +++ /dev/null @@ -1,128 +0,0 @@ -Bánh -Bang -bênh -bướng -bậy -Chanh -chum -chuyện -chép -Chùng -chắp -chệnh -chới -chữ -công -cạc -cột -cứu -Doanh -duyên -dùng -dể -dọng -gia -giày -giêng -Giảng -giềng -hon -Hoẳn -Hài -hôm -hước -hấu -hớt -hữu -Khiển -Khoào -khuya -khuyến -khách -khén -khẩn -khắp -khựng -kẻo -lang -liền -Loàng -Luỗng -lình -lương -lấp -lệnh -lịnh -lốn -lời -lựng -Muộn -Mãnh -mại -mạn -mổ -mởn -nghiễm -nghều -Ngoáy -Nguyên -ngóp -người -ngỏ -ngớp -ngụa -ngửng -nhiếp -nhu -nhà -nhân -Nhóm -nhưỡng -nhắm -nhổn -nhứt -ninh -noi -nãy -nạn -nốt -ong -pao -phiên -phiêu -Phên -Phương tiện -phẩm chất -phố đi bộ -quan trọng -quyền lợi -quán cà phê -quảng cáo -Quốc -Quốc tế -riêng biệt -rưỡi -Rải -Rẻng -rộng rãi -siễn -sum -Sõng -Sưu -sưu tập -sử dụng -Thiệt thòi -Thuộc về -thuộc tính - -Слова с ошибками -thiệte -quốq tế -nguên -khoao -chenh -chhùng -man -doah -khien -ngoay \ No newline at end of file From 20a8de9440b463ed6127a71bd7acdc4b399f9d51 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 4 Sep 2024 16:32:52 +0500 Subject: [PATCH 19/82] Fix bug #69988 --- OdfFile/Reader/Format/office_text.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/OdfFile/Reader/Format/office_text.cpp b/OdfFile/Reader/Format/office_text.cpp index 72812030f1..5b8476f142 100644 --- a/OdfFile/Reader/Format/office_text.cpp +++ b/OdfFile/Reader/Format/office_text.cpp @@ -39,6 +39,7 @@ #include "serialize_elements.h" #include "odfcontext.h" +#include "style_paragraph_properties.h" namespace cpdoccore { namespace odf_reader { @@ -240,9 +241,21 @@ void office_text::docx_convert(oox::docx_conversion_context & Context) } } - if (!Context.get_master_page_name().empty() && !next_masterPageName) + style_instance* next_style_instance = Context.root()->odf_context().styleContainer().style_by_name(text___, odf_types::style_family::Paragraph, false); + if (next_style_instance) { - Context.next_dump_page_properties(true); + style_content* next_style_content = next_style_instance->content(); + if (next_style_content) + { + style_paragraph_properties* next_para_props = next_style_content->get_style_paragraph_properties(); + if (next_para_props) + { + if (next_para_props->content_.fo_break_before_ && next_para_props->content_.fo_break_before_->get_type() == odf_types::fo_break::Page) + { + Context.next_dump_page_properties(true); + } + } + } } } content_[i]->docx_convert(Context); From ceeaff9585da77faeb2c16cda7b380ea8e8dbbe8 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 4 Sep 2024 14:51:31 +0300 Subject: [PATCH 20/82] Fixes for pdf --- DesktopEditor/graphics/pro/js/after.py | 2 ++ DesktopEditor/graphics/pro/js/before.py | 4 +++- DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/DesktopEditor/graphics/pro/js/after.py b/DesktopEditor/graphics/pro/js/after.py index 138e3d2ddd..c992eca246 100644 --- a/DesktopEditor/graphics/pro/js/after.py +++ b/DesktopEditor/graphics/pro/js/after.py @@ -7,6 +7,8 @@ base.configure_common_apps() base.replaceInFile("../../../../Common/3dParty/icu/icu/source/common/udata.cpp", "\n{\n#ifdef BUILDING_WASM_MODULE\nreturn NULL;\n#endif\n UDataMemory tData;", "\n{\n UDataMemory tData;") base.replaceInFile("../../../../DesktopEditor/cximage/png/pnglibconf.h", "//#define PNG_CONSOLE_IO_SUPPORTED", "#define PNG_CONSOLE_IO_SUPPORTED") +base.replaceInFile("../../../../Common/3dParty/openssl/openssl/crypto/sha/sha512.c", "const SHA_LONG64 *W = (const SHA_LONG64*)in;", "const SHA_LONG64 *W = in;") + # finalize base.replaceInFile("./deploy/drawingfile.js", "function getBinaryPromise(", "function getBinaryPromise2(") base.replaceInFile("./deploy/drawingfile.js", "__ATPOSTRUN__=[];", "__ATPOSTRUN__=[function(){window[\"AscViewer\"] && window[\"AscViewer\"][\"onLoadModule\"] && window[\"AscViewer\"][\"onLoadModule\"]();}];") diff --git a/DesktopEditor/graphics/pro/js/before.py b/DesktopEditor/graphics/pro/js/before.py index 55f11d7fbc..8f75cc7f3b 100644 --- a/DesktopEditor/graphics/pro/js/before.py +++ b/DesktopEditor/graphics/pro/js/before.py @@ -36,4 +36,6 @@ if not base.is_dir("freetype-2.10.4"): common.apply_patch("./freetype-2.10.4/builds/unix/ftsystem.c", "./wasm/patches/ftsystem.patch") base.replaceInFile("../../../../Common/3dParty/icu/icu/source/common/udata.cpp", "\n{\n UDataMemory tData;", "\n{\n#ifdef BUILDING_WASM_MODULE\nreturn NULL;\n#endif\n UDataMemory tData;") -base.replaceInFile("../../../../DesktopEditor/cximage/png/pnglibconf.h", "#define PNG_CONSOLE_IO_SUPPORTED", "//#define PNG_CONSOLE_IO_SUPPORTED") \ No newline at end of file +base.replaceInFile("../../../../DesktopEditor/cximage/png/pnglibconf.h", "#define PNG_CONSOLE_IO_SUPPORTED", "//#define PNG_CONSOLE_IO_SUPPORTED") + +base.replaceInFile("../../../../Common/3dParty/openssl/openssl/crypto/sha/sha512.c", "const SHA_LONG64 *W = in;", "const SHA_LONG64 *W = (const SHA_LONG64*)in;") diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js index 81ff56a1fe..8aa600e208 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js @@ -273,6 +273,8 @@ CFile.prototype._getGlyphs = function(pageIndex) res.result = new Uint8Array(len); res.result.set(textCommandsSrc); } + else + res.result = []; return res; }; From 386bce9b68becdbc81a8843570b5063a319d6a92 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 4 Sep 2024 20:22:34 +0600 Subject: [PATCH 21/82] Fix bug #70020 --- OOXML/XlsxFormat/Pivot/Pivots.cpp | 124 ++++++++++++++++-------------- 1 file changed, 67 insertions(+), 57 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 3f39b9d0d9..bee1244a32 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -2572,7 +2572,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fStdev = false; if (m_oSubtotalCaption.IsInit()) - ptr->irstSub.value() = m_oSubtotalCaption.get(); + ptr->irstSub = m_oSubtotalCaption.get(); else ptr->fDisplaySub = false; @@ -4880,54 +4880,59 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) { - auto boolVal = static_cast(i); - if(boolVal) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = boolVal->toBin(); - ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); - continue; - } - auto dataValue = static_cast(i); - if(dataValue) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = dataValue->toBin(); - ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); - continue; - } - auto errorValue = static_cast(i); - if(errorValue) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = errorValue->toBin(); - ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); - continue; - } - auto noVal = static_cast(i); - if(noVal) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = noVal->toBin(); - ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); - continue; - } - auto numericVal = static_cast(i); - if(numericVal) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = numericVal->toBin(); - ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); - continue; - } - auto charVal = static_cast(i); - if(charVal) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = charVal->toBin(); - ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); - continue; - } + switch(i->getType()) + { + case et_x_PivotBooleanValue: + { + auto boolVal = static_cast(i); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = boolVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + break; + } + case et_x_PivotDateTimeValue: + { + auto dataValue = static_cast(i); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = dataValue->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + break; + } + case et_x_PivotErrorValue: + { + auto errorValue = static_cast(i); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = errorValue->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + break; + } + case et_x_PivotNoValue: + { + auto noVal = static_cast(i); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = noVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + break; + } + case et_x_PivotNumericValue: + { + auto numericVal = static_cast(i); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = numericVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + break; + } + case et_x_PivotCharacterValue: + { + auto charVal = static_cast(i); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = charVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + break; + } + default: + break; + } } return objectPtr; } @@ -5083,6 +5088,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oEndNum.IsInit()) ptr->xnumEnd.data.value = m_oEndNum.get(); } + ptr->iByType = 0x00; if(m_oGroupBy.IsInit()) { if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByNumericRanges) ptr->iByType = 0x00; @@ -6784,14 +6790,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptr(new XLSB::PCDFGROUP); XLS::BaseObjectPtr objectPtr(ptr); - if(m_oPar.IsInit() || m_oBase.IsInit()) - { - auto ptr1(new XLSB::BeginPCDFGroup); - if(m_oPar.IsInit()) - ptr1->ifdbParent = m_oPar->GetValue(); - if(m_oBase.IsInit()) - ptr1->ifdbBase = m_oBase->GetValue(); - } + + auto ptr1(new XLSB::BeginPCDFGroup); + ptr->m_BrtBeginPCDFGroup = XLS::BaseObjectPtr{ptr1}; + if(m_oPar.IsInit()) + ptr1->ifdbParent = m_oPar->GetValue(); + else + ptr1->ifdbParent = -1; + if(m_oBase.IsInit()) + ptr1->ifdbBase = m_oBase->GetValue(); + else + ptr1->ifdbBase = -1; + if(m_oDiscretePr.IsInit()) ptr->m_PCDFGDISCRETE = m_oDiscretePr->toBin(); if(m_oRangePr.IsInit()) From f6c48c1edb82bd237f714d90652f52f581f146b2 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 4 Sep 2024 20:48:28 +0500 Subject: [PATCH 22/82] Fix bug #70039 --- OdfFile/DataTypes/presentationclass.cpp | 1 + OdfFile/Reader/Format/draw_frame_pptx.cpp | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/OdfFile/DataTypes/presentationclass.cpp b/OdfFile/DataTypes/presentationclass.cpp index f3918d04df..c8239e863f 100644 --- a/OdfFile/DataTypes/presentationclass.cpp +++ b/OdfFile/DataTypes/presentationclass.cpp @@ -127,6 +127,7 @@ std::wstring presentation_class::get_type_ms() break; case notes: case handout: + case outline: case text: res = L"body"; break; diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 0312ec1dfc..a4f43aeff6 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -189,13 +189,12 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) if (common_presentation_attlist_.presentation_class_) { std::wstring type = common_presentation_attlist_.presentation_class_->get_type_ms(); - - if (Context.process_masters_ && type.empty()) - { - type = L"body"; - } - Context.get_slide_context().set_placeHolder_type(type); + if (!Context.process_masters_ && !Context.get_slide_context().processing_notes() && + common_presentation_attlist_.presentation_class_->get_type() == odf_types::presentation_class::outline) + Context.get_slide_context().set_is_placeHolder(true); + else + Context.get_slide_context().set_placeHolder_type(type); if (idx_in_owner >= 0) Context.get_slide_context().set_placeHolder_idx(idx_in_owner); From 978ec430471efc7854fc27709d8de9347d2850cd Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Wed, 4 Sep 2024 20:01:10 +0300 Subject: [PATCH 23/82] printPr --- OOXML/PPTXFormat/Limit/BWMode.cpp | 84 ++++++++++ OOXML/PPTXFormat/Limit/BWMode.h | 4 + OOXML/PPTXFormat/PresProps.cpp | 44 +++-- OOXML/PPTXFormat/PresProps.h | 16 +- OOXML/PPTXFormat/ShowPr/Browse.cpp | 4 +- OOXML/PPTXFormat/ShowPr/Browse.h | 10 +- OOXML/PPTXFormat/ShowPr/CustShow.cpp | 4 +- OOXML/PPTXFormat/ShowPr/CustShow.h | 12 +- OOXML/PPTXFormat/ShowPr/Kiosk.cpp | 4 +- OOXML/PPTXFormat/ShowPr/Kiosk.h | 12 +- OOXML/PPTXFormat/ShowPr/Present.cpp | 4 +- OOXML/PPTXFormat/ShowPr/Present.h | 9 +- .../ShowPr/{ShowPr.cpp => PresentationPr.cpp} | 155 ++++++++++++++---- .../ShowPr/{ShowPr.h => PresentationPr.h} | 57 +++++-- OOXML/PPTXFormat/ShowPr/SldAll.cpp | 4 +- OOXML/PPTXFormat/ShowPr/SldAll.h | 9 +- OOXML/PPTXFormat/ShowPr/SldRg.cpp | 4 +- OOXML/PPTXFormat/ShowPr/SldRg.h | 14 +- .../Linux/PPTXFormatLib/PPTXFormatLib.pro | 4 +- .../Windows/PPTXFormatLib/PPTXFormat.vcxproj | 4 +- .../PPTXFormatLib/PPTXFormat.vcxproj.filters | 38 ++--- 21 files changed, 333 insertions(+), 163 deletions(-) rename OOXML/PPTXFormat/ShowPr/{ShowPr.cpp => PresentationPr.cpp} (51%) rename OOXML/PPTXFormat/ShowPr/{ShowPr.h => PresentationPr.h} (64%) diff --git a/OOXML/PPTXFormat/Limit/BWMode.cpp b/OOXML/PPTXFormat/Limit/BWMode.cpp index 34b9e1c02b..6d25500015 100644 --- a/OOXML/PPTXFormat/Limit/BWMode.cpp +++ b/OOXML/PPTXFormat/Limit/BWMode.cpp @@ -92,5 +92,89 @@ namespace PPTX break; } } +//------------------------------------------------------------------------------------------ + PrintClrMode::PrintClrMode() + { + m_strValue = L"clr"; + } + void PrintClrMode::set(const std::wstring& strValue) + { + if ((L"bw" == strValue) || + (L"clr" == strValue) || + (L"gray" == strValue)) + { + m_strValue = strValue; + } + } + unsigned char PrintClrMode::GetBYTECode() const + { + if (L"bw" == m_strValue) return 0; + if (L"clr" == m_strValue) return 1; + if (L"gray" == m_strValue) return 2; + return 0; + } + void PrintClrMode::SetBYTECode(const unsigned char& src) + { + switch (src) + { + case 0: m_strValue = L"bw"; break; + case 1: m_strValue = L"clr"; break; + case 2: m_strValue = L"gray"; break; + default: + m_strValue = L"clr"; + break; + } + } +//------------------------------------------------------------------------------------------ + PrintWhat::PrintWhat() + { + m_strValue = L"slides"; + } + void PrintWhat::set(const std::wstring& strValue) + { + if ((L"slides" == strValue) || + (L"handouts1" == strValue) || + (L"handouts2" == strValue) || + (L"handouts3" == strValue) || + (L"handouts4" == strValue) || + (L"handouts6" == strValue) || + (L"handouts9" == strValue) || + (L"notes" == strValue) || + (L"outline" == strValue)) + { + m_strValue = strValue; + } + } + unsigned char PrintWhat::GetBYTECode() const + { + if (L"slides" == m_strValue) return 0; + if (L"handouts1" == m_strValue) return 1; + if (L"handouts2" == m_strValue) return 2; + if (L"handouts3" == m_strValue) return 3; + if (L"handouts4" == m_strValue) return 4; + if (L"handouts6" == m_strValue) return 5; + if (L"handouts9" == m_strValue) return 6; + if (L"notes" == m_strValue) return 7; + if (L"outline" == m_strValue) return 8; + return 0; + } + void PrintWhat::SetBYTECode(const unsigned char& src) + { + switch (src) + { + case 0: m_strValue = L"slides"; break; + case 1: m_strValue = L"handouts1"; break; + case 2: m_strValue = L"handouts2"; break; + case 3: m_strValue = L"handouts3"; break; + case 4: m_strValue = L"handouts4"; break; + case 5: m_strValue = L"handouts6"; break; + case 6: m_strValue = L"handouts9"; break; + case 7: m_strValue = L"notes"; break; + case 8: m_strValue = L"outline"; break; + default: + m_strValue = L"slides"; + break; + } + } } // namespace Limit } // namespace PPTX diff --git a/OOXML/PPTXFormat/Limit/BWMode.h b/OOXML/PPTXFormat/Limit/BWMode.h index ab4b79aa8d..d5ffdf584a 100644 --- a/OOXML/PPTXFormat/Limit/BWMode.h +++ b/OOXML/PPTXFormat/Limit/BWMode.h @@ -38,5 +38,9 @@ namespace PPTX namespace Limit { DEFINE_LIMIT_BASE(BWMode) + + DEFINE_LIMIT_BASE(PrintClrMode) + + DEFINE_LIMIT_BASE(PrintWhat) } // namespace Limit } // namespace PPTX diff --git a/OOXML/PPTXFormat/PresProps.cpp b/OOXML/PPTXFormat/PresProps.cpp index 07bab3188f..f9f230dea9 100644 --- a/OOXML/PPTXFormat/PresProps.cpp +++ b/OOXML/PPTXFormat/PresProps.cpp @@ -32,7 +32,7 @@ #include "PresProps.h" -#include "ShowPr/ShowPr.h" +#include "ShowPr/PresentationPr.h" #include "ShowPr/Browse.h" #include "ShowPr/CustShow.h" #include "ShowPr/Kiosk.h" @@ -59,12 +59,17 @@ namespace PPTX ClrMru.clear(); XmlUtils::CXmlNode oNodeClr; - if (oNode.GetNode(_T("p:clrMru"), oNodeClr)) - XmlMacroLoadArray(oNodeClr, _T("*"), ClrMru, Logic::UniColor); + if (oNode.GetNode(L"p:clrMru", oNodeClr)) + XmlMacroLoadArray(oNodeClr, L"*", ClrMru, Logic::UniColor); - showPr = oNode.ReadNode(_T("p:showPr")); + showPr = oNode.ReadNode(L"p:showPr"); + printPr = oNode.ReadNode(L"p:printPr"); + if(showPr.is_init()) showPr->SetParentFilePointer(this); + + if (printPr.is_init()) + printPr->SetParentFilePointer(this); } void PresProps::write(const OOX::CPath& filename, const OOX::CPath& directory, OOX::CContentTypes& content)const { @@ -77,25 +82,27 @@ namespace PPTX pWriter->WriteRecordArray(0, 0, ClrMru); pWriter->WriteRecord2(1, showPr); + pWriter->WriteRecord2(2, printPr); pWriter->EndRecord(); } void PresProps::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const { - pWriter->StartNode(_T("p:presentationPr")); + pWriter->StartNode(L"p:presentationPr"); pWriter->StartAttributes(); - pWriter->WriteAttribute(_T("xmlns:a"), PPTX::g_Namespaces.a.m_strLink); - pWriter->WriteAttribute(_T("xmlns:r"), PPTX::g_Namespaces.r.m_strLink); - pWriter->WriteAttribute(_T("xmlns:p"), PPTX::g_Namespaces.p.m_strLink); + pWriter->WriteAttribute(L"xmlns:a", PPTX::g_Namespaces.a.m_strLink); + pWriter->WriteAttribute(L"xmlns:r", PPTX::g_Namespaces.r.m_strLink); + pWriter->WriteAttribute(L"xmlns:p", PPTX::g_Namespaces.p.m_strLink); pWriter->EndAttributes(); - pWriter->WriteArray(_T("p:clrMru"), ClrMru); + pWriter->WriteArray(L"p:clrMru", ClrMru); pWriter->Write(showPr); + pWriter->Write(printPr); - pWriter->EndNode(_T("p:presentationPr")); + pWriter->EndNode(L"p:presentationPr"); } void PresProps::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { @@ -130,15 +137,18 @@ namespace PPTX ClrMru.pop_back(); } } - } - break; - } + } + }break; case 1: { - showPr = new nsShowPr::ShowPr(); - showPr->fromPPTY(pReader); - break; - } + showPr = new nsPresentationPr::ShowPr(); + showPr->fromPPTY(pReader); + }break; + case 2: + { + printPr = new nsPresentationPr::PrintPr(); + printPr->fromPPTY(pReader); + }break; default: { pReader->SkipRecord(); diff --git a/OOXML/PPTXFormat/PresProps.h b/OOXML/PPTXFormat/PresProps.h index 52fdd40f5d..fb92004ba8 100644 --- a/OOXML/PPTXFormat/PresProps.h +++ b/OOXML/PPTXFormat/PresProps.h @@ -30,8 +30,6 @@ * */ #pragma once -#ifndef PPTX_PRESPROPS_FILE_INCLUDE_H_ -#define PPTX_PRESPROPS_FILE_INCLUDE_H_ #include "WrapperFile.h" #include "FileContainer.h" @@ -41,9 +39,10 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class ShowPr; + class PrintPr; } class PresProps : public WrapperFile, public PPTX::FileContainer @@ -53,7 +52,6 @@ namespace PPTX PresProps(OOX::Document* pMain, const OOX::CPath& filename, FileMap& map); virtual ~PresProps(); - public: virtual void read(const OOX::CPath& filename, FileMap& map); virtual void write(const OOX::CPath& filename, const OOX::CPath& directory, OOX::CContentTypes& content) const; @@ -61,16 +59,12 @@ namespace PPTX virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: virtual const OOX::FileType type() const; virtual const OOX::CPath DefaultDirectory() const; virtual const OOX::CPath DefaultFileName() const; - public: - std::vector ClrMru; - nullable showPr; - //prnPr (Printing Properties) + std::vector ClrMru; + nullable showPr; + nullable printPr; }; } // namespace PPTX - -#endif // PPTX_PRESPROPS_FILE_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/Browse.cpp b/OOXML/PPTXFormat/ShowPr/Browse.cpp index 15fa76823f..cf6d0d16df 100644 --- a/OOXML/PPTXFormat/ShowPr/Browse.cpp +++ b/OOXML/PPTXFormat/ShowPr/Browse.cpp @@ -34,7 +34,7 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void Browse::fromXML(XmlUtils::CXmlNode& node) { @@ -88,5 +88,5 @@ namespace PPTX void Browse::FillParentPointersForChilds() { } - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/Browse.h b/OOXML/PPTXFormat/ShowPr/Browse.h index 8d580a118a..3f3c763331 100644 --- a/OOXML/PPTXFormat/ShowPr/Browse.h +++ b/OOXML/PPTXFormat/ShowPr/Browse.h @@ -30,14 +30,12 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_BROWSE_INCLUDE_H_ -#define PPTX_SHOWPR_BROWSE_INCLUDE_H_ #include "./../WrapperWritingElement.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class Browse : public WrapperWritingElement { @@ -52,13 +50,11 @@ namespace PPTX virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - nullable_bool showScrollbar; + nullable_bool showScrollbar; protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX -#endif // PPTX_SHOWPR_BROWSE_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/CustShow.cpp b/OOXML/PPTXFormat/ShowPr/CustShow.cpp index f737a19b4c..1d8847541e 100644 --- a/OOXML/PPTXFormat/ShowPr/CustShow.cpp +++ b/OOXML/PPTXFormat/ShowPr/CustShow.cpp @@ -34,7 +34,7 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void CustShow::fromXML(XmlUtils::CXmlNode& node) { @@ -88,5 +88,5 @@ namespace PPTX void CustShow::FillParentPointersForChilds() { } - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/CustShow.h b/OOXML/PPTXFormat/ShowPr/CustShow.h index c5897cc2d8..5464ef3800 100644 --- a/OOXML/PPTXFormat/ShowPr/CustShow.h +++ b/OOXML/PPTXFormat/ShowPr/CustShow.h @@ -30,21 +30,18 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_CUSTSHOW_INCLUDE_H_ -#define PPTX_SHOWPR_CUSTSHOW_INCLUDE_H_ #include "./../WrapperWritingElement.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class CustShow : public WrapperWritingElement { public: PPTX_LOGIC_BASE(CustShow) - public: virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -52,13 +49,10 @@ namespace PPTX virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - nullable_int id; + nullable_int id; protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX - -#endif // PPTX_SHOWPR_CUSTSHOW_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/Kiosk.cpp b/OOXML/PPTXFormat/ShowPr/Kiosk.cpp index 04a6bd3ee7..d669071604 100644 --- a/OOXML/PPTXFormat/ShowPr/Kiosk.cpp +++ b/OOXML/PPTXFormat/ShowPr/Kiosk.cpp @@ -34,7 +34,7 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void Kiosk::fromXML(XmlUtils::CXmlNode& node) { @@ -88,5 +88,5 @@ namespace PPTX void Kiosk::FillParentPointersForChilds() { } - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/Kiosk.h b/OOXML/PPTXFormat/ShowPr/Kiosk.h index 1e57e57a54..5063ab1f7d 100644 --- a/OOXML/PPTXFormat/ShowPr/Kiosk.h +++ b/OOXML/PPTXFormat/ShowPr/Kiosk.h @@ -30,21 +30,18 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_KIOSK_INCLUDE_H_ -#define PPTX_SHOWPR_KIOSK_INCLUDE_H_ #include "./../WrapperWritingElement.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class Kiosk : public WrapperWritingElement { public: PPTX_LOGIC_BASE(Kiosk) - public: virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -52,13 +49,10 @@ namespace PPTX virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - nullable_int restart; + nullable_int restart; protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX - -#endif // PPTX_SHOWPR_KIOSK_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/Present.cpp b/OOXML/PPTXFormat/ShowPr/Present.cpp index bd0798dacf..4a4a58d6ab 100644 --- a/OOXML/PPTXFormat/ShowPr/Present.cpp +++ b/OOXML/PPTXFormat/ShowPr/Present.cpp @@ -34,7 +34,7 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void Present::fromXML(XmlUtils::CXmlNode& node) { @@ -53,5 +53,5 @@ namespace PPTX void Present::FillParentPointersForChilds() { } - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/Present.h b/OOXML/PPTXFormat/ShowPr/Present.h index d5390ef53b..5ffa218cbd 100644 --- a/OOXML/PPTXFormat/ShowPr/Present.h +++ b/OOXML/PPTXFormat/ShowPr/Present.h @@ -30,21 +30,18 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_PRESENT_INCLUDE_H_ -#define PPTX_SHOWPR_PRESENT_INCLUDE_H_ #include "./../WrapperWritingElement.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class Present : public WrapperWritingElement { public: PPTX_LOGIC_BASE(Present) - public: virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -54,7 +51,5 @@ namespace PPTX protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX - -#endif // PPTX_SHOWPR_PRESENT_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/ShowPr.cpp b/OOXML/PPTXFormat/ShowPr/PresentationPr.cpp similarity index 51% rename from OOXML/PPTXFormat/ShowPr/ShowPr.cpp rename to OOXML/PPTXFormat/ShowPr/PresentationPr.cpp index f86cf9db50..c9185ae035 100644 --- a/OOXML/PPTXFormat/ShowPr/ShowPr.cpp +++ b/OOXML/PPTXFormat/ShowPr/PresentationPr.cpp @@ -30,7 +30,7 @@ * */ -#include "ShowPr.h" +#include "PresentationPr.h" #include "./Browse.h" #include "./CustShow.h" @@ -41,31 +41,31 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void ShowPr::fromXML(XmlUtils::CXmlNode& node) { - XmlMacroReadAttributeBase(node, _T("loop"), loop); - XmlMacroReadAttributeBase(node, _T("showAnimation"), showAnimation); - XmlMacroReadAttributeBase(node, _T("showNarration"), showNarration); - XmlMacroReadAttributeBase(node, _T("useTimings"), useTimings); + XmlMacroReadAttributeBase(node, L"loop", loop); + XmlMacroReadAttributeBase(node, L"showAnimation", showAnimation); + XmlMacroReadAttributeBase(node, L"showNarration", showNarration); + XmlMacroReadAttributeBase(node, L"useTimings", useTimings); - Browse = node.ReadNodeNoNS(_T("browse")); - CustShow = node.ReadNodeNoNS(_T("custShow")); - Kiosk = node.ReadNodeNoNS(_T("kiosk")); - XmlUtils::CXmlNode node1 = node.ReadNodeNoNS(_T("penClr")); + Browse = node.ReadNodeNoNS(L"browse"); + CustShow = node.ReadNodeNoNS(L"custShow"); + Kiosk = node.ReadNodeNoNS(L"kiosk"); + XmlUtils::CXmlNode node1 = node.ReadNodeNoNS(L"penClr"); PenClr.GetColorFrom(node1); - Present = node.ReadNodeNoNS(_T("present")); - SldAll = node.ReadNodeNoNS(_T("sldAll")); - SldRg = node.ReadNodeNoNS(_T("sldRg")); + Present = node.ReadNodeNoNS(L"present"); + SldAll = node.ReadNodeNoNS(L"sldAll"); + SldRg = node.ReadNodeNoNS(L"sldRg"); } std::wstring ShowPr::toXML() const { XmlUtils::CAttribute oAttr; - oAttr.Write(_T("loop"), loop); - oAttr.Write(_T("showAnimation"), showAnimation); - oAttr.Write(_T("showNarration"), showNarration); - oAttr.Write(_T("useTimings"), useTimings); + oAttr.Write(L"loop", loop); + oAttr.Write(L"showAnimation", showAnimation); + oAttr.Write(L"showNarration", showNarration); + oAttr.Write(L"useTimings", useTimings); XmlUtils::CNodeValue oValue; oValue.WriteNullable(Present); @@ -76,7 +76,7 @@ namespace PPTX oValue.WriteNullable(CustShow); oValue.Write(PenClr); - return XmlUtils::CreateNode(_T("p:ShowPr"), oAttr, oValue); + return XmlUtils::CreateNode(L"p:ShowPr", oAttr, oValue); } void ShowPr::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const { @@ -97,14 +97,14 @@ namespace PPTX } void ShowPr::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const { - pWriter->StartNode(_T("p:showPr")); + pWriter->StartNode(L"p:showPr"); pWriter->StartAttributes(); - pWriter->WriteAttribute(_T("loop"), loop); - pWriter->WriteAttribute(_T("showAnimation"), showAnimation); - pWriter->WriteAttribute(_T("showNarration"), showNarration); - pWriter->WriteAttribute(_T("useTimings"), useTimings); + pWriter->WriteAttribute(L"loop", loop); + pWriter->WriteAttribute(L"showAnimation", showAnimation); + pWriter->WriteAttribute(L"showNarration", showNarration); + pWriter->WriteAttribute(L"useTimings", useTimings); pWriter->EndAttributes(); @@ -116,12 +116,12 @@ namespace PPTX pWriter->Write(CustShow); if(PenClr.is_init()) { - pWriter->WriteString(_T("")); + pWriter->WriteString(L""); PenClr.toXmlWriter(pWriter); - pWriter->WriteString(_T("")); + pWriter->WriteString(L""); } - pWriter->EndNode(_T("p:showPr")); + pWriter->EndNode(L"p:showPr"); } void ShowPr::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { @@ -154,19 +154,19 @@ namespace PPTX { case 0: { - Browse = new nsShowPr::Browse(); + Browse = new nsPresentationPr::Browse(); Browse->fromPPTY(pReader); break; } case 1: { - CustShow = new nsShowPr::CustShow(); + CustShow = new nsPresentationPr::CustShow(); CustShow->fromPPTY(pReader); break; } case 2: { - Kiosk = new nsShowPr::Kiosk(); + Kiosk = new nsPresentationPr::Kiosk(); Kiosk->fromPPTY(pReader); break; } @@ -177,19 +177,19 @@ namespace PPTX } case 4: { - Present = new nsShowPr::Present(); + Present = new nsPresentationPr::Present(); pReader->SkipRecord(); break; } case 5: { - SldAll = new nsShowPr::SldAll(); + SldAll = new nsPresentationPr::SldAll(); pReader->SkipRecord(); break; } case 6: { - SldRg = new nsShowPr::SldRg(); + SldRg = new nsPresentationPr::SldRg(); SldRg->fromPPTY(pReader); break; } @@ -203,5 +203,94 @@ namespace PPTX void ShowPr::FillParentPointersForChilds() { } - } // namespace nsShowPr +//-------------------------------------------------------------------------------------------------------- + void PrintPr::fromXML(XmlUtils::CXmlNode& node) + { + XmlMacroReadAttributeBase(node, L"clrMode", clrMode); + XmlMacroReadAttributeBase(node, L"prnWhat", prnWhat); + XmlMacroReadAttributeBase(node, L"frameSlides", frameSlides); + XmlMacroReadAttributeBase(node, L"hiddenSlides", hiddenSlides); + XmlMacroReadAttributeBase(node, L"scaleToFitPaper", scaleToFitPaper); + + XmlUtils::CXmlNode list = node.ReadNodeNoNS(L"extLst"); + if (list.IsValid()) + { + std::vector oNodes; + if (list.GetNodes(L"*", oNodes)) + { + size_t nCount = oNodes.size(); + for (size_t i = 0; i < nCount; ++i) + { + XmlUtils::CXmlNode& oNode = oNodes[i]; + + Logic::Ext element; + element.fromXML(oNode); + + ExtLst.push_back(element); + } + } + } + } + std::wstring PrintPr::toXML() const + { + XmlUtils::CAttribute oAttr; + oAttr.Write(L"frameSlides", frameSlides); + oAttr.Write(L"hiddenSlides", hiddenSlides); + oAttr.Write(L"scaleToFitPaper", scaleToFitPaper); + oAttr.WriteLimitNullable(L"clrMode", clrMode); + oAttr.WriteLimitNullable(L"prnWhat", prnWhat); + + XmlUtils::CNodeValue oValue; + + return XmlUtils::CreateNode(L"p:PrintPr", oAttr, oValue); + } + void PrintPr::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const + { + pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); + pWriter->WriteBool2(0, frameSlides); + pWriter->WriteBool2(1, hiddenSlides); + pWriter->WriteBool2(2, scaleToFitPaper); + pWriter->WriteLimit2(3, clrMode); + pWriter->WriteLimit2(4, prnWhat); + pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); + } + void PrintPr::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const + { + pWriter->WriteString(toXML()); + } + void PrintPr::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) + { + LONG _end_rec = pReader->GetPos() + pReader->GetLong() + 4; + + pReader->Skip(1); // start attributes + + while (true) + { + BYTE _at = pReader->GetUChar_TypeNode(); + if (_at == NSBinPptxRW::g_nodeAttributeEnd) + break; + + switch (_at) + { + case 0: + frameSlides = pReader->GetBool(); break; + case 1: + hiddenSlides = pReader->GetBool(); break; + case 2: + scaleToFitPaper = pReader->GetBool(); break; + case 3: + clrMode = pReader->GetUChar(); break; + case 4: + prnWhat = pReader->GetUChar(); break; + default: + break; + } + } + + pReader->Seek(_end_rec); + } + void PrintPr::FillParentPointersForChilds() + { + } + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/ShowPr.h b/OOXML/PPTXFormat/ShowPr/PresentationPr.h similarity index 64% rename from OOXML/PPTXFormat/ShowPr/ShowPr.h rename to OOXML/PPTXFormat/ShowPr/PresentationPr.h index 58f6348945..ad05a4b93a 100644 --- a/OOXML/PPTXFormat/ShowPr/ShowPr.h +++ b/OOXML/PPTXFormat/ShowPr/PresentationPr.h @@ -30,15 +30,15 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_FILE_INCLUDE_H_ -#define PPTX_SHOWPR_FILE_INCLUDE_H_ -#include "./../WrapperWritingElement.h" +#include "../WrapperWritingElement.h" #include "../Logic/UniColor.h" +#include "../Limit/BWMode.h" +#include "../Logic/ExtP.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class Browse; class CustShow; @@ -52,7 +52,6 @@ namespace PPTX public: PPTX_LOGIC_BASE(ShowPr) - public: virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -60,24 +59,46 @@ namespace PPTX virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - nullable Browse; - nullable CustShow; - nullable Kiosk; + nullable Browse; + nullable CustShow; + nullable Kiosk; Logic::UniColor PenClr; - nullable Present; - nullable SldAll; - nullable SldRg; + nullable Present; + nullable SldAll; + nullable SldRg; - nullable_bool loop; - nullable_bool showAnimation; - nullable_bool showNarration; - nullable_bool useTimings; + nullable_bool loop; + nullable_bool showAnimation; + nullable_bool showNarration; + nullable_bool useTimings; protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + + class PrintPr : public WrapperWritingElement + { + public: + PPTX_LOGIC_BASE(PrintPr) + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; + virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; + virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); + + nullable_limit clrMode; + nullable_limit prnWhat; + + nullable_bool frameSlides; + nullable_bool hiddenSlides; + nullable_bool scaleToFitPaper; + + std::vector ExtLst; + protected: + virtual void FillParentPointersForChilds(); + }; + } // namespace nsPresentationPr } // namespace PPTX -#endif // PPTX_SHOWPR_FILE_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/SldAll.cpp b/OOXML/PPTXFormat/ShowPr/SldAll.cpp index 94596b4333..35d849886c 100644 --- a/OOXML/PPTXFormat/ShowPr/SldAll.cpp +++ b/OOXML/PPTXFormat/ShowPr/SldAll.cpp @@ -34,7 +34,7 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void SldAll::fromXML(XmlUtils::CXmlNode& node) { @@ -53,5 +53,5 @@ namespace PPTX void SldAll::FillParentPointersForChilds() { } - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/SldAll.h b/OOXML/PPTXFormat/ShowPr/SldAll.h index d020c0c42c..d8a8b7e0a9 100644 --- a/OOXML/PPTXFormat/ShowPr/SldAll.h +++ b/OOXML/PPTXFormat/ShowPr/SldAll.h @@ -30,21 +30,18 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_SLDALL_INCLUDE_H_ -#define PPTX_SHOWPR_SLDALL_INCLUDE_H_ #include "./../WrapperWritingElement.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class SldAll : public WrapperWritingElement { public: PPTX_LOGIC_BASE(SldAll) - public: virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -54,7 +51,5 @@ namespace PPTX protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX - -#endif // PPTX_SHOWPR_SLDALL_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/ShowPr/SldRg.cpp b/OOXML/PPTXFormat/ShowPr/SldRg.cpp index 3b1d335f34..a189c07db8 100644 --- a/OOXML/PPTXFormat/ShowPr/SldRg.cpp +++ b/OOXML/PPTXFormat/ShowPr/SldRg.cpp @@ -34,7 +34,7 @@ namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { void SldRg::fromXML(XmlUtils::CXmlNode& node) { @@ -94,5 +94,5 @@ namespace PPTX void SldRg::FillParentPointersForChilds() { } - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX diff --git a/OOXML/PPTXFormat/ShowPr/SldRg.h b/OOXML/PPTXFormat/ShowPr/SldRg.h index 06b6868de6..c3316cc6e2 100644 --- a/OOXML/PPTXFormat/ShowPr/SldRg.h +++ b/OOXML/PPTXFormat/ShowPr/SldRg.h @@ -30,21 +30,18 @@ * */ #pragma once -#ifndef PPTX_SHOWPR_SLDRG_INCLUDE_H_ -#define PPTX_SHOWPR_SLDRG_INCLUDE_H_ #include "./../WrapperWritingElement.h" namespace PPTX { - namespace nsShowPr + namespace nsPresentationPr { class SldRg : public WrapperWritingElement { public: PPTX_LOGIC_BASE(SldRg) - public: virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -52,14 +49,11 @@ namespace PPTX virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - nullable_int st; - nullable_int end; + nullable_int st; + nullable_int end; protected: virtual void FillParentPointersForChilds(); }; - } // namespace nsShowPr + } // namespace nsPresentationPr } // namespace PPTX - -#endif // PPTX_SHOWPR_SLDRG_INCLUDE_H_ diff --git a/OOXML/Projects/Linux/PPTXFormatLib/PPTXFormatLib.pro b/OOXML/Projects/Linux/PPTXFormatLib/PPTXFormatLib.pro index 8d7af7629e..4cedc517b3 100644 --- a/OOXML/Projects/Linux/PPTXFormatLib/PPTXFormatLib.pro +++ b/OOXML/Projects/Linux/PPTXFormatLib/PPTXFormatLib.pro @@ -107,7 +107,7 @@ SOURCES += \ ../../../PPTXFormat/Theme/FontScheme.cpp \ ../../../PPTXFormat/Theme/ThemeElements.cpp \ \ - ../../../PPTXFormat/ShowPr/ShowPr.cpp \ + ../../../PPTXFormat/ShowPr/PresentationPr.cpp \ ../../../PPTXFormat/ShowPr/Present.cpp \ ../../../PPTXFormat/ShowPr/Kiosk.cpp \ ../../../PPTXFormat/ShowPr/CustShow.cpp \ @@ -202,6 +202,6 @@ HEADERS += \ ../../../PPTXFormat/ShowPr/CustShow.h \ ../../../PPTXFormat/ShowPr/Kiosk.h \ ../../../PPTXFormat/ShowPr/Present.h \ - ../../../PPTXFormat/ShowPr/ShowPr.h \ + ../../../PPTXFormat/ShowPr/PresentationPr.h \ ../../../PPTXFormat/ShowPr/SldAll.h \ ../../../PPTXFormat/ShowPr/SldRg.h diff --git a/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj b/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj index f3c84171d6..043c2764be 100644 --- a/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj +++ b/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj @@ -635,7 +635,7 @@ - + @@ -1266,7 +1266,7 @@ - + diff --git a/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj.filters b/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj.filters index e68dab9209..b21e88e442 100644 --- a/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj.filters +++ b/OOXML/Projects/Windows/PPTXFormatLib/PPTXFormat.vcxproj.filters @@ -708,25 +708,25 @@ Presentation - ShowPr + PresentationPr - ShowPr + PresentationPr - ShowPr + PresentationPr - ShowPr + PresentationPr - - ShowPr + + PresentationPr - ShowPr + PresentationPr - ShowPr + PresentationPr Theme @@ -2471,25 +2471,25 @@ Presentation - ShowPr + PresentationPr - ShowPr + PresentationPr - ShowPr + PresentationPr - ShowPr + PresentationPr - - ShowPr + + PresentationPr - ShowPr + PresentationPr - ShowPr + PresentationPr Theme @@ -3769,9 +3769,6 @@ {1bccfc22-686e-4d82-8fd1-353cbc5479f2} - - {47677fd9-1e35-4520-bcb1-bf87d1fec730} - {200ee36f-100d-4ba7-b62c-2dccbb924a09} @@ -3802,5 +3799,8 @@ {1461f41f-a436-4c57-bb70-199577dca246} + + {47677fd9-1e35-4520-bcb1-bf87d1fec730} + \ No newline at end of file From 8a56072454348d4bd5dc4ae6307836aa9aa8e08c Mon Sep 17 00:00:00 2001 From: Kirill Polyakov Date: Thu, 29 Aug 2024 19:12:00 +0300 Subject: [PATCH 24/82] Fix bugs and refactoring --- .../raster/Metafile/Common/CClip.cpp | 4 +- .../raster/Metafile/Emf/EmfObjects.cpp | 2 +- .../Metafile/Emf/EmfParser/CEmfParser.cpp | 335 +++++++++++++----- .../Metafile/Emf/EmfParser/CEmfParser.h | 5 +- .../Metafile/Emf/EmfParser/CEmfParserBase.cpp | 44 ++- .../Metafile/Emf/EmfParser/CEmfParserBase.h | 34 +- .../Metafile/Emf/EmfParser/CEmfPlusParser.cpp | 303 ++++++++-------- .../Metafile/Emf/EmfParser/CEmfPlusParser.h | 2 +- .../raster/Metafile/Emf/EmfPlayer.cpp | 3 + .../CInterpretatorSvgBase.cpp | 5 +- 10 files changed, 459 insertions(+), 278 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Common/CClip.cpp b/DesktopEditor/raster/Metafile/Common/CClip.cpp index 20bba19298..5797ca807b 100644 --- a/DesktopEditor/raster/Metafile/Common/CClip.cpp +++ b/DesktopEditor/raster/Metafile/Common/CClip.cpp @@ -107,8 +107,8 @@ namespace MetaFile void CClip::Copy(const CClip &oClip) { Clear(); - - for (const CClipCommandBase* pCommand : m_arCommands) + + for (const CClipCommandBase* pCommand : oClip.m_arCommands) { switch(pCommand->GetType()) { diff --git a/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp b/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp index 034cedecf0..94dff91dda 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp @@ -221,7 +221,7 @@ namespace MetaFile } CEmfLogPen::CEmfLogPen() - : unPenStyle(PS_SOLID), unWidth(1), oColor(0, 0, 0), pStyleEntry(NULL) + : unPenStyle(PS_SOLID), unWidth(1), oColor(0, 0, 0), unNumStyleEntries(0), pStyleEntry(NULL) {} CEmfLogPen::~CEmfLogPen() diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp index 84c6e33652..55be9415b8 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp @@ -14,10 +14,157 @@ #include "../../Wmf/WmfParser/CWmfParser.h" +#define PRINT_EMF_RECORD(type) do {} while(false) + +#ifdef _DEBUG + #ifdef LOG_EMF_RECORDS + #if 1 == LOG_EMF_RECORDS + #ifdef PRINTING_EMF_RECORDS + #if 1 == PRINTING_EMF_RECORDS + static const struct ActionNamesEmf + { + int actionNumber; + std::wstring actionName; + } actionNamesEmf[] = + { + { 0, L"Unknown"}, + { EMR_HEADER, L"EMR_HEADER"}, + { EMR_POLYBEZIER, L"EMR_POLYBEZIER"}, + { EMR_POLYGON, L"EMR_POLYGON"}, + { EMR_POLYLINE, L"EMR_POLYLINE"}, + { EMR_POLYBEZIERTO, L"EMR_POLYBEZIERTO"}, + { EMR_POLYLINETO, L"EMR_POLYLINETO"}, + { EMR_POLYPOLYLINE, L"EMR_POLYPOLYLINE"}, + { EMR_POLYPOLYGON, L"EMR_POLYPOLYGON"}, + { EMR_SETWINDOWEXTEX, L"EMR_SETWINDOWEXTEX"}, + { EMR_SETWINDOWORGEX, L"EMR_SETWINDOWORGEX"}, + { EMR_SETVIEWPORTEXTEX, L"EMR_SETVIEWPORTEXTEX"}, + { EMR_SETVIEWPORTORGEX, L"EMR_SETVIEWPORTORGEX"}, + { EMR_SETBRUSHORGEX, L"EMR_SETBRUSHORGEX"}, + { EMR_EOF, L"EMR_EOF"}, + { EMR_SETPIXELV, L"EMR_SETPIXELV"}, + { EMR_SETMAPPERFLAGS, L"EMR_SETMAPPERFLAGS"}, + { EMR_SETMAPMODE, L"EMR_SETMAPMODE"}, + { EMR_SETBKMODE, L"EMR_SETBKMODE"}, + { EMR_SETPOLYFILLMODE, L"EMR_SETPOLYFILLMODE"}, + { EMR_SETROP2, L"EMR_SETROP2"}, + { EMR_SETSTRETCHBLTMODE, L"EMR_SETSTRETCHBLTMODE"}, + { EMR_SETTEXTALIGN, L"EMR_SETTEXTALIGN"}, + { EMR_SETCOLORADJUSTMENT, L"EMR_SETCOLORADJUSTMENT"}, + { EMR_SETTEXTCOLOR, L"EMR_SETTEXTCOLOR"}, + { EMR_SETBKCOLOR, L"EMR_SETBKCOLOR"}, + { EMR_OFFSETCLIPRGN, L"EMR_OFFSETCLIPRGN"}, + { EMR_MOVETOEX, L"EMR_MOVETOEX"}, + { EMR_SETMETARGN, L"EMR_SETMETARGN"}, + { EMR_EXCLUDECLIPRECT, L"EMR_EXCLUDECLIPRECT"}, + { EMR_INTERSECTCLIPRECT, L"EMR_INTERSECTCLIPRECT"}, + { EMR_SCALEVIEWPORTEXTEX, L"EMR_SCALEVIEWPORTEXTEX"}, + { EMR_SCALEWINDOWEXTEX, L"EMR_SCALEWINDOWEXTEX"}, + { EMR_SAVEDC, L"EMR_SAVEDC"}, + { EMR_RESTOREDC, L"EMR_RESTOREDC"}, + { EMR_SETWORLDTRANSFORM, L"EMR_SETWORLDTRANSFORM"}, + { EMR_MODIFYWORLDTRANSFORM, L"EMR_MODIFYWORLDTRANSFORM"}, + { EMR_SELECTOBJECT, L"EMR_SELECTOBJECT"}, + { EMR_CREATEPEN, L"EMR_CREATEPEN"}, + { EMR_CREATEBRUSHINDIRECT, L"EMR_CREATEBRUSHINDIRECT"}, + { EMR_DELETEOBJECT, L"EMR_DELETEOBJECT"}, + { EMR_ANGLEARC, L"EMR_ANGLEARC"}, + { EMR_ELLIPSE, L"EMR_ELLIPSE"}, + { EMR_RECTANGLE, L"EMR_RECTANGLE"}, + { EMR_ROUNDRECT, L"EMR_ROUNDRECT"}, + { EMR_ARC, L"EMR_ARC"}, + { EMR_CHORD, L"EMR_CHORD"}, + { EMR_PIE, L"EMR_PIE"}, + { EMR_SELECTPALETTE, L"EMR_SELECTPALETTE"}, + { EMR_CREATEPALETTE, L"EMR_CREATEPALETTE"}, + { EMR_SETPALETTEENTRIES, L"EMR_SETPALETTEENTRIES"}, + { EMR_RESIZEPALETTE, L"EMR_RESIZEPALETTE"}, + { EMR_REALIZEPALETTE, L"EMR_REALIZEPALETTE"}, + { EMR_EXTFLOODFILL, L"EMR_EXTFLOODFILL"}, + { EMR_LINETO, L"EMR_LINETO"}, + { EMR_ARCTO, L"EMR_ARCTO"}, + { EMR_POLYDRAW, L"EMR_POLYDRAW"}, + { EMR_SETARCDIRECTION, L"EMR_SETARCDIRECTION"}, + { EMR_SETMITERLIMIT, L"EMR_SETMITERLIMIT"}, + { EMR_BEGINPATH, L"EMR_BEGINPATH"}, + { EMR_ENDPATH, L"EMR_ENDPATH"}, + { EMR_CLOSEFIGURE, L"EMR_CLOSEFIGURE"}, + { EMR_FILLPATH, L"EMR_FILLPATH"}, + { EMR_STROKEANDFILLPATH, L"EMR_STROKEANDFILLPATH"}, + { EMR_STROKEPATH, L"EMR_STROKEPATH"}, + { EMR_FLATTENPATH, L"EMR_FLATTENPATH"}, + { EMR_WIDENPATH, L"EMR_WIDENPATH"}, + { EMR_SELECTCLIPPATH, L"EMR_SELECTCLIPPATH"}, + { EMR_ABORTPATH, L"EMR_ABORTPATH"}, + { 69, L"Unknown"}, + { EMR_GDICOMMENT, L"EMR_GDICOMMENT"}, + { EMR_FILLRGN, L"EMR_FILLRGN"}, + { EMR_FRAMERGN, L"EMR_FRAMERGN"}, + { EMR_INVERTRGN, L"EMR_INVERTRGN"}, + { EMR_PAINTRGN, L"EMR_PAINTRGN"}, + { EMR_EXTSELECTCLIPRGN, L"EMR_EXTSELECTCLIPRGN"}, + { EMR_BITBLT, L"EMR_BITBLT"}, + { EMR_STRETCHBLT, L"EMR_STRETCHBLT"}, + { EMR_MASKBLT, L"EMR_MASKBLT"}, + { EMR_PLGBLT, L"EMR_PLGBLT"}, + { EMR_SETDIBITSTODEVICE, L"EMR_SETDIBITSTODEVICE"}, + { EMR_STRETCHDIBITS, L"EMR_STRETCHDIBITS"}, + { EMR_EXTCREATEFONTINDIRECTW, L"EMR_EXTCREATEFONTINDIRECTW"}, + { EMR_EXTTEXTOUTA, L"EMR_EXTTEXTOUTA"}, + { EMR_EXTTEXTOUTW, L"EMR_EXTTEXTOUTW"}, + { EMR_POLYBEZIER16, L"EMR_POLYBEZIER16"}, + { EMR_POLYGON16, L"EMR_POLYGON16"}, + { EMR_POLYLINE16, L"EMR_POLYLINE16"}, + { EMR_POLYBEZIERTO16, L"EMR_POLYBEZIERTO16"}, + { EMR_POLYLINETO16, L"EMR_POLYLINETO16"}, + { EMR_POLYPOLYLINE16, L"EMR_POLYPOLYLINE16"}, + { EMR_POLYPOLYGON16, L"EMR_POLYPOLYGON16"}, + { EMR_POLYDRAW16, L"EMR_POLYDRAW16"}, + { EMR_CREATEMONOBRUSH, L"EMR_CREATEMONOBRUSH"}, + { EMR_CREATEDIBPATTERNBRUSHPT, L"EMR_CREATEDIBPATTERNBRUSHPT"}, + { EMR_EXTCREATEPEN, L"EMR_EXTCREATEPEN"}, + { EMR_POLYTEXTOUTA, L"EMR_POLYTEXTOUTA"}, + { EMR_POLYTEXTOUTW, L"EMR_POLYTEXTOUTW"}, + { EMR_SETICMMODE, L"EMR_SETICMMODE"}, + { EMR_CREATECOLORSPACE, L"EMR_CREATECOLORSPACE"}, + { EMR_SETCOLORSPACE, L"EMR_SETCOLORSPACE"}, + { EMR_DELETECOLORSPACE, L"EMR_DELETECOLORSPACE"}, + { EMR_GLSRECORD, L"EMR_GLSRECORD"}, + { EMR_GLSBOUNDEDRECORD, L"EMR_GLSBOUNDEDRECORD"}, + { EMR_PIXELFORMAT, L"EMR_PIXELFORMAT"}, + { EMR_RESERVED_105, L"EMR_RESERVED_105"}, + { EMR_RESERVED_106, L"EMR_RESERVED_106"}, + { EMR_RESERVED_107, L"EMR_RESERVED_107"}, + { EMR_RESERVED_108, L"EMR_RESERVED_108"}, + { EMR_RESERVED_109, L"EMR_RESERVED_109"}, + { EMR_RESERVED_110, L"EMR_RESERVED_110"}, + { EMR_COLORCORRECTPALETTE, L"EMR_COLORCORRECTPALETTE"}, + { EMR_SETICMPROFILEA, L"EMR_SETICMPROFILEA"}, + { EMR_SETICMPROFILEW, L"EMR_SETICMPROFILEW"}, + { EMR_ALPHABLEND, L"EMR_ALPHABLEND"}, + { EMR_SETLAYOUT, L"EMR_SETLAYOUT"}, + { EMR_TRANSPARENTBLT, L"EMR_TRANSPARENTBLT"}, + { EMR_RESERVED_117, L"EMR_RESERVED_117"}, + { EMR_GRADIENTFILL, L"EMR_GRADIENTFILL"}, + { EMR_RESERVED_119, L"EMR_RESERVED_119"}, + { EMR_RESERVED_120, L"EMR_RESERVED_120"}, + { EMR_COLORMATCHTOTARGETW, L"EMR_COLORMATCHTOTARGETW"}, + { EMR_CREATECOLORSPACEW, L"EMR_CREATECOLORSPACEW"} + }; + + #define PRINT_EMF_RECORD(type) \ + if (0 <= type && type <= EMR_CREATECOLORSPACEW) \ + std::wcout << L"LEVEL [" << unFileLevel << L"] EMF Record: " << actionNamesEmf[type].actionName << std::endl + #endif + #endif + #endif + #endif +#endif + namespace MetaFile { CEmfParser::CEmfParser() - : m_pEmfPlusParser(NULL), m_bOnlyEmfPlus(false) {} + : m_pEmfPlusParser(NULL) {} CEmfParser::~CEmfParser() { @@ -39,6 +186,9 @@ namespace MetaFile if (!m_oStream.IsValid()) SetError(); + if (NULL != m_pInterpretator) + GO_UP_LEVEL; + unsigned int ulSize, ulType; unsigned int ulRecordIndex = 0; @@ -77,11 +227,8 @@ namespace MetaFile if (0 == ulRecordIndex && EMR_HEADER != ulType) return SetError(); - if (m_bOnlyEmfPlus && ulType != EMR_HEADER && ulType != EMR_EOF && ulType != EMR_GDICOMMENT) - { - m_oStream.Skip(m_ulRecordSize); - continue; - } + if (NULL != m_pInterpretator && (!BanEMFProcesses()|| ulType == EMR_HEADER || ulType == EMR_EOF || ulType == EMR_GDICOMMENT)) + PRINT_EMF_RECORD(ulType); switch (ulType) { @@ -220,10 +367,13 @@ namespace MetaFile int need_skip = m_ulRecordSize - (m_oStream.Tell() - m_ulRecordPos); m_oStream.Skip(need_skip); + + if (0 != need_skip && NULL != m_pInterpretator) + PRINT_LOG(L"SKIP BYTES: " << need_skip); + ulRecordIndex++; m_oStream.ClearCurrentBlockSize(); - } while (!CheckError()); if (!CheckError()) @@ -232,6 +382,9 @@ namespace MetaFile if (!m_bEof) HANDLE_EMR_EOF(); + if (NULL != m_pInterpretator) + GO_DOWN_LEVEL_BELOW; + ClearFile(); } @@ -260,9 +413,9 @@ namespace MetaFile m_oStream.SetStream(pBuf, unSize); } - void CEmfParser::SetOnlyEmfPlus(bool bValue) + bool CEmfParser::BanEMFProcesses() const { - m_bOnlyEmfPlus = bValue; + return NULL != m_pEmfPlusParser && m_pEmfPlusParser->GetBanEMFProcesses(); } bool CEmfParser::ReadImage(unsigned int offBmi, unsigned int cbBmi, unsigned int offBits, unsigned int cbBits, unsigned int ulSkip, BYTE **ppBgraBuffer, unsigned int *pulWidth, unsigned int *pulHeight) @@ -327,7 +480,7 @@ namespace MetaFile m_oStream >> oBitmap; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ALPHABLEND(oBitmap); } @@ -337,7 +490,7 @@ namespace MetaFile m_oStream >> oBitmap; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_STRETCHDIBITS(oBitmap); } @@ -347,7 +500,7 @@ namespace MetaFile m_oStream >> oBitmap; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_BITBLT(oBitmap); } @@ -357,7 +510,7 @@ namespace MetaFile m_oStream >> oBitmap; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETDIBITSTODEVICE(oBitmap); } @@ -367,7 +520,7 @@ namespace MetaFile m_oStream >> oBitmap; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_STRETCHBLT(oBitmap); } @@ -392,7 +545,7 @@ namespace MetaFile void CEmfParser::Read_EMR_SAVEDC() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SAVEDC(); } @@ -402,7 +555,7 @@ namespace MetaFile m_oStream >> lSavedDC; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_RESTOREDC(lSavedDC); } @@ -414,7 +567,7 @@ namespace MetaFile m_oStream >> oXForm; m_oStream >> ulMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_MODIFYWORLDTRANSFORM(oXForm, ulMode); } @@ -424,7 +577,7 @@ namespace MetaFile m_oStream >> oXForm; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETWORLDTRANSFORM(oXForm); } @@ -438,7 +591,7 @@ namespace MetaFile m_oStream >> ulBrushIndex; m_oStream >> *pBrush; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CREATEBRUSHINDIRECT(ulBrushIndex, pBrush); } @@ -448,7 +601,7 @@ namespace MetaFile m_oStream >> oColor; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETTEXTCOLOR(oColor); } @@ -458,7 +611,7 @@ namespace MetaFile m_oStream >> ulObjectIndex; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SELECTOBJECT(ulObjectIndex); } @@ -475,7 +628,7 @@ namespace MetaFile m_oStream >> ulIndex; m_oStream >> *pFont; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_EXTCREATEFONTINDIRECTW(ulIndex, pFont); } @@ -485,7 +638,7 @@ namespace MetaFile m_oStream >> ulAlign; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETTEXTALIGN(ulAlign); } @@ -495,7 +648,7 @@ namespace MetaFile m_oStream >> ulBgMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETBKMODE(ulBgMode); } @@ -505,7 +658,7 @@ namespace MetaFile m_oStream >> ulIndex; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_DELETEOBJECT(ulIndex); } @@ -515,7 +668,7 @@ namespace MetaFile m_oStream >> ulMiterLimit; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETMITERLIMIT(ulMiterLimit); } @@ -567,7 +720,7 @@ namespace MetaFile // Пропускаем часть с картинкой, если она была m_oStream.Skip(current_size); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_EXTCREATEPEN(ulPenIndex, pPen, arUnused); } @@ -589,7 +742,7 @@ namespace MetaFile m_oStream >> widthY; m_oStream >> pPen->oColor; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CREATEPEN(ulPenIndex, widthX, pPen); } @@ -599,43 +752,43 @@ namespace MetaFile m_oStream >> ulFillMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETPOLYFILLMODE(ulFillMode); } void CEmfParser::Read_EMR_BEGINPATH() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_BEGINPATH(); } void CEmfParser::Read_EMR_ENDPATH() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ENDPATH(); } void CEmfParser::Read_EMR_CLOSEFIGURE() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CLOSEFIGURE(); } void CEmfParser::Read_EMR_FLATTENPATH() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_FLATTENPATH(); } void CEmfParser::Read_EMR_WIDENPATH() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_WIDENPATH(); } void CEmfParser::Read_EMR_ABORTPATH() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ABORTPATH(); } @@ -645,7 +798,7 @@ namespace MetaFile m_oStream >> oPoint; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_MOVETOEX(oPoint); } @@ -655,7 +808,7 @@ namespace MetaFile m_oStream >> unDirection; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETARCDIRECTION(unDirection); } @@ -665,7 +818,7 @@ namespace MetaFile m_oStream >> oBounds; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_FILLPATH(oBounds); } @@ -675,7 +828,7 @@ namespace MetaFile m_oStream >> ulMapMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETMAPMODE(ulMapMode); } @@ -685,7 +838,7 @@ namespace MetaFile m_oStream >> oOrigin; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETWINDOWORGEX(oOrigin); } @@ -695,7 +848,7 @@ namespace MetaFile m_oStream >> oExtent; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETWINDOWEXTEX(oExtent); } @@ -708,7 +861,7 @@ namespace MetaFile m_oStream >> nYNum; m_oStream >> nYDenom; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SCALEWINDOWEXTEX(nXNum, nXDenom, nYNum, nYDenom); } @@ -718,7 +871,7 @@ namespace MetaFile m_oStream >> oOrigin; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETVIEWPORTORGEX(oOrigin); } @@ -728,7 +881,7 @@ namespace MetaFile m_oStream >> oExtent; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETVIEWPORTEXTEX(oExtent); } @@ -741,7 +894,7 @@ namespace MetaFile m_oStream >> nYNum; m_oStream >> nYDenom; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SCALEVIEWPORTEXTEX(nXNum, nXDenom, nYNum, nYDenom); } @@ -751,7 +904,7 @@ namespace MetaFile m_oStream >> ulStretchMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETSTRETCHBLTMODE(ulStretchMode); } @@ -761,7 +914,7 @@ namespace MetaFile m_oStream >> ulICMMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETICMMODE(ulICMMode); } @@ -773,7 +926,7 @@ namespace MetaFile m_oStream >> ulBrushIndex; m_oStream >> oDibBrush; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CREATEDIBPATTERNBRUSHPT(ulBrushIndex, oDibBrush); } @@ -785,7 +938,7 @@ namespace MetaFile m_oStream >> ulBrushIndex; m_oStream >> oDibBrush; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CREATEMONOBRUSH(ulBrushIndex, oDibBrush); } @@ -795,7 +948,7 @@ namespace MetaFile m_oStream >> unRegionMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SELECTCLIPPATH(unRegionMode); } @@ -805,7 +958,7 @@ namespace MetaFile m_oStream >> oColor; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETBKCOLOR(oColor); } @@ -816,7 +969,7 @@ namespace MetaFile m_oStream >> oClip; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_EXCLUDECLIPRECT(oClip); } @@ -827,7 +980,7 @@ namespace MetaFile m_oStream >> ulRgnDataSize; m_oStream >> ulRegionMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_EXTSELECTCLIPRGN(ulRgnDataSize, ulRegionMode); } @@ -842,7 +995,7 @@ namespace MetaFile m_oStream >> ulRop2Mode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETROP2(ulRop2Mode); } @@ -856,7 +1009,7 @@ namespace MetaFile m_oStream >> ulPaletteIndex; m_oStream >> *pPalette; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CREATEPALETTE(ulPaletteIndex, pPalette); } @@ -866,13 +1019,13 @@ namespace MetaFile m_oStream >> ulIndex; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SELECTPALETTE(ulIndex); } void CEmfParser::Read_EMR_REALIZEPALETTE() { - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_REALIZEPALETTE(); } @@ -882,7 +1035,7 @@ namespace MetaFile m_oStream >> oClip; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_INTERSECTCLIPRECT(oClip); } @@ -892,7 +1045,7 @@ namespace MetaFile m_oStream >> ulLayoutMode; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETLAYOUT(ulLayoutMode); } @@ -902,7 +1055,7 @@ namespace MetaFile m_oStream >> oOrigin; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETBRUSHORGEX(oOrigin); } @@ -919,7 +1072,7 @@ namespace MetaFile m_oStream >> dStartAngle; m_oStream >> dSweepAngle; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ANGLEARC(oCenter, unRadius, dStartAngle, dSweepAngle); } @@ -951,7 +1104,7 @@ namespace MetaFile Read_EMR_ARC_BASE(oBox, oStart, oEnd, dStartAngle, dSweep); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ARC(oBox, oStart, oEnd); } @@ -964,7 +1117,7 @@ namespace MetaFile Read_EMR_ARC_BASE(oBox, oStart, oEnd, dStartAngle, dSweep); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ARCTO(oBox, oStart, oEnd); } @@ -977,7 +1130,7 @@ namespace MetaFile Read_EMR_ARC_BASE(oBox, oStart, oEnd, dStartAngle, dSweep); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_CHORD(oBox, oStart, oEnd); } @@ -987,7 +1140,7 @@ namespace MetaFile m_oStream >> oBox; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ELLIPSE(oBox); } @@ -998,7 +1151,7 @@ namespace MetaFile m_oStream >> oText; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_EXTTEXTOUTA(oText); } @@ -1008,7 +1161,7 @@ namespace MetaFile m_oStream >> oText; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_EXTTEXTOUTW(oText); } @@ -1018,7 +1171,7 @@ namespace MetaFile m_oStream >> oPoint; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_LINETO(oPoint); } @@ -1031,7 +1184,7 @@ namespace MetaFile Read_EMR_ARC_BASE(oBox, oStart, oEnd, dStartAngle, dSweep); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_PIE(oBox, oStart, oEnd); } @@ -1067,7 +1220,7 @@ namespace MetaFile m_oStream >> arPoints[ulIndex + 2]; } - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYBEZIER(oBounds, arPoints); } @@ -1101,7 +1254,7 @@ namespace MetaFile m_oStream >> arPoints[ulIndex + 2]; } - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYBEZIERTO_BASE(oBounds, arPoints); } @@ -1146,7 +1299,7 @@ namespace MetaFile for (unsigned int unIndex = 0; unIndex < unCount; unIndex++) m_oStream >> pAbTypes[unIndex]; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYDRAW_BASE(oBounds, pPoints, unCount, pAbTypes); delete[] pPoints; @@ -1179,7 +1332,7 @@ namespace MetaFile for (unsigned int ulIndex = 0; ulIndex < ulCount; ulIndex++) m_oStream >> arPoints[ulIndex]; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYGON_BASE(oBounds, arPoints); } @@ -1209,7 +1362,7 @@ namespace MetaFile for (unsigned int ulIndex = 0; ulIndex < ulCount; ulIndex++) m_oStream >> arPoints[ulIndex]; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYLINE_BASE(oBounds, arPoints); } @@ -1236,7 +1389,7 @@ namespace MetaFile for (unsigned int ulIndex = 0; ulIndex < ulCount; ulIndex++) m_oStream >> arPoints[ulIndex]; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYLINETO_BASE(oBounds, arPoints); } @@ -1278,7 +1431,7 @@ namespace MetaFile for (unsigned int unPointIndex = 0; unPointIndex < arPoints[unPolygonIndex].size(); ++unPointIndex) m_oStream >> arPoints[unPolygonIndex][unPointIndex]; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYPOLYGON(oBounds, arPoints); delete[] pPolygonPointCount; @@ -1326,7 +1479,7 @@ namespace MetaFile for (unsigned int unPointIndex = 0; unPointIndex < arPoints[unPolylineIndex].size(); ++unPointIndex) m_oStream >> arPoints[unPolylineIndex][unPointIndex]; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_POLYPOLYLINE(oBounds, arPoints); delete[] pPolylinePointCount; @@ -1347,7 +1500,7 @@ namespace MetaFile if (!oText.arEmrText) return SetError(); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) { for (unsigned int unIndex = 0; unIndex < oText.unCStrings; unIndex++) { @@ -1370,7 +1523,7 @@ namespace MetaFile if (!oText.arEmrText) return SetError(); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) { for (unsigned int unIndex = 0; unIndex < oText.unCStrings; unIndex++) { @@ -1385,7 +1538,7 @@ namespace MetaFile m_oStream >> oBox; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_RECTANGLE(oBox); } @@ -1397,7 +1550,7 @@ namespace MetaFile m_oStream >> oBox; m_oStream >> oCorner; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_ROUNDRECT(oBox, oCorner); } @@ -1409,7 +1562,7 @@ namespace MetaFile m_oStream >> oPoint; m_oStream >> oColor; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SETPIXELV(oPoint, oColor); } @@ -1419,7 +1572,7 @@ namespace MetaFile m_oStream >> oText; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_SMALLTEXTOUT(oText); } @@ -1429,7 +1582,7 @@ namespace MetaFile m_oStream >> oBounds; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_STROKEANDFILLPATH(oBounds); } @@ -1439,7 +1592,7 @@ namespace MetaFile m_oStream >> oBounds; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_STROKEPATH(oBounds); } @@ -1472,7 +1625,7 @@ namespace MetaFile if (4 == unVer) m_oStream.Skip(unTri * 4); - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_GRADIENTFILL(arVertex, arVertexIndexes, unMode); } @@ -1485,6 +1638,8 @@ namespace MetaFile if (sType == "EMF+" && NULL != m_pInterpretator) { + SaveDC(); + if (NULL == m_pEmfPlusParser) { m_pEmfPlusParser = new CEmfPlusParser(m_pInterpretator, m_oHeader); @@ -1500,6 +1655,8 @@ namespace MetaFile m_pInterpretator->ChangeConditional(); m_oStream.Skip(m_ulRecordSize - 8); + + RestoreDC(-1); } else if (sType == "GDIC") { @@ -1598,7 +1755,7 @@ namespace MetaFile for (TRectL &oRect : arRects) m_oStream >> oRect; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_FILLRGN(oBounds, unIhBrush, oRegionDataHeader, arRects); } @@ -1625,7 +1782,7 @@ namespace MetaFile for (TRectL &oRect : arRects) m_oStream >> oRect; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_PAINTRGN(oBounds, oRegionDataHeader, arRects); } @@ -1657,7 +1814,7 @@ namespace MetaFile for (TRectL &oRect : arRects) m_oStream >> oRect; - if (NULL == m_pEmfPlusParser || !m_pEmfPlusParser->GetBanEMFProcesses()) + if (!BanEMFProcesses()) HANDLE_EMR_FRAMERGN(oBounds, unIhBrush, nWidth, nHeight, oRegionDataHeader, arRects); } } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h index 967e822be0..f2e2bc083f 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h @@ -22,11 +22,10 @@ namespace MetaFile EmfParserType GetType() override; void SetStream(BYTE* pBuf, unsigned int unSize); - - void SetOnlyEmfPlus(bool bValue); private: CEmfPlusParser *m_pEmfPlusParser; - bool m_bOnlyEmfPlus; + + bool BanEMFProcesses() const; bool ReadImage(unsigned int offBmi, unsigned int cbBmi, unsigned int offBits, unsigned int cbBits, unsigned int ulSkip, BYTE **ppBgraBuffer, unsigned int *pulWidth, unsigned int *pulHeight) override; void Read_EMR_HEADER(); diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp index 16b9dc35b7..b399b68d31 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp @@ -16,6 +16,14 @@ #define GRADIENT_FILL_OP_FLAG 0x000000ff #endif +#ifdef _DEBUG +#ifdef LOG_EMF_RECORDS + #if 1 == LOG_EMF_RECORDS + unsigned int unFileLevel = 0; +#endif +#endif +#endif + namespace MetaFile { void CEmfParserBase::ImageProcessing(const TEmfAlphaBlend &oTEmfAlphaBlend) @@ -856,6 +864,25 @@ namespace MetaFile return oStartPoint; } + void CEmfParserBase::SaveDC() + { + m_oPlayer.SaveDC(); + UpdateOutputDC(); + } + + void CEmfParserBase::RestoreDC(int nIndex) + { + if (nIndex >= 0) + { + SetError(); + return; + } + + m_oPlayer.RestoreDC(nIndex); + m_pDC = m_oPlayer.GetDC(); + UpdateOutputDC(); + } + void CEmfParserBase::HANDLE_EMR_HEADER(TEmfHeader &oTEmfHeader) { if (ENHMETA_SIGNATURE != m_oHeader.ulSignature || 0x00010000 != m_oHeader.ulVersion) @@ -952,8 +979,7 @@ namespace MetaFile if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_EMR_SAVEDC(); - m_oPlayer.SaveDC(); - UpdateOutputDC(); + SaveDC(); } void CEmfParserBase::HANDLE_EMR_RESTOREDC(int &nIndexDC) @@ -961,15 +987,7 @@ namespace MetaFile if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_EMR_RESTOREDC(nIndexDC); - if (nIndexDC >= 0) - { - SetError(); - return; - } - - m_oPlayer.RestoreDC(nIndexDC); - m_pDC = m_oPlayer.GetDC(); - UpdateOutputDC(); + RestoreDC(nIndexDC); } void CEmfParserBase::HANDLE_EMR_MODIFYWORLDTRANSFORM(TXForm &oXForm, unsigned int &unMode) @@ -1408,9 +1426,9 @@ namespace MetaFile TRectD oClipRect; TranslatePoint(oClip.Left, oClip.Top, oClipRect.Left, oClipRect.Top); TranslatePoint(oClip.Right, oClip.Bottom, oClipRect.Right, oClipRect.Bottom); - + m_pDC->GetClip()->Intersect(oClipRect); - + if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_EMR_INTERSECTCLIPRECT(oClip); } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h index b0780663e2..5334182be0 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h @@ -11,14 +11,39 @@ #include "../EmfInterpretator/CEmfInterpretatorBase.h" + +#if defined(DrawText) +#undef DrawText +#endif + +#define PRINT_LOG(text) do {} while(false) +#define GO_DOWN_LEVEL_BELOW do {} while (false) +#define GO_UP_LEVEL do {} while (false) + #ifdef _DEBUG #include #include #include -#endif -#if defined(DrawText) -#undef DrawText +#define LOG_EMF_RECORDS 0 + +#ifdef LOG_EMF_RECORDS + #if 1 == LOG_EMF_RECORDS + #define PRINTING_EMF_RECORDS 1 + #define PRINTING_EMF_PLUS_RECORDS 1 + + extern unsigned int unFileLevel; + + #define GO_DOWN_LEVEL_BELOW \ + std::wcout << L"LEVEL [" << unFileLevel << L"] -> [" << --::unFileLevel << L"]" << std::endl + + #define GO_UP_LEVEL \ + std::wcout << L"LEVEL [" << unFileLevel << L"] -> [" << ++::unFileLevel << L"]" << std::endl + + #define PRINT_LOG(text) \ + std::wcout << L"LEVEL [" << unFileLevel << L"] [LOG] " << text << std::endl + #endif +#endif #endif namespace MetaFile @@ -159,6 +184,9 @@ namespace MetaFile TPointL GetStartPointForArc(const TRectL &oBox, double dStartAngle); + void SaveDC(); + void RestoreDC(int nIndex); + void HANDLE_EMR_HEADER(TEmfHeader& oTEmfHeader); void HANDLE_EMR_ALPHABLEND(TEmfAlphaBlend& oTEmfAlphaBlend); void HANDLE_EMR_STRETCHDIBITS(TEmfStretchDIBITS& oTEmfStretchDIBITS); diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp index 9145e5dd45..9c9265a96b 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp @@ -88,75 +88,93 @@ #define MAX_PICTURE_SIZE 2000. +#define PRINT_EMF_PLUS_RECORD(type, size) do {} while(false) + +#ifdef _DEBUG + #ifdef LOG_EMF_RECORDS + #if 1 == LOG_EMF_RECORDS + #ifdef PRINTING_EMF_PLUS_RECORDS + #if 1 == PRINTING_EMF_PLUS_RECORDS + #include + + static std::map mActionNamesEmfPlus = + { + {0x4035, L"EMRPLUS_OFFSETCLIP"}, + {0x4031, L"EMRPLUS_RESETCLIP"}, + {0x4033, L"EMFPLUS_SETCLIPPATH"}, + {0x4032, L"EMFPLUS_SETCLIPRECT"}, + {0x4034, L"EMFPLUS_SETCLIPREGION"}, + + {0x4003, L"EMFPLUS_COMMENT"}, + + {0x4002, L"EMFPLUS_ENDOFFILE"}, + {0x4004, L"EMFPLUS_GETDC"}, + {0x4001, L"EMFPLUS_HEADER"}, + + {0x4009, L"EMFPLUS_CLEAR"}, + {0x4012, L"EMFPLUS_DRAWARC"}, + {0x4019, L"EMFPLUS_DRAWBEZIERS"}, + {0x4017, L"EMFPLUS_DRAWCLOSEDCURVE"}, + {0x4018, L"EMFPLUS_DRAWCURVE"}, + {0x4036, L"EMFPLUS_DRAWDRIVERSTRING"}, + {0x400F, L"EMFPLUS_DRAWELLIPSE"}, + {0x401A, L"EMFPLUS_DRAWIMAGE"}, + {0x401B, L"EMFPLUS_DRAWIMAGEPOINTS"}, + {0x400D, L"EMFPLUS_DRAWLINES"}, + {0x4015, L"EMFPLUS_DRAWPATH"}, + {0x4011, L"EMFPLUS_DRAWPIE"}, + {0x400B, L"EMFPLUS_DRAWRECTS"}, + {0x401C, L"EMFPLUS_DRAWSTRING"}, + {0x4016, L"EMFPLUS_FILLCLOSEDCURVE"}, + {0x400E, L"EMFPLUS_FILLELLIPSE"}, + {0x4014, L"EMFPLUS_FILLPATH"}, + {0x4010, L"EMFPLUS_FILLPIE"}, + {0x400C, L"EMFPLUS_FILLPOLYGON"}, + {0x400A, L"EMFPLUS_FILLRECTS"}, + {0x4013, L"EMFPLUS_FILLREGION"}, + + {0x4008, L"EMFPLUS_OBJECT"}, + {0x4038, L"EMFPLUS_SERIALIZABLEOBJECT"}, + + {0x401E, L"EMFPLUS_SETANTIALIASMODE"}, + {0x4023, L"EMFPLUS_SETCOMPOSITINGMODE"}, + {0x4024, L"EMFPLUS_SETCOMPOSITINGQUALITY"}, + {0x4021, L"EMFPLUS_SETINTERPOLATIONMODE"}, + {0x4022, L"EMFPLUS_SETPIXELOFFSETMODE"}, + {0x401D, L"EMFPLUS_SETRENDERINGORIGIN"}, + {0x4020, L"EMFPLUS_SETTEXTCONTRAST"}, + {0x401F, L"EMFPLUS_SETTEXTRENDERINGHINT"}, + + {0x4027, L"EMFPLUS_BEGINCONTAINER"}, + {0x4028, L"EMFPLUS_BEGINCONTAINERNOPARAMS"}, + {0x4029, L"EMFPLUS_ENDCONTAINER"}, + {0x4026, L"EMFPLUS_RESTORE"}, + {0x4025, L"EMFPLUS_SAVE"}, + + {0x403A, L"EMFPLUS_SETTSCLIP"}, + {0x4039, L"EMFPLUS_SETTSGRAPHICS"}, + + {0x402C, L"EMFPLUS_MULTIPLYWORLDTRANSFORM"}, + {0x402B, L"EMFPLUS_RESETWORLDTRANSFORM"}, + {0x402F, L"EMFPLUS_ROTATEWORLDTRANSFORM"}, + {0x402E, L"EMFPLUS_SCALEWORLDTRANSFORM"}, + {0x4030, L"EMFPLUS_SETPAGETRANSFORM"}, + {0x402A, L"EMFPLUS_SETWORLDTRANSFORM"}, + {0x402D, L"EMFPLUS_TRANSLATEWORLDTRANSFORM"} + }; + + #define PRINT_EMF_PLUS_RECORD(type, size) \ + std::wcout << L"LEVEL [" << unFileLevel << L"] EMF_PLUS_RECORD: " << mActionNamesEmfPlus[unShType] << L" {DataSize = " << size << L"}" << std::endl + #endif + #endif + #endif + #endif +#endif + namespace MetaFile -{ static std::map ActionNamesEmfPlus = - { - {0x4035, L"EMRPLUS_OFFSETCLIP"}, - {0x4031, L"EMRPLUS_RESETCLIP"}, - {0x4033, L"EMFPLUS_SETCLIPPATH"}, - {0x4032, L"EMFPLUS_SETCLIPRECT"}, - {0x4034, L"EMFPLUS_SETCLIPREGION"}, - - {0x4003, L"EMFPLUS_COMMENT"}, - - {0x4002, L"EMFPLUS_ENDOFFILE"}, - {0x4004, L"EMFPLUS_GETDC"}, - {0x4001, L"EMFPLUS_HEADER"}, - - {0x4009, L"EMFPLUS_CLEAR"}, - {0x4012, L"EMFPLUS_DRAWARC"}, - {0x4019, L"EMFPLUS_DRAWBEZIERS"}, - {0x4017, L"EMFPLUS_DRAWCLOSEDCURVE"}, - {0x4018, L"EMFPLUS_DRAWCURVE"}, - {0x4036, L"EMFPLUS_DRAWDRIVERSTRING"}, - {0x400F, L"EMFPLUS_DRAWELLIPSE"}, - {0x401A, L"EMFPLUS_DRAWIMAGE"}, - {0x401B, L"EMFPLUS_DRAWIMAGEPOINTS"}, - {0x400D, L"EMFPLUS_DRAWLINES"}, - {0x4015, L"EMFPLUS_DRAWPATH"}, - {0x4011, L"EMFPLUS_DRAWPIE"}, - {0x400B, L"EMFPLUS_DRAWRECTS"}, - {0x401C, L"EMFPLUS_DRAWSTRING"}, - {0x4016, L"EMFPLUS_FILLCLOSEDCURVE"}, - {0x400E, L"EMFPLUS_FILLELLIPSE"}, - {0x4014, L"EMFPLUS_FILLPATH"}, - {0x4010, L"EMFPLUS_FILLPIE"}, - {0x400C, L"EMFPLUS_FILLPOLYGON"}, - {0x400A, L"EMFPLUS_FILLRECTS"}, - {0x4013, L"EMFPLUS_FILLREGION"}, - - {0x4008, L"EMFPLUS_OBJECT"}, - {0x4038, L"EMFPLUS_SERIALIZABLEOBJECT"}, - - {0x401E, L"EMFPLUS_SETANTIALIASMODE"}, - {0x4023, L"EMFPLUS_SETCOMPOSITINGMODE"}, - {0x4024, L"EMFPLUS_SETCOMPOSITINGQUALITY"}, - {0x4021, L"EMFPLUS_SETINTERPOLATIONMODE"}, - {0x4022, L"EMFPLUS_SETPIXELOFFSETMODE"}, - {0x401D, L"EMFPLUS_SETRENDERINGORIGIN"}, - {0x4020, L"EMFPLUS_SETTEXTCONTRAST"}, - {0x401F, L"EMFPLUS_SETTEXTRENDERINGHINT"}, - - {0x4027, L"EMFPLUS_BEGINCONTAINER"}, - {0x4028, L"EMFPLUS_BEGINCONTAINERNOPARAMS"}, - {0x4029, L"EMFPLUS_ENDCONTAINER"}, - {0x4026, L"EMFPLUS_RESTORE"}, - {0x4025, L"EMFPLUS_SAVE"}, - - {0x403A, L"EMFPLUS_SETTSCLIP"}, - {0x4039, L"EMFPLUS_SETTSGRAPHICS"}, - - {0x402C, L"EMFPLUS_MULTIPLYWORLDTRANSFORM"}, - {0x402B, L"EMFPLUS_RESETWORLDTRANSFORM"}, - {0x402F, L"EMFPLUS_ROTATEWORLDTRANSFORM"}, - {0x402E, L"EMFPLUS_SCALEWORLDTRANSFORM"}, - {0x4030, L"EMFPLUS_SETPAGETRANSFORM"}, - {0x402A, L"EMFPLUS_SETWORLDTRANSFORM"}, - {0x402D, L"EMFPLUS_TRANSLATEWORLDTRANSFORM"} - }; - +{ CEmfPlusParser::CEmfPlusParser(CEmfInterpretatorBase *pEmfInterpretator, const TEmfHeader& oHeader) - : m_bBanEmfProcessing(false), + : m_bBanEmfProcessing(true), m_unLogicalDpiX(96), m_unLogicalDpiY(96), m_dUnitKoef(1) @@ -220,6 +238,9 @@ namespace MetaFile unsigned short unShType, unShFlags; unsigned int unSize; + if (NULL != m_pInterpretator) + GO_UP_LEVEL; + do { if (m_bEof) @@ -234,11 +255,17 @@ namespace MetaFile m_oStream >> unSize; m_oStream >> m_ulRecordSize; + if (unSize < 12 || unSize > m_oStream.CanRead() || m_ulRecordSize > (unSize - 12)) + break; + m_oStream.SetCurrentBlockSize(m_ulRecordSize); unsigned int unRecordPos = m_oStream.Tell(); - LOGGING(ActionNamesEmfPlus[unShType] << L" DataSize = " << m_ulRecordSize) + if (NULL != m_pInterpretator) + PRINT_EMF_PLUS_RECORD(unShType, m_ulRecordSize); + + m_bBanEmfProcessing = true; switch (unShType) { @@ -318,7 +345,8 @@ namespace MetaFile int nNeedSkip = (unRecordPos + m_ulRecordSize) - m_oStream.Tell(); m_oStream.Skip(nNeedSkip); - LOGGING(L"Skip: " << nNeedSkip) + if (0 != nNeedSkip && NULL != m_pInterpretator) + PRINT_LOG(L"SKIP BYTES: " << nNeedSkip); m_oStream.ClearCurrentBlockSize(); m_ulRecordSize = 0; @@ -327,7 +355,8 @@ namespace MetaFile if (!CheckError()) m_oStream.SeekToStart(); - LOGGING(L"_____________________________________________________") + if (NULL != m_pInterpretator) + GO_DOWN_LEVEL_BELOW; } void CEmfPlusParser::Scan() @@ -1005,7 +1034,7 @@ namespace MetaFile else { std::vector arPoints = ReadPoints(unPathPointCount); - std::vector arPointTypes = ReadPointTypes(unPathPointCount); + std::vector arPointTypes = ReadPointTypes(unPathPointCount); pPath->MoveTo(arPoints[0].X, arPoints[0].Y); @@ -1343,12 +1372,14 @@ namespace MetaFile void CEmfPlusParser::UpdateMatrix(TEmfPlusXForm &oMatrix) { - oMatrix.M11 *= m_dUnitKoef; - oMatrix.M12 *= m_dUnitKoef; - oMatrix.M21 *= m_dUnitKoef; - oMatrix.M22 *= m_dUnitKoef; - oMatrix.Dx *= m_dUnitKoef; - oMatrix.Dy *= m_dUnitKoef; + const double dKoef{m_dUnitKoef * (m_unLogicalDpiX / 96)}; + + oMatrix.M11 *= dKoef; + oMatrix.M12 *= dKoef; + oMatrix.M21 *= dKoef; + oMatrix.M22 *= dKoef; + oMatrix.Dx *= dKoef; + oMatrix.Dy *= dKoef; } bool CEmfPlusParser::SaveImage(const CEmfPlusImage &oEmfPlusImage, std::wstring &wsPathToImage) @@ -1477,7 +1508,7 @@ namespace MetaFile if (NULL == pBuffer || unSizeBuffer == 0 || arPoints.size() != 3) return; - if (ImageDataTypeBitmap == pImage->GetImageDataType()) + if (ImageDataTypeBitmap == pImage->GetImageDataType()) { unsigned int unWidth, unHeigth; @@ -1494,7 +1525,7 @@ namespace MetaFile case MetafileDataTypeEmfPlusDual: { CEmfParser oParser; - oParser.SetOnlyEmfPlus(MetafileDataTypeEmfPlusOnly == pImage->GetMetafileType()); + // oParser.SetOnlyEmf(true); return DrawMetafile(oParser, pBuffer, unSizeBuffer, oSrcRect, arPoints); } case MetafileDataTypeWmf: @@ -1539,8 +1570,7 @@ namespace MetaFile const double dMaxWidth = std::max(MAX_PICTURE_SIZE, dParentWidth); const double dMaxHeight = std::max(MAX_PICTURE_SIZE, dParentHeight); - if (dFileWidth > dMaxWidth || dFileHeight > dMaxHeight) - dScale *= std::min(dMaxWidth / dFileWidth, dMaxHeight / dFileHeight); + dScale *= std::min(dMaxWidth / dFileWidth, dMaxHeight / dFileHeight); const int nWidth = dFileWidth * dScale; const int nHeight = dFileHeight * dScale; @@ -1685,7 +1715,7 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_HEADER(unsigned short unShFlags) { - m_oStream.Skip(4); //Version + m_oStream.Skip(4); //Data size unsigned int unEmfPlusFlags; @@ -1693,8 +1723,6 @@ namespace MetaFile m_oStream >> m_unLogicalDpiX; m_oStream >> m_unLogicalDpiY; - m_bBanEmfProcessing = true; - if (NULL != m_pInterpretator) { m_pInterpretator->Begin(); @@ -1711,8 +1739,6 @@ namespace MetaFile if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_EMFPLUS_CLEAR(oARGB); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_DRAWARC(unsigned short unShFlags) @@ -1721,8 +1747,6 @@ namespace MetaFile Read_EMFPLUS_DRAWARC_BASE(unShFlags); else Read_EMFPLUS_DRAWARC_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -1781,8 +1805,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWBEZIERS_BASE(unShFlags); // абсолютное расположение } - - m_bBanEmfProcessing = true; } template @@ -1842,8 +1864,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWCLOSEDCURVE_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами. } - - m_bBanEmfProcessing = true; } template @@ -1896,8 +1916,6 @@ namespace MetaFile Read_EMFPLUS_DRAWCURVE_BASE(unShFlags); else Read_EMFPLUS_DRAWCURVE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -1974,8 +1992,6 @@ namespace MetaFile TEmfPlusXForm oMatrix; m_oStream >> oMatrix; - - m_bBanEmfProcessing = true; } //---------- if (NULL == m_pInterpretator || wsString.length() != arGlyphPos.size()) @@ -2039,8 +2055,6 @@ namespace MetaFile } m_pDC->RemoveFont(pFont); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_DRAWELLIPSE(unsigned short unShFlags) @@ -2049,8 +2063,6 @@ namespace MetaFile Read_EMFPLUS_DRAWELLIPSE_BASE(unShFlags); else Read_EMFPLUS_DRAWELLIPSE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2094,8 +2106,6 @@ namespace MetaFile Read_EMFPLUS_DRAWIMAGE_BASE(unShFlags); else Read_EMFPLUS_DRAWIMAGE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2142,8 +2152,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWIMAGEPOINTS_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2159,7 +2167,7 @@ namespace MetaFile m_oStream >> oSrcRect; m_oStream >> unCount; - if (nSrcUnit != UnitTypePixel && unCount != 3) + if (nSrcUnit != UnitTypePixel || unCount != 3) return; std::vector arPoints(unCount); @@ -2187,8 +2195,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWLINES_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2225,8 +2231,6 @@ namespace MetaFile m_pDC->RemoveBrush(pEmfPlusPen->pBrush); m_pDC->RemovePen(pEmfPlusPen); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_DRAWPATH(unsigned short unShFlags) @@ -2265,8 +2269,6 @@ namespace MetaFile m_pDC->RemovePen(pEmfPlusPen); } - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_DRAWPIE(unsigned short unShFlags) @@ -2275,8 +2277,6 @@ namespace MetaFile Read_EMFPLUS_DRAWPIE_BASE(unShFlags); else Read_EMFPLUS_DRAWPIE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2302,8 +2302,6 @@ namespace MetaFile Read_EMFPLUS_DRAWRECTS_BASE(unShFlags); else Read_EMFPLUS_DRAWRECTS_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2467,8 +2465,6 @@ namespace MetaFile m_pDC->SetTextAlign(unOldTextAlign); m_pDC->RemoveFont(pFont); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_FILLCLOSEDCURVE(unsigned short unShFlags) @@ -2488,8 +2484,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_FILLCLOSEDCURVE_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2518,8 +2512,6 @@ namespace MetaFile Read_EMFPLUS_FILLELLIPSE_BASE(unShFlags); else Read_EMFPLUS_FILLELLIPSE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2622,8 +2614,6 @@ namespace MetaFile m_pDC->RemoveBrush(pBrush); } - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_FILLPIE(unsigned short unShFlags) @@ -2632,8 +2622,6 @@ namespace MetaFile Read_EMFPLUS_FILLPIE_BASE(unShFlags); else Read_EMFPLUS_FILLPIE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2671,8 +2659,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_FILLPOLYGON_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2746,8 +2732,6 @@ namespace MetaFile Read_EMFPLUS_FILLRECTS_BASE(unShFlags); else Read_EMFPLUS_FILLRECTS_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2815,7 +2799,6 @@ namespace MetaFile m_oStream >> unBrushId; //TODO: реализовать - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_OBJECT(unsigned short unShFlags) @@ -2828,7 +2811,7 @@ namespace MetaFile case ObjectTypeInvalid: return; case ObjectTypeBrush: { - LOGGING(L"Object Brush with index: " << shObjectIndex) + PRINT_LOG(L"Object Brush with index: " << shObjectIndex); CEmfPlusBrush *pEmfPlusBrush = ReadBrush(); @@ -2838,7 +2821,7 @@ namespace MetaFile } case ObjectTypePen: { - LOGGING(L"Object Pen with index: " << shObjectIndex) + PRINT_LOG(L"Object Pen with index: " << shObjectIndex); CEmfPlusPen *pEmfPlusPen = ReadPen(); @@ -2848,7 +2831,7 @@ namespace MetaFile } case ObjectTypePath: { - LOGGING(L"Object Path with index: " << shObjectIndex) + PRINT_LOG(L"Object Path with index: " << shObjectIndex); if ((unShFlags >>(15)) & 1) { @@ -2891,7 +2874,7 @@ namespace MetaFile } case ObjectTypeRegion: { - LOGGING(L"Object Region") + PRINT_LOG(L"Object Region"); CEmfPlusRegion *pEmfPlusRegion = ReadRegion(); @@ -2901,13 +2884,14 @@ namespace MetaFile } case ObjectTypeImage: { - LOGGING(L"Object Image") + PRINT_LOG(L"Object Image"); + ReadImage(shObjectIndex, ((unShFlags >>(15)) & 1)); break; } case ObjectTypeFont: { - LOGGING(L"Object Font with index: " << shObjectIndex) + PRINT_LOG(L"Object Font with index: " << shObjectIndex); CEmfPlusFont *pFont = ReadFont(); @@ -2917,7 +2901,7 @@ namespace MetaFile } case ObjectTypeStringFormat: { - LOGGING(L"Object String Format") + PRINT_LOG(L"Object String Format"); CEmfPlusStringFormat *pStringFormat = new CEmfPlusStringFormat; @@ -2929,7 +2913,7 @@ namespace MetaFile } case ObjectTypeImageAttributes: { - LOGGING(L"Object Image Attributes") + PRINT_LOG(L"Object Image Attributes"); CEmfPlusImageAttributes *pImageAttributes = new CEmfPlusImageAttributes(); @@ -2943,10 +2927,14 @@ namespace MetaFile } case ObjectTypeCustomLineCap: { - LOGGING(L"Object Custom Line Cap") + PRINT_LOG(L"Object Custom Line Cap"); break; } - default: return; + default: + { + PRINT_LOG(L"Unknown object type"); + return; + } } //TODO: реализовать } @@ -3118,26 +3106,28 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_MULTIPLYWORLDTRANSFORM(unsigned short unShFlags) { + m_bBanEmfProcessing = true; + TEmfPlusXForm oMatrix; m_oStream >> oMatrix; m_pDC->MultiplyTransform(oMatrix, (unShFlags & 0x2000) ? MWT_RIGHTMULTIPLY : MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_RESETWORLDTRANSFORM() { + m_bBanEmfProcessing = true; + m_pDC->ResetTransform(); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_ROTATEWORLDTRANSFORM(unsigned short unShFlags) { + m_bBanEmfProcessing = true; + double dAngle; m_oStream >> dAngle; @@ -3151,12 +3141,12 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, (unShFlags & 0x2000) ? MWT_RIGHTMULTIPLY : MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_SCALEWORLDTRANSFORM(unsigned short unShFlags) { + m_bBanEmfProcessing = true; + double dSx, dSy; m_oStream >> dSx; @@ -3166,12 +3156,12 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, (unShFlags & 0x2000) ? MWT_RIGHTMULTIPLY : MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_SETPAGETRANSFORM(unsigned short unShFlags) { + m_bBanEmfProcessing = true; + short shPageUnit = ExpressValue(unShFlags, 0, 7); m_oStream >> m_dUnitKoef; @@ -3192,8 +3182,6 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_SETWORLDTRANSFORM() @@ -3206,8 +3194,6 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, MWT_SET); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_TRANSLATEWORLDTRANSFORM(unsigned short unShFlags) @@ -3221,8 +3207,6 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, (unShFlags & 0x2000) ? MWT_RIGHTMULTIPLY : MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_ENDOFFILE() @@ -3231,7 +3215,6 @@ namespace MetaFile m_pInterpretator->End(); m_bEof = true; - m_bBanEmfProcessing = false; if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_EMFPLUS_ENDOFFILE(); @@ -3247,8 +3230,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMRPLUS_OFFSETCLIP() { - m_bBanEmfProcessing = true; - double dX, dY; m_oStream >> dX; @@ -3262,8 +3243,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMRPLUS_RESETCLIP() { - m_bBanEmfProcessing = true; - m_pDC->GetClip()->Reset(); UpdateOutputDC(); @@ -3273,8 +3252,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_SETCLIPPATH(unsigned short unShFlags) { - m_bBanEmfProcessing = true; - BYTE uchObjectId = ExpressValue(unShFlags, 0, 7); CEmfPlusPath* pPath = GetPath(uchObjectId); @@ -3293,8 +3270,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_SETCLIPRECT(unsigned short unShFlags) { - m_bBanEmfProcessing = true; - short shCM = ExpressValue(unShFlags, 8, 11); TEmfPlusRectF oRect; @@ -3310,8 +3285,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_SETCLIPREGION(unsigned short unShFlags) { - m_bBanEmfProcessing = true; - short shObjectIndex = ExpressValue(unShFlags, 0, 7); short shCM = ExpressValue(unShFlags, 8, 11); diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h index 1709db3e04..b281fbad89 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h @@ -23,7 +23,7 @@ namespace MetaFile void Scan() override; USHORT GetDpi() override; - EmfParserType GetType() override; + EmfParserType GetType() override; void SetStream(BYTE *pBytes, unsigned int unSize); bool GetBanEMFProcesses(); diff --git a/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp b/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp index 291acd40b4..5a7ba80b66 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp @@ -191,6 +191,7 @@ namespace MetaFile case EMF_OBJECT_BRUSH: m_pDC->SetBrush((CEmfLogBrushEx*)pObject); break; case EMF_OBJECT_FONT: m_pDC->SetFont((CEmfLogFont*)pObject); break; case EMF_OBJECT_PEN: m_pDC->SetPen((CEmfLogPen*)pObject); break; + default: break; } } } @@ -222,6 +223,7 @@ namespace MetaFile case EMF_OBJECT_BRUSH: m_pDC->RemoveBrush((CEmfLogBrushEx*)pObject); break; case EMF_OBJECT_FONT: m_pDC->RemoveFont((CEmfLogFont*)pObject); break; case EMF_OBJECT_PEN: m_pDC->RemovePen((CEmfLogPen*)pObject); break; + default: break; } for (std::pair oElement : m_mDCs) @@ -233,6 +235,7 @@ namespace MetaFile case EMF_OBJECT_BRUSH: pDC->RemoveBrush((CEmfLogBrushEx*)pObject); break; case EMF_OBJECT_FONT: pDC->RemoveFont((CEmfLogFont*)pObject); break; case EMF_OBJECT_PEN: pDC->RemovePen((CEmfLogPen*)pObject); break; + default: break; } } diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp index 1c860b7517..a6644fdc29 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp @@ -494,6 +494,7 @@ namespace MetaFile {L"fill", CalculateColor(pBuffer[2], pBuffer[1], pBuffer[0], 255)}}; AddTransform(arAttributes, &oTransform); + AddClip(); WriteNode(L"rect", arAttributes); @@ -548,7 +549,9 @@ namespace MetaFile void CInterpretatorSvgBase::ResetClip() { + CloseClip(); m_oClip.Reset(); + m_bUpdatedClip = false; } void CInterpretatorSvgBase::IntersectClip(const TRectD &oClip) @@ -562,7 +565,7 @@ namespace MetaFile pTransform->Apply(dLeft, dTop); pTransform->Apply(dRight, dBottom); - + const std::wstring wsId = L"INTERSECTCLIP_" + ConvertToWString(++m_unNumberDefs, 0); const std::wstring wsValue = L""; From 47ec9ab80d014ee678efc78e7cb7aa165471ba56 Mon Sep 17 00:00:00 2001 From: Green Date: Tue, 3 Sep 2024 14:12:02 +0300 Subject: [PATCH 25/82] Fix bugs and refactoring --- .../raster/Metafile/Common/MetaFile.h | 81 ++++--- .../raster/Metafile/Common/MetaFileObjects.h | 57 +++-- .../raster/Metafile/Common/MetaFileRenderer.h | 21 +- .../raster/Metafile/Common/MetaFileTypes.cpp | 46 +++- .../raster/Metafile/Common/MetaFileTypes.h | 12 +- .../raster/Metafile/Common/MetaFileUtils.h | 4 +- DesktopEditor/raster/Metafile/Emf/EmfFile.h | 4 +- .../EmfInterpretator/CEmfInterpretatorSvg.cpp | 14 +- .../raster/Metafile/Emf/EmfObjects.cpp | 80 +++---- .../raster/Metafile/Emf/EmfObjects.h | 67 +++--- .../Metafile/Emf/EmfParser/CEmfParser.cpp | 12 +- .../Metafile/Emf/EmfParser/CEmfParser.h | 2 +- .../Metafile/Emf/EmfParser/CEmfParserBase.cpp | 153 ++++++------ .../Metafile/Emf/EmfParser/CEmfParserBase.h | 78 ++++--- .../Metafile/Emf/EmfParser/CEmfPlusParser.cpp | 72 +++--- .../Metafile/Emf/EmfParser/CEmfPlusParser.h | 6 +- .../Metafile/Emf/EmfParser/CEmfxParser.cpp | 2 +- .../Metafile/Emf/EmfParser/CEmfxParser.h | 2 +- .../raster/Metafile/Emf/EmfPlayer.cpp | 88 +++---- DesktopEditor/raster/Metafile/Emf/EmfPlayer.h | 100 ++++---- .../raster/Metafile/Emf/EmfPlusObjects.cpp | 86 +++---- .../raster/Metafile/Emf/EmfPlusObjects.h | 94 ++++---- DesktopEditor/raster/Metafile/MetaFile.cpp | 30 +-- .../raster/Metafile/StarView/SvmFile.h | 96 +++----- .../raster/Metafile/StarView/SvmObjects.cpp | 24 +- .../raster/Metafile/StarView/SvmObjects.h | 66 +++--- .../raster/Metafile/StarView/SvmPlayer.cpp | 40 ++-- .../raster/Metafile/StarView/SvmPlayer.h | 76 +++--- DesktopEditor/raster/Metafile/Wmf/WmfFile.h | 6 +- .../CInterpretatorSvgBase.cpp | 42 ++-- .../WmfInterpretator/CInterpretatorSvgBase.h | 8 +- .../WmfInterpretator/CWmfInterpretatorSvg.cpp | 16 +- .../raster/Metafile/Wmf/WmfObjects.cpp | 94 ++++---- .../raster/Metafile/Wmf/WmfObjects.h | 66 +++--- .../Metafile/Wmf/WmfParser/CWmfParser.cpp | 3 +- .../Metafile/Wmf/WmfParser/CWmfParser.h | 2 +- .../Metafile/Wmf/WmfParser/CWmfParserBase.cpp | 221 ++++++++---------- .../Metafile/Wmf/WmfParser/CWmfParserBase.h | 67 +++--- .../raster/Metafile/Wmf/WmfPlayer.cpp | 76 +++--- DesktopEditor/raster/Metafile/Wmf/WmfPlayer.h | 112 ++++----- DesktopEditor/raster/Metafile/Wmf/WmfTypes.h | 2 +- 41 files changed, 1072 insertions(+), 1056 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Common/MetaFile.h b/DesktopEditor/raster/Metafile/Common/MetaFile.h index f87a965371..0bd2dbc146 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFile.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFile.h @@ -45,11 +45,8 @@ namespace MetaFile { public: IMetaFileBase() + : m_pOutput(NULL), m_pBufferData(NULL), m_bIsExternalBuffer(false), m_bError(false), m_pParent(NULL) { - m_pBufferData = NULL; - m_bIsExternalBuffer = false; - m_bError = false; - m_pOutput = NULL; m_oStream.SetStream(NULL, 0); } virtual ~IMetaFileBase() @@ -57,33 +54,46 @@ namespace MetaFile this->Close(); } - virtual void PlayMetaFile() = 0; - virtual void ClearFile() {/*Нельзя делать чисто виртуальной, потому что вызывается в деструкторе*/} - virtual TRectL* GetDCBounds() = 0; - virtual CClip* GetClip() = 0; - virtual double GetPixelHeight() = 0; - virtual double GetPixelWidth() = 0; - virtual int GetTextColor() = 0; - virtual IFont* GetFont() = 0; - virtual IBrush* GetBrush() = 0; - virtual IPen* GetPen() = 0; - virtual unsigned int GetTextAlign() = 0; - virtual unsigned int GetTextBgMode() = 0; - virtual int GetTextBgColor() = 0; - virtual unsigned int GetFillMode() = 0; - virtual TPointD GetCurPos() = 0; - virtual TXForm* GetInverseTransform() = 0; - virtual TXForm* GetTransform(int iGraphicsMode = GM_ADVANCED) = 0; - virtual unsigned int GetMiterLimit() = 0; - virtual unsigned int GetRop2Mode() = 0; - virtual int GetCharSpace() = 0; - virtual bool IsWindowFlippedY() = 0; - virtual bool IsWindowFlippedX() = 0; - virtual unsigned int GetMapMode() = 0; - virtual USHORT GetDpi() = 0; - virtual IRegion* GetRegion() = 0; - virtual unsigned int GetArcDirection() = 0; - virtual CPath* GetPath() = 0; + virtual void PlayMetaFile() = 0; + virtual void ClearFile() {/*Нельзя делать чисто виртуальной, потому что вызывается в деструкторе*/} + virtual const TRectL& GetDCBounds() const = 0; + virtual const CClip* GetClip() const = 0; + virtual double GetPixelHeight() const = 0; + virtual double GetPixelWidth() const = 0; + virtual int GetTextColor() const = 0; + virtual const IFont* GetFont() const = 0; + virtual const IBrush* GetBrush() const = 0; + virtual const IPen* GetPen() const = 0; + virtual unsigned int GetTextAlign() const = 0; + virtual unsigned int GetTextBgMode() const = 0; + virtual int GetTextBgColor() const = 0; + virtual unsigned int GetFillMode() const = 0; + virtual TPointD GetCurPos() const = 0; + virtual const TXForm& GetInverseTransform() const = 0; + virtual const TXForm& GetTransform(int iGraphicsMode = GM_ADVANCED) = 0; + virtual unsigned int GetMiterLimit() const = 0; + virtual unsigned int GetRop2Mode() const = 0; + virtual int GetCharSpace() const = 0; + virtual bool IsWindowFlippedY() const = 0; + virtual bool IsWindowFlippedX() const = 0; + virtual unsigned int GetMapMode() const = 0; + virtual USHORT GetDpi() const = 0; + virtual const IRegion* GetRegion() const = 0; + virtual unsigned int GetArcDirection() const = 0; + virtual const CPath* GetPath() const = 0; + + virtual TXForm CalculateCurrentTransform() const + { + return TXForm{}; + } + + virtual const TRectL& GetOriginalDCBounds() const + { + if (NULL != m_pParent) + return m_pParent->GetOriginalDCBounds(); + + return GetDCBounds(); + } bool ReadFromBuffer(BYTE* pBuffer, unsigned int unSize, const bool& bIsExternal = true) { @@ -141,7 +151,7 @@ namespace MetaFile this->ClearFile(); } - NSFonts::IFontManager* GetFontManager() + NSFonts::IFontManager* GetFontManager() const { return m_pFontManager; } @@ -157,16 +167,21 @@ namespace MetaFile { m_bError = true; } - bool CheckError() + bool CheckError() const { return m_bError; } + void SetParent(const IMetaFileBase* pParent) + { + m_pParent = pParent; + } protected: CDataStream m_oStream; IOutputDevice* m_pOutput; + const IMetaFileBase* m_pParent; private: NSFonts::IFontManager* m_pFontManager; diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileObjects.h b/DesktopEditor/raster/Metafile/Common/MetaFileObjects.h index 76d61ad9b7..d5fb459c13 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileObjects.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFileObjects.h @@ -34,8 +34,6 @@ #include -#include "IOutputDevice.h" - namespace MetaFile { class IFont @@ -44,15 +42,15 @@ namespace MetaFile IFont(){} virtual ~IFont(){} - virtual double GetHeight() = 0; - virtual std::wstring GetFaceName() = 0; - virtual int GetWeight() = 0; - virtual bool IsItalic() = 0; - virtual bool IsStrikeOut() = 0; - virtual bool IsUnderline() = 0; - virtual int GetEscapement() = 0; - virtual int GetCharSet() = 0; - virtual int GetOrientation() = 0; + virtual double GetHeight() const = 0; + virtual std::wstring GetFaceName() const = 0; + virtual int GetWeight() const = 0; + virtual bool IsItalic() const = 0; + virtual bool IsStrikeOut() const = 0; + virtual bool IsUnderline() const = 0; + virtual int GetEscapement() const = 0; + virtual int GetCharSet() const = 0; + virtual int GetOrientation() const = 0; }; class IBrush @@ -61,32 +59,33 @@ namespace MetaFile IBrush(){} virtual ~IBrush(){} - virtual int GetColor() = 0; - virtual int GetColor2() = 0; - virtual unsigned int GetStyle() = 0; - virtual unsigned int GetStyleEx() = 0; - virtual unsigned int GetHatch() = 0; - virtual unsigned int GetAlpha() = 0; - virtual unsigned int GetAlpha2() = 0; - virtual std::wstring GetDibPatterPath() = 0; - virtual void GetBounds(double& left, double& top, double& width, double& height) = 0; - virtual void GetCenterPoint(double& dX, double& dY) = 0; + virtual int GetColor() const = 0; + virtual int GetColor2() const = 0; + virtual unsigned int GetStyle() const = 0; + virtual unsigned int GetStyleEx() const = 0; + virtual unsigned int GetHatch() const = 0; + virtual unsigned int GetAlpha() const = 0; + virtual unsigned int GetAlpha2() const = 0; + virtual std::wstring GetDibPatterPath() const = 0; + virtual void GetBounds(double& left, double& top, double& width, double& height) const = 0; + virtual void GetCenterPoint(double& dX, double& dY) const = 0; - virtual void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight) = 0; + virtual void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight) const = 0; }; + class IPen { public: IPen(){} virtual ~IPen(){} - virtual int GetColor() = 0; - virtual unsigned int GetStyle() = 0; - virtual double GetWidth() = 0; - virtual unsigned int GetAlpha() = 0; - virtual double GetMiterLimit() = 0; - virtual double GetDashOffset() = 0; - virtual void GetDashData(double*&, unsigned int&) = 0; + virtual int GetColor() const = 0; + virtual unsigned int GetStyle() const = 0; + virtual double GetWidth() const = 0; + virtual unsigned int GetAlpha() const = 0; + virtual double GetMiterLimit() const = 0; + virtual double GetDashOffset() const = 0; + virtual void GetDashData(double*&, unsigned int&) const = 0; }; class IRegion diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h b/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h index 6f9dddf77c..791446ee58 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFileRenderer.h @@ -197,14 +197,9 @@ namespace MetaFile if (NULL == m_pFile) return; - TRectL* pBounds = m_pFile->GetDCBounds(); - int nL = pBounds->Left; - int nR = pBounds->Right; - int nT = pBounds->Top; - int nB = pBounds->Bottom; - - m_dScaleX = m_dW / std::fabs((double)(nR - nL)); - m_dScaleY = m_dH / std::fabs((double)(nB - nT)); + const TRectL& oBounds{m_pFile->GetDCBounds()}; + m_dScaleX = m_dW / std::fabs((double)(oBounds.Right - oBounds.Left)); + m_dScaleY = m_dH / std::fabs((double)(oBounds.Bottom - oBounds.Top)); } double GetHeight() const @@ -293,7 +288,7 @@ namespace MetaFile } void DrawDriverString(const std::wstring& wsString, const std::vector& arPoints) { - IFont *pFont = m_pFile->GetFont(); + const IFont *pFont = m_pFile->GetFont(); if (NULL == pFont) return; @@ -356,7 +351,7 @@ namespace MetaFile void DrawString(std::wstring& wsText, unsigned int unCharsCount, double _dX, double _dY, double* pDx, int iGraphicsMode, double dXScale, double dYScale) { CheckEndPath(); - IFont* pFont = m_pFile->GetFont(); + const IFont* pFont = m_pFile->GetFont(); if (!pFont) return; @@ -991,7 +986,7 @@ namespace MetaFile } bool UpdateBrush() { - IBrush* pBrush = m_pFile->GetBrush(); + const IBrush* pBrush = m_pFile->GetBrush(); if (!pBrush) return false; @@ -1152,7 +1147,7 @@ namespace MetaFile if (m_bUpdatedClip) return; - CClip *pClip = m_pFile->GetClip(); + const CClip *pClip = m_pFile->GetClip(); if (NULL == pClip) return; @@ -1180,7 +1175,7 @@ namespace MetaFile } bool UpdatePen() { - IPen* pPen = m_pFile->GetPen(); + const IPen* pPen = m_pFile->GetPen(); if (!pPen) return false; diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileTypes.cpp b/DesktopEditor/raster/Metafile/Common/MetaFileTypes.cpp index 3b1ee749f5..b6293a91ce 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileTypes.cpp +++ b/DesktopEditor/raster/Metafile/Common/MetaFileTypes.cpp @@ -62,7 +62,7 @@ namespace MetaFile a = oRGBA.a; } - int TRGBA::ToInt() + int TRGBA::ToInt() const { return METAFILE_RGBA(r, g, b, a); } @@ -74,6 +74,26 @@ namespace MetaFile b = t; } + unsigned char TRGBA::GetRed() const + { + return r; + } + + unsigned char TRGBA::GetGreen() const + { + return g; + } + + unsigned char TRGBA::GetBlue() const + { + return b; + } + + unsigned char TRGBA::GetAlpha() const + { + return a; + } + TXForm::TXForm() : M11(1), M12(0), M21(0), M22(1), Dx(0), Dy(0) {} @@ -101,14 +121,24 @@ namespace MetaFile return; M11 = pOther->M11; - M12 = pOther->M12; - M21 = pOther->M21; - M22 = pOther->M22; - Dx = pOther->Dx; - Dy = pOther->Dy; + M12 = pOther->M12; + M21 = pOther->M21; + M22 = pOther->M22; + Dx = pOther->Dx; + Dy = pOther->Dy; } - void TXForm::Multiply(TXForm &oOther, unsigned int ulMode) + void TXForm::Copy(const TXForm& oOther) + { + M11 = oOther.M11; + M12 = oOther.M12; + M21 = oOther.M21; + M22 = oOther.M22; + Dx = oOther.Dx; + Dy = oOther.Dy; + } + + void TXForm::Multiply(const TXForm &oOther, unsigned int ulMode) { if (MWT_IDENTITY == ulMode) Init(); @@ -154,7 +184,7 @@ namespace MetaFile } } - void TXForm::Apply(double &dX, double &dY) + void TXForm::Apply(double &dX, double &dY) const { double _dX = dX; double _dY = dY; diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileTypes.h b/DesktopEditor/raster/Metafile/Common/MetaFileTypes.h index 427b2178ae..44fbc99b29 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileTypes.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFileTypes.h @@ -549,8 +549,13 @@ namespace MetaFile void Set(unsigned char _r, unsigned char _g, unsigned char _b, unsigned char _a = 0); void Copy(const TRGBA &oRGBA); - int ToInt(); + int ToInt() const; void SwapToBGR(); + + unsigned char GetRed() const; + unsigned char GetGreen() const; + unsigned char GetBlue() const; + unsigned char GetAlpha() const; }; struct TXForm @@ -568,8 +573,9 @@ namespace MetaFile void Init(); void Copy(const TXForm* pOther); - void Multiply(TXForm &oOther, unsigned int ulMode); - void Apply(double& dX, double& dY); + void Copy(const TXForm& oOther); + void Multiply(const TXForm& oOther, unsigned int ulMode); + void Apply(double& dX, double& dY) const; }; } diff --git a/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h b/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h index 7767bd9c97..0001315f0b 100644 --- a/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h +++ b/DesktopEditor/raster/Metafile/Common/MetaFileUtils.h @@ -1068,7 +1068,7 @@ namespace MetaFile return false; } - unsigned int Tell() + unsigned int Tell() const { return (unsigned int)(pCur - pBuffer); } @@ -1092,7 +1092,7 @@ namespace MetaFile ClearCurrentBlockSize(); } - unsigned int CanRead() + unsigned int CanRead() const { return (unsigned int)(pEnd - pCur); } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfFile.h b/DesktopEditor/raster/Metafile/Emf/EmfFile.h index d296724fd1..8d40755bd0 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfFile.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfFile.h @@ -117,7 +117,7 @@ namespace MetaFile m_pParser->SetFontManager(pFontManager); } - bool CheckError() + bool CheckError() const { return m_pParser->CheckError(); } @@ -142,7 +142,7 @@ namespace MetaFile m_pParser->SetInterpretator(oInterpretatorType, unWidth, unHeight); } - TRectL* GetBounds() + const TRectL& GetBounds() const { return m_pParser->GetBounds(); } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfInterpretator/CEmfInterpretatorSvg.cpp b/DesktopEditor/raster/Metafile/Emf/EmfInterpretator/CEmfInterpretatorSvg.cpp index e3d1d13433..c2a4f1252e 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfInterpretator/CEmfInterpretatorSvg.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfInterpretator/CEmfInterpretatorSvg.cpp @@ -200,7 +200,7 @@ namespace MetaFile double dStartAngle = GetEllipseAngle(oBox.Left, oBox.Top, oBox.Right, oBox.Bottom, oStart.X, oStart.Y); double dSweepAngle = GetEllipseAngle(oBox.Left, oBox.Top, oBox.Right, oBox.Bottom, oEnd.X, oEnd.Y); - if (NULL != m_pParser && m_pParser->GetTransform()->M22 < 0) + if (NULL != m_pParser && m_pParser->GetTransform().M22 < 0) { dStartAngle *= -1; dSweepAngle *= -1; @@ -263,7 +263,7 @@ namespace MetaFile double dStartAngle = GetEllipseAngle(oBox.Left, oBox.Top, oBox.Right, oBox.Bottom, oStart.X, oStart.Y); double dSweepAngle = GetEllipseAngle(oBox.Left, oBox.Top, oBox.Right, oBox.Bottom, oEnd.X, oEnd.Y); - if (NULL != m_pParser && m_pParser->GetTransform()->M22 < 0) + if (NULL != m_pParser && m_pParser->GetTransform().M22 < 0) { dStartAngle *= -1; dSweepAngle *= -1; @@ -1062,7 +1062,7 @@ namespace MetaFile { TRectD oNewRect = oRect.ToRectD(); - if (NULL != m_pParser && m_pParser->GetTransform()->M22 < 0) + if (NULL != m_pParser && m_pParser->GetTransform().M22 < 0) { dStartAngle *= -1; dSweepAngle *= -1; @@ -1140,7 +1140,7 @@ namespace MetaFile if (NULL == m_pParser || wsString.size() != arGlyphPos.size()) return; - IFont *pFont = m_pParser->GetFont(); + const IFont *pFont = m_pParser->GetFont(); if (NULL == pFont) return; @@ -1308,7 +1308,7 @@ namespace MetaFile void CEmfInterpretatorSvg::HANDLE_EMFPLUS_DRAWSTRING(short shOgjectIndex, unsigned int unBrushId, unsigned int unFormatID, const std::wstring &wsString, const TEmfPlusRectF &oRect) { - WriteText(wsString, TPointD(oRect.dX, oRect.dY), oRect.ToRectL(), TPointD(m_pParser->GetTransform()->M11, m_pParser->GetTransform()->M22)); + WriteText(wsString, TPointD(oRect.dX, oRect.dY), oRect.ToRectL(), TPointD(m_pParser->GetTransform().M11, m_pParser->GetTransform().M22)); } void CEmfInterpretatorSvg::HANDLE_EMFPLUS_FILLCLOSEDCURVE(unsigned int unBrushId, double dTension, const std::vector &arPoints) @@ -1389,8 +1389,8 @@ namespace MetaFile { oTempRect = oRect.ToRectD(); - m_pParser->GetTransform()->Apply(oTempRect.Left, oTempRect.Top); - m_pParser->GetTransform()->Apply(oTempRect.Right, oTempRect.Bottom); + m_pParser->GetTransform().Apply(oTempRect.Left, oTempRect.Top); + m_pParser->GetTransform().Apply(oTempRect.Right, oTempRect.Bottom); wsValue += L"M " + ConvertToWString(oTempRect.Left) + L',' + ConvertToWString(oTempRect.Top) + L" L " + ConvertToWString(oTempRect.Right) + L',' + ConvertToWString(oTempRect.Top) + L' ' + diff --git a/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp b/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp index 94dff91dda..8cec00d90b 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfObjects.cpp @@ -46,7 +46,7 @@ namespace MetaFile CEmfObjectBase::~CEmfObjectBase() {} - EEmfObjectType CEmfObjectBase::GetType() + EEmfObjectType CEmfObjectBase::GetType() const { return EMF_OBJECT_UNKNOWN; } @@ -63,7 +63,7 @@ namespace MetaFile RELEASEOBJECT(pDibBuffer); } - EEmfObjectType CEmfLogBrushEx::GetType() + EEmfObjectType CEmfLogBrushEx::GetType() const { return EMF_OBJECT_BRUSH; } @@ -102,57 +102,57 @@ namespace MetaFile #endif } - int CEmfLogBrushEx::GetColor() + int CEmfLogBrushEx::GetColor() const { return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); } - int CEmfLogBrushEx::GetColor2() + int CEmfLogBrushEx::GetColor2() const { return 0; } - unsigned int CEmfLogBrushEx::GetStyle() + unsigned int CEmfLogBrushEx::GetStyle() const { return unBrushStyle; } - unsigned int CEmfLogBrushEx::GetStyleEx() + unsigned int CEmfLogBrushEx::GetStyleEx() const { return 0; } - unsigned int CEmfLogBrushEx::GetHatch() + unsigned int CEmfLogBrushEx::GetHatch() const { return unBrushHatch; } - unsigned int CEmfLogBrushEx::GetAlpha() + unsigned int CEmfLogBrushEx::GetAlpha() const { return 0xff; } - unsigned int CEmfLogBrushEx::GetAlpha2() + unsigned int CEmfLogBrushEx::GetAlpha2() const { return 0xff; } - std::wstring CEmfLogBrushEx::GetDibPatterPath() + std::wstring CEmfLogBrushEx::GetDibPatterPath() const { return wsDibPatternPath; } - void CEmfLogBrushEx::GetBounds(double &left, double &top, double &width, double &height) + void CEmfLogBrushEx::GetBounds(double &left, double &top, double &width, double &height) const {} - void CEmfLogBrushEx::GetCenterPoint(double &dX, double &dY) + void CEmfLogBrushEx::GetCenterPoint(double &dX, double &dY) const {} - void CEmfLogBrushEx::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) + void CEmfLogBrushEx::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) const { - *pBuffer = pDibBuffer; - unWidth = unDibWidth; - unHeight = unDibHeigth; + *pBuffer = pDibBuffer; + unWidth = unDibWidth; + unHeight = unDibHeigth; } CEmfLogFont::CEmfLogFont(bool bFixedLength) : m_bFixedLength(bFixedLength) @@ -165,57 +165,57 @@ namespace MetaFile RELEASEOBJECT(oDesignVector.pValues); } - EEmfObjectType CEmfLogFont::GetType() + EEmfObjectType CEmfLogFont::GetType() const { return EMF_OBJECT_FONT; } - double CEmfLogFont::GetHeight() + double CEmfLogFont::GetHeight() const { return (double)oLogFontEx.oLogFont.nHeight; } - std::wstring CEmfLogFont::GetFaceName() + std::wstring CEmfLogFont::GetFaceName() const { - return std::wstring(NSFile::CUtf8Converter::GetWStringFromUTF16(oLogFontEx.oLogFont.ushFaceName, 32).c_str()); + return NSFile::CUtf8Converter::GetWStringFromUTF16(oLogFontEx.oLogFont.ushFaceName, 32); } - int CEmfLogFont::GetWeight() + int CEmfLogFont::GetWeight() const { return oLogFontEx.oLogFont.nWeight; } - bool CEmfLogFont::IsItalic() + bool CEmfLogFont::IsItalic() const { - return (0x01 == oLogFontEx.oLogFont.uchItalic ? true : false); + return 0x01 == oLogFontEx.oLogFont.uchItalic; } - bool CEmfLogFont::IsStrikeOut() + bool CEmfLogFont::IsStrikeOut() const { - return (0x01 == oLogFontEx.oLogFont.uchStrikeOut ? true : false); + return 0x01 == oLogFontEx.oLogFont.uchStrikeOut; } - bool CEmfLogFont::IsUnderline() + bool CEmfLogFont::IsUnderline() const { - return (0x01 == oLogFontEx.oLogFont.uchUnderline ? true : false); + return 0x01 == oLogFontEx.oLogFont.uchUnderline ; } - int CEmfLogFont::GetEscapement() + int CEmfLogFont::GetEscapement() const { return oLogFontEx.oLogFont.nEscapement; } - int CEmfLogFont::GetCharSet() + int CEmfLogFont::GetCharSet() const { return oLogFontEx.oLogFont.uchCharSet; } - bool CEmfLogFont::IsFixedLength() + bool CEmfLogFont::IsFixedLength() const { return m_bFixedLength; } - int CEmfLogFont::GetOrientation() + int CEmfLogFont::GetOrientation() const { return oLogFontEx.oLogFont.nOrientation; } @@ -229,42 +229,42 @@ namespace MetaFile RELEASEOBJECT(pStyleEntry); } - EEmfObjectType CEmfLogPen::GetType() + EEmfObjectType CEmfLogPen::GetType() const { return EMF_OBJECT_PEN; } - int CEmfLogPen::GetColor() + int CEmfLogPen::GetColor() const { return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, oColor.a); } - unsigned int CEmfLogPen::GetStyle() + unsigned int CEmfLogPen::GetStyle() const { return unPenStyle; } - double CEmfLogPen::GetWidth() + double CEmfLogPen::GetWidth() const { return (double)unWidth; } - unsigned int CEmfLogPen::GetAlpha() + unsigned int CEmfLogPen::GetAlpha() const { return 0xff; } - double CEmfLogPen::GetMiterLimit() + double CEmfLogPen::GetMiterLimit() const { return 0; } - double CEmfLogPen::GetDashOffset() + double CEmfLogPen::GetDashOffset() const { return 0; } - void CEmfLogPen::GetDashData(double *&arDatas, unsigned int &unSize) + void CEmfLogPen::GetDashData(double *&arDatas, unsigned int &unSize) const { arDatas = NULL; unSize = 0; @@ -278,7 +278,7 @@ namespace MetaFile RELEASEOBJECT(pPaletteEntries); } - EEmfObjectType CEmfLogPalette::GetType() + EEmfObjectType CEmfLogPalette::GetType() const { return EMF_OBJECT_PALETTE; } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfObjects.h b/DesktopEditor/raster/Metafile/Emf/EmfObjects.h index d75fa92f16..a466dc0a8d 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfObjects.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfObjects.h @@ -53,7 +53,7 @@ namespace MetaFile public: CEmfObjectBase(); virtual ~CEmfObjectBase(); - virtual EEmfObjectType GetType(); + virtual EEmfObjectType GetType() const; }; class CEmfLogBrushEx : public CEmfObjectBase, public IBrush @@ -61,22 +61,22 @@ namespace MetaFile public: CEmfLogBrushEx(); virtual ~CEmfLogBrushEx(); - virtual EEmfObjectType GetType(); + virtual EEmfObjectType GetType() const override; void SetDibPattern(unsigned char* pBuffer, unsigned int ulWidth, unsigned int ulHeight); // IBrush - int GetColor(); - int GetColor2(); - unsigned int GetStyle(); - unsigned int GetStyleEx(); - unsigned int GetHatch(); - unsigned int GetAlpha(); - unsigned int GetAlpha2(); - std::wstring GetDibPatterPath(); - void GetBounds(double& left, double& top, double& width, double& height); - void GetCenterPoint(double& dX, double& dY); - void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight); + int GetColor() const override; + int GetColor2() const override; + unsigned int GetStyle() const override; + unsigned int GetStyleEx() const override; + unsigned int GetHatch() const override; + unsigned int GetAlpha() const override; + unsigned int GetAlpha2() const override; + std::wstring GetDibPatterPath() const override; + void GetBounds(double& left, double& top, double& width, double& height) const override; + void GetCenterPoint(double& dX, double& dY) const override; + void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight) const override; public: unsigned int unBrushStyle; TRGBA oColor; @@ -92,19 +92,20 @@ namespace MetaFile public: CEmfLogFont(bool bFixedLength = false); virtual ~CEmfLogFont(); - virtual EEmfObjectType GetType(); + virtual EEmfObjectType GetType() const override; + + bool IsFixedLength() const; // IFont - double GetHeight(); - std::wstring GetFaceName(); - int GetWeight(); - bool IsItalic(); - bool IsStrikeOut(); - bool IsUnderline(); - int GetEscapement(); - int GetCharSet(); - bool IsFixedLength(); - int GetOrientation(); + double GetHeight() const override; + int GetWeight() const override; + bool IsItalic() const override; + bool IsStrikeOut() const override; + bool IsUnderline() const override; + int GetEscapement() const override; + int GetCharSet() const override; + int GetOrientation() const override; + std::wstring GetFaceName() const override; public: TEmfLogFontEx oLogFontEx; TEmfDesignVector oDesignVector; @@ -118,16 +119,16 @@ namespace MetaFile public: CEmfLogPen(); virtual ~CEmfLogPen(); - virtual EEmfObjectType GetType(); + virtual EEmfObjectType GetType() const override; // IPen - int GetColor(); - unsigned int GetStyle(); - double GetWidth(); - unsigned int GetAlpha(); - double GetMiterLimit(); - double GetDashOffset(); - void GetDashData(double*& arDatas, unsigned int& unSize); + int GetColor() const override; + unsigned int GetStyle() const override; + double GetWidth() const override; + unsigned int GetAlpha() const override; + double GetMiterLimit() const override; + double GetDashOffset() const override; + void GetDashData(double*& arDatas, unsigned int& unSize) const override; public: unsigned int unPenStyle; unsigned int unWidth; @@ -141,7 +142,7 @@ namespace MetaFile public: CEmfLogPalette(); virtual ~CEmfLogPalette(); - virtual EEmfObjectType GetType(); + virtual EEmfObjectType GetType() const override; public: unsigned short ushNumberOfEntries; TEmfLogPaletteEntry* pPaletteEntries; diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp index 55be9415b8..f170434373 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.cpp @@ -403,7 +403,7 @@ namespace MetaFile CEmfParserBase::ClearFile(); } - EmfParserType CEmfParser::GetType() + EmfParserType CEmfParser::GetType() const { return EmfParserType::EmfParser; } @@ -1644,6 +1644,7 @@ namespace MetaFile { m_pEmfPlusParser = new CEmfPlusParser(m_pInterpretator, m_oHeader); m_pEmfPlusParser->SetFontManager(GetFontManager()); + m_pEmfPlusParser->SetParent(this); } m_pEmfPlusParser->SetStream(m_oStream.GetCurPtr(), m_ulRecordSize - 8); @@ -1679,6 +1680,7 @@ namespace MetaFile oWmfParser.SetFontManager(GetFontManager()); oWmfParser.SetStream(m_oStream.GetCurPtr(), unWinMetafileSize); + oWmfParser.SetParent(this); oWmfParser.Scan(); if (oWmfParser.CheckError()) @@ -1701,11 +1703,11 @@ namespace MetaFile XmlUtils::CXmlWriter *pXmlWriter = ((CEmfInterpretatorSvg*)m_pInterpretator)->GetXmlWriter(); - TRectL* pWmfRect = oWmfParser.GetDCBounds(); - TRectL *pCurentRect = GetDCBounds(); + const TRectL& oWmfRect{oWmfParser.GetDCBounds()}; + const TRectL& oCurentRect{GetDCBounds()}; - const double dScaleX = std::abs((double)(pCurentRect->Right - pCurentRect->Left) / (double)(pWmfRect->Right - pWmfRect->Left)); - const double dScaleY = std::abs((double)(pCurentRect->Bottom - pCurentRect->Top) / (double)(pWmfRect->Bottom - pWmfRect->Top)); + const double dScaleX = std::abs((double)(oCurentRect.Right - oCurentRect.Left) / (double)(oWmfRect.Right - oWmfRect.Left)); + const double dScaleY = std::abs((double)(oCurentRect.Bottom - oCurentRect.Top) / (double)(oWmfRect.Bottom - oWmfRect.Top)); const bool bAddGElement = !Equals(1., dScaleX) || !Equals(1., dScaleY); diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h index f2e2bc083f..f2870789b7 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h @@ -20,7 +20,7 @@ namespace MetaFile void ClearFile() override; - EmfParserType GetType() override; + EmfParserType GetType() const override; void SetStream(BYTE* pBuf, unsigned int unSize); private: CEmfPlusParser *m_pEmfPlusParser; diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp index b399b68d31..18423b0fc0 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.cpp @@ -236,12 +236,12 @@ namespace MetaFile } } - void CEmfParserBase::TranslatePoint(TPointL &oPoint, double &dX, double &dY) + void CEmfParserBase::TranslatePoint(TPointL &oPoint, double &dX, double &dY) const { TranslatePoint(oPoint.X, oPoint.Y, dX, dY); } - void CEmfParserBase::TranslatePoint(int nX, int nY, double &dX, double &dY) + void CEmfParserBase::TranslatePoint(int nX, int nY, double &dX, double &dY) const { dX = (double)nX; dY = (double)nY; @@ -453,7 +453,7 @@ namespace MetaFile if (!oText.pOutputString) return SetError(); - IFont* pFont = GetFont(); + const IFont* pFont = GetFont(); NSStringExt::CConverter::ESingleByteEncoding eCharSet = NSStringExt::CConverter::ESingleByteEncoding::SINGLE_BYTE_ENCODING_DEFAULT; if (pFont) { @@ -605,12 +605,9 @@ namespace MetaFile } CEmfParserBase::CEmfParserBase() - : m_oPlayer(this) + : m_oPlayer(this), m_pPath(NULL), m_pInterpretator(NULL), m_bEof(false) { - m_pPath = NULL; - m_pDC = m_oPlayer.GetDC(); - m_pInterpretator = NULL; - m_bEof = false; + m_pDC = m_oPlayer.GetDC(); } CEmfParserBase::~CEmfParserBase(){} @@ -625,35 +622,34 @@ namespace MetaFile m_bEof = false; } - TRectL *CEmfParserBase::GetDCBounds() + const TRectL& CEmfParserBase::GetDCBounds() const { - return &m_oHeader.oFrameToBounds; + return m_oHeader.oFrameToBounds; } - - CClip *CEmfParserBase::GetClip() + + const CClip *CEmfParserBase::GetClip() const { return m_pDC->GetClip(); } - double CEmfParserBase::GetPixelHeight() + double CEmfParserBase::GetPixelHeight() const { return m_pDC->GetPixelHeight(); } - double CEmfParserBase::GetPixelWidth() + double CEmfParserBase::GetPixelWidth() const { return m_pDC->GetPixelWidth(); } - int CEmfParserBase::GetTextColor() + int CEmfParserBase::GetTextColor() const { - TRGBA& oColor = m_pDC->GetTextColor(); - return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); + return m_pDC->GetTextColor().ToInt(); } - IFont *CEmfParserBase::GetFont() + const IFont *CEmfParserBase::GetFont() const { - IFont* pFont = m_pDC->GetFont(); + const IFont* pFont = m_pDC->GetFont(); if (!pFont) return NULL; @@ -661,46 +657,37 @@ namespace MetaFile return pFont; } - IBrush *CEmfParserBase::GetBrush() + const IBrush *CEmfParserBase::GetBrush() const { - IBrush* pBrush = m_pDC->GetBrush(); - if (!pBrush) - return NULL; - - return pBrush; + return m_pDC->GetBrush(); } - IPen *CEmfParserBase::GetPen() + const IPen *CEmfParserBase::GetPen() const { - IPen* pPen = m_pDC->GetPen(); - if (!pPen) - return NULL; - - return pPen; + return m_pDC->GetPen(); } - unsigned int CEmfParserBase::GetTextAlign() + unsigned int CEmfParserBase::GetTextAlign() const { return m_pDC->GetTextAlign(); } - unsigned int CEmfParserBase::GetTextBgMode() + unsigned int CEmfParserBase::GetTextBgMode() const { return m_pDC->GetBgMode(); } - int CEmfParserBase::GetTextBgColor() + int CEmfParserBase::GetTextBgColor() const { - TRGBA& oColor = m_pDC->GetBgColor(); - return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); + return m_pDC->GetBgColor()->ToInt(); } - unsigned int CEmfParserBase::GetFillMode() + unsigned int CEmfParserBase::GetFillMode() const { return m_pDC->GetFillMode(); } - TPointD CEmfParserBase::GetCurPos() + TPointD CEmfParserBase::GetCurPos() const { TPointL oPoint = m_pDC->GetCurPos(); TPointD oRes; @@ -708,85 +695,80 @@ namespace MetaFile return oRes; } - TXForm *CEmfParserBase::GetInverseTransform() + const TXForm& CEmfParserBase::GetInverseTransform() const { return m_pDC->GetInverseTransform(); } - TXForm *CEmfParserBase::GetTransform(int iGraphicsMode) + const TXForm& CEmfParserBase::GetTransform(int iGraphicsMode) { - TRectL* pBounds = GetDCBounds(); - double dT = pBounds->Top; - double dL = pBounds->Left; + double dT = GetDCBounds().Top; + double dL = GetDCBounds().Left; TXForm oShiftXForm(1, 0, 0, 1, -dL, -dT); - m_oTransform.Copy(m_pDC->GetFinalTransform(iGraphicsMode)); + m_oTransform.Copy(&m_pDC->GetFinalTransform(iGraphicsMode)); m_oTransform.Multiply(oShiftXForm, MWT_RIGHTMULTIPLY); - return &m_oTransform; + return m_oTransform; } - unsigned int CEmfParserBase::GetMiterLimit() + unsigned int CEmfParserBase::GetMiterLimit() const { return m_pDC->GetMiterLimit(); } - unsigned int CEmfParserBase::GetRop2Mode() + unsigned int CEmfParserBase::GetRop2Mode() const { return m_pDC->GetRop2Mode(); } - int CEmfParserBase::GetCharSpace() + int CEmfParserBase::GetCharSpace() const { return 0; } - bool CEmfParserBase::IsWindowFlippedY() + bool CEmfParserBase::IsWindowFlippedY() const { - TEmfWindow* pWindow = m_pDC->GetWindow(); - return (pWindow->ulH < 0); + return m_pDC->GetWindow().ulH < 0; } - bool CEmfParserBase::IsWindowFlippedX() + bool CEmfParserBase::IsWindowFlippedX() const { - TEmfWindow* pWindow = m_pDC->GetWindow(); - return (pWindow->ulW < 0); + return m_pDC->GetWindow().ulW < 0; } - unsigned int CEmfParserBase::GetMapMode() + unsigned int CEmfParserBase::GetMapMode() const { return m_pDC->GetMapMode(); } - USHORT CEmfParserBase::GetDpi() + USHORT CEmfParserBase::GetDpi() const { return 96; } - IRegion *CEmfParserBase::GetRegion() + const IRegion *CEmfParserBase::GetRegion() const { return NULL; } - unsigned int CEmfParserBase::GetArcDirection() + unsigned int CEmfParserBase::GetArcDirection() const { return m_pDC->GetArcDirection(); } - CPath *CEmfParserBase::GetPath() + const CPath *CEmfParserBase::GetPath() const { return m_pPath; } - bool CEmfParserBase::IsViewportFlippedY() + bool CEmfParserBase::IsViewportFlippedY() const { - TEmfWindow* pViewport = m_pDC->GetViewport(); - return (pViewport->ulH < 0); + return m_pDC->GetViewport().ulH < 0; } - bool CEmfParserBase::IsViewportFlippedX() + bool CEmfParserBase::IsViewportFlippedX() const { - TEmfWindow* pViewport = m_pDC->GetViewport(); - return (pViewport->ulW < 0); + return m_pDC->GetViewport().ulW < 0; } void CEmfParserBase::SetInterpretator(IOutputDevice *pOutput) @@ -837,17 +819,28 @@ namespace MetaFile return m_pInterpretator; } - TRectL* CEmfParserBase::GetBounds() + TXForm CEmfParserBase::CalculateCurrentTransform() const { - return &m_oHeader.oFramePx; + if (NULL == m_pParent) + return m_pDC->GetTransform(); + + TXForm oTransform{m_pParent->CalculateCurrentTransform()}; + oTransform.Multiply(m_pDC->GetTransform(), MWT_RIGHTMULTIPLY); + + return oTransform; } - CPath *CEmfParserBase::GetPath() const + const TRectL& CEmfParserBase::GetBounds() const + { + return m_oHeader.oFramePx; + } + + CPath *CEmfParserBase::GetPath() { return m_pPath; } - TPointL CEmfParserBase::GetStartPointForArc(const TRectL &oBox, double dStartAngle) + TPointL CEmfParserBase::GetStartPointForArc(const TRectL &oBox, double dStartAngle) const { TPointL oStartPoint; @@ -1310,7 +1303,7 @@ namespace MetaFile if (NULL != m_pPath) { - m_pDC->GetClip()->SetPath(*m_pPath, unRegionMode, *GetDC()->GetFinalTransform(GM_ADVANCED)); + m_pDC->GetClip()->SetPath(*m_pPath, unRegionMode, m_pDC->GetFinalTransform(GM_ADVANCED)); RELEASEOBJECT(m_pPath); UpdateOutputDC(); } @@ -1356,9 +1349,9 @@ namespace MetaFile TranslatePoint(oClip.Left, oClip.Top, oClipRect.Left, oClipRect.Top); TranslatePoint(oClip.Right, oClip.Bottom, oClipRect.Right, oClipRect.Bottom); - TRectL* pRect = GetDCBounds(); - TranslatePoint(pRect->Left, pRect->Top, oBB.Left, oBB.Top); - TranslatePoint(pRect->Right, pRect->Bottom, oBB.Right, oBB.Bottom); + const TRectL& oRect{GetDCBounds()}; + TranslatePoint(oRect.Left, oRect.Top, oBB.Left, oBB.Top); + TranslatePoint(oRect.Right, oRect.Bottom, oBB.Right, oBB.Bottom); m_pDC->GetClip()->Exclude(oClipRect, oBB); UpdateOutputDC(); @@ -1713,12 +1706,12 @@ namespace MetaFile return; CEmfPlusBrush oBrush; - oBrush.unStyle = BS_LINEARGRADIENT; + oBrush.unStyle = BS_LINEARGRADIENT; - oBrush.oColor.chRed = arVertex[0].ushRed / 255.; - oBrush.oColor.chGreen = arVertex[0].ushGreen / 255.; - oBrush.oColor.chBlue = arVertex[0].ushBlue / 255.; - oBrush.oColor.chAlpha = 255; + oBrush.oColor.chRed = arVertex[0].ushRed / 255.; + oBrush.oColor.chGreen = arVertex[0].ushGreen / 255.; + oBrush.oColor.chBlue = arVertex[0].ushBlue / 255.; + oBrush.oColor.chAlpha = 255; if (GRADIENT_FILL_RECT_H == unFillMode || GRADIENT_FILL_TRIANGLE == unFillMode) { @@ -1744,7 +1737,7 @@ namespace MetaFile } oBrush.oColorBack.chAlpha = 255; - IBrush* pBrush = m_pDC->GetBrush(); + const IBrush* pBrush = m_pDC->GetBrush(); m_pDC->SetBrush(&oBrush); MoveTo(arVertex[0].nX, arVertex[0].nY); @@ -1760,7 +1753,7 @@ namespace MetaFile m_pInterpretator->HANDLE_EMR_GRADIENTFILL(arVertex, arIndexes, unFillMode); m_pDC->RemoveBrush(&oBrush); - m_pDC->SetBrush(pBrush); + m_pDC->SetBrush((IBrush*)pBrush); } void CEmfParserBase::HANDLE_EMR_UNKNOWN(const unsigned int& unRecordSize) diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h index 5334182be0..8b7b0f6bc9 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParserBase.h @@ -79,37 +79,38 @@ namespace MetaFile virtual void PlayFile() = 0; virtual void Scan() = 0; - virtual EmfParserType GetType() = 0; + virtual EmfParserType GetType() const = 0; - void PlayMetaFile() override; - void ClearFile() override; - TRectL* GetDCBounds() override; - CClip* GetClip() override; - double GetPixelHeight() override; - double GetPixelWidth() override; - int GetTextColor() override; - IFont* GetFont() override; - IBrush* GetBrush() override; - IPen* GetPen() override; - unsigned int GetTextAlign() override; - unsigned int GetTextBgMode() override; - int GetTextBgColor() override; - unsigned int GetFillMode() override; - TPointD GetCurPos() override; - TXForm* GetInverseTransform() override; - TXForm* GetTransform(int = GM_ADVANCED) override; - unsigned int GetMiterLimit() override; - unsigned int GetRop2Mode() override; - int GetCharSpace() override; - bool IsWindowFlippedY() override; - bool IsWindowFlippedX() override; - unsigned int GetMapMode() override; - USHORT GetDpi() override; - IRegion* GetRegion() override; - unsigned int GetArcDirection() override; - CPath* GetPath() override; - bool IsViewportFlippedY(); - bool IsViewportFlippedX(); + void PlayMetaFile() override; + void ClearFile() override; + const TRectL& GetDCBounds() const override; + const CClip* GetClip() const override; + double GetPixelHeight() const override; + double GetPixelWidth() const override; + int GetTextColor() const override; + const IFont* GetFont() const override; + const IBrush* GetBrush() const override; + const IPen* GetPen() const override; + unsigned int GetTextAlign() const override; + unsigned int GetTextBgMode() const override; + int GetTextBgColor() const override; + unsigned int GetFillMode() const override; + TPointD GetCurPos() const override; + const TXForm& GetInverseTransform() const override; + const TXForm& GetTransform(int = GM_ADVANCED) override; + unsigned int GetMiterLimit() const override; + unsigned int GetRop2Mode() const override; + int GetCharSpace() const override; + bool IsWindowFlippedY() const override; + bool IsWindowFlippedX() const override; + unsigned int GetMapMode() const override; + USHORT GetDpi() const override; + const IRegion* GetRegion() const override; + unsigned int GetArcDirection() const override; + const CPath* GetPath() const override; + + bool IsViewportFlippedY() const; + bool IsViewportFlippedX() const; void SetInterpretator(IOutputDevice* pOutput); void SetInterpretator(const wchar_t *wsFilePath, InterpretatorType oInterpretatorType, unsigned int unWidth = 0, unsigned int unHeight = 0); @@ -118,9 +119,11 @@ namespace MetaFile CEmfInterpretatorBase* GetInterpretator(); - CEmfDC* GetDC(); - TRectL* GetBounds(); - CPath* GetPath() const; + TXForm CalculateCurrentTransform() const override; + + CEmfDC* GetDC(); + const TRectL& GetBounds() const; + CPath* GetPath(); private: //Работа с изображениями void ImageProcessing(const TEmfAlphaBlend &oTEmfAlphaBlend); @@ -132,8 +135,8 @@ namespace MetaFile void DrawImage(int nX, int nY, int nW, int nH, BYTE *pImageBuffer, unsigned int unImageW, unsigned int unImageH); //---------------------- - void TranslatePoint(TPointL &oPoint, double &dX, double &dY); - void TranslatePoint(int nX, int nY, double &dX, double &dY); + void TranslatePoint(TPointL &oPoint, double &dX, double &dY) const; + void TranslatePoint(int nX, int nY, double &dX, double &dY) const; void UpdateOutputDC(); void ClosePath(); @@ -176,13 +179,13 @@ namespace MetaFile CPath* m_pPath; TEmfXForm m_oTransform; - CEmfInterpretatorBase *m_pInterpretator; + CEmfInterpretatorBase* m_pInterpretator; bool m_bEof; private: virtual bool ReadImage(unsigned int offBmi, unsigned int cbBmi, unsigned int offBits, unsigned int cbBits, unsigned int ulSkip, BYTE **ppBgraBuffer, unsigned int *pulWidth, unsigned int *pulHeight) = 0; - TPointL GetStartPointForArc(const TRectL &oBox, double dStartAngle); + TPointL GetStartPointForArc(const TRectL &oBox, double dStartAngle) const; void SaveDC(); void RestoreDC(int nIndex); @@ -425,6 +428,5 @@ namespace MetaFile void HANDLE_EMR_FRAMERGN(const TRectL& oBounds, unsigned int unIhBrush, int nWidth, int nHeight, const TRegionDataHeader& oRegionDataHeader, const std::vector& arRects); }; - } #endif // CEMFPARSERBASE_H diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp index 9c9265a96b..eff536c1d3 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.cpp @@ -255,7 +255,7 @@ namespace MetaFile m_oStream >> unSize; m_oStream >> m_ulRecordSize; - if (unSize < 12 || unSize > m_oStream.CanRead() || m_ulRecordSize > (unSize - 12)) + if (unSize < 12 || m_ulRecordSize > m_oStream.CanRead() || m_ulRecordSize > (unSize - 12)) break; m_oStream.SetCurrentBlockSize(m_ulRecordSize); @@ -368,12 +368,12 @@ namespace MetaFile this->ClearFile(); } - USHORT CEmfPlusParser::GetDpi() + USHORT CEmfPlusParser::GetDpi() const { return m_unLogicalDpiX; } - EmfParserType CEmfPlusParser::GetType() + EmfParserType CEmfPlusParser::GetType() const { return EmfParserType::EmfPlusParser; } @@ -736,7 +736,7 @@ namespace MetaFile switch (nStartCap) { - case 0: pEmfPlusPen->unStyle |= PS_STARTCAP_MASK & PS_STARTCAP_FLAT; break; + case 0: pEmfPlusPen->unStyle |= PS_STARTCAP_MASK & PS_STARTCAP_FLAT; break; case 1: pEmfPlusPen->unStyle |= PS_STARTCAP_MASK & PS_STARTCAP_SQUARE; break; case 2: pEmfPlusPen->unStyle |= PS_STARTCAP_MASK & PS_STARTCAP_ROUND; break; } @@ -1365,7 +1365,7 @@ namespace MetaFile oPath.LineTo(oClip.Left, oClip.Bottom); oPath.Close(); - m_pDC->GetClip()->SetPath(oPath, nMode, *GetTransform()); + m_pDC->GetClip()->SetPath(oPath, nMode, GetTransform()); UpdateOutputDC(); } @@ -1524,40 +1524,60 @@ namespace MetaFile case MetafileDataTypeEmfPlusOnly: case MetafileDataTypeEmfPlusDual: { - CEmfParser oParser; - // oParser.SetOnlyEmf(true); - return DrawMetafile(oParser, pBuffer, unSizeBuffer, oSrcRect, arPoints); + return DrawMetafile(pBuffer, unSizeBuffer, oSrcRect, arPoints); } case MetafileDataTypeWmf: case MetafileDataTypeWmfPlaceable: { - CWmfParser oParser; - return DrawMetafile(oParser, pBuffer, unSizeBuffer, oSrcRect, arPoints); + return DrawMetafile(pBuffer, unSizeBuffer, oSrcRect, arPoints); } } } } template - void CEmfPlusParser::DrawMetafile(MetafileType& oParser, BYTE *pBuffer, unsigned int unSize, const TEmfPlusRectF &oSrcRect, const std::vector &arPoints) + void CEmfPlusParser::DrawMetafile(BYTE *pBuffer, unsigned int unSize, const TEmfPlusRectF &oSrcRect, const std::vector &arPoints) { if (NULL == pBuffer || 0 == unSize || 3 != arPoints.size()) return; + const TRectL& oOriginalBounds{GetOriginalDCBounds()}; + const TXForm oCurrentTransform{CalculateCurrentTransform()}; + + bool bIsWokspace{false}; + + for (TEmfPlusPointF oPoint : arPoints) + { + oCurrentTransform.Apply(oPoint.X, oPoint.Y); + + if (oPoint.X > oOriginalBounds.Left && oPoint.X < oOriginalBounds.Right && + oPoint.Y > oOriginalBounds.Top && oPoint.Y < oOriginalBounds.Bottom) + { + bIsWokspace = true; + break; + } + } + + if (!bIsWokspace) + return; + + MetafileType oParser; + oParser.SetStream(pBuffer, unSize); oParser.SetFontManager(GetFontManager()); + oParser.SetParent(this); oParser.Scan(); if (oParser.CheckError()) return; - const TRectL* pFileBounds = oParser.GetDCBounds(); - const double dFileWidth = std::abs(pFileBounds->Right - pFileBounds->Left); - const double dFileHeight = std::abs(pFileBounds->Bottom - pFileBounds->Top); + const TRectL& oFileBounds{oParser.GetDCBounds()}; + const double dFileWidth = std::abs(oFileBounds.Right - oFileBounds.Left); + const double dFileHeight = std::abs(oFileBounds.Bottom - oFileBounds.Top); - const TRectL* pParentBounds = GetDCBounds(); - const double dParentWidth = std::abs(pParentBounds->Right - pParentBounds->Left); - const double dParentHeight = std::abs(pParentBounds->Bottom - pParentBounds->Top); + const TRectL& oParentBounds{GetDCBounds()}; + const double dParentWidth = std::abs(oParentBounds.Right - oParentBounds.Left); + const double dParentHeight = std::abs(oParentBounds.Bottom - oParentBounds.Top); if (InterpretatorType::Render == m_pInterpretator->GetType()) { @@ -1635,7 +1655,7 @@ namespace MetaFile oParser.PlayFile(); - TXForm *pXForm = m_pDC->GetTransform(); + const TXForm& oXForm{m_pDC->GetTransform()}; TRectD oRect; @@ -1646,14 +1666,14 @@ namespace MetaFile TRectD oTempSrcRect; - oTempSrcRect.Left = oSrcRect.dX - pFileBounds->Left; - oTempSrcRect.Top = oSrcRect.dY - pFileBounds->Top; + oTempSrcRect.Left = oSrcRect.dX - oFileBounds.Left; + oTempSrcRect.Top = oSrcRect.dY - oFileBounds.Top; oTempSrcRect.Right = oTempSrcRect.Left + ((dFileWidth > oSrcRect.dWidth) ? oSrcRect.dWidth - GetPixelWidth() : dFileWidth); oTempSrcRect.Bottom = oTempSrcRect.Top + ((dFileHeight > oSrcRect.dHeight) ? oSrcRect.dHeight - GetPixelHeight() : dFileHeight); TXForm oTransform; - oTransform.Copy(pXForm); + oTransform.Copy(oXForm); oTransform.Dx -= m_oHeader.oFramePx.Left; oTransform.Dy -= m_oHeader.oFramePx.Top; @@ -2020,7 +2040,7 @@ namespace MetaFile oColor.r = (unBrushId >> 16) & 0xFF; oColor.a = (unBrushId >> 24) & 0xFF; - TRGBA oTextColor = m_pDC->GetTextColor(); + const TRGBA oTextColor{m_pDC->GetTextColor()}; m_pDC->SetTextColor(oColor); @@ -2042,7 +2062,7 @@ namespace MetaFile oColor.r = pBrush->oColor.chRed; oColor.a = pBrush->oColor.chAlpha; - TRGBA oTextColor = m_pDC->GetTextColor(); + const TRGBA oTextColor{m_pDC->GetTextColor()}; m_pDC->SetTextColor(oColor); @@ -3261,7 +3281,7 @@ namespace MetaFile BYTE uchCM = ExpressValue(unShFlags, 8, 11); m_pDC->GetClip()->Reset(); - m_pDC->GetClip()->SetPath(*pPath, uchCM, *GetTransform()); + m_pDC->GetClip()->SetPath(*pPath, uchCM, GetTransform()); UpdateOutputDC(); if (NULL != m_pInterpretator) @@ -3307,7 +3327,7 @@ namespace MetaFile CEmfPlusRegionNodePath* pNodeRegionPath = (CEmfPlusRegionNodePath*)pNode; if (!pNodeRegionPath->Empty()) - m_pDC->GetClip()->SetPath(*pNodeRegionPath->GetPath(), shCM, *GetTransform()); + m_pDC->GetClip()->SetPath(*pNodeRegionPath->GetPath(), shCM, GetTransform()); break; } @@ -3324,7 +3344,7 @@ namespace MetaFile { CEmfPlusRegionNodeChild* pNodeRegionChild = (CEmfPlusRegionNodeChild*)pNode; - pNodeRegionChild->DrawOnClip(*m_pDC->GetClip(), *GetTransform(), GetDCBounds()); + pNodeRegionChild->DrawOnClip(*m_pDC->GetClip(), GetTransform(), &GetDCBounds()); break; } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h index b281fbad89..857f58c101 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfPlusParser.h @@ -21,9 +21,9 @@ namespace MetaFile void PlayFile() override; void Scan() override; - USHORT GetDpi() override; + USHORT GetDpi() const override; - EmfParserType GetType() override; + EmfParserType GetType() const override; void SetStream(BYTE *pBytes, unsigned int unSize); bool GetBanEMFProcesses(); @@ -78,7 +78,7 @@ namespace MetaFile void DrawImagePoints(unsigned int unImageIndex, unsigned int unImageAttributeIndex, const TEmfPlusRectF& oSrcRect, const std::vector& arPoints); template - void DrawMetafile(MetafileType& oParser, BYTE* pBuffer, unsigned int unSize, const TEmfPlusRectF& oSrcRect, const std::vector& arPoints); + void DrawMetafile(BYTE* pBuffer, unsigned int unSize, const TEmfPlusRectF& oSrcRect, const std::vector& arPoints); void DrawBitmap(BYTE* pBuffer, unsigned int unSize, unsigned int unWidth, unsigned int unHeight, const TEmfPlusRectF& oSrcRect, const std::vector& arPoints); TEmfPlusARGB ApplyImageAttributes(TEmfPlusRectF& oRectangle, const CEmfPlusImageAttributes& oImageAttributes); diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.cpp b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.cpp index c15cd61900..cb392e3c68 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.cpp @@ -301,7 +301,7 @@ namespace MetaFile m_pOutput->MoveToStart(); } - EmfParserType CEmfxParser::GetType() + EmfParserType CEmfxParser::GetType() const { return EmfParserType::EmfxParser; } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.h b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.h index 36cda4ebde..d67b7219c3 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfxParser.h @@ -18,7 +18,7 @@ namespace MetaFile void PlayFile() override; void Scan() override; - EmfParserType GetType() override; + EmfParserType GetType() const override; private: bool ReadImage(unsigned int offBmi, unsigned int cbBmi, unsigned int offBits, unsigned int cbBits, unsigned int ulSkip, BYTE **ppBgraBuffer, unsigned int *pulWidth, unsigned int *pulHeight) override; diff --git a/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp b/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp index 5a7ba80b66..cbca118655 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfPlayer.cpp @@ -438,7 +438,7 @@ namespace MetaFile UpdateFinalTransform(); } - unsigned int CEmfDC::GetMapMode() + unsigned int CEmfDC::GetMapMode() const { return m_ulMapMode; } @@ -448,20 +448,20 @@ namespace MetaFile m_oTransform.Init(); UpdateFinalTransform(); } - TEmfXForm* CEmfDC::GetTransform() + const TEmfXForm& CEmfDC::GetTransform() const { - return &m_oTransform; + return m_oTransform; } - TEmfXForm* CEmfDC::GetInverseTransform() + const TEmfXForm& CEmfDC::GetInverseTransform() const { - return &m_oInverseTransform; + return m_oInverseTransform; } - TEmfXForm* CEmfDC::GetFinalTransform(int iGraphicsMode) + const TEmfXForm& CEmfDC::GetFinalTransform(int iGraphicsMode) const { if (GM_COMPATIBLE == iGraphicsMode) - return &m_oFinalTransform2; + return m_oFinalTransform2; - return &m_oFinalTransform; + return m_oFinalTransform; } void CEmfDC::MultiplyTransform(TEmfXForm& oForm, unsigned int ulMode) { @@ -489,11 +489,11 @@ namespace MetaFile UpdateFinalTransform(); } - void CEmfDC::SetTextColor(TRGBA& oColor) + void CEmfDC::SetTextColor(const TRGBA& oColor) { m_oTextColor.Copy(oColor); } - TRGBA& CEmfDC::GetTextColor() + const TRGBA& CEmfDC::GetTextColor() const { return m_oTextColor; } @@ -506,7 +506,7 @@ namespace MetaFile if (pBrush == m_pBrush) m_pBrush = NULL; } - IBrush* CEmfDC::GetBrush() + const IBrush* CEmfDC::GetBrush() const { return m_pBrush; } @@ -519,7 +519,7 @@ namespace MetaFile if (pFont == m_pFont) m_pFont = NULL; } - IFont* CEmfDC::GetFont() + const IFont* CEmfDC::GetFont() const { return (NULL != m_pFont) ? m_pFont : &m_oDefaultFont; } @@ -527,7 +527,7 @@ namespace MetaFile { m_ulTextAlign = ulAlign; } - unsigned int CEmfDC::GetTextAlign() + unsigned int CEmfDC::GetTextAlign() const { return m_ulTextAlign; } @@ -535,7 +535,7 @@ namespace MetaFile { m_ulBgMode = ulBgMode; } - unsigned int CEmfDC::GetBgMode() + unsigned int CEmfDC::GetBgMode() const { return m_ulBgMode; } @@ -543,15 +543,15 @@ namespace MetaFile { m_oBgColor.Copy(oColor); } - TRGBA& CEmfDC::GetBgColor() + const TRGBA* CEmfDC::GetBgColor() const { - return m_oBgColor; + return &m_oBgColor; } void CEmfDC::SetMiterLimit(unsigned int ulMiter) { m_ulMiterLimit = ulMiter; } - unsigned int CEmfDC::GetMiterLimit() + unsigned int CEmfDC::GetMiterLimit() const { return m_ulMiterLimit; } @@ -559,7 +559,7 @@ namespace MetaFile { m_ulFillMode = ulFillMode; } - unsigned int CEmfDC::GetFillMode() + unsigned int CEmfDC::GetFillMode() const { return m_ulFillMode; } @@ -572,7 +572,7 @@ namespace MetaFile if (pPen == m_pPen) m_pPen = NULL; } - IPen* CEmfDC::GetPen() + const IPen* CEmfDC::GetPen() const { return m_pPen; } @@ -580,15 +580,15 @@ namespace MetaFile { m_ulStretchMode = oMode; } - unsigned int CEmfDC::GetStretchMode() + unsigned int CEmfDC::GetStretchMode() const { return m_ulStretchMode; } - double CEmfDC::GetPixelWidth() + double CEmfDC::GetPixelWidth() const { return m_dPixelWidth; } - double CEmfDC::GetPixelHeight() + double CEmfDC::GetPixelHeight() const { return m_dPixelHeight; } @@ -600,14 +600,14 @@ namespace MetaFile { m_dPixelHeight = dPixelH; } - void CEmfDC::SetWindowOrigin(TPointL& oPoint) + void CEmfDC::SetWindowOrigin(const TPointL& oPoint) { m_oWindow.lX = oPoint.X; m_oWindow.lY = oPoint.Y; UpdatePixelMetrics(); UpdateFinalTransform(); } - void CEmfDC::SetWindowExtents(TSizeL& oPoint) + void CEmfDC::SetWindowExtents(const TSizeL& oPoint) { m_oWindow.ulW = oPoint.X; m_oWindow.ulH = oPoint.Y; @@ -625,7 +625,7 @@ namespace MetaFile UpdateFinalTransform(); } - void CEmfDC::ScaleWindow(double dXScale, double dYScale) + void CEmfDC::ScaleWindow(const double& dXScale, const double& dYScale) { m_oWindow.ulW = (int)(m_oWindow.ulW * dXScale); m_oWindow.ulH = (int)(m_oWindow.ulH * dYScale); @@ -637,18 +637,18 @@ namespace MetaFile UpdateFinalTransform(); } - TEmfWindow* CEmfDC::GetWindow() + const TEmfWindow& CEmfDC::GetWindow() const { - return &m_oWindow; + return m_oWindow; } - void CEmfDC::SetViewportOrigin(TPointL& oPoint) + void CEmfDC::SetViewportOrigin(const TPointL& oPoint) { m_oViewport.lX = oPoint.X; m_oViewport.lY = oPoint.Y; UpdatePixelMetrics(); UpdateFinalTransform(); } - void CEmfDC::SetViewportExtents(TSizeL& oPoint) + void CEmfDC::SetViewportExtents(const TSizeL& oPoint) { m_oViewport.ulW = oPoint.X; m_oViewport.ulH = oPoint.Y; @@ -666,7 +666,7 @@ namespace MetaFile UpdateFinalTransform(); } - void CEmfDC::ScaleViewport(double dXScale, double dYScale) + void CEmfDC::ScaleViewport(const double& dXScale, const double& dYScale) { m_oViewport.ulW = (int)(m_oViewport.ulW * dXScale); m_oViewport.ulH = (int)(m_oViewport.ulH * dYScale); @@ -678,9 +678,9 @@ namespace MetaFile UpdateFinalTransform(); } - TEmfWindow* CEmfDC::GetViewport() + const TEmfWindow& CEmfDC::GetViewport() const { - return &m_oViewport; + return m_oViewport; } bool CEmfDC::UpdatePixelMetrics() { @@ -711,14 +711,14 @@ namespace MetaFile } void CEmfDC::UpdateFinalTransform() { - TEmfWindow* pWindow = GetWindow(); - TEmfWindow* pViewPort = GetViewport(); + const TEmfWindow& oWindow{GetWindow()}; + const TEmfWindow& oViewPort{GetViewport()}; - double dM11 = (pViewPort->ulW >= 0) ? 1 : -1; - double dM22 = (pViewPort->ulH >= 0) ? 1 : -1; + double dM11 = (oViewPort.ulW >= 0) ? 1 : -1; + double dM22 = (oViewPort.ulH >= 0) ? 1 : -1; - TEmfXForm oWindowXForm(1, 0, 0, 1, -(pWindow->lX * GetPixelWidth() * dM11), -(pWindow->lY * GetPixelHeight() * dM22)); - TEmfXForm oViewportXForm(GetPixelWidth() * dM11, 0, 0, GetPixelHeight() * dM22, pViewPort->lX, pViewPort->lY); + TEmfXForm oWindowXForm(1, 0, 0, 1, -(oWindow.lX * GetPixelWidth() * dM11), -(oWindow.lY * GetPixelHeight() * dM22)); + TEmfXForm oViewportXForm(GetPixelWidth() * dM11, 0, 0, GetPixelHeight() * dM22, oViewPort.lX, oViewPort.lY); m_oFinalTransform.Init(); m_oFinalTransform.Multiply(oViewportXForm, MWT_RIGHTMULTIPLY); @@ -749,11 +749,11 @@ namespace MetaFile if (!m_oViewport.ulH) m_oViewport.ulH = nMinCy; } } - void CEmfDC::SetRop2Mode(unsigned int& nMode) + void CEmfDC::SetRop2Mode(unsigned int nMode) { m_ulRop2Mode = nMode; } - unsigned int CEmfDC::GetRop2Mode() + unsigned int CEmfDC::GetRop2Mode() const { return m_ulRop2Mode; } @@ -766,11 +766,11 @@ namespace MetaFile if (m_pPalette == pPalette) m_pPalette = NULL; } - CEmfLogPalette* CEmfDC::GetPalette() + const CEmfLogPalette* CEmfDC::GetPalette() const { return m_pPalette; } - void CEmfDC::SetCurPos(TPointL& oPoint) + void CEmfDC::SetCurPos(const TPointL& oPoint) { SetCurPos(oPoint.X, oPoint.Y); } @@ -779,7 +779,7 @@ namespace MetaFile m_oCurPos.X = lX; m_oCurPos.Y = lY; } - TPointL& CEmfDC::GetCurPos() + const TPointL& CEmfDC::GetCurPos() const { return m_oCurPos; } @@ -787,7 +787,7 @@ namespace MetaFile { m_unArcDirection = unDirection; } - unsigned int CEmfDC::GetArcDirection() + unsigned int CEmfDC::GetArcDirection() const { return m_unArcDirection; } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfPlayer.h b/DesktopEditor/raster/Metafile/Emf/EmfPlayer.h index 1159d4deaa..081ee385ee 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfPlayer.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfPlayer.h @@ -89,56 +89,56 @@ namespace MetaFile CClip* GetClip(); - void SetMapMode(unsigned int ulMapMode); - unsigned int GetMapMode(); - void ResetTransform(); - TEmfXForm* GetTransform(); - TEmfXForm* GetInverseTransform(); - TEmfXForm* GetFinalTransform(int iGraphicsMode); - void MultiplyTransform(TEmfXForm& oForm, unsigned int ulMode); - void SetTextColor(TRGBA& oColor); - TRGBA& GetTextColor(); - void SetBrush(IBrush* pBrush); - void RemoveBrush(IBrush* pBrush); - IBrush* GetBrush(); - void SetFont(IFont* pFont); - void RemoveFont(IFont* pFont); - IFont* GetFont(); - void SetTextAlign(unsigned int ulAlign); - unsigned int GetTextAlign(); - void SetBgMode(unsigned int ulBgMode); - unsigned int GetBgMode(); - void SetBgColor(TRGBA& oColor); - TRGBA& GetBgColor(); - void SetMiterLimit(unsigned int ulMiter); - unsigned int GetMiterLimit(); - void SetFillMode(unsigned int ulFillMode); - unsigned int GetFillMode(); - void SetPen(IPen* pPen); - void RemovePen(IPen* pPen); - IPen* GetPen(); - void SetStretchMode(unsigned int& oMode); - unsigned int GetStretchMode(); - double GetPixelWidth(); - double GetPixelHeight(); - void SetWindowOrigin(TPointL& oPoint); - void SetWindowExtents(TSizeL& oPoint); - void ScaleWindow(double dXScale, double dYScale); - TEmfWindow* GetWindow(); - void SetViewportOrigin(TPointL& oPoint); - void SetViewportExtents(TSizeL& oPoint); - void ScaleViewport(double dXScale, double dYScale); - TEmfWindow* GetViewport(); - void SetRop2Mode(unsigned int& nMode); - unsigned int GetRop2Mode(); - void SetPalette(CEmfLogPalette* pPalette); - void RemovePalette(CEmfLogPalette* pPalette); - CEmfLogPalette* GetPalette(); - void SetCurPos(TPointL& oPoint); - void SetCurPos(int lX, int lY); - TPointL& GetCurPos(); - void SetArcDirection(unsigned int unDirection); - unsigned int GetArcDirection(); + void SetMapMode(unsigned int ulMapMode); + unsigned int GetMapMode() const; + void ResetTransform(); + const TEmfXForm& GetTransform() const; + const TEmfXForm& GetInverseTransform() const ; + const TEmfXForm& GetFinalTransform(int iGraphicsMode) const; + void MultiplyTransform(TEmfXForm& oForm, unsigned int ulMode); + void SetTextColor(const TRGBA& oColor); + const TRGBA& GetTextColor() const; + void SetBrush(IBrush* pBrush); + void RemoveBrush(IBrush* pBrush); + const IBrush* GetBrush() const; + void SetFont(IFont* pFont); + void RemoveFont(IFont* pFont); + const IFont* GetFont() const; + void SetTextAlign(unsigned int ulAlign); + unsigned int GetTextAlign() const; + void SetBgMode(unsigned int ulBgMode); + unsigned int GetBgMode() const; + void SetBgColor(TRGBA& oColor); + const TRGBA* GetBgColor() const; + void SetMiterLimit(unsigned int ulMiter); + unsigned int GetMiterLimit() const; + void SetFillMode(unsigned int ulFillMode); + unsigned int GetFillMode() const; + void SetPen(IPen* pPen); + void RemovePen(IPen* pPen); + const IPen* GetPen() const; + void SetStretchMode(unsigned int& oMode); + unsigned int GetStretchMode() const; + double GetPixelWidth() const; + double GetPixelHeight() const; + void SetWindowOrigin(const TPointL& oPoint); + void SetWindowExtents(const TSizeL& oPoint); + void ScaleWindow(const double& dXScale, const double& dYScale); + const TEmfWindow& GetWindow() const; + void SetViewportOrigin(const TPointL& oPoint); + void SetViewportExtents(const TSizeL& oPoint); + void ScaleViewport(const double& dXScale, const double& dYScale); + const TEmfWindow& GetViewport() const; + void SetRop2Mode(unsigned int nMode); + unsigned int GetRop2Mode() const; + void SetPalette(CEmfLogPalette* pPalette); + void RemovePalette(CEmfLogPalette* pPalette); + const CEmfLogPalette* GetPalette() const; + void SetCurPos(const TPointL& oPoint); + void SetCurPos(int lX, int lY); + const TPointL& GetCurPos() const; + void SetArcDirection(unsigned int unDirection); + unsigned int GetArcDirection() const; private: diff --git a/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.cpp b/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.cpp index c431ce2f3d..db99eecde6 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.cpp +++ b/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.cpp @@ -12,66 +12,66 @@ namespace MetaFile NSFile::CFileBinary::Remove(wsDibPatternPath); } - EEmfObjectType CEmfPlusBrush::GetType() + EEmfObjectType CEmfPlusBrush::GetType() const { return EMF_OBJECT_BRUSH; } - EEmfPlusObjectType CEmfPlusBrush::GetObjectType() + EEmfPlusObjectType CEmfPlusBrush::GetObjectType() const { return ObjectTypeBrush; } - int CEmfPlusBrush::GetColor() + int CEmfPlusBrush::GetColor() const { return METAFILE_RGBA(oColor.chRed, oColor.chGreen, oColor.chBlue, 0); } - int CEmfPlusBrush::GetColor2() + int CEmfPlusBrush::GetColor2() const { return METAFILE_RGBA(oColorBack.chRed, oColorBack.chGreen, oColorBack.chBlue, 0); } - unsigned int CEmfPlusBrush::GetStyle() + unsigned int CEmfPlusBrush::GetStyle() const { return unStyle; } - unsigned int CEmfPlusBrush::GetStyleEx() + unsigned int CEmfPlusBrush::GetStyleEx() const { return unAngle; } - unsigned int CEmfPlusBrush::GetHatch() + unsigned int CEmfPlusBrush::GetHatch() const { return unHatch; } - unsigned int CEmfPlusBrush::GetAlpha() + unsigned int CEmfPlusBrush::GetAlpha() const { return oColor.chAlpha; } - unsigned int CEmfPlusBrush::GetAlpha2() + unsigned int CEmfPlusBrush::GetAlpha2() const { return oColorBack.chAlpha; } - std::wstring CEmfPlusBrush::GetDibPatterPath() + std::wstring CEmfPlusBrush::GetDibPatterPath() const { return wsDibPatternPath; } - void CEmfPlusBrush::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) + void CEmfPlusBrush::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) const {} - void CEmfPlusBrush::GetCenterPoint(double &dX, double &dY) + void CEmfPlusBrush::GetCenterPoint(double &dX, double &dY) const { dX = oCenterPoint.X; dY = oCenterPoint.Y; } - void CEmfPlusBrush::GetBounds(double &left, double &top, double &width, double &height) + void CEmfPlusBrush::GetBounds(double &left, double &top, double &width, double &height) const { left = oRectF.dX; top = oRectF.dY; @@ -93,17 +93,17 @@ namespace MetaFile RELEASEOBJECT(pLineEndCapData) } - EEmfObjectType CEmfPlusPen::GetType() + EEmfObjectType CEmfPlusPen::GetType() const { return EMF_OBJECT_PEN; } - EEmfPlusObjectType CEmfPlusPen::GetObjectType() + EEmfPlusObjectType CEmfPlusPen::GetObjectType() const { return ObjectTypePen; } - int CEmfPlusPen::GetColor() + int CEmfPlusPen::GetColor() const { if (NULL != pBrush) return pBrush->GetColor(); @@ -111,12 +111,12 @@ namespace MetaFile return METAFILE_RGBA(oColor.chRed, oColor.chGreen, oColor.chBlue, 0); } - unsigned int CEmfPlusPen::GetStyle() + unsigned int CEmfPlusPen::GetStyle() const { return unStyle; } - double CEmfPlusPen::GetWidth() + double CEmfPlusPen::GetWidth() const { // if (dWidth < 0) // return 1; @@ -124,7 +124,7 @@ namespace MetaFile return dWidth; } - unsigned int CEmfPlusPen::GetAlpha() + unsigned int CEmfPlusPen::GetAlpha() const { if (NULL != pBrush) return pBrush->oColor.chAlpha; @@ -132,17 +132,17 @@ namespace MetaFile return 0xff; } - double CEmfPlusPen::GetMiterLimit() + double CEmfPlusPen::GetMiterLimit() const { return dMiterLimit; } - double CEmfPlusPen::GetDashOffset() + double CEmfPlusPen::GetDashOffset() const { return dDashOffset; } - void CEmfPlusPen::GetDashData(double *&arDatas, unsigned int &unSize) + void CEmfPlusPen::GetDashData(double *&arDatas, unsigned int &unSize) const { arDatas = pDataDash; unSize = unSizeDash; @@ -157,57 +157,57 @@ namespace MetaFile CEmfPlusFont::~CEmfPlusFont() {} - EEmfObjectType CEmfPlusFont::GetType() + EEmfObjectType CEmfPlusFont::GetType() const { return EMF_OBJECT_FONT; } - EEmfPlusObjectType CEmfPlusFont::GetObjectType() + EEmfPlusObjectType CEmfPlusFont::GetObjectType() const { return ObjectTypeFont; } - double CEmfPlusFont::GetHeight() + double CEmfPlusFont::GetHeight() const { return m_dEmSize; } - std::wstring CEmfPlusFont::GetFaceName() + std::wstring CEmfPlusFont::GetFaceName() const { return m_wsFamilyName; } - int CEmfPlusFont::GetWeight() + int CEmfPlusFont::GetWeight() const { return (m_bBold) ? 700 : 400; } - bool CEmfPlusFont::IsItalic() + bool CEmfPlusFont::IsItalic() const { return m_bItalic; } - bool CEmfPlusFont::IsStrikeOut() + bool CEmfPlusFont::IsStrikeOut() const { return m_bStrikeout; } - bool CEmfPlusFont::IsUnderline() + bool CEmfPlusFont::IsUnderline() const { return m_bUnderline; } - int CEmfPlusFont::GetEscapement() + int CEmfPlusFont::GetEscapement() const { return 0; } - int CEmfPlusFont::GetCharSet() + int CEmfPlusFont::GetCharSet() const { return 0; } - int CEmfPlusFont::GetOrientation() + int CEmfPlusFont::GetOrientation() const { return 0; } @@ -221,7 +221,7 @@ namespace MetaFile RELEASEOBJECT(m_pBuffer) } - EEmfPlusObjectType CEmfPlusBuffer::GetObjectType() + EEmfPlusObjectType CEmfPlusBuffer::GetObjectType() const { return ObjectTypeBuffer; } @@ -276,7 +276,7 @@ namespace MetaFile Clear(); } - EEmfPlusObjectType CEmfPlusPath::GetObjectType() + EEmfPlusObjectType CEmfPlusPath::GetObjectType() const { return ObjectTypePath; } @@ -328,7 +328,7 @@ namespace MetaFile CEmfPlusImageAttributes::CEmfPlusImageAttributes() : CEmfPlusObject() {} - EEmfPlusObjectType CEmfPlusImageAttributes::GetObjectType() + EEmfPlusObjectType CEmfPlusImageAttributes::GetObjectType() const { return ObjectTypeImageAttributes; } @@ -339,7 +339,7 @@ namespace MetaFile m_unWidth(0), m_unHeight(0) {} - EEmfPlusObjectType CEmfPlusImage::GetObjectType() + EEmfPlusObjectType CEmfPlusImage::GetObjectType() const { return ObjectTypeImage; } @@ -411,7 +411,7 @@ namespace MetaFile RELEASEOBJECT(pPath); } - EEmfPLusRegionNodeType CEmfPlusRegionNodePath::GetNodeType() + EEmfPLusRegionNodeType CEmfPlusRegionNodePath::GetNodeType() const { return EmfPLusRegionNodeTypePath; } @@ -434,7 +434,7 @@ namespace MetaFile RELEASEOBJECT(pRect); } - EEmfPLusRegionNodeType CEmfPlusRegionNodeRectF::GetNodeType() + EEmfPLusRegionNodeType CEmfPlusRegionNodeRectF::GetNodeType() const { return EmfPLusRegionNodeTypeRectF; } @@ -458,12 +458,12 @@ namespace MetaFile RELEASEOBJECT(pRigth); } - EEmfPLusRegionNodeType CEmfPlusRegionNodeChild::GetNodeType() + EEmfPLusRegionNodeType CEmfPlusRegionNodeChild::GetNodeType() const { return EmfPLusRegionNodeTypeChild; } - void CEmfPlusRegionNodeChild::DrawOnClip(CClip &oClip, const TXForm &oTransform, TRectL *pOutRect) + void CEmfPlusRegionNodeChild::DrawOnClip(CClip &oClip, const TXForm &oTransform, const TRectL *pOutRect) { unsigned int unType; @@ -550,7 +550,7 @@ namespace MetaFile arNodes.clear(); } - EEmfPlusObjectType CEmfPlusRegion::GetObjectType() + EEmfPlusObjectType CEmfPlusRegion::GetObjectType() const { return ObjectTypeRegion; } @@ -558,7 +558,7 @@ namespace MetaFile CEmfPlusStringFormat::CEmfPlusStringFormat() : CEmfPlusObject() {} - EEmfPlusObjectType CEmfPlusStringFormat::GetObjectType() + EEmfPlusObjectType CEmfPlusStringFormat::GetObjectType() const { return ObjectTypeStringFormat; } diff --git a/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.h b/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.h index 188aa3f0a6..49d8e7a787 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfPlusObjects.h @@ -93,7 +93,7 @@ namespace MetaFile CEmfPlusObject(){}; virtual ~CEmfPlusObject(){}; - virtual EEmfPlusObjectType GetObjectType() + virtual EEmfPlusObjectType GetObjectType() const { return ObjectTypeInvalid; } @@ -173,21 +173,21 @@ namespace MetaFile public: CEmfPlusBrush(); virtual ~CEmfPlusBrush(); - virtual EEmfObjectType GetType(); - virtual EEmfPlusObjectType GetObjectType(); + virtual EEmfObjectType GetType() const override; + virtual EEmfPlusObjectType GetObjectType() const override; // IBrush - int GetColor(); - int GetColor2(); - unsigned int GetStyle(); - unsigned int GetStyleEx(); - unsigned int GetHatch(); - unsigned int GetAlpha(); - unsigned int GetAlpha2(); - std::wstring GetDibPatterPath(); - void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight); - void GetCenterPoint(double& dX, double& dY); - void GetBounds(double& left, double& top, double& width, double& height); + int GetColor() const override; + int GetColor2() const override; + unsigned int GetStyle() const override; + unsigned int GetStyleEx() const override; + unsigned int GetHatch() const override; + unsigned int GetAlpha() const override; + unsigned int GetAlpha2() const override; + std::wstring GetDibPatterPath() const override; + void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight) const override; + void GetCenterPoint(double& dX, double& dY) const override; + void GetBounds(double& left, double& top, double& width, double& height) const override; public: TEmfPlusARGB oColor; @@ -205,17 +205,17 @@ namespace MetaFile public: CEmfPlusPen(); virtual ~CEmfPlusPen(); - virtual EEmfObjectType GetType(); - virtual EEmfPlusObjectType GetObjectType(); + virtual EEmfObjectType GetType() const override; + virtual EEmfPlusObjectType GetObjectType() const override; // IPen - int GetColor(); - unsigned int GetStyle(); - double GetWidth(); - unsigned int GetAlpha(); - double GetMiterLimit(); - double GetDashOffset(); - void GetDashData(double*& arDatas, unsigned int& unSize); + int GetColor() const override; + unsigned int GetStyle() const override; + double GetWidth() const override; + unsigned int GetAlpha() const override; + double GetMiterLimit() const override; + double GetDashOffset() const override; + void GetDashData(double*& arDatas, unsigned int& unSize) const override; public: unsigned int unStyle; @@ -236,19 +236,19 @@ namespace MetaFile public: CEmfPlusFont(); virtual ~CEmfPlusFont(); - virtual EEmfObjectType GetType(); - virtual EEmfPlusObjectType GetObjectType(); + virtual EEmfObjectType GetType() const override; + virtual EEmfPlusObjectType GetObjectType() const override; // IFont - double GetHeight(); - std::wstring GetFaceName(); - int GetWeight(); - bool IsItalic(); - bool IsStrikeOut(); - bool IsUnderline(); - int GetEscapement(); - int GetCharSet(); - int GetOrientation(); + double GetHeight() const override; + std::wstring GetFaceName() const override; + int GetWeight() const override; + bool IsItalic() const override; + bool IsStrikeOut() const override; + bool IsUnderline() const override; + int GetEscapement() const override; + int GetCharSet() const override; + int GetOrientation() const override; public: double m_dEmSize; @@ -272,7 +272,7 @@ namespace MetaFile public: CEmfPlusBuffer(); virtual ~CEmfPlusBuffer(); - virtual EEmfPlusObjectType GetObjectType(); + virtual EEmfPlusObjectType GetObjectType() const override; void SetSize(unsigned int unSize); unsigned int GetSize() const; @@ -293,7 +293,7 @@ namespace MetaFile CEmfPlusPath(); CEmfPlusPath(CEmfPlusPath* pPath); virtual ~CEmfPlusPath(); - virtual EEmfPlusObjectType GetObjectType() override; + virtual EEmfPlusObjectType GetObjectType() const override; TRectD GetBounds() const; }; @@ -311,7 +311,7 @@ namespace MetaFile { public: CEmfPlusImageAttributes(); - virtual EEmfPlusObjectType GetObjectType() override; + virtual EEmfPlusObjectType GetObjectType() const override; public: EEmfPlusWrapMode eWrapMode; @@ -329,7 +329,7 @@ namespace MetaFile { public: CEmfPlusImage(); - virtual EEmfPlusObjectType GetObjectType() override; + virtual EEmfPlusObjectType GetObjectType() const override; void SetImageDataType(unsigned int unImageDataType); EEmfPlusImageDataType GetImageDataType() const; @@ -374,8 +374,8 @@ namespace MetaFile CEmfPlusRegionNode(); virtual ~CEmfPlusRegionNode(); - EEmfPlusRegionNodeDataType GetType() const; - EEmfPLusRegionNodeType GetNodeType() const; + virtual EEmfPlusRegionNodeDataType GetType() const; + virtual EEmfPLusRegionNodeType GetNodeType() const; public: EEmfPlusRegionNodeDataType eType; @@ -387,7 +387,7 @@ namespace MetaFile CEmfPlusRegionNodePath(); virtual ~CEmfPlusRegionNodePath(); - EEmfPLusRegionNodeType GetNodeType(); + EEmfPLusRegionNodeType GetNodeType() const override; bool Empty() const; CEmfPlusPath* GetPath() const; @@ -402,9 +402,9 @@ namespace MetaFile CEmfPlusRegionNodeRectF(); virtual ~CEmfPlusRegionNodeRectF(); - EEmfPLusRegionNodeType GetNodeType(); + EEmfPLusRegionNodeType GetNodeType() const override; - bool Empty() const; + bool Empty() const; TEmfPlusRectF* GetRect() const; public: @@ -417,9 +417,9 @@ namespace MetaFile CEmfPlusRegionNodeChild(); virtual ~CEmfPlusRegionNodeChild(); - EEmfPLusRegionNodeType GetNodeType(); + EEmfPLusRegionNodeType GetNodeType() const override; - void DrawOnClip(CClip& oClip, const TXForm& oTransform, TRectL *pOutRect = NULL); + void DrawOnClip(CClip& oClip, const TXForm& oTransform, const TRectL* pOutRect = NULL); public: CEmfPlusRegionNode *pLeft, *pRigth; }; @@ -430,7 +430,7 @@ namespace MetaFile CEmfPlusRegion(); virtual ~CEmfPlusRegion(); - virtual EEmfPlusObjectType GetObjectType() override; + virtual EEmfPlusObjectType GetObjectType() const override; public: std::vector arNodes; @@ -465,7 +465,7 @@ namespace MetaFile { public: CEmfPlusStringFormat(); - virtual EEmfPlusObjectType GetObjectType() override; + virtual EEmfPlusObjectType GetObjectType() const override; unsigned int unStringFormatFlags; unsigned int unStringAlignment; diff --git a/DesktopEditor/raster/Metafile/MetaFile.cpp b/DesktopEditor/raster/Metafile/MetaFile.cpp index c482571d39..2ab5f6e9df 100644 --- a/DesktopEditor/raster/Metafile/MetaFile.cpp +++ b/DesktopEditor/raster/Metafile/MetaFile.cpp @@ -523,31 +523,31 @@ namespace MetaFile #ifdef METAFILE_SUPPORT_WMF_EMF case c_lMetaWmf: { - TRectL* pRect = m_oWmfFile.GetBounds(); - *pdX = pRect->Left; - *pdY = pRect->Top; - *pdW = pRect->Right - pRect->Left; - *pdH = pRect->Bottom - pRect->Top; + const TRectL& oRect{m_oWmfFile.GetBounds()}; + *pdX = oRect.Left; + *pdY = oRect.Top; + *pdW = oRect.Right - oRect.Left; + *pdH = oRect.Bottom - oRect.Top; break; } case c_lMetaEmf: { - TRectL* pRect = m_oEmfFile.GetBounds(); - *pdX = pRect->Left; - *pdY = pRect->Top; - *pdW = pRect->Right - pRect->Left; - *pdH = pRect->Bottom - pRect->Top; + const TRectL& oRect{m_oEmfFile.GetBounds()}; + *pdX = oRect.Left; + *pdY = oRect.Top; + *pdW = oRect.Right - oRect.Left; + *pdH = oRect.Bottom - oRect.Top; break; } #endif #ifdef METAFILE_SUPPORT_SVM case c_lMetaSvm: { - TRectL* pRect = m_oSvmFile.GetBounds(); - *pdX = pRect->Left; - *pdY = pRect->Top; - *pdW = pRect->Right - pRect->Left; - *pdH = pRect->Bottom - pRect->Top; + const TRectL& oRect{m_oSvmFile.GetBounds()}; + *pdX = oRect.Left; + *pdY = oRect.Top; + *pdW = oRect.Right - oRect.Left; + *pdH = oRect.Bottom - oRect.Top; if (*pdW > 10000 || *pdH > 10000) { diff --git a/DesktopEditor/raster/Metafile/StarView/SvmFile.h b/DesktopEditor/raster/Metafile/StarView/SvmFile.h index c4c25b3943..5a7bedfeca 100644 --- a/DesktopEditor/raster/Metafile/StarView/SvmFile.h +++ b/DesktopEditor/raster/Metafile/StarView/SvmFile.h @@ -82,142 +82,122 @@ class CSvmFile : virtual public IMetaFileBase m_currentCharset = 0; m_currentLanguage = 0; } - TRectL* GetBounds() + const TRectL& GetBounds() { - return &m_oBoundingBox; + return m_oBoundingBox; } - TRectL* GetDCBounds() + const TRectL& GetDCBounds() const override { - //if (m_oHeader.mapMode.isSimple) if (m_pDC->m_oMapMode.isSimple) { - m_oDCRect = m_oBoundingBox; - return &m_oDCRect; + return m_oBoundingBox; } else { - return &m_oHeader.boundRect; + return m_oHeader.boundRect; } } - double GetPixelHeight() + double GetPixelHeight() const override { return m_pDC->m_dPixelHeight; } - double GetPixelWidth() + double GetPixelWidth() const override { return m_pDC->m_dPixelWidth; } - int GetTextColor() + int GetTextColor() const override { - TSvmColor& oColor = m_pDC->GetTextColor(); - return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); + return m_pDC->GetTextColor().ToInt(); } - IFont* GetFont() + const IFont* GetFont() const override { - CSvmFont* pFont = m_pDC->GetFont(); - if (!pFont) - return NULL; - - return (IFont*)pFont; + return m_pDC->GetFont(); } - IBrush* GetBrush() + const IBrush* GetBrush() const override { - CSvmBrush* pBrush = m_pDC->GetBrush(); - if (!pBrush) - return NULL; - - return (IBrush*)pBrush; + return m_pDC->GetBrush(); } - IPen* GetPen() + const IPen* GetPen() const override { - CSvmPen* pPen = m_pDC->GetPen(); - if (!pPen) - return NULL; - - return (IPen*)pPen; + return m_pDC->GetPen(); } - unsigned int GetTextAlign() + unsigned int GetTextAlign() const override { return m_pDC->GetTextAlign(); } - unsigned int GetTextBgMode() + unsigned int GetTextBgMode() const override { return m_pDC->GetBgMode(); } - int GetTextBgColor() + int GetTextBgColor() const override { - TSvmColor& oColor = m_pDC->GetTextBgColor(); - return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); + return m_pDC->GetTextBgColor().ToInt(); } - unsigned int GetFillMode() + unsigned int GetFillMode() const override { return m_pDC->GetFillMode(); } - TPointD GetCurPos() + TPointD GetCurPos() const override { TSvmPoint oPoint = m_pDC->GetCurPos(); TPointD oRes( oPoint.x, oPoint.y); TranslatePoint(oPoint.x, oPoint.y, oRes.X, oRes.Y); return oRes; } - TXForm* GetInverseTransform() + const TXForm& GetInverseTransform() const override { return m_pDC->GetInverseTransform(); } - TXForm* GetTransform(int iGraphicsMode = GM_ADVANCED) + const TXForm& GetTransform(int iGraphicsMode = GM_ADVANCED) override { return m_pDC->GetTransform(); } - unsigned int GetMiterLimit() + unsigned int GetMiterLimit() const override { return m_pDC->GetMiterLimit(); } - unsigned int GetRop2Mode() + unsigned int GetRop2Mode() const override { return m_pDC->GetRop2Mode(); } - CClip* GetClip() + const CClip* GetClip() const override { - CClip* pClip = m_pDC->GetClip(); - if (!pClip) - return NULL; - - return pClip; + return m_pDC->GetClip(); } - int GetCharSpace() + int GetCharSpace() const override { return 0; } - bool IsWindowFlippedY() + bool IsWindowFlippedY() const override { return false; } - bool IsWindowFlippedX() + bool IsWindowFlippedX() const override { return false; } - unsigned int GetMapMode() + unsigned int GetMapMode() const override { return MM_ANISOTROPIC; } - USHORT GetDpi() + USHORT GetDpi() const override { return 96; } - IRegion* GetRegion() + const IRegion* GetRegion() const override { return NULL; } - unsigned int GetArcDirection() + unsigned int GetArcDirection() const override { return AD_CLOCKWISE; } - CPath* GetPath() + const CPath* GetPath() const override { return NULL; } @@ -240,8 +220,6 @@ class CSvmFile : virtual public IMetaFileBase bool m_bFirstPoint; TRectL m_oBoundingBox; - //TRect m_oRect; - TRectL m_oDCRect; friend class CSvmPlayer; @@ -286,11 +264,11 @@ class CSvmFile : virtual public IMetaFileBase //------------------------------------------------------------------------------------------------------- - void TranslatePoint(TSvmPoint& oPoint, double& dX, double& dY) + void TranslatePoint(TSvmPoint& oPoint, double& dX, double& dY) const { TranslatePoint(oPoint.x, oPoint.y, dX, dY); } - void TranslatePoint(int nX, int nY, double& dX, double &dY) + void TranslatePoint(int nX, int nY, double& dX, double &dY) const { dX = (double)nX; dY = (double)nY; diff --git a/DesktopEditor/raster/Metafile/StarView/SvmObjects.cpp b/DesktopEditor/raster/Metafile/StarView/SvmObjects.cpp index bbe4c96e32..4654c35218 100644 --- a/DesktopEditor/raster/Metafile/StarView/SvmObjects.cpp +++ b/DesktopEditor/raster/Metafile/StarView/SvmObjects.cpp @@ -319,35 +319,35 @@ CSvmBrush::CSvmBrush(CSvmBrush& oBrush) BrushBounds = oBrush.BrushBounds; } -int CSvmBrush::GetColor() +int CSvmBrush::GetColor() const { - return METAFILE_RGBA(Color.r, Color.g, Color.b, 0); + return Color.ToInt(); } -int CSvmBrush::GetColor2() +int CSvmBrush::GetColor2() const { - return METAFILE_RGBA(Color2.r, Color2.g, Color2.b, 0); + return Color2.ToInt(); } -unsigned int CSvmBrush::GetStyleEx() +unsigned int CSvmBrush::GetStyleEx() const { return BrushStyleEx; } -unsigned int CSvmBrush::GetStyle() +unsigned int CSvmBrush::GetStyle() const { return BrushStyle; } -unsigned int CSvmBrush::GetHatch() +unsigned int CSvmBrush::GetHatch() const { return BrushHatch; } -unsigned int CSvmBrush::GetAlpha() +unsigned int CSvmBrush::GetAlpha() const { return 0xff-Color.a; } -unsigned int CSvmBrush::GetAlpha2() +unsigned int CSvmBrush::GetAlpha2() const { return 0xff-Color2.a; } -void CSvmBrush::GetBounds(double& left, double& top, double& width, double& height) +void CSvmBrush::GetBounds(double& left, double& top, double& width, double& height) const { left = BrushBounds.l; top = BrushBounds.t; @@ -355,10 +355,10 @@ void CSvmBrush::GetBounds(double& left, double& top, double& width, double& heig height = BrushBounds.b - BrushBounds.t; } -void CSvmBrush::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) +void CSvmBrush::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) const {} -int CSvmPen::GetColor() +int CSvmPen::GetColor() const { return METAFILE_RGBA(Color.r, Color.g, Color.b, 0); } diff --git a/DesktopEditor/raster/Metafile/StarView/SvmObjects.h b/DesktopEditor/raster/Metafile/StarView/SvmObjects.h index 8a512f78ba..3acbd8c00f 100644 --- a/DesktopEditor/raster/Metafile/StarView/SvmObjects.h +++ b/DesktopEditor/raster/Metafile/StarView/SvmObjects.h @@ -53,7 +53,7 @@ namespace MetaFile public: CSvmObjectBase(){} virtual ~CSvmObjectBase(){} - virtual ESvmObjectType GetType() + virtual ESvmObjectType GetType() const { return SVM_OBJECT_UNKNOWN; } @@ -241,6 +241,10 @@ struct TSvmColor r = oColor.r; g = oColor.g; b = oColor.b; a = oColor.a; color = oColor.color; return *this; } + int ToInt() const + { + return METAFILE_RGBA(r, g, b, 0); + } }; struct TSvmLineInfo @@ -279,22 +283,22 @@ public: CSvmBrush(); CSvmBrush(CSvmBrush& oBrush); virtual ~CSvmBrush(){} - virtual ESvmObjectType GetType() + virtual ESvmObjectType GetType() const override { return SVM_OBJECT_BRUSH; } // IBrush - int GetColor(); - int GetColor2(); - unsigned int GetStyleEx(); - unsigned int GetStyle(); - unsigned int GetHatch(); - unsigned int GetAlpha(); - unsigned int GetAlpha2(); - std::wstring GetDibPatterPath(){ return L""; } - void GetCenterPoint(double& dX, double& dY){} - void GetBounds(double& left, double& top, double& width, double& height); - void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight); + int GetColor() const override; + int GetColor2() const override; + unsigned int GetStyleEx() const override; + unsigned int GetStyle() const override; + unsigned int GetHatch() const override; + unsigned int GetAlpha() const override; + unsigned int GetAlpha2() const override; + std::wstring GetDibPatterPath() const override { return L""; } + void GetCenterPoint(double& dX, double& dY) const override {} + void GetBounds(double& left, double& top, double& width, double& height) const override; + void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight) const override; public: unsigned short BrushStyleEx; //angle, or .... @@ -331,45 +335,45 @@ public: { } - virtual ESvmObjectType GetType() + virtual ESvmObjectType GetType() const override { return SVM_OBJECT_FONT; } // IFont - double GetHeight() + double GetHeight() const override { return (double)SizeHeight; } - std::wstring GetFaceName() + std::wstring GetFaceName() const override { return sFamilyName; } - int GetWeight() + int GetWeight() const override { return (int)Weight; } - bool IsItalic() + bool IsItalic() const override { return (0x01 == Italic ? true : false); } - bool IsStrikeOut() + bool IsStrikeOut() const override { return (0x01 == StrikeOut ? true : false); } - bool IsUnderline() + bool IsUnderline() const override { return (0x01 == Underline ? true : false); } - int GetEscapement() + int GetEscapement() const override { return 0;//(int)Escapement; } - int GetCharSet() + int GetCharSet() const override { return (int)CharSet; } - int GetOrientation() + int GetOrientation() const override { return (int)Orientation; } @@ -412,34 +416,34 @@ public: { } - virtual ESvmObjectType GetType() + virtual ESvmObjectType GetType() const override { return SVM_OBJECT_PEN; } // IPen - int GetColor(); - unsigned int GetStyle() + int GetColor() const override; + unsigned int GetStyle() const override { return (unsigned int)PenStyle; } - double GetWidth() + double GetWidth() const override { return (double)Width; } - unsigned int GetAlpha() + unsigned int GetAlpha() const override { return 255; } - double GetMiterLimit() + double GetMiterLimit() const override { return 0; } - double GetDashOffset() + double GetDashOffset() const override { return 0; } - void GetDashData(double*& arDatas, unsigned int& unSize) + void GetDashData(double*& arDatas, unsigned int& unSize) const override { arDatas = NULL; unSize = 0; diff --git a/DesktopEditor/raster/Metafile/StarView/SvmPlayer.cpp b/DesktopEditor/raster/Metafile/StarView/SvmPlayer.cpp index d4e20ad417..6a9c1f3481 100644 --- a/DesktopEditor/raster/Metafile/StarView/SvmPlayer.cpp +++ b/DesktopEditor/raster/Metafile/StarView/SvmPlayer.cpp @@ -447,7 +447,7 @@ CSvmDC::CSvmDC() CSvmDC::~CSvmDC() { } -CSvmDC* CSvmDC::Copy() +CSvmDC* CSvmDC::Copy() const { CSvmDC* pNewDC = new CSvmDC(); if (!pNewDC) @@ -482,7 +482,7 @@ CSvmDC* CSvmDC::Copy() return pNewDC; } -ESvmMapUnit CSvmDC::GetMapModeUnit() +ESvmMapUnit CSvmDC::GetMapModeUnit() const { return (ESvmMapUnit)m_oMapMode.unit; } @@ -576,14 +576,14 @@ void CSvmDC::SetMapMode(TSvmMapMode & mapMode, bool prefered ) } } -TXForm* CSvmDC::GetTransform() +const TXForm& CSvmDC::GetTransform() const { - return &m_oTransform; + return m_oTransform; } -TXForm* CSvmDC::GetInverseTransform() +const TXForm& CSvmDC::GetInverseTransform() const { - return &m_oTransform; + return m_oTransform; } void CSvmDC::SetTextColor(TSvmColor& oColor) @@ -591,7 +591,7 @@ void CSvmDC::SetTextColor(TSvmColor& oColor) m_oTextColor.Copy(oColor); } -TSvmColor& CSvmDC::GetTextColor() +const TSvmColor& CSvmDC::GetTextColor() const { return m_oTextColor; } @@ -604,7 +604,7 @@ void CSvmDC::RemoveBrush(CSvmBrush* pBrush) if (pBrush == m_pBrush) m_pBrush = NULL; } -CSvmBrush* CSvmDC::GetBrush() +const CSvmBrush* CSvmDC::GetBrush() const { return m_pBrush; } @@ -617,7 +617,7 @@ void CSvmDC::RemoveFont(CSvmFont* pFont) if (pFont == m_pFont) m_pFont = NULL; } -CSvmFont* CSvmDC::GetFont() +const CSvmFont* CSvmDC::GetFont() const { return m_pFont; } @@ -625,7 +625,7 @@ void CSvmDC::SetTextAlign(unsigned int ulAlign) { m_ulTextAlign = ulAlign; } -unsigned int CSvmDC::GetTextAlign() +unsigned int CSvmDC::GetTextAlign() const { return m_ulTextAlign; } @@ -633,7 +633,7 @@ void CSvmDC::SetBgMode(unsigned int ulBgMode) { m_ulBgMode = ulBgMode; } -unsigned int CSvmDC::GetBgMode() +unsigned int CSvmDC::GetBgMode() const { return m_ulBgMode; } @@ -645,7 +645,7 @@ void CSvmDC::SetTextBgColor(TSvmColor* oColor) { m_oTextBgColor.Copy(*oColor); } -TSvmColor& CSvmDC::GetTextBgColor() +const TSvmColor& CSvmDC::GetTextBgColor() const { return m_oTextBgColor; } @@ -653,7 +653,7 @@ void CSvmDC::SetMiterLimit(unsigned int ulMiter) { m_ulMiterLimit = ulMiter; } -unsigned int CSvmDC::GetMiterLimit() +unsigned int CSvmDC::GetMiterLimit() const { return m_ulMiterLimit; } @@ -661,7 +661,7 @@ void CSvmDC::SetFillMode(unsigned int ulFillMode) { m_ulFillMode = ulFillMode; } -unsigned int CSvmDC::GetFillMode() +unsigned int CSvmDC::GetFillMode() const { return m_ulFillMode; } @@ -674,11 +674,11 @@ void CSvmDC::RemovePen(CSvmPen* pPen) if (pPen == m_pPen) m_pPen = NULL; } -CSvmPen* CSvmDC::GetPen() +const CSvmPen* CSvmDC::GetPen() const { return m_pPen; } -CClip* CSvmDC::GetClip() +const CClip* CSvmDC::GetClip() const { return NULL;; //return &m_oClip; @@ -687,7 +687,7 @@ void CSvmDC::SetStretchMode(unsigned int& oMode) { m_ulStretchMode = oMode; } -unsigned int CSvmDC::GetStretchMode() +unsigned int CSvmDC::GetStretchMode() const { return m_ulStretchMode; } @@ -705,7 +705,7 @@ void CSvmDC::SetRop2Mode(unsigned int& nMode) { m_ulRop2Mode = nMode; } -unsigned int CSvmDC::GetRop2Mode() +unsigned int CSvmDC::GetRop2Mode() const { return m_ulRop2Mode; } @@ -731,7 +731,7 @@ void CSvmDC::SetCurPos(int lX, int lY) m_oCurPos.x = lX; m_oCurPos.y = lY; } -TSvmPoint & CSvmDC::GetCurPos() +const TSvmPoint & CSvmDC::GetCurPos() const { return m_oCurPos; } @@ -743,7 +743,7 @@ void CSvmDC::SetArcDirection(unsigned int unDirection) { m_unArcDirection = unDirection; } -unsigned int CSvmDC::GetArcDirection() +unsigned int CSvmDC::GetArcDirection() const { return m_unArcDirection; } diff --git a/DesktopEditor/raster/Metafile/StarView/SvmPlayer.h b/DesktopEditor/raster/Metafile/StarView/SvmPlayer.h index f8ecddd679..be9b9568fa 100644 --- a/DesktopEditor/raster/Metafile/StarView/SvmPlayer.h +++ b/DesktopEditor/raster/Metafile/StarView/SvmPlayer.h @@ -89,51 +89,51 @@ public: CSvmDC(); ~CSvmDC(); - CSvmDC* Copy(); + CSvmDC* Copy() const; - ESvmMapUnit GetMapModeUnit(); - void SetMapMode(TSvmMapMode &mapMode, bool prefered = false); - TXForm* GetTransform(); - TXForm* GetInverseTransform(); - void MultiplyTransform(TXForm& oForm, unsigned int ulMode); - void SetTextColor(TSvmColor& oColor); - TSvmColor& GetTextColor(); - void SetBrush(CSvmBrush* pBrush); - void RemoveBrush(CSvmBrush *pBrush); - CSvmBrush* GetBrush(); - void SetFont(CSvmFont* pFont); - void RemoveFont(CSvmFont* pFont); - CSvmFont* GetFont(); - void SetTextAlign(unsigned int ulAlign); - unsigned int GetTextAlign(); - void SetBgMode(unsigned int ulBgMode); - unsigned int GetBgMode(); + ESvmMapUnit GetMapModeUnit() const; + void SetMapMode(TSvmMapMode &mapMode, bool prefered = false); + const TXForm& GetTransform() const; + const TXForm& GetInverseTransform() const; + void MultiplyTransform(TXForm& oForm, unsigned int ulMode); + void SetTextColor(TSvmColor& oColor); + const TSvmColor& GetTextColor() const; + void SetBrush(CSvmBrush* pBrush); + void RemoveBrush(CSvmBrush *pBrush); + const CSvmBrush* GetBrush() const; + void SetFont(CSvmFont* pFont); + void RemoveFont(CSvmFont* pFont); + const CSvmFont* GetFont() const; + void SetTextAlign(unsigned int ulAlign); + unsigned int GetTextAlign() const; + void SetBgMode(unsigned int ulBgMode); + unsigned int GetBgMode() const; - void SetTextBgColor(TSvmColor& oColor); - void SetTextBgColor(TSvmColor* oColor); - TSvmColor& GetTextBgColor(); + void SetTextBgColor(TSvmColor& oColor); + void SetTextBgColor(TSvmColor* oColor); + const TSvmColor& GetTextBgColor() const; - void SetMiterLimit(unsigned int ulMiter); - unsigned int GetMiterLimit(); - void SetFillMode(unsigned int ulFillMode); - unsigned int GetFillMode(); - void SetPen(CSvmPen* pPen); - void RemovePen(CSvmPen* pPen); - CSvmPen* GetPen(); - void SetStretchMode(unsigned int& oMode); - unsigned int GetStretchMode(); - void SetRop2Mode(unsigned int& nMode); - unsigned int GetRop2Mode(); + void SetMiterLimit(unsigned int ulMiter); + unsigned int GetMiterLimit() const; + void SetFillMode(unsigned int ulFillMode); + unsigned int GetFillMode() const; + void SetPen(CSvmPen* pPen); + void RemovePen(CSvmPen* pPen); + const CSvmPen* GetPen() const; + void SetStretchMode(unsigned int& oMode); + unsigned int GetStretchMode() const; + void SetRop2Mode(unsigned int& nMode); + unsigned int GetRop2Mode() const; //void SetPalette(CSvmLogPalette* pPalette); //void RemovePalette(CSvmLogPalette* pPalette); //CSvmLogPalette* GetPalette(); - void SetCurPos(TSvmPoint& oPoint); - void SetCurPos(int lX, int lY); - TSvmPoint& GetCurPos(); - CClip* GetClip(); + void SetCurPos(TSvmPoint& oPoint); + void SetCurPos(int lX, int lY); + const TSvmPoint& GetCurPos() const; + const CClip* GetClip() const; //void ClipToPath(CSvmPath* pPath, unsigned int unMode); - void SetArcDirection(unsigned int unDirection); - unsigned int GetArcDirection(); + void SetArcDirection(unsigned int unDirection); + unsigned int GetArcDirection() const; double m_dPixelWidth; double m_dPixelHeight; diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfFile.h b/DesktopEditor/raster/Metafile/Wmf/WmfFile.h index 3d17de2f15..5c0734575b 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfFile.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfFile.h @@ -51,7 +51,7 @@ namespace MetaFile { public: CWmfFile() : m_pParser(new CWmfParser) - {} + {} ~CWmfFile() { @@ -102,7 +102,7 @@ namespace MetaFile m_pParser->Close(); } - void SetFontManager(NSFonts::IFontManager* pFontManager) + void SetFontManager(NSFonts::IFontManager* pFontManager) { m_pParser->SetFontManager(pFontManager); } @@ -131,7 +131,7 @@ namespace MetaFile m_pParser->SetInterpretator(pOutput, wsFilePath); } - TRectL* GetBounds() + const TRectL& GetBounds() const { return m_pParser->GetDCBounds(); } diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp index a6644fdc29..0129b4f632 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp @@ -269,7 +269,7 @@ namespace MetaFile if (0 != nColor) arNodeAttributes.push_back({L"fill", CalculateColor(nColor, 255)}); - IFont *pFont = m_pParser->GetFont(); + const IFont *pFont = m_pParser->GetFont(); if (NULL == pFont) return; @@ -378,7 +378,7 @@ namespace MetaFile { double dEscapement = pFont->GetEscapement() / -10; - if (m_pParser->GetTransform()->M22 < 0) + if (m_pParser->GetTransform().M22 < 0) dEscapement = -dEscapement; double dSin = std::sin(dEscapement * M_PI / 180.); @@ -556,15 +556,13 @@ namespace MetaFile void CInterpretatorSvgBase::IntersectClip(const TRectD &oClip) { - TXForm *pTransform = m_pParser->GetTransform(); - double dLeft = oClip.Left; double dTop = oClip.Top; double dRight = oClip.Right; double dBottom = oClip.Bottom; - pTransform->Apply(dLeft, dTop); - pTransform->Apply(dRight, dBottom); + m_pParser->GetTransform().Apply(dLeft, dTop); + m_pParser->GetTransform().Apply(dRight, dBottom); const std::wstring wsId = L"INTERSECTCLIP_" + ConvertToWString(++m_unNumberDefs, 0); const std::wstring wsValue = L""; @@ -574,23 +572,23 @@ namespace MetaFile void CInterpretatorSvgBase::ExcludeClip(const TRectD &oClip, const TRectD &oBB) { - TXForm *pTransform = m_pParser->GetTransform(); + const TXForm &oTransform{m_pParser->GetTransform()}; double dClipLeft = oClip.Left; double dClipTop = oClip.Top; double dClipRight = oClip.Right; double dClipBottom = oClip.Bottom; - pTransform->Apply(dClipLeft, dClipTop); - pTransform->Apply(dClipRight, dClipBottom); - + oTransform.Apply(dClipLeft, dClipTop); + oTransform.Apply(dClipRight, dClipBottom); + double dBBLeft = oBB.Left; double dBBTop = oBB.Top; double dBBRight = oBB.Right; double dBBBottom = oBB.Bottom; - pTransform->Apply(dBBLeft, dBBTop); - pTransform->Apply(dBBRight, dBBBottom); + oTransform.Apply(dBBLeft, dBBTop); + oTransform.Apply(dBBRight, dBBBottom); const std::wstring wsId = L"EXCLUDECLIP_" + ConvertToWString(++m_unNumberDefs, 0); const std::wstring wsValue = L"GetPen(); + const IPen *pPen = m_pParser->GetPen(); if (NULL == pPen || PS_NULL == pPen->GetStyle()) return; @@ -716,11 +714,11 @@ namespace MetaFile return; } - IBrush *pBrush = NULL; + const IBrush *pBrush = NULL; if (NULL != m_pParser->GetPen()) { - CEmfPlusPen *pPen = dynamic_cast(m_pParser->GetPen()); + const CEmfPlusPen *pPen = dynamic_cast(m_pParser->GetPen()); if (NULL != pPen) pBrush = pPen->pBrush; @@ -864,7 +862,7 @@ namespace MetaFile { CloseClip(); - CClip *pClip = m_pParser->GetClip(); + const CClip *pClip = m_pParser->GetClip(); if (NULL == pClip || pClip->Empty()) return false; @@ -1020,7 +1018,7 @@ namespace MetaFile if (NULL == m_pParser || NULL == m_pParser->GetBrush()) return std::wstring(); - double dStrokeWidth = 1. / m_pParser->GetTransform()->M11; + double dStrokeWidth = 1. / m_pParser->GetTransform().M11; if (NULL != m_pParser->GetPen()) { @@ -1052,7 +1050,7 @@ namespace MetaFile return std::wstring(); } - std::wstring CInterpretatorSvgBase::CreateDibPatternStyle(IBrush *pBrush) + std::wstring CInterpretatorSvgBase::CreateDibPatternStyle(const IBrush *pBrush) { if (NULL == m_pParser || NULL == pBrush) return std::wstring(); @@ -1105,7 +1103,7 @@ namespace MetaFile std::wstring wsImageDataW = NSFile::CUtf8Converter::GetUnicodeFromCharPtr(pImageData, (LONG)nImageSize); - double dStrokeWidth = 1. / m_pParser->GetTransform()->M11; + double dStrokeWidth = 1. / m_pParser->GetTransform().M11; if (NULL != m_pParser->GetPen()) { @@ -1128,7 +1126,7 @@ namespace MetaFile return wsStyleId; } - std::wstring CInterpretatorSvgBase::CreatePatternStyle(IBrush *pBrush) + std::wstring CInterpretatorSvgBase::CreatePatternStyle(const IBrush *pBrush) { if (NULL == m_pParser || NULL == pBrush) return std::wstring(); @@ -1178,7 +1176,7 @@ namespace MetaFile return wsStyleId; } - std::wstring CInterpretatorSvgBase::CreateGradient(IBrush *pBrush) + std::wstring CInterpretatorSvgBase::CreateGradient(const IBrush* pBrush) { if (pBrush == NULL) return std::wstring(); @@ -1723,7 +1721,7 @@ namespace MetaFile return true; } - std::wstring CHatchGenerator::GetPatternId() + std::wstring CHatchGenerator::GetPatternId() const { if (mHatchStyles.end() == mHatchStyles.find(m_nHatchStyle)) return L""; diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.h b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.h index ab32bee333..16d9038feb 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.h @@ -19,7 +19,7 @@ namespace MetaFile bool GenerateHatch(); - std::wstring GetPatternId(); + std::wstring GetPatternId() const; std::wstring GetPattern(); private: void AddLine(const TPointD& oPoint1, const TPointD& oPoint2); @@ -120,9 +120,9 @@ namespace MetaFile std::wstring CreatePath(const CPath& oPath, const TXForm* pTransform = NULL); std::wstring CreateHatchStyle(unsigned int unHatchStyle, double dWidth, double dHeight); - std::wstring CreateDibPatternStyle(IBrush *pBrush); - std::wstring CreatePatternStyle(IBrush *pBrush); - std::wstring CreateGradient(IBrush *pBrush); + std::wstring CreateDibPatternStyle(const IBrush* pBrush); + std::wstring CreatePatternStyle(const IBrush* pBrush); + std::wstring CreateGradient(const IBrush *pBrush); private: TSvgViewport m_oViewport; TPointD m_oSizeWindow; diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CWmfInterpretatorSvg.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CWmfInterpretatorSvg.cpp index 6d8909476d..960b9b1b05 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CWmfInterpretatorSvg.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CWmfInterpretatorSvg.cpp @@ -28,12 +28,12 @@ namespace MetaFile m_pXmlWriter->WriteAttribute(L"xmlns", L"http://www.w3.org/2000/svg"); m_pXmlWriter->WriteAttribute(L"xmlns:xlink", L"http://www.w3.org/1999/xlink"); - TRectL *pBounds = m_pParser->GetDCBounds(); + const TRectL& oBounds{m_pParser->GetDCBounds()}; - m_oViewport.dLeft = std::min(pBounds->Left, pBounds->Right ); - m_oViewport.dTop = std::min(pBounds->Top, pBounds->Bottom); - m_oViewport.dRight = std::max(pBounds->Left, pBounds->Right ); - m_oViewport.dBottom = std::max(pBounds->Top, pBounds->Bottom); + m_oViewport.dLeft = std::min(oBounds.Left, oBounds.Right ); + m_oViewport.dTop = std::min(oBounds.Top, oBounds.Bottom); + m_oViewport.dRight = std::max(oBounds.Left, oBounds.Right ); + m_oViewport.dBottom = std::max(oBounds.Top, oBounds.Bottom); UpdateSize(); @@ -144,7 +144,7 @@ namespace MetaFile void CWmfInterpretatorSvg::HANDLE_META_EXTTEXTOUT(short shY, short shX, short shStringLength, unsigned short ushFwOptions, const TRectL &oRectangle, unsigned char *pString, short *pDx) { - IFont* pFont = NULL; + const IFont* pFont = NULL; if (NULL != m_pParser) pFont = m_pParser->GetFont(); @@ -213,7 +213,7 @@ namespace MetaFile void CWmfInterpretatorSvg::HANDLE_META_FILLREGION(unsigned short ushRegionIndex, unsigned short ushBrushIndex) { - CWmfRegion *pRegion = dynamic_cast(m_pParser->GetRegion()); + const CWmfRegion *pRegion = dynamic_cast(m_pParser->GetRegion()); if (NULL == pRegion) return; @@ -438,7 +438,7 @@ namespace MetaFile void CWmfInterpretatorSvg::HANDLE_META_TEXTOUT(short shStringLength, unsigned char *pString, short shX, short shY) { - IFont* pFont = NULL; + const IFont* pFont = NULL; if (NULL != m_pParser) pFont = m_pParser->GetFont(); diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp index a1842f7d2e..a21e0aa0a1 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfObjects.cpp @@ -46,7 +46,7 @@ namespace MetaFile CWmfObjectBase::~CWmfObjectBase() {} - EWmfObjectType CWmfObjectBase::GetType() + EWmfObjectType CWmfObjectBase::GetType() const { return WMF_OBJECT_UNKNOWN; } @@ -67,7 +67,7 @@ namespace MetaFile RELEASEOBJECT(pDibBuffer); } - EWmfObjectType CWmfBrush::GetType() + EWmfObjectType CWmfBrush::GetType() const { return WMF_OBJECT_BRUSH; } @@ -109,61 +109,57 @@ namespace MetaFile #endif } - int CWmfBrush::GetColor() + int CWmfBrush::GetColor() const { return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, oColor.a); } - int CWmfBrush::GetColor2() + int CWmfBrush::GetColor2() const { return 0; } - unsigned int CWmfBrush::GetStyle() + unsigned int CWmfBrush::GetStyle() const { return ushBrushStyle; } - unsigned int CWmfBrush::GetStyleEx() + unsigned int CWmfBrush::GetStyleEx() const { return 0; } - unsigned int CWmfBrush::GetHatch() + unsigned int CWmfBrush::GetHatch() const { return ushBrushHatch; } - unsigned int CWmfBrush::GetAlpha() - { - return 255; - } - - unsigned int CWmfBrush::GetAlpha2() + unsigned int CWmfBrush::GetAlpha() const { return 0xff; } - std::wstring CWmfBrush::GetDibPatterPath() + unsigned int CWmfBrush::GetAlpha2() const + { + return 0xff; + } + + std::wstring CWmfBrush::GetDibPatterPath() const { return wsDibPatternPath; } - void CWmfBrush::GetBounds(double &left, double &top, double &width, double &height) - { - - } + void CWmfBrush::GetBounds(double &left, double &top, double &width, double &height) const + {} - void CWmfBrush::GetCenterPoint(double &dX, double &dY) - { - - } + void CWmfBrush::GetCenterPoint(double &dX, double &dY) const + {} - void CWmfBrush::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) + void CWmfBrush::GetDibPattern(unsigned char **pBuffer, unsigned int &unWidth, unsigned int &unHeight) const { - *pBuffer = pDibBuffer; - unWidth = unDibWidth; - unHeight = unDibHeigth; + *pBuffer = pDibBuffer; + unWidth = unDibWidth; + unHeight = unDibHeigth; } CWmfFont::CWmfFont() @@ -174,52 +170,52 @@ namespace MetaFile CWmfFont::~CWmfFont() {} - EWmfObjectType CWmfFont::GetType() + EWmfObjectType CWmfFont::GetType() const { return WMF_OBJECT_FONT; } - double CWmfFont::GetHeight() + double CWmfFont::GetHeight() const { return (double)shHeight; } - std::wstring CWmfFont::GetFaceName() + std::wstring CWmfFont::GetFaceName() const { return std::wstring(NSStringExt::CConverter::GetUnicodeFromSingleByteString((const unsigned char*)uchFacename, 32).c_str()); } - int CWmfFont::GetWeight() + int CWmfFont::GetWeight() const { return (int)shWidth; } - bool CWmfFont::IsItalic() + bool CWmfFont::IsItalic() const { - return (0x01 == uchItalic ? true : false); + return 0x01 == uchItalic; } - bool CWmfFont::IsStrikeOut() + bool CWmfFont::IsStrikeOut() const { - return (0x01 == uchStrikeOut ? true : false); + return 0x01 == uchStrikeOut; } - bool CWmfFont::IsUnderline() + bool CWmfFont::IsUnderline() const { - return (0x01 == uchUnderline ? true : false); + return 0x01 == uchUnderline; } - int CWmfFont::GetEscapement() + int CWmfFont::GetEscapement() const { return (int)shEscapement; } - int CWmfFont::GetCharSet() + int CWmfFont::GetCharSet() const { return (int)uchCharSet; } - int CWmfFont::GetOrientation() + int CWmfFont::GetOrientation() const { return (int)shOrientation; } @@ -232,7 +228,7 @@ namespace MetaFile RELEASEOBJECT(pPaletteEntries); } - EWmfObjectType CWmfPalette::GetType() + EWmfObjectType CWmfPalette::GetType() const { return WMF_OBJECT_PALETTE; } @@ -243,42 +239,42 @@ namespace MetaFile CWmfPen::~CWmfPen() {} - EWmfObjectType CWmfPen::GetType() + EWmfObjectType CWmfPen::GetType() const { return WMF_OBJECT_PEN; } - int CWmfPen::GetColor() + int CWmfPen::GetColor() const { return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, oColor.a); } - unsigned int CWmfPen::GetStyle() + unsigned int CWmfPen::GetStyle() const { return (unsigned int)ushPenStyle; } - double CWmfPen::GetWidth() + double CWmfPen::GetWidth() const { return (double)oWidth.X; } - unsigned int CWmfPen::GetAlpha() + unsigned int CWmfPen::GetAlpha() const { return 0xff; } - double CWmfPen::GetMiterLimit() + double CWmfPen::GetMiterLimit() const { return 0; } - double CWmfPen::GetDashOffset() + double CWmfPen::GetDashOffset() const { return 0; } - void CWmfPen::GetDashData(double *&arDatas, unsigned int &unSize) + void CWmfPen::GetDashData(double *&arDatas, unsigned int &unSize) const { arDatas = NULL; unSize = 0; @@ -292,7 +288,7 @@ namespace MetaFile RELEASEOBJECT(pScans); } - EWmfObjectType CWmfRegion::GetType() + EWmfObjectType CWmfRegion::GetType() const { return WMF_OBJECT_REGION; } diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfObjects.h b/DesktopEditor/raster/Metafile/Wmf/WmfObjects.h index fd020a3f4a..07ac47b12a 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfObjects.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfObjects.h @@ -57,7 +57,7 @@ namespace MetaFile public: CWmfObjectBase(); virtual ~CWmfObjectBase(); - virtual EWmfObjectType GetType(); + virtual EWmfObjectType GetType() const; }; class CWmfBrush : public CWmfObjectBase, public IBrush @@ -66,22 +66,22 @@ namespace MetaFile CWmfBrush(); CWmfBrush(const TWmfLogBrush &oBrush); virtual ~CWmfBrush(); - virtual EWmfObjectType GetType(); + virtual EWmfObjectType GetType() const override; void SetDibPattern(unsigned char* pBuffer, unsigned int unWidth, unsigned int unHeight); // IBrush - int GetColor(); - int GetColor2(); - unsigned int GetStyle(); - unsigned int GetStyleEx(); - unsigned int GetHatch(); - unsigned int GetAlpha(); - unsigned int GetAlpha2(); - std::wstring GetDibPatterPath(); - void GetBounds(double& left, double& top, double& width, double& height); - void GetCenterPoint(double& dX, double& dY); - void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight); + int GetColor() const override; + int GetColor2() const override; + unsigned int GetStyle() const override; + unsigned int GetStyleEx() const override; + unsigned int GetHatch() const override; + unsigned int GetAlpha() const override; + unsigned int GetAlpha2() const override; + std::wstring GetDibPatterPath() const override; + void GetBounds(double& left, double& top, double& width, double& height) const override; + void GetCenterPoint(double& dX, double& dY) const override; + void GetDibPattern(unsigned char** pBuffer, unsigned int &unWidth, unsigned int &unHeight) const override; public: unsigned short ushBrushStyle; @@ -98,18 +98,18 @@ namespace MetaFile CWmfFont(); virtual ~CWmfFont(); - virtual EWmfObjectType GetType(); + virtual EWmfObjectType GetType() const override; // IFont - double GetHeight(); - std::wstring GetFaceName(); - int GetWeight(); - bool IsItalic(); - bool IsStrikeOut(); - bool IsUnderline(); - int GetEscapement(); - int GetCharSet(); - int GetOrientation(); + double GetHeight() const override; + std::wstring GetFaceName() const override; + int GetWeight() const override; + bool IsItalic() const override; + bool IsStrikeOut() const override; + bool IsUnderline() const override; + int GetEscapement() const override; + int GetCharSet() const override; + int GetOrientation() const override; public: short shHeight; @@ -132,7 +132,7 @@ namespace MetaFile public: CWmfPalette(); virtual ~CWmfPalette(); - virtual EWmfObjectType GetType(); + virtual EWmfObjectType GetType() const override; public: unsigned short ushStart; unsigned short ushNumberOfEntries; @@ -143,16 +143,16 @@ namespace MetaFile public: CWmfPen(); virtual ~CWmfPen(); - virtual EWmfObjectType GetType(); + virtual EWmfObjectType GetType() const override; // IPen - int GetColor(); - unsigned int GetStyle(); - double GetWidth(); - unsigned int GetAlpha(); - double GetMiterLimit(); - double GetDashOffset(); - void GetDashData(double*& arDatas, unsigned int& unSize); + int GetColor() const override; + unsigned int GetStyle() const override; + double GetWidth() const override; + unsigned int GetAlpha() const override; + double GetMiterLimit() const override; + double GetDashOffset() const override; + void GetDashData(double*& arDatas, unsigned int& unSize) const override; public: unsigned short ushPenStyle; TPointS oWidth; @@ -163,7 +163,7 @@ namespace MetaFile public: CWmfRegion(); virtual ~CWmfRegion(); - virtual EWmfObjectType GetType(); + virtual EWmfObjectType GetType() const override; public: short shNextInChain; // не используется short shObjectType; // не используется diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp index 34ec3fa88c..13df37bdf0 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp @@ -183,11 +183,12 @@ namespace MetaFile CWmfInterpretatorBase *pInterpretator = m_pInterpretator; m_pInterpretator = NULL; PlayFile(); + UpdateDCRect(); m_pInterpretator = pInterpretator; this->ClearFile(); } - WmfParserType CWmfParser::GetType() + WmfParserType CWmfParser::GetType() const { return WmfParserType::WmfParser; } diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.h b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.h index f60df82b86..f8d727788a 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.h @@ -17,7 +17,7 @@ namespace MetaFile void PlayFile() override; void Scan() override; - WmfParserType GetType() override; + WmfParserType GetType() const override; void SetStream(BYTE* pBuf, unsigned int unSize); private: diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp index df45dcfb40..e7af599510 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp @@ -29,82 +29,67 @@ namespace MetaFile m_bEof = false; } - TRectL *CWmfParserBase::GetDCBounds() + const TRectL& CWmfParserBase::GetDCBounds() const { - m_oDCRect = GetBoundingBox(); - return &m_oDCRect; + return m_oDCRect; } - CClip *CWmfParserBase::GetClip() + const CClip *CWmfParserBase::GetClip() const { return m_pDC->GetClip(); } - double CWmfParserBase::GetPixelHeight() + double CWmfParserBase::GetPixelHeight() const { return m_pDC->GetPixelHeight(); } - double CWmfParserBase::GetPixelWidth() + double CWmfParserBase::GetPixelWidth() const { return m_pDC->GetPixelWidth(); } - int CWmfParserBase::GetTextColor() + int CWmfParserBase::GetTextColor() const { - TRGBA& oColor = m_pDC->GetTextColor(); - return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); + return m_pDC->GetTextColor().ToInt(); } - IFont *CWmfParserBase::GetFont() + const IFont *CWmfParserBase::GetFont() const { - CWmfFont* pFont = m_pDC->GetFont(); - if (!pFont) - return NULL; - - return (IFont*)pFont; + return m_pDC->GetFont(); } - IBrush *CWmfParserBase::GetBrush() + const IBrush *CWmfParserBase::GetBrush() const { - CWmfBrush* pBrush = m_pDC->GetBrush(); - if (!pBrush) - return NULL; - - return (IBrush*)pBrush; + return m_pDC->GetBrush(); } - IPen *CWmfParserBase::GetPen() + const IPen *CWmfParserBase::GetPen() const { - CWmfPen* pPen = m_pDC->GetPen(); - if (!pPen) - return NULL; - - return (IPen*)pPen; + return m_pDC->GetPen(); } - unsigned int CWmfParserBase::GetTextAlign() + unsigned int CWmfParserBase::GetTextAlign() const { return (unsigned int)m_pDC->GetTextAlign(); } - unsigned int CWmfParserBase::GetTextBgMode() + unsigned int CWmfParserBase::GetTextBgMode() const { return (unsigned int)m_pDC->GetTextBgMode(); } - int CWmfParserBase::GetTextBgColor() + int CWmfParserBase::GetTextBgColor() const { - TRGBA& oColor = m_pDC->GetTextBgColor(); - return METAFILE_RGBA(oColor.r, oColor.g, oColor.b, 0); + return m_pDC->GetTextBgColor().ToInt(); } - unsigned int CWmfParserBase::GetFillMode() + unsigned int CWmfParserBase::GetFillMode() const { return (unsigned int)m_pDC->GetPolyFillMode(); } - TPointD CWmfParserBase::GetCurPos() + TPointD CWmfParserBase::GetCurPos() const { TPointL oPoint = m_pDC->GetCurPos(); double dX, dY; @@ -112,71 +97,69 @@ namespace MetaFile return TPointD(dX, dY); } - TXForm *CWmfParserBase::GetInverseTransform() + const TXForm& CWmfParserBase::GetInverseTransform() const { return m_pDC->GetInverseTransform(); } - TXForm *CWmfParserBase::GetTransform(int iGraphicsMode) + const TXForm& CWmfParserBase::GetTransform(int iGraphicsMode) { - TRectL* pBounds = GetDCBounds(); - double dT = pBounds->Top; - double dL = pBounds->Left; + const TRectL& oBounds{GetDCBounds()}; + double dT = oBounds.Top; + double dL = oBounds.Left; TXForm oShiftXForm(1, 0, 0, 1, -dL, -dT); m_oTransform.Copy(m_pDC->GetFinalTransform(iGraphicsMode)); m_oTransform.Multiply(oShiftXForm, MWT_RIGHTMULTIPLY); - return &m_oTransform; + return m_oTransform; } - unsigned int CWmfParserBase::GetMiterLimit() + unsigned int CWmfParserBase::GetMiterLimit() const { return m_pDC->GetMiterLimit(); } - unsigned int CWmfParserBase::GetRop2Mode() + unsigned int CWmfParserBase::GetRop2Mode() const { return (unsigned int)m_pDC->GetRop2Mode(); } - int CWmfParserBase::GetCharSpace() + int CWmfParserBase::GetCharSpace() const { return m_pDC->GetCharSpacing(); } - bool CWmfParserBase::IsWindowFlippedY() + bool CWmfParserBase::IsWindowFlippedY() const { - TWmfWindow* pWindow = m_pDC->GetWindow(); - return (pWindow->h < 0); + return m_pDC->GetWindow().h < 0; } - bool CWmfParserBase::IsWindowFlippedX() + bool CWmfParserBase::IsWindowFlippedX() const { - TWmfWindow* pWindow = m_pDC->GetWindow(); - return (pWindow->w < 0); + return m_pDC->GetWindow().w < 0; } - unsigned int CWmfParserBase::GetMapMode() + unsigned int CWmfParserBase::GetMapMode() const { return m_pDC->GetMapMode(); } - USHORT CWmfParserBase::GetDpi() + USHORT CWmfParserBase::GetDpi() const { return (0 != m_oPlaceable.ushInch) ? m_oPlaceable.ushInch : 96; } - IRegion *CWmfParserBase::GetRegion() + const IRegion *CWmfParserBase::GetRegion() const { return m_pDC->GetRegion(); } - unsigned int CWmfParserBase::GetArcDirection() + unsigned int CWmfParserBase::GetArcDirection() const { return AD_CLOCKWISE; } - CPath *CWmfParserBase::GetPath() + const CPath *CWmfParserBase::GetPath() const { return NULL; } @@ -221,8 +204,7 @@ namespace MetaFile TRectD CWmfParserBase::GetBounds() { - TRectL oBoundsBox = GetBoundingBox(); - TRectD oBounds(oBoundsBox); + TRectD oBounds(m_oDCRect); return oBounds; } @@ -235,63 +217,60 @@ namespace MetaFile m_oStream.SeekBack(1); } - void CWmfParserBase::TranslatePoint(short shX, short shY, double &dX, double &dY) + void CWmfParserBase::TranslatePoint(short shX, short shY, double &dX, double &dY) const { dX = (double)shX; dY = (double)shY; } - TRectL CWmfParserBase::GetBoundingBox() + void CWmfParserBase::UpdateDCRect() { - if (IsPlaceable()) + if (!IsPlaceable()) { - TRectL oBB; - - oBB = m_oPlaceable.oBoundingBox; - - const USHORT ushFileDpi = GetDpi(); - const USHORT ushRendererDpi = 96; - - if (ushFileDpi != ushRendererDpi && 0 != ushFileDpi) - { - const double dKoef = (double)ushRendererDpi / (double)ushFileDpi; - - oBB.Left = std::round(oBB.Left * dKoef); - oBB.Top = std::round(oBB.Top * dKoef); - oBB.Right = std::round(oBB.Right * dKoef); - oBB.Bottom = std::round(oBB.Bottom * dKoef); - } - - // Иногда m_oPlaceable.BoundingBox задается нулевой ширины и высоты - if (abs(oBB.Right - oBB.Left) <= 1) - { - oBB.Right = m_oBoundingBox.Right; - oBB.Left = m_oBoundingBox.Left; - } - if (abs(oBB.Bottom - oBB.Top) <= 1) - { - oBB.Top = m_oBoundingBox.Top; - oBB.Bottom = m_oBoundingBox.Bottom; - } - - return oBB; + m_oDCRect = m_oBoundingBox; + return; + } + + m_oDCRect = m_oPlaceable.oBoundingBox; + + const USHORT ushFileDpi = GetDpi(); + const USHORT ushRendererDpi = 96; + + if (ushFileDpi != ushRendererDpi && 0 != ushFileDpi) + { + const double dKoef = (double)ushRendererDpi / (double)ushFileDpi; + + m_oDCRect.Left = std::round(m_oDCRect.Left * dKoef); + m_oDCRect.Top = std::round(m_oDCRect.Top * dKoef); + m_oDCRect.Right = std::round(m_oDCRect.Right * dKoef); + m_oDCRect.Bottom = std::round(m_oDCRect.Bottom * dKoef); + } + + // Иногда m_oPlaceable.BoundingBox задается нулевой ширины и высоты + if (abs(m_oDCRect.Right - m_oDCRect.Left) <= 1) + { + m_oDCRect.Right = m_oBoundingBox.Right; + m_oDCRect.Left = m_oBoundingBox.Left; + } + if (abs(m_oDCRect.Bottom - m_oDCRect.Top) <= 1) + { + m_oDCRect.Top = m_oBoundingBox.Top; + m_oDCRect.Bottom = m_oBoundingBox.Bottom; } - else - return m_oBoundingBox; } - bool CWmfParserBase::IsPlaceable() + bool CWmfParserBase::IsPlaceable() const { return (0x9AC6CDD7 == m_oPlaceable.unKey); } - int CWmfParserBase::GetRecordRemainingBytesCount() + int CWmfParserBase::GetRecordRemainingBytesCount() const { - unsigned int unReadedSize = m_oStream.Tell() - m_unRecordPos; + const unsigned int unReadedSize = m_oStream.Tell() - m_unRecordPos; return (m_unRecordSize - unReadedSize); } - double CWmfParserBase::GetSweepAngle(const double &dStartAngle, const double &dEndAngle) + double CWmfParserBase::GetSweepAngle(const double &dStartAngle, const double &dEndAngle) const { return (dEndAngle - dStartAngle); } @@ -373,7 +352,7 @@ namespace MetaFile nY = m_pDC->GetCurPos().Y; } - IFont* pFont = GetFont(); + const IFont* pFont = GetFont(); NSStringExt::CConverter::ESingleByteEncoding eCharSet = NSStringExt::CConverter::ESingleByteEncoding::SINGLE_BYTE_ENCODING_DEFAULT;; if (pFont) { @@ -453,7 +432,7 @@ namespace MetaFile } } - m_pInterpretator->DrawString(wsText, unCharsCount, dX, dY, pdDx, 1, GetTransform()->M11, GetTransform()->M22); + m_pInterpretator->DrawString(wsText, unCharsCount, dX, dY, pdDx, 1, GetTransform().M11, GetTransform().M22); RELEASEARRAYOBJECTS(pdDx); } @@ -854,12 +833,10 @@ namespace MetaFile if (NULL != m_pInterpretator) { - m_oRect = GetBoundingBox(); - - m_pDC->SetWindowOrg(m_oRect.Left, m_oRect.Top); - m_pDC->SetWindowExt(m_oRect.Right - m_oRect.Left, m_oRect.Bottom - m_oRect.Top); - m_pDC->SetViewportOrg(m_oRect.Left, m_oRect.Top); - m_pDC->SetViewportExt(m_oRect.Right - m_oRect.Left, m_oRect.Bottom - m_oRect.Top); + m_pDC->SetWindowOrg(m_oDCRect.Left, m_oDCRect.Top); + m_pDC->SetWindowExt(m_oDCRect.Right - m_oDCRect.Left, m_oDCRect.Bottom - m_oDCRect.Top); + m_pDC->SetViewportOrg(m_oDCRect.Left, m_oDCRect.Top); + m_pDC->SetViewportExt(m_oDCRect.Right - m_oDCRect.Left, m_oDCRect.Bottom - m_oDCRect.Top); if (IsPlaceable() && 0 != m_oPlaceable.ushInch) { @@ -1036,7 +1013,7 @@ namespace MetaFile if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_META_FILLREGION(ushRegionIndex, ushBrushIndex); - CWmfRegion *pRegion = m_pDC->GetRegion(); + const CWmfRegion *pRegion = m_pDC->GetRegion(); if (NULL != pRegion) { @@ -1066,7 +1043,7 @@ namespace MetaFile m_oPlayer.SelectObject(ushRegionIndex); - CWmfRegion *pRegion = m_pDC->GetRegion(); + const CWmfRegion *pRegion = m_pDC->GetRegion(); if (NULL != pRegion) { @@ -1113,7 +1090,7 @@ namespace MetaFile m_oPlayer.SelectObject(ushRegionIndex); - CWmfRegion *pRegion = m_pDC->GetRegion(); + const CWmfRegion *pRegion = m_pDC->GetRegion(); if (NULL != pRegion) { @@ -1436,11 +1413,11 @@ namespace MetaFile TranslatePoint(shLeft, shTop, oClip.Left, oClip.Top); TranslatePoint(shRight, shBottom, oClip.Right, oClip.Bottom); - TWmfWindow* pWindow = m_pDC->GetWindow(); + const TWmfWindow& oWindow{m_pDC->GetWindow()}; TRectD oBB; - TranslatePoint(pWindow->x, pWindow->y, oBB.Left, oBB.Top); - TranslatePoint(pWindow->x + pWindow->w, pWindow->y + pWindow->h, oBB.Right, oBB.Bottom); + TranslatePoint(oWindow.x, oWindow.y, oBB.Left, oBB.Top); + TranslatePoint(oWindow.x + oWindow.w, oWindow.y + oWindow.h, oBB.Right, oBB.Bottom); m_pDC->GetClip()->Exclude(oClip, oBB); UpdateOutputDC(); @@ -1502,9 +1479,9 @@ namespace MetaFile if (NULL == m_pInterpretator) { - TWmfWindow *pWindow = m_pDC->GetWindow(); - RegisterPoint(pWindow->x , pWindow->y ); - RegisterPoint(pWindow->x + pWindow->w, pWindow->y + pWindow->h); + const TWmfWindow& oWindow{m_pDC->GetWindow()}; + RegisterPoint(oWindow.x , oWindow.y ); + RegisterPoint(oWindow.x + oWindow.w, oWindow.y + oWindow.h); } } @@ -1683,8 +1660,8 @@ namespace MetaFile if (NULL == m_pInterpretator) { - TWmfWindow *pWindow = m_pDC->GetWindow(); - RegisterPoint(pWindow->x + pWindow->w, pWindow->y + pWindow->h); + const TWmfWindow& oWindow{m_pDC->GetWindow()}; + RegisterPoint(oWindow.x + oWindow.w, oWindow.y + oWindow.h); } } @@ -1698,9 +1675,9 @@ namespace MetaFile if (NULL == m_pInterpretator) { - TWmfWindow *pWindow = m_pDC->GetWindow(); - RegisterPoint(pWindow->x , pWindow->y ); - RegisterPoint(pWindow->x + pWindow->w, pWindow->y + pWindow->h); + const TWmfWindow& oWindow{m_pDC->GetWindow()}; + RegisterPoint(oWindow.x , oWindow.y ); + RegisterPoint(oWindow.x + oWindow.w, oWindow.y + oWindow.h); } } @@ -1766,7 +1743,7 @@ namespace MetaFile if (NULL == m_pInterpretator) { if (!IsPlaceable()) - m_oBoundingBox = *oEmfParser.GetDCBounds(); + m_oBoundingBox = oEmfParser.GetDCBounds(); HANDLE_META_EOF(); } @@ -1785,11 +1762,11 @@ namespace MetaFile XmlUtils::CXmlWriter *pXmlWriter = ((CWmfInterpretatorSvg*)GetInterpretator())->GetXmlWriter(); - TRectL *pEmfRect = oEmfParser.GetDCBounds(); - TRectL *pCurentRect = GetDCBounds(); + const TRectL& oEmfRect{oEmfParser.GetDCBounds()}; + const TRectL& oCurentRect{GetDCBounds()}; - const double dScaleX = std::abs((pCurentRect->Right - pCurentRect->Left) / (pEmfRect->Right - pEmfRect->Left)); - const double dScaleY = std::abs((pCurentRect->Bottom - pCurentRect->Top) / (pEmfRect->Bottom - pEmfRect->Top)); + const double dScaleX = std::abs((oCurentRect.Right - oCurentRect.Left) / (oEmfRect.Right - oEmfRect.Left)); + const double dScaleY = std::abs((oCurentRect.Bottom - oCurentRect.Top) / (oEmfRect.Bottom - oEmfRect.Top)); const bool bAddGElement = !Equals(1., dScaleX) || !Equals(1., dScaleY); diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h index e5ccd158bd..43f1bdb298 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h @@ -32,35 +32,35 @@ namespace MetaFile virtual void PlayFile() = 0; virtual void Scan() = 0; - virtual WmfParserType GetType() = 0; + virtual WmfParserType GetType() const = 0; - void PlayMetaFile() override; - void ClearFile() override; - TRectL* GetDCBounds() override; - CClip* GetClip() override; - double GetPixelHeight() override; - double GetPixelWidth() override; - int GetTextColor() override; - IFont* GetFont() override; - IBrush* GetBrush() override; - IPen* GetPen() override; - unsigned int GetTextAlign() override; - unsigned int GetTextBgMode() override; - int GetTextBgColor() override; - unsigned int GetFillMode() override; - TPointD GetCurPos() override; - TXForm* GetInverseTransform() override; - TXForm* GetTransform(int = GM_ADVANCED) override; - unsigned int GetMiterLimit() override; - unsigned int GetRop2Mode() override; - int GetCharSpace() override; - bool IsWindowFlippedY() override; - bool IsWindowFlippedX() override; - unsigned int GetMapMode() override; - USHORT GetDpi() override; - IRegion* GetRegion() override; - unsigned int GetArcDirection() override; - CPath* GetPath() override; + void PlayMetaFile() override; + void ClearFile() override; + const TRectL& GetDCBounds() const override; + const CClip* GetClip() const override; + double GetPixelHeight() const override; + double GetPixelWidth() const override; + int GetTextColor() const override; + const IFont* GetFont() const override; + const IBrush* GetBrush() const override; + const IPen* GetPen() const override; + unsigned int GetTextAlign() const override; + unsigned int GetTextBgMode() const override; + int GetTextBgColor() const override; + unsigned int GetFillMode() const override; + TPointD GetCurPos() const override; + const TXForm& GetInverseTransform() const override; + const TXForm& GetTransform(int = GM_ADVANCED) override; + unsigned int GetMiterLimit() const override; + unsigned int GetRop2Mode() const override; + int GetCharSpace() const override; + bool IsWindowFlippedY() const override; + bool IsWindowFlippedX() const override; + unsigned int GetMapMode() const override; + USHORT GetDpi() const override; + const IRegion* GetRegion() const override; + unsigned int GetArcDirection() const override; + const CPath* GetPath() const override; void SetInterpretator(IOutputDevice* pOutput); void SetInterpretator(const wchar_t *wsFilePath, InterpretatorType oInterpretatorType, unsigned int unWidth = 0, unsigned int unHeight = 0); @@ -74,11 +74,11 @@ namespace MetaFile private: void SkipVoid(); - void TranslatePoint(short shX, short shY, double& dX, double &dY); - TRectL GetBoundingBox(); - bool IsPlaceable(); - int GetRecordRemainingBytesCount(); - inline double GetSweepAngle(const double& dStartAngle, const double& dEndAngle); + void TranslatePoint(short shX, short shY, double& dX, double &dY) const; + void UpdateDCRect(); + bool IsPlaceable() const; + int GetRecordRemainingBytesCount() const; + inline double GetSweepAngle(const double& dStartAngle, const double& dEndAngle) const; void MoveTo(short shX, short shY); void LineTo(short shX, short shY); @@ -105,7 +105,6 @@ namespace MetaFile TWmfPlaceable m_oPlaceable; TWmfHeader m_oHeader; - TRectL m_oRect; TRectL m_oDCRect; CWmfPlayer m_oPlayer; diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.cpp index 8407e8583d..2e59367315 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.cpp @@ -262,7 +262,7 @@ namespace MetaFile { } - CWmfDC* CWmfDC::Copy() + CWmfDC* CWmfDC::Copy() const { CWmfDC* pNewDC = new CWmfDC(); if (!pNewDC) @@ -296,7 +296,7 @@ namespace MetaFile return pNewDC; } - CClip *CWmfDC::GetClip() + CClip* CWmfDC::GetClip() { return &m_oClip; } @@ -309,7 +309,7 @@ namespace MetaFile if (pBrush == m_pBrush) m_pBrush = NULL; } - CWmfBrush* CWmfDC::GetBrush() + const CWmfBrush* CWmfDC::GetBrush() const { return m_pBrush; } @@ -322,7 +322,7 @@ namespace MetaFile if (m_pPen == pPen) m_pPen = NULL; } - CWmfPen* CWmfDC::GetPen() + const CWmfPen* CWmfDC::GetPen() const { return m_pPen; } @@ -335,7 +335,7 @@ namespace MetaFile if (m_pPalette == pPalette) m_pPalette = NULL; } - CWmfPalette* CWmfDC::GetPalette() + const CWmfPalette* CWmfDC::GetPalette() const { return m_pPalette; } @@ -348,7 +348,7 @@ namespace MetaFile if (m_pFont == pFont) m_pFont = NULL; } - CWmfFont* CWmfDC::GetFont() + const CWmfFont* CWmfDC::GetFont() const { return m_pFont; } @@ -361,7 +361,7 @@ namespace MetaFile if (m_pRegion == pRegion) m_pRegion = NULL; } - CWmfRegion* CWmfDC::GetRegion() + const CWmfRegion* CWmfDC::GetRegion() const { return m_pRegion; } @@ -421,15 +421,15 @@ namespace MetaFile UpdateFinalTransform(); } - unsigned int CWmfDC::GetMapMode() + unsigned int CWmfDC::GetMapMode() const { return m_ushMapMode; } - double CWmfDC::GetPixelWidth() + double CWmfDC::GetPixelWidth() const { return m_dPixelWidth; } - double CWmfDC::GetPixelHeight() + double CWmfDC::GetPixelHeight() const { return m_dPixelHeight; } @@ -441,9 +441,9 @@ namespace MetaFile { m_dPixelHeight = dH; } - TWmfWindow* CWmfDC::GetWindow() + const TWmfWindow& CWmfDC::GetWindow() const { - return &m_oWindow; + return m_oWindow; } void CWmfDC::SetWindowOrg(short shX, short shY) { @@ -490,9 +490,9 @@ namespace MetaFile UpdatePixelMetrics(); UpdateFinalTransform(); } - TWmfWindow* CWmfDC::GetViewport() + const TWmfWindow& CWmfDC::GetViewport() const { - return &m_oViewport; + return m_oViewport; } void CWmfDC::SetViewportOrg(short shX, short shY) { @@ -568,14 +568,14 @@ namespace MetaFile } void CWmfDC::UpdateFinalTransform() { - TWmfWindow* pWindow = GetWindow(); - TWmfWindow* pViewPort = GetViewport(); + const TWmfWindow& oWindow{GetWindow()}; + const TWmfWindow& oViewPort{GetViewport()}; - double dM11 = (pViewPort->w >= 0) ? 1 : -1; - double dM22 = (pViewPort->h >= 0) ? 1 : -1; + double dM11 = (oViewPort.w >= 0) ? 1 : -1; + double dM22 = (oViewPort.h >= 0) ? 1 : -1; - TEmfXForm oWindowXForm(1, 0, 0, 1, -(pWindow->x * GetPixelWidth() * dM11), -(pWindow->y * GetPixelHeight() * dM22)); - TEmfXForm oViewportXForm(GetPixelWidth() * dM11, 0, 0, GetPixelHeight() * dM22, pViewPort->x, pViewPort->y); + TEmfXForm oWindowXForm(1, 0, 0, 1, -(oWindow.x * GetPixelWidth() * dM11), -(oWindow.y * GetPixelHeight() * dM22)); + TEmfXForm oViewportXForm(GetPixelWidth() * dM11, 0, 0, GetPixelHeight() * dM22, oViewPort.x, oViewPort.y); m_oFinalTransform.Init(); m_oFinalTransform.Multiply(oViewportXForm, MWT_RIGHTMULTIPLY); @@ -613,7 +613,7 @@ namespace MetaFile { m_oTextColor = oColor; } - TRGBA& CWmfDC::GetTextColor() + const TRGBA& CWmfDC::GetTextColor() const { return m_oTextColor; } @@ -621,11 +621,11 @@ namespace MetaFile { m_oTextBgColor = oColor; } - TRGBA& CWmfDC::GetTextBgColor() + const TRGBA& CWmfDC::GetTextBgColor() const { return m_oTextBgColor; } - TPointS &CWmfDC::GetCurPos() + const TPointS& CWmfDC::GetCurPos() const { return m_oCurPos; } @@ -642,7 +642,7 @@ namespace MetaFile { m_ushTextBgMode = ushMode; } - unsigned short CWmfDC::GetTextBgMode() + unsigned short CWmfDC::GetTextBgMode() const { return m_ushTextBgMode; } @@ -650,7 +650,7 @@ namespace MetaFile { m_ushLayout = ushLayout; } - unsigned short CWmfDC::GetLayout() + unsigned short CWmfDC::GetLayout() const { return m_ushLayout; } @@ -658,7 +658,7 @@ namespace MetaFile { m_ushPolyFillMode = ushMode; } - unsigned short CWmfDC::GetPolyFillMode() + unsigned short CWmfDC::GetPolyFillMode() const { return m_ushPolyFillMode; } @@ -666,7 +666,7 @@ namespace MetaFile { m_ushRop2Mode = ushMode; } - unsigned short CWmfDC::GetRop2Mode() + unsigned short CWmfDC::GetRop2Mode() const { return m_ushRop2Mode; } @@ -674,7 +674,7 @@ namespace MetaFile { m_ushStretchBltMode = ushMode; } - unsigned short CWmfDC::GetStretchBltMode() + unsigned short CWmfDC::GetStretchBltMode() const { return m_ushStretchBltMode; } @@ -682,7 +682,7 @@ namespace MetaFile { m_ushTextAlign = ushTextAlign; } - unsigned short CWmfDC::GetTextAlign() + unsigned short CWmfDC::GetTextAlign() const { return m_ushTextAlign; } @@ -690,26 +690,26 @@ namespace MetaFile { m_ushCharSpacing = ushCharSpacing; } - unsigned short CWmfDC::GetCharSpacing() + unsigned short CWmfDC::GetCharSpacing() const { return m_ushCharSpacing; } - TXForm* CWmfDC::GetTransform() + const TXForm& CWmfDC::GetTransform() const { - return &m_oTransform; + return m_oTransform; } - TXForm* CWmfDC::GetInverseTransform() + const TXForm& CWmfDC::GetInverseTransform() const { - return &m_oTransform; + return m_oTransform; } - TXForm* CWmfDC::GetFinalTransform(int iGraphicsMode) + const TXForm& CWmfDC::GetFinalTransform(int iGraphicsMode) const { if (GM_COMPATIBLE == iGraphicsMode) - return &m_oFinalTransform2; + return m_oFinalTransform2; - return &m_oFinalTransform; + return m_oFinalTransform; } - unsigned int CWmfDC::GetMiterLimit() + unsigned int CWmfDC::GetMiterLimit() const { return 0; } diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.h b/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.h index 40a3e8263f..b153750a60 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfPlayer.h @@ -78,62 +78,62 @@ namespace MetaFile public: CWmfDC(); ~CWmfDC(); - CWmfDC* Copy(); - CClip* GetClip(); - void SetBrush(CWmfBrush* pBrush); - void RemoveBrush(CWmfBrush* pBrush); - CWmfBrush* GetBrush(); - void SetPen(CWmfPen* pPen); - void RemovePen(CWmfPen* pPen); - CWmfPen* GetPen(); - void SetPalette(CWmfPalette* pPalette); - void RemovePalette(CWmfPalette* pPalette); - CWmfPalette* GetPalette(); - void SetFont(CWmfFont* pFont); - void RemoveFont(CWmfFont* pFont); - CWmfFont* GetFont(); - void SetRegion(CWmfRegion* pRegion); - void RemoveRegion(CWmfRegion* pRegion); - CWmfRegion* GetRegion(); - void SetMapMode(unsigned short ushMapMode); - unsigned int GetMapMode(); - double GetPixelWidth(); - double GetPixelHeight(); - TWmfWindow* GetWindow(); - void SetWindowOrg(short shX, short shY); - void SetWindowExt(short shW, short shH); - void SetWindowOff(short shX, short shY); - void SetWindowScale(double dX, double dY); - TWmfWindow* GetViewport(); - void SetViewportOrg(short shX, short shY); - void SetViewportExt(short shW, short shH); - void SetViewportOff(short shX, short shY); - void SetViewportScale(double dX, double dY); - void SetTextColor(TRGBA& oColor); - TRGBA& GetTextColor(); - void SetTextBgColor(TRGBA& oColor); - TRGBA& GetTextBgColor(); - TPointS& GetCurPos(); - void SetCurPos(TPointS& oPoint); - void SetCurPos(short shX, short shY); - void SetTextBgMode(unsigned short ushMode); - unsigned short GetTextBgMode(); - void SetLayout(unsigned short ushLayout); - unsigned short GetLayout(); - void SetPolyFillMode(unsigned short ushMode); - unsigned short GetPolyFillMode(); - void SetRop2Mode(unsigned short ushMode); - unsigned short GetRop2Mode(); - void SetStretchBltMode(unsigned short ushMode); - unsigned short GetStretchBltMode(); - void SetTextAlign(unsigned short ushTextAlign); - unsigned short GetTextAlign(); - void SetCharSpacing(unsigned short ushCharSpacing); - unsigned short GetCharSpacing(); - TXForm* GetTransform(); - TXForm* GetInverseTransform(); - TXForm* GetFinalTransform(int iGraphicsMode); - unsigned int GetMiterLimit(); + CWmfDC* Copy() const; + CClip* GetClip(); + void SetBrush(CWmfBrush* pBrush); + void RemoveBrush(CWmfBrush* pBrush); + const CWmfBrush* GetBrush() const; + void SetPen(CWmfPen* pPen); + void RemovePen(CWmfPen* pPen); + const CWmfPen* GetPen() const; + void SetPalette(CWmfPalette* pPalette); + void RemovePalette(CWmfPalette* pPalette); + const CWmfPalette* GetPalette() const; + void SetFont(CWmfFont* pFont); + void RemoveFont(CWmfFont* pFont); + const CWmfFont* GetFont() const; + void SetRegion(CWmfRegion* pRegion); + void RemoveRegion(CWmfRegion* pRegion); + const CWmfRegion* GetRegion() const; + void SetMapMode(unsigned short ushMapMode); + unsigned int GetMapMode() const; + double GetPixelWidth() const; + double GetPixelHeight() const; + const TWmfWindow& GetWindow() const; + void SetWindowOrg(short shX, short shY); + void SetWindowExt(short shW, short shH); + void SetWindowOff(short shX, short shY); + void SetWindowScale(double dX, double dY); + const TWmfWindow& GetViewport() const; + void SetViewportOrg(short shX, short shY); + void SetViewportExt(short shW, short shH); + void SetViewportOff(short shX, short shY); + void SetViewportScale(double dX, double dY); + void SetTextColor(TRGBA& oColor); + const TRGBA& GetTextColor() const; + void SetTextBgColor(TRGBA& oColor); + const TRGBA& GetTextBgColor() const; + const TPointS& GetCurPos() const; + void SetCurPos(TPointS& oPoint); + void SetCurPos(short shX, short shY); + void SetTextBgMode(unsigned short ushMode); + unsigned short GetTextBgMode() const; + void SetLayout(unsigned short ushLayout); + unsigned short GetLayout() const; + void SetPolyFillMode(unsigned short ushMode); + unsigned short GetPolyFillMode() const; + void SetRop2Mode(unsigned short ushMode); + unsigned short GetRop2Mode() const; + void SetStretchBltMode(unsigned short ushMode); + unsigned short GetStretchBltMode() const; + void SetTextAlign(unsigned short ushTextAlign); + unsigned short GetTextAlign() const; + void SetCharSpacing(unsigned short ushCharSpacing); + unsigned short GetCharSpacing() const; + const TXForm& GetTransform() const; + const TXForm& GetInverseTransform() const; + const TXForm& GetFinalTransform(int iGraphicsMode) const; + unsigned int GetMiterLimit() const; private: diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfTypes.h b/DesktopEditor/raster/Metafile/Wmf/WmfTypes.h index f5d4870f13..7c45973a39 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfTypes.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfTypes.h @@ -230,7 +230,7 @@ namespace MetaFile h = 1; } - void Copy(TWmfWindow& oOther) + void Copy(const TWmfWindow& oOther) { x = oOther.x; y = oOther.y; From 5a7909a90151e580cafa346b49323ca1deaf6525 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 6 Sep 2024 15:46:26 +0600 Subject: [PATCH 26/82] Fix pivot cache definition conversion --- .../Biff12_records/BeginPCDFGRange.cpp | 4 +- .../Biff12_records/BeginPCDFGRange.h | 6 +-- OOXML/XlsxFormat/Pivot/Pivots.cpp | 45 +++++++++++++------ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.cpp b/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.cpp index 78ec5babd1..9573a8ed5c 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.cpp +++ b/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.cpp @@ -59,7 +59,7 @@ namespace XLSB fAutoEnd = GETBIT(flags, 1); fDates = GETBIT(flags, 2); - record >> xnumStart >> xnumBy >> xnumEnd; + record >> xnumStart >> xnumEnd >> xnumBy; } void BeginPCDFGRange::writeFields(XLS::CFRecord& record) @@ -71,7 +71,7 @@ namespace XLSB SETBIT(flags, 2, fDates) record << iByType << flags; - record << xnumStart << xnumBy << xnumEnd; + record << xnumStart << xnumEnd << xnumBy; } } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.h b/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.h index 0974d988f4..fb2971de68 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.h +++ b/OOXML/XlsbFormat/Biff12_records/BeginPCDFGRange.h @@ -54,9 +54,9 @@ namespace XLSB //static const XLS::ElementType type = XLS::typeBeginPCDFGRange; BYTE iByType; - bool fAutoStart; - bool fAutoEnd; - bool fDates; + bool fAutoStart = false; + bool fAutoEnd = false; + bool fDates = false; XLS::Xnum xnumStart; XLS::Xnum xnumEnd; XLS::Xnum xnumBy; diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index bee1244a32..d5b3e528f8 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -175,6 +175,16 @@ namespace Spreadsheet } + double getExcelTimeFromDate(std::wstring Date) + { + boost::gregorian::date StartDate(1899, boost::gregorian::Dec, 30); + XLSB::PCDIDateTime datetime; + datetime.fromString(Date); + boost::gregorian::date date(datetime.yr + 1900, datetime.mon + 1, datetime.dom); + auto duration = date - StartDate; + return duration.days(); + } + //struct NullDeleter {template void operator()(T*) {} }; void CPivotTableFile::readBin(const CPath& oPath) { @@ -4316,7 +4326,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_else_if ( oReader, L"uniqueList", m_oUniqueList ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"level", m_oLevel ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"mappingCount", m_oMappingCount ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"uniqueList", m_oNumFmtId ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"numFmtId", m_oNumFmtId ) WritingElement_ReadAttributes_End( oReader ) } //------------------------------------ @@ -4528,8 +4538,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->citems = 0; if(m_oMinDate.IsInit() && m_oMaxDate.IsInit()) { - ptr->xnumMin.data.value = std::stod(m_oMinDate->GetValue()); - ptr->xnumMax.data.value =std::stod(m_oMaxDate->GetValue()); + ptr->xnumMin.data.value = getExcelTimeFromDate(m_oMinDate->GetValue()); + ptr->xnumMax.data.value = getExcelTimeFromDate(m_oMaxDate->GetValue()); } else if(m_oMinValue.IsInit() && m_oMaxValue.IsInit()) { @@ -5076,10 +5086,12 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fAutoEnd = m_oAutoEnd.get(); if(m_oGroupInterval.IsInit()) ptr->xnumBy.data.value = m_oGroupInterval.get(); + else + ptr->xnumBy.data.value = 1; if(m_oStartDate.IsInit() && m_oEndDate.IsInit()) { - ptr->xnumStart.data.value = std::stod(m_oStartDate->GetValue()); - ptr->xnumEnd.data.value = std::stod(m_oEndDate->GetValue()); + ptr->xnumStart.data.value = getExcelTimeFromDate(m_oStartDate->GetValue()); + ptr->xnumEnd.data.value = getExcelTimeFromDate(m_oEndDate->GetValue()); } else { @@ -5100,6 +5112,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByQuarters) ptr->iByType = 0x06; else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByYears) ptr->iByType = 0x07; } + if(ptr->iByType > 0x00) + ptr->fDates = true; return objectPtr; } void CRangeGroupingProperties::fromBin(XLS::BaseObjectPtr& obj) @@ -5163,14 +5177,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" void CRangeGroupingProperties::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if ( oReader, L"m_oGroupBy", m_oGroupBy ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oAutoStart", m_oAutoStart ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oAutoEnd", m_oAutoEnd ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oStartDate", m_oStartDate ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oEndDate", m_oEndDate ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oStartNum", m_oStartNum ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oEndNum", m_oEndNum ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oGroupInterval", m_oGroupInterval ) + WritingElement_ReadAttributes_Read_if ( oReader, L"groupBy", m_oGroupBy ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"autoStart", m_oAutoStart ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"autoEnd", m_oAutoEnd ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"startDate", m_oStartDate ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"endDate", m_oEndDate ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"startNum", m_oStartNum ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"endNum", m_oEndNum ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"groupInterval", m_oGroupInterval ) WritingElement_ReadAttributes_End( oReader ) } //------------------------------------ @@ -5781,6 +5795,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->info.cIMemProps = m_oCount->GetValue(); if(m_oValue.IsInit()) ptr->datetime.fromString(m_oValue->GetValue()); + ptr->datetime.yr += 1900; + ptr->datetime.mon += 1; for(auto i:m_arrItems) ptr->info.rgIMemProps.push_back(i->m_oV.get()); return objectPtr; @@ -5793,6 +5809,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->datetime.fromString(m_oValue->GetValue()); + ptr->datetime.yr += 1900; + ptr->datetime.mon += 1; return objectPtr; } @@ -6281,6 +6299,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->relId.value = m_oRid->GetValue(); else ptr->fLoadRelId = false; + ptr->fBuiltIn = false; return objectPtr; } void CWorksheetSource::fromBin(XLS::BaseObjectPtr& obj) From b79c173f5981bf84426022b75f23eb5f4b18fe03 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 9 Sep 2024 07:48:27 +0300 Subject: [PATCH 27/82] Add dependencies for doctrenderer --- DesktopEditor/doctrenderer/doctrenderer.pro | 1 + DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 080a7225df..a5789be704 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -111,6 +111,7 @@ include(../../Common/3dParty/openssl/openssl.pri) DEFINES += BUIDLER_OPEN_DOWNLOAD_ENABLED DEFINES += BUIDLER_OPEN_BASE64_ENABLED +CONFIG += drawingfile_support drawingfile_support { DEFINES += WASM_SERIALIZER_USE_ALLOCATOR ADD_DEPENDENCY(PdfFile, XpsFile, DjVuFile, DocxRenderer) diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp index 12263c5eab..b7caf4daef 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp @@ -1,6 +1,6 @@ #include "DrawingFileEmbed.h" -JSSmart MoveMemoryToJS(BYTE* pWasmData) +JSSmart MoveMemoryToJS(BYTE* pWasmData, const bool& isFree = true) { if (NULL == pWasmData) return CJSContext::createNull(); @@ -13,7 +13,9 @@ JSSmart MoveMemoryToJS(BYTE* pWasmData) size_t nBufferSize = (size_t)(nLen - 4); BYTE* pMemory = NSJSBase::NSAllocator::Alloc(nBufferSize); memcpy(pMemory, pWasmData + 4, nBufferSize); - free(pWasmData); + + if (isFree) + free(pWasmData); return NSJSBase::CJSContext::createUint8Array(pMemory, (int)nBufferSize, false); } @@ -50,7 +52,7 @@ JSSmart CDrawingFileEmbed::GetPixmap(JSSmart nPageIndex, JSS JSSmart CDrawingFileEmbed::GetGlyphs(JSSmart nPageIndex) { - return MoveMemoryToJS(m_pFile->GetGlyphs(nPageIndex->toInt32())); + return MoveMemoryToJS(m_pFile->GetGlyphs(nPageIndex->toInt32()), false); } JSSmart CDrawingFileEmbed::GetLinks(JSSmart nPageIndex) { From f21d92ee92f42864909c597cc9ed4b792eb9864a Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 9 Sep 2024 14:23:54 +0300 Subject: [PATCH 28/82] Enable drawing file in doctrenderer --- DesktopEditor/allthemesgen/allthemesgen.pro | 2 +- .../doctrenderer/app_builder/docbuilder.pro | 2 +- .../doctrenderer/embed/DrawingFileEmbed.cpp | 65 ++++++++++++------- .../doctrenderer/embed/DrawingFileEmbed.h | 6 +- .../embed/jsc/jsc_DrawingFileEmbed.mm | 8 ++- .../embed/v8/v8_DrawingFileEmbed.cpp | 8 ++- 6 files changed, 62 insertions(+), 29 deletions(-) diff --git a/DesktopEditor/allthemesgen/allthemesgen.pro b/DesktopEditor/allthemesgen/allthemesgen.pro index 7746933ab2..8455c0259c 100644 --- a/DesktopEditor/allthemesgen/allthemesgen.pro +++ b/DesktopEditor/allthemesgen/allthemesgen.pro @@ -15,7 +15,7 @@ TARGET = allthemesgen DEFINES += KERNEL_USE_DYNAMIC_LIBRARY DEFINES += GRAPHICS_USE_DYNAMIC_LIBRARY -ADD_DEPENDENCY(graphics, kernel, kernel_network, UnicodeConverter, doctrenderer) +ADD_DEPENDENCY(graphics, kernel, kernel_network, UnicodeConverter, doctrenderer, PdfFile, XpsFile, DjVuFile, DocxRenderer) core_windows { DEFINES -= UNICODE diff --git a/DesktopEditor/doctrenderer/app_builder/docbuilder.pro b/DesktopEditor/doctrenderer/app_builder/docbuilder.pro index e414a3f70d..ceb33c54a5 100644 --- a/DesktopEditor/doctrenderer/app_builder/docbuilder.pro +++ b/DesktopEditor/doctrenderer/app_builder/docbuilder.pro @@ -25,7 +25,7 @@ core_windows { DESTDIR = $$CORE_BUILDS_BINARY_PATH ################################################ -ADD_DEPENDENCY(graphics, kernel, kernel_network, UnicodeConverter, doctrenderer) +ADD_DEPENDENCY(graphics, kernel, kernel_network, UnicodeConverter, doctrenderer, PdfFile, XpsFile, DjVuFile, DocxRenderer) core_linux { LIBS += -ldl diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp index b7caf4daef..ed0ebd3f0d 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp @@ -1,6 +1,6 @@ #include "DrawingFileEmbed.h" -JSSmart MoveMemoryToJS(BYTE* pWasmData, const bool& isFree = true) +JSSmart WasmMemoryToJS(BYTE* pWasmData) { if (NULL == pWasmData) return CJSContext::createNull(); @@ -10,14 +10,7 @@ JSSmart MoveMemoryToJS(BYTE* pWasmData, const bool& isFree = true) if (4 >= nLen) return CJSContext::createNull(); - size_t nBufferSize = (size_t)(nLen - 4); - BYTE* pMemory = NSJSBase::NSAllocator::Alloc(nBufferSize); - memcpy(pMemory, pWasmData + 4, nBufferSize); - - if (isFree) - free(pWasmData); - - return NSJSBase::CJSContext::createUint8Array(pMemory, (int)nBufferSize, false); + return NSJSBase::CJSContext::createUint8Array(pWasmData + 4, nLen - 4, true); } JSSmart CDrawingFileEmbed::OpenFile(JSSmart sFile, JSSmart sPassword) @@ -42,58 +35,76 @@ JSSmart CDrawingFileEmbed::GetErrorCode() JSSmart CDrawingFileEmbed::GetInfo() { - return MoveMemoryToJS(m_pFile->GetInfo()); + return WasmMemoryToJS(m_pFile->GetInfo()); } JSSmart CDrawingFileEmbed::GetPixmap(JSSmart nPageIndex, JSSmart nRasterW, JSSmart nRasterH, JSSmart nBackgroundColor) { - return MoveMemoryToJS(m_pFile->GetPixmap(nPageIndex->toInt32(), nRasterW->toInt32(), nRasterH->toInt32(), nBackgroundColor->toInt32())); + int nW = nRasterW->toInt32(); + int nH = nRasterH->toInt32(); + BYTE* pData = m_pFile->GetPixmap(nPageIndex->toInt32(), nW, nH, nBackgroundColor->toInt32()); + + if (NULL == pData) + return CJSContext::createNull(); + + return NSJSBase::CJSContext::createUint8Array(pData, 4 * nW * nH, true); +} + +JSSmart CDrawingFileEmbed::DestroyPixmap(JSSmart typedArray) +{ + if (!typedArray->isTypedArray()) + return NULL; + + CBgraFrame oFrame; + oFrame.put_Data(typedArray->toTypedArray()->getData().Data); + // free on destructor + return NULL; } JSSmart CDrawingFileEmbed::GetGlyphs(JSSmart nPageIndex) { - return MoveMemoryToJS(m_pFile->GetGlyphs(nPageIndex->toInt32()), false); + return WasmMemoryToJS(m_pFile->GetGlyphs(nPageIndex->toInt32())); } JSSmart CDrawingFileEmbed::GetLinks(JSSmart nPageIndex) { - return MoveMemoryToJS(m_pFile->GetLinks(nPageIndex->toInt32())); + return WasmMemoryToJS(m_pFile->GetLinks(nPageIndex->toInt32())); } JSSmart CDrawingFileEmbed::GetStructure() { - return MoveMemoryToJS(m_pFile->GetStructure()); + return WasmMemoryToJS(m_pFile->GetStructure()); } JSSmart CDrawingFileEmbed::GetInteractiveFormsInfo() { - return MoveMemoryToJS(m_pFile->GetInteractiveFormsInfo()); + return WasmMemoryToJS(m_pFile->GetInteractiveFormsInfo()); } JSSmart CDrawingFileEmbed::GetInteractiveFormsFonts(JSSmart nTypeFonts) { - return MoveMemoryToJS(m_pFile->GetInteractiveFormsFonts(nTypeFonts->toInt32())); + return WasmMemoryToJS(m_pFile->GetInteractiveFormsFonts(nTypeFonts->toInt32())); } JSSmart CDrawingFileEmbed::GetInteractiveFormsAP(JSSmart nRasterW, JSSmart nRasterH, JSSmart nBackgroundColor, JSSmart nPageIndex, JSSmart nWidget, JSSmart nView, JSSmart nButtonView) { - return MoveMemoryToJS(m_pFile->GetInteractiveFormsAP(nRasterW->toInt32(), nRasterH->toInt32(), nBackgroundColor->toInt32(), + return WasmMemoryToJS(m_pFile->GetInteractiveFormsAP(nRasterW->toInt32(), nRasterH->toInt32(), nBackgroundColor->toInt32(), nPageIndex->toInt32(), nWidget->toInt32(), nView->toInt32(), nButtonView->toInt32())); } JSSmart CDrawingFileEmbed::GetButtonIcons(JSSmart nBackgroundColor, JSSmart nPageIndex, JSSmart bBase64, JSSmart nButtonWidget, JSSmart nIconView) { - return MoveMemoryToJS(m_pFile->GetButtonIcons(nBackgroundColor->toInt32(), nPageIndex->toInt32(), bBase64->toInt32(), + return WasmMemoryToJS(m_pFile->GetButtonIcons(nBackgroundColor->toInt32(), nPageIndex->toInt32(), bBase64->toInt32(), nButtonWidget->toInt32(), nIconView->toInt32())); } JSSmart CDrawingFileEmbed::GetAnnotationsInfo(JSSmart nPageIndex) { - return MoveMemoryToJS(m_pFile->GetAnnotationsInfo(nPageIndex->toInt32())); + return WasmMemoryToJS(m_pFile->GetAnnotationsInfo(nPageIndex->toInt32())); } JSSmart CDrawingFileEmbed::GetAnnotationsAP(JSSmart nRasterW, JSSmart nRasterH, JSSmart nBackgroundColor, JSSmart nPageIndex, JSSmart nAnnot, JSSmart nView) { - return MoveMemoryToJS(m_pFile->GetAnnotationsAP(nRasterW->toInt32(), nRasterH->toInt32(), nBackgroundColor->toInt32(), - nPageIndex->toInt32(), nAnnot->toInt32(), nView->toInt32())); + return WasmMemoryToJS(m_pFile->GetAnnotationsAP(nRasterW->toInt32(), nRasterH->toInt32(), nBackgroundColor->toInt32(), + nPageIndex->toInt32(), nAnnot->toInt32(), nView->toInt32())); } JSSmart CDrawingFileEmbed::DestroyTextInfo() @@ -107,7 +118,7 @@ JSSmart CDrawingFileEmbed::IsNeedCMap() } JSSmart CDrawingFileEmbed::ScanPage(JSSmart nPageIndex, JSSmart mode) { - return MoveMemoryToJS(m_pFile->ScanPage(nPageIndex->toInt32(), mode->toInt32())); + return WasmMemoryToJS(m_pFile->ScanPage(nPageIndex->toInt32(), mode->toInt32())); } JSSmart CDrawingFileEmbed::GetImageBase64(JSSmart rId) @@ -119,3 +130,13 @@ JSSmart CDrawingFileEmbed::GetImageBase64(JSSmart rId) *pData = ""; return ret; } + +JSSmart CDrawingFileEmbed::FreeWasmData(JSSmart typedArray) +{ + if (!typedArray->isTypedArray()) + return NULL; + BYTE* data = typedArray->toTypedArray()->getData().Data; + data -= 4; // sizeof int (length in NSWasm::Data) + free(data); + return NULL; +} diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h index 89ab6e228a..15cc3598ad 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h @@ -32,8 +32,8 @@ public: JSSmart GetInfo(); JSSmart GetPixmap(JSSmart nPageIndex, JSSmart nRasterW, JSSmart nRasterH, JSSmart nBackgroundColor); + JSSmart DestroyPixmap(JSSmart typedArray); - JSSmart GetGlyphs(JSSmart nPageIndex); JSSmart GetLinks(JSSmart nPageIndex); JSSmart GetStructure(); JSSmart GetInteractiveFormsInfo(); @@ -44,12 +44,16 @@ public: JSSmart GetAnnotationsInfo(JSSmart nPageIndex); JSSmart GetAnnotationsAP(JSSmart nRasterW, JSSmart nRasterH, JSSmart nBackgroundColor, JSSmart nPageIndex, JSSmart nAnnot, JSSmart nView); + JSSmart GetGlyphs(JSSmart nPageIndex); JSSmart DestroyTextInfo(); + JSSmart IsNeedCMap(); JSSmart ScanPage(JSSmart nPageIndex, JSSmart mode); JSSmart GetImageBase64(JSSmart rId); + JSSmart FreeWasmData(JSSmart typedArray); + DECLARE_EMBED_METHODS }; diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm index 38a6e013a5..fe2af99105 100644 --- a/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm +++ b/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm @@ -11,7 +11,7 @@ -(JSValue*) GetErrorCode; -(JSValue*) GetInfo; -(JSValue*) GetPixmap : (JSValue*)nPageIndex : (JSValue*)nRasterW : (JSValue*)nRasterH : (JSValue*)nBackgroundColor; --(JSValue*) GetGlyphs : (JSValue*)nPageIndex; +-(JSValue*) DestroyPixmap : (JSValue*)typedArray; -(JSValue*) GetLinks : (JSValue*)nPageIndex; -(JSValue*) GetStructure; -(JSValue*) GetInteractiveFormsInfo; @@ -20,10 +20,12 @@ -(JSValue*) GetButtonIcons : (JSValue*)nBackgroundColor : (JSValue*)nPageIndex : (JSValue*)bBase64 : (JSValue*)nButtonWidget : (JSValue*)nIconView; -(JSValue*) GetAnnotationsInfo : (JSValue*)nPageIndex; -(JSValue*) GetAnnotationsAP : (JSValue*)nRasterW : (JSValue*)nRasterH : (JSValue*)nBackgroundColor : (JSValue*)nPageIndex : (JSValue*)nAnnot : (JSValue*)nView; +-(JSValue*) GetGlyphs : (JSValue*)nPageIndex; -(JSValue*) DestroyTextInfo; -(JSValue*) IsNeedCMap; -(JSValue*) ScanPage : (JSValue*)nPageIndex : (JSValue*)mode; -(JSValue*) GetImageBase64 : (JSValue*)rId; +-(JSValue*) FreeWasmData : (JSValue*)typedArray; @end @interface CJSCDrawingFileEmbed : NSObject @@ -42,7 +44,7 @@ FUNCTION_WRAPPER_JS_0(GetType, GetType) FUNCTION_WRAPPER_JS_0(GetErrorCode, GetErrorCode) FUNCTION_WRAPPER_JS_0(GetInfo, GetInfo) FUNCTION_WRAPPER_JS_4(GetPixmap, GetPixmap) -FUNCTION_WRAPPER_JS_1(GetGlyphs, GetGlyphs) +FUNCTION_WRAPPER_JS_1(DestroyPixmap, DestroyPixmap) FUNCTION_WRAPPER_JS_1(GetLinks, GetLinks) FUNCTION_WRAPPER_JS_0(GetStructure, GetStructure) FUNCTION_WRAPPER_JS_0(GetInteractiveFormsInfo, GetInteractiveFormsInfo) @@ -51,10 +53,12 @@ FUNCTION_WRAPPER_JS_7(GetInteractiveFormsAP, GetInteractiveFormsAP) FUNCTION_WRAPPER_JS_5(GetButtonIcons, GetButtonIcons) FUNCTION_WRAPPER_JS_1(GetAnnotationsInfo, GetAnnotationsInfo) FUNCTION_WRAPPER_JS_6(GetAnnotationsAP, GetAnnotationsAP) +FUNCTION_WRAPPER_JS_1(GetGlyphs, GetGlyphs) FUNCTION_WRAPPER_JS_0(DestroyTextInfo, DestroyTextInfo) FUNCTION_WRAPPER_JS_0(IsNeedCMap, IsNeedCMap) FUNCTION_WRAPPER_JS_2(ScanPage, ScanPage) FUNCTION_WRAPPER_JS_1(GetImageBase64, GetImageBase64) +FUNCTION_WRAPPER_JS_1(FreeWasmData, FreeWasmData) @end class CDrawingFileEmbedAdapter : public CJSEmbedObjectAdapterJSC diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp index 7b22c21607..600379c909 100644 --- a/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp @@ -14,7 +14,7 @@ namespace NSDrawingFileEmbed FUNCTION_WRAPPER_V8_0(_GetErrorCode, GetErrorCode) FUNCTION_WRAPPER_V8_0(_GetInfo, GetInfo) FUNCTION_WRAPPER_V8_4(_GetPixmap, GetPixmap) - FUNCTION_WRAPPER_V8_1(_GetGlyphs, GetGlyphs) + FUNCTION_WRAPPER_V8_1(_DestroyPixmap, DestroyPixmap) FUNCTION_WRAPPER_V8_1(_GetLinks, GetLinks) FUNCTION_WRAPPER_V8_0(_GetStructure, GetStructure) FUNCTION_WRAPPER_V8_0(_GetInteractiveFormsInfo, GetInteractiveFormsInfo) @@ -23,10 +23,12 @@ namespace NSDrawingFileEmbed FUNCTION_WRAPPER_V8_5(_GetButtonIcons, GetButtonIcons) FUNCTION_WRAPPER_V8_1(_GetAnnotationsInfo, GetAnnotationsInfo) FUNCTION_WRAPPER_V8_6(_GetAnnotationsAP, GetAnnotationsAP) + FUNCTION_WRAPPER_V8_1(_GetGlyphs, GetGlyphs) FUNCTION_WRAPPER_V8_0(_DestroyTextInfo, DestroyTextInfo) FUNCTION_WRAPPER_V8_0(_IsNeedCMap, IsNeedCMap) FUNCTION_WRAPPER_V8_2(_ScanPage, ScanPage) FUNCTION_WRAPPER_V8_1(_GetImageBase64, GetImageBase64) + FUNCTION_WRAPPER_V8_1(_FreeWasmData, FreeWasmData) v8::Handle CreateTemplate(v8::Isolate* isolate) { @@ -40,7 +42,7 @@ namespace NSDrawingFileEmbed NSV8Objects::Template_Set(result, "GetErrorCode", _GetErrorCode); NSV8Objects::Template_Set(result, "GetInfo", _GetInfo); NSV8Objects::Template_Set(result, "GetPixmap", _GetPixmap); - NSV8Objects::Template_Set(result, "GetGlyphs", _GetGlyphs); + NSV8Objects::Template_Set(result, "DestroyPixmap", _DestroyPixmap); NSV8Objects::Template_Set(result, "GetLinks", _GetLinks); NSV8Objects::Template_Set(result, "GetStructure", _GetStructure); NSV8Objects::Template_Set(result, "GetInteractiveFormsInfo", _GetInteractiveFormsInfo); @@ -49,10 +51,12 @@ namespace NSDrawingFileEmbed NSV8Objects::Template_Set(result, "GetButtonIcons", _GetButtonIcons); NSV8Objects::Template_Set(result, "GetAnnotationsInfo", _GetAnnotationsInfo); NSV8Objects::Template_Set(result, "GetAnnotationsAP", _GetAnnotationsAP); + NSV8Objects::Template_Set(result, "GetGlyphs", _GetGlyphs); NSV8Objects::Template_Set(result, "DestroyTextInfo", _DestroyTextInfo); NSV8Objects::Template_Set(result, "IsNeedCMap", _IsNeedCMap); NSV8Objects::Template_Set(result, "ScanPage", _ScanPage); NSV8Objects::Template_Set(result, "GetImageBase64", _GetImageBase64); + NSV8Objects::Template_Set(result, "FreeWasmData", _FreeWasmData); return handle_scope.Escape(result); } From 493cec92c695a5fcdcfef36ccf02bc24ca993b28 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 9 Sep 2024 15:03:59 +0300 Subject: [PATCH 29/82] Move methods from graphics renderer to base interface --- DesktopEditor/graphics/GraphicsRenderer.cpp | 2 +- DesktopEditor/graphics/GraphicsRenderer.h | 8 ++-- DesktopEditor/graphics/IRenderer.h | 9 +++++ DesktopEditor/graphics/pro/Graphics.h | 5 --- PdfFile/SrcReader/RendererOutputDev.cpp | 37 ++++++------------- .../gradient/Gradient/mainwindow.cpp | 2 +- 6 files changed, 27 insertions(+), 36 deletions(-) diff --git a/DesktopEditor/graphics/GraphicsRenderer.cpp b/DesktopEditor/graphics/GraphicsRenderer.cpp index 5e20c46f18..2f14a36b59 100644 --- a/DesktopEditor/graphics/GraphicsRenderer.cpp +++ b/DesktopEditor/graphics/GraphicsRenderer.cpp @@ -1537,7 +1537,7 @@ void CGraphicsRenderer::Restore() RELEASEOBJECT(pState); } -void CGraphicsRenderer::put_BlendMode(const unsigned int nBlendMode) +void CGraphicsRenderer::put_BlendMode(const unsigned int& nBlendMode) { if (NULL != m_pRenderer) { diff --git a/DesktopEditor/graphics/GraphicsRenderer.h b/DesktopEditor/graphics/GraphicsRenderer.h index b8bcc7cf1b..d5cd633616 100644 --- a/DesktopEditor/graphics/GraphicsRenderer.h +++ b/DesktopEditor/graphics/GraphicsRenderer.h @@ -163,9 +163,9 @@ public: virtual HRESULT PenDashPattern(double* pPattern, LONG lCount); // brush ------------------------------------------------------------------------------------ - virtual void put_BrushGradInfo(const NSStructures::GradientInfo &_ginfo) override { - m_oBrush.m_oGradientInfo = _ginfo; - } + virtual void put_BrushGradInfo(void* pGradInfo) override { + m_oBrush.m_oGradientInfo = *((NSStructures::GradientInfo*)pGradInfo); + } virtual HRESULT get_BrushType(LONG* lType); virtual HRESULT put_BrushType(const LONG& lType); @@ -278,7 +278,7 @@ public: { _SetFont(); } - virtual void put_BlendMode(const unsigned int nBlendMode) override; + virtual void put_BlendMode(const unsigned int& nBlendMode) override; public: virtual void CloseFont() diff --git a/DesktopEditor/graphics/IRenderer.h b/DesktopEditor/graphics/IRenderer.h index d8273d734e..e387ed6e3b 100644 --- a/DesktopEditor/graphics/IRenderer.h +++ b/DesktopEditor/graphics/IRenderer.h @@ -403,6 +403,15 @@ public: UNUSED_VARIABLE(dValue); return S_FALSE; } + + virtual void put_BrushGradInfo(void* pGradInfo) + { + UNUSED_VARIABLE(pGradInfo); + } + virtual void put_BlendMode(const unsigned int& nBlendMode) + { + UNUSED_VARIABLE(nBlendMode); + } }; #define PROPERTY_RENDERER(NameBase, Name, Type) \ diff --git a/DesktopEditor/graphics/pro/Graphics.h b/DesktopEditor/graphics/pro/Graphics.h index d76fd9a81e..efc49eddd3 100644 --- a/DesktopEditor/graphics/pro/Graphics.h +++ b/DesktopEditor/graphics/pro/Graphics.h @@ -131,11 +131,6 @@ namespace NSGraphics virtual void drawVerLine(BYTE align, double x, double y, double b, double penW) = 0; virtual void drawHorLineExt(BYTE align, double y, double x, double r, double penW, double leftMW, double rightMW) = 0; - - // test - - virtual void put_BrushGradInfo(const NSStructures::GradientInfo &_ginfo) = 0; - virtual void put_BlendMode(const unsigned int nBlendMode) = 0; }; GRAPHICS_DECL IGraphicsRenderer* Create(); diff --git a/PdfFile/SrcReader/RendererOutputDev.cpp b/PdfFile/SrcReader/RendererOutputDev.cpp index 4f2f33a62a..24166e1a78 100644 --- a/PdfFile/SrcReader/RendererOutputDev.cpp +++ b/PdfFile/SrcReader/RendererOutputDev.cpp @@ -1895,11 +1895,8 @@ namespace PdfReader cur_y += delta_y; } - if (NSGraphics::IGraphicsRenderer* GRenderer = dynamic_cast(m_pRenderer)) - { - GRenderer->put_BrushGradInfo(info); - m_pRenderer->DrawPath(c_nWindingFillMode); - } + m_pRenderer->put_BrushGradInfo(&info); + m_pRenderer->DrawPath(c_nWindingFillMode); m_pRenderer->EndCommand(c_nPathType); m_pRenderer->put_BrushType(brush); @@ -1953,11 +1950,8 @@ namespace PdfReader t+=delta; } - if (NSGraphics::IGraphicsRenderer* GRenderer = dynamic_cast(m_pRenderer)) - { - GRenderer->put_BrushGradInfo(info); - m_pRenderer->DrawPath(c_nWindingFillMode); - } + m_pRenderer->put_BrushGradInfo(&info); + m_pRenderer->DrawPath(c_nWindingFillMode); m_pRenderer->EndCommand(c_nPathType); @@ -2009,11 +2003,9 @@ namespace PdfReader t+=delta; } - if (NSGraphics::IGraphicsRenderer* GRenderer = dynamic_cast(m_pRenderer)) - { - GRenderer->put_BrushGradInfo(info); - m_pRenderer->DrawPath(c_nWindingFillMode); - } + m_pRenderer->put_BrushGradInfo(&info); + m_pRenderer->DrawPath(c_nWindingFillMode); + m_pRenderer->EndCommand(c_nPathType); m_pRenderer->put_BrushType(brush); pGState->clearPath(); @@ -2051,11 +2043,9 @@ namespace PdfReader NSStructures::GradientInfo info = NSStructures::GInfoConstructor::get_triangle(pixel_points, rgba8_colors, {}, false); - if (NSGraphics::IGraphicsRenderer* GRenderer = dynamic_cast(m_pRenderer)) - { - GRenderer->put_BrushGradInfo(info); - m_pRenderer->DrawPath(c_nWindingFillMode); - } + m_pRenderer->put_BrushGradInfo(&info); + m_pRenderer->DrawPath(c_nWindingFillMode); + pGState->clearPath(); m_pRenderer->EndCommand(c_nPathType); m_pRenderer->put_BrushType(brush); @@ -2107,11 +2097,8 @@ namespace PdfReader false ); - if (NSGraphics::IGraphicsRenderer* GRenderer = dynamic_cast(m_pRenderer)) - { - GRenderer->put_BrushGradInfo(info); - m_pRenderer->DrawPath(c_nWindingFillMode); - } + m_pRenderer->put_BrushGradInfo(&info); + m_pRenderer->DrawPath(c_nWindingFillMode); m_pRenderer->EndCommand(c_nPathType); m_pRenderer->put_BrushType(brush); diff --git a/Test/Applications/gradient/Gradient/mainwindow.cpp b/Test/Applications/gradient/Gradient/mainwindow.cpp index 3410e7aea9..d01fd8ab22 100644 --- a/Test/Applications/gradient/Gradient/mainwindow.cpp +++ b/Test/Applications/gradient/Gradient/mainwindow.cpp @@ -61,7 +61,7 @@ QImage GenerateImg(std::vector &points, Info &info, const i NSStructures::GradientInfo ginfo = info.ginfo; ginfo.shading.f_type = NSStructures::ShadingInfo::UseNew; - pRasterRenderer->put_BrushGradInfo(ginfo); + pRasterRenderer->put_BrushGradInfo(&ginfo); auto a = info.c; auto b = info.p; LONG *c = a.data(); From 6a2d3838ae1f0398a75ef6910b0a44c286ef5edb Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 10 Sep 2024 03:24:57 +0500 Subject: [PATCH 30/82] Fix bug #70044 --- OdfFile/Writer/Converter/ConvertDrawing.cpp | 17 +++++++++ OdfFile/Writer/Converter/PptxConverter.cpp | 8 ++++ OdfFile/Writer/Format/odf_drawing_context.cpp | 37 ++++++++++++++++++- OdfFile/Writer/Format/odf_drawing_context.h | 3 ++ 4 files changed, 63 insertions(+), 2 deletions(-) diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 61d4f1ce85..6c94c353cb 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -68,6 +68,7 @@ #include "../Format/odf_drawing_context.h" #include "../Format/style_text_properties.h" #include "../Format/style_paragraph_properties.h" +#include "../Format/style_graphic_properties.h" #include "../Format/styles_list.h" #define GETBITS(from, numL, numH) ((from & (((1 << (numH - numL + 1)) - 1) << numL)) >> numL) @@ -872,6 +873,22 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape) if (type < 0)return; //----------------------------------------------------------------------------- odf_context()->drawing_context()->start_shape(type); + + if (odf_context()->drawing_context()->placeholder_replacing()) + { + _CP_PTR(cpdoccore::odf_writer::paragraph_format_properties) paragraph_properties = boost::make_shared(); + _CP_PTR(cpdoccore::odf_writer::text_format_properties) text_properties = boost::make_shared(); + _CP_PTR(cpdoccore::odf_writer::graphic_format_properties) graphic_properties = boost::make_shared(); + + convert(oox_shape->txBody->lstStyle.GetPointer(), 0, paragraph_properties.get(), text_properties.get()); + + graphic_properties->draw_textarea_horizontal_align_ = odf_types::text_align(odf_types::text_align::Left); + graphic_properties->draw_textarea_vertical_align_ = odf_types::vertical_align(odf_types::vertical_align::Top); + + odf_context()->drawing_context()->set_text_properties(text_properties.get()); + odf_context()->drawing_context()->set_paragraph_properties(paragraph_properties.get()); + odf_context()->drawing_context()->set_graphic_properties(graphic_properties.get()); + } convert(&oox_shape->spPr, oox_shape->style.GetPointer()); diff --git a/OdfFile/Writer/Converter/PptxConverter.cpp b/OdfFile/Writer/Converter/PptxConverter.cpp index a1a1e76585..a6f8187776 100644 --- a/OdfFile/Writer/Converter/PptxConverter.cpp +++ b/OdfFile/Writer/Converter/PptxConverter.cpp @@ -2775,10 +2775,17 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS } int ph_type = 0; + bool placeholder_replacing = false; if (pNvPr->ph->type.IsInit()) { ph_type = pNvPr->ph->type->GetBYTECode(); + if (type == Slide && ph_type == 0) + { + placeholder_replacing = true; + ph_type = 13; // subtitle + } + if (type == Layout && (ph_type == 5 || ph_type == 6 || ph_type == 7 || ph_type == 12)) continue; } @@ -2786,6 +2793,7 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS if (!bPlaceholders) continue; + odf_context()->drawing_context()->placeholder_replacing(placeholder_replacing); odf_context()->drawing_context()->set_placeholder_type(ph_type); if (pNvPr->ph->idx.IsInit()) diff --git a/OdfFile/Writer/Format/odf_drawing_context.cpp b/OdfFile/Writer/Format/odf_drawing_context.cpp index 8679507fc1..74d64642ce 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.cpp +++ b/OdfFile/Writer/Format/odf_drawing_context.cpp @@ -201,6 +201,7 @@ struct odf_drawing_state presentation_class_ = boost::none; presentation_placeholder_id_ = boost::none; + placeholder_replacing = false; rotateAngle_ = boost::none; text_rotateAngle_ = boost::none; @@ -249,6 +250,7 @@ struct odf_drawing_state _CP_OPT(presentation_class) presentation_class_; _CP_OPT(std::wstring) presentation_placeholder_id_; + bool placeholder_replacing; std::wstring program_; std::wstring replacement_; @@ -294,6 +296,7 @@ public: is_header_ = false; is_footer_ = false; is_background_ = false; + placeholder_replacing = false; //некоторые свойства для объектов графики не поддерживаюися в редакторах Libre && OpenOffice.net //в MS Office и в нашем - проблем таких нет. } @@ -309,6 +312,7 @@ public: bool is_footer_; bool is_header_; bool is_background_; + bool placeholder_replacing; _CP_OPT(int) is_presentation_; void create_draw_base(eOdfDrawElements type); @@ -2592,18 +2596,47 @@ void odf_drawing_context::set_paragraph_properties(paragraph_format_properties * } else { - //??? find by name + /// find by name + if (!draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_text_style_name_->empty()) + { + style* found_style; + + impl_->styles_context_->find_odf_style( + *draw->common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.draw_text_style_name_, + odf_types::style_family::Paragraph, + found_style); + + if (found_style) + impl_->current_paragraph_properties = found_style->content_.add_get_style_paragraph_properties(); + } } } } if (impl_->current_paragraph_properties && paragraph_properties) - impl_->current_paragraph_properties ->apply_from(*paragraph_properties); + impl_->current_paragraph_properties->apply_from(*paragraph_properties); } void odf_drawing_context::set_graphic_properties(style_graphic_properties *graphic_properties) { if (impl_->current_graphic_properties && graphic_properties) impl_->current_graphic_properties->apply_from(graphic_properties->content_); } + +void odf_drawing_context::set_graphic_properties(graphic_format_properties* graphic_properties) +{ + if (impl_->current_graphic_properties && graphic_properties) + impl_->current_graphic_properties->apply_from(*graphic_properties); +} + +void odf_drawing_context::placeholder_replacing(bool replacing) +{ + impl_->current_drawing_state_.placeholder_replacing = replacing; +} + +bool odf_drawing_context::placeholder_replacing() +{ + return impl_->current_drawing_state_.placeholder_replacing; +} + graphic_format_properties* odf_drawing_context::get_graphic_properties() { return impl_->current_graphic_properties; diff --git a/OdfFile/Writer/Format/odf_drawing_context.h b/OdfFile/Writer/Format/odf_drawing_context.h index d97e4f2942..a52e7c6dcf 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.h +++ b/OdfFile/Writer/Format/odf_drawing_context.h @@ -152,10 +152,13 @@ public: bool is_wordart(); bool is_text_box(); bool is_placeholder(); + void placeholder_replacing(bool replacing); + bool placeholder_replacing(); graphic_format_properties* get_graphic_properties(); void set_graphic_properties (style_graphic_properties *graphic_properties); + void set_graphic_properties (graphic_format_properties* graphic_properties); void set_paragraph_properties (paragraph_format_properties *paragraph_properties); void set_text_properties (style_text_properties *text_properties); void set_text_properties (text_format_properties* text_properties); From 891739018597c051a2c14e6c0ab39d5773e9a401 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Tue, 10 Sep 2024 16:25:23 +0300 Subject: [PATCH 31/82] binary mrun --- OOXML/Binary/Document/BinReader/Readers.cpp | 72 ++++++++++++++++++- .../BinWriter/BinReaderWriterDefines.h | 15 +++- .../Binary/Document/BinWriter/BinWriters.cpp | 67 +++++++++++++++++ OOXML/DocxFormat/Logic/RunContent.cpp | 40 +++++------ 4 files changed, 172 insertions(+), 22 deletions(-) diff --git a/OOXML/Binary/Document/BinReader/Readers.cpp b/OOXML/Binary/Document/BinReader/Readers.cpp index 4c88fba09f..3dc3b50d03 100644 --- a/OOXML/Binary/Document/BinReader/Readers.cpp +++ b/OOXML/Binary/Document/BinReader/Readers.cpp @@ -6033,11 +6033,12 @@ int Binary_DocumentTableReader::ReadMathArg(BYTE type, long length, void* poResu OOX::Logic::CMoveToRangeEnd oMoveToRangeEnd; READ1_DEF(length, res, this->ReadMoveToRangeEnd, &oMoveToRangeEnd); GetRunStringWriter().WriteString(oMoveToRangeEnd.toXML()); - } + } else res = c_oSerConstants::ReadUnknown; return res; } + int Binary_DocumentTableReader::ReadMathAcc(BYTE type, long length, void* poResult) { int res = c_oSerConstants::ReadOk; @@ -7517,6 +7518,75 @@ int Binary_DocumentTableReader::ReadMathMRun(BYTE type, long length, void* poRes READ1_DEF(length, res, this->ReadMathInsDel, &oTrackRevision); oTrackRevision.Write(&GetRunStringWriter(), _T("w:ins")); } + else if (c_oSer_OMathContentType::AnnotationRef == type) + { + OOX::Logic::CAnnotationRef oAnnotationRef; + GetRunStringWriter().WriteString(oAnnotationRef.toXML()); + } + else if (c_oSer_OMathContentType::CommentReference == type) + { + long nId = 0; + READ1_DEF(length, res, this->ReadComment, &nId); + if (NULL != m_oFileWriter.m_pComments) + { + CComment* pComment = m_oFileWriter.m_pComments->get(nId); + if (NULL != pComment) // могут быть и без start/end + { + GetRunStringWriter().WriteString(pComment->writeRef(std::wstring(_T("")), std::wstring(_T("w:commentReference")), std::wstring(_T("")))); + } + } + } + else if (c_oSer_OMathContentType::Cr == type) + { + OOX::Logic::CCr oCr; + GetRunStringWriter().WriteString(oCr.toXML()); + } + else if (c_oSer_OMathContentType::EndnoteRef == type) + { + OOX::Logic::CEndnoteRef oEndnoteRef; + GetRunStringWriter().WriteString(oEndnoteRef.toXML()); + } + else if (c_oSer_OMathContentType::FootnoteRef == type) + { + OOX::Logic::CFootnoteRef oFootnoteRef; + GetRunStringWriter().WriteString(oFootnoteRef.toXML()); + } + else if (c_oSer_OMathContentType::EndnoteReference == type) + { + OOX::Logic::CEndnoteReference oEndnoteReference; + READ1_DEF(length, res, this->ReadEndnoteRef, &oEndnoteReference); + GetRunStringWriter().WriteString(oEndnoteReference.toXML()); + } + else if (c_oSer_OMathContentType::FootnoteReference == type) + { + OOX::Logic::CFootnoteReference oFootnoteReference; + READ1_DEF(length, res, this->ReadFootnoteRef, &oFootnoteReference); + GetRunStringWriter().WriteString(oFootnoteReference.toXML()); + } + else if (c_oSer_OMathContentType::LastRenderedPageBreak == type) + { + OOX::Logic::CLastRenderedPageBreak oLastRenderedPageBreak; + GetRunStringWriter().WriteString(oLastRenderedPageBreak.toXML()); + } + else if (c_oSer_OMathContentType::NoBreakHyphen == type) + { + OOX::Logic::CNoBreakHyphen oNoBreakHyphen; + GetRunStringWriter().WriteString(oNoBreakHyphen.toXML()); + } + else if (c_oSer_OMathContentType::SoftHyphen == type) + { + OOX::Logic::CSoftHyphen oSoftHyphen; + GetRunStringWriter().WriteString(oSoftHyphen.toXML()); + } + else if (c_oSer_OMathContentType::Tab == type) + { + OOX::Logic::CTab oTab; + GetRunStringWriter().WriteString(oTab.toXML()); + } + else if (c_oSer_OMathContentType::Sym == type) + { + std::wstring sText = m_oBufferedStream.GetString3(length); + } else res = c_oSerConstants::ReadUnknown; return res; diff --git a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h index 51ef40ee6a..16d2cbef8a 100644 --- a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h +++ b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h @@ -1061,7 +1061,20 @@ extern int g_nCurFormatVersion; MoveFromRangeStart = 68, MoveFromRangeEnd = 69, MoveToRangeStart = 70, - MoveToRangeEnd = 71 + MoveToRangeEnd = 71, + AnnotationRef = 72, + CommentReference = 73, + ContentPart = 74, + Cr = 75, + EndnoteRef = 76, + EndnoteReference = 77, + FootnoteRef = 78, + FootnoteReference = 79, + LastRenderedPageBreak = 80, + NoBreakHyphen = 81, + SoftHyphen = 82, + Sym = 83, + Tab = 84 };} namespace c_oSer_FramePrType{ enum c_oSer_FramePrType { diff --git a/OOXML/Binary/Document/BinWriter/BinWriters.cpp b/OOXML/Binary/Document/BinWriter/BinWriters.cpp index cdf9c6c3c3..ffc049b7a1 100644 --- a/OOXML/Binary/Document/BinWriter/BinWriters.cpp +++ b/OOXML/Binary/Document/BinWriter/BinWriters.cpp @@ -5115,6 +5115,73 @@ void BinaryDocumentTableWriter::WriteMathRunContent(OOX::Logic::CMRun* pMRun) WriteMathIns(pMRun->m_oIns.get()); m_oBcw.WriteItemEnd(nCurPos2); } + if (pMRun->m_oNoBreakHyphen.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::NoBreakHyphen); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oSoftHyphen.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::SoftHyphen); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oTab.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::Tab); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oSym.IsInit()) + { + wchar_t ch = 0x0FFF & pMRun->m_oSym->m_oChar->GetValue(); + std::wstring sText(&ch, 1); + + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::Sym); + m_oBcw.m_oStream.WriteStringW(sText); + m_oBcw.WriteItemEnd(nCurPos2); + } + if (pMRun->m_oAnnotationRef.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::AnnotationRef); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oCommentReference.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::CommentReference); + WriteComment(OOX::et_w_commentReference, pMRun->m_oCommentReference->m_oId); + m_oBcw.WriteItemEnd(nCurPos2); + } + if (pMRun->m_oCr.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::Cr); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oEndnoteRef.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::EndnoteRef); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oEndnoteReference.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::EndnoteReference); + WriteNoteRef(pMRun->m_oEndnoteReference->m_oCustomMarkFollows, pMRun->m_oEndnoteReference->m_oId); + m_oBcw.WriteItemEnd(nCurPos2); + } + if (pMRun->m_oFootnoteRef.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::FootnoteRef); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } + if (pMRun->m_oFootnoteReference.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_OMathContentType::FootnoteReference); + WriteNoteRef(pMRun->m_oFootnoteReference->m_oCustomMarkFollows, pMRun->m_oFootnoteReference->m_oId); + m_oBcw.WriteItemEnd(nCurPos2); + } + if (pMRun->m_oLastRenderedPageBreak.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_OMathContentType::LastRenderedPageBreak); + m_oBcw.m_oStream.WriteLONG(c_oSerPropLenType::Null); + } } void BinaryDocumentTableWriter::WriteMathAccPr(const OOX::Logic::CAccPr &pAccPr) { diff --git a/OOXML/DocxFormat/Logic/RunContent.cpp b/OOXML/DocxFormat/Logic/RunContent.cpp index 871f5afbfd..22795eeb27 100644 --- a/OOXML/DocxFormat/Logic/RunContent.cpp +++ b/OOXML/DocxFormat/Logic/RunContent.cpp @@ -72,7 +72,7 @@ namespace OOX sResult += _T("w:type=\""); sResult += m_oType.ToString(); - sResult += _T("\" />"); + sResult += _T("\"/>"); return sResult; } @@ -153,7 +153,7 @@ namespace OOX sResult += L"\" "; } - sResult += L" />"; + sResult += L"/>"; return sResult; } @@ -184,7 +184,7 @@ namespace OOX } std::wstring CCr::toXML() const { - return _T(""); + return _T(""); } EElementType CCr::getType() const { @@ -207,7 +207,7 @@ namespace OOX } std::wstring CDayLong::toXML() const { - return _T(""); + return _T(""); } EElementType CDayLong::getType() const { @@ -230,7 +230,7 @@ namespace OOX } std::wstring CDayShort::toXML() const { - return _T(""); + return _T(""); } EElementType CDayShort::getType() const { @@ -318,7 +318,7 @@ namespace OOX } std::wstring CLastRenderedPageBreak::toXML() const { - return _T(""); + return _T(""); } EElementType CLastRenderedPageBreak::getType() const { @@ -341,7 +341,7 @@ namespace OOX } std::wstring CMonthLong::toXML() const { - return _T(""); + return _T(""); } EElementType CMonthLong::getType() const { @@ -364,7 +364,7 @@ namespace OOX } std::wstring CMonthShort::toXML() const { - return _T(""); + return _T(""); } EElementType CMonthShort::getType() const { @@ -387,7 +387,7 @@ namespace OOX } std::wstring CNoBreakHyphen::toXML() const { - return _T(""); + return _T(""); } EElementType CNoBreakHyphen::getType() const { @@ -410,7 +410,7 @@ namespace OOX } std::wstring CPgNum::toXML() const { - return _T(""); + return _T(""); } EElementType CPgNum::getType() const { @@ -494,7 +494,7 @@ namespace OOX } std::wstring CRuby::toXML() const { - return _T(""); + return _T(""); } EElementType CRuby::getType() const { @@ -517,7 +517,7 @@ namespace OOX } std::wstring CSoftHyphen::toXML() const { - return _T(""); + return _T(""); } EElementType CSoftHyphen::getType() const { @@ -672,7 +672,7 @@ namespace OOX } std::wstring CTab::toXML() const { - return _T(""); + return _T(""); } EElementType CTab::getType() const { @@ -695,7 +695,7 @@ namespace OOX } std::wstring CYearLong::toXML() const { - return _T(""); + return _T(""); } EElementType CYearLong::getType() const { @@ -718,7 +718,7 @@ namespace OOX } std::wstring CYearShort::toXML() const { - return _T(""); + return _T(""); } EElementType CYearShort::getType() const { @@ -741,7 +741,7 @@ namespace OOX } std::wstring CAnnotationRef::toXML() const { - return _T(""); + return _T(""); } EElementType CAnnotationRef::getType() const { @@ -821,7 +821,7 @@ namespace OOX } std::wstring CContinuationSeparator::toXML() const { - return _T(""); + return _T(""); } EElementType CContinuationSeparator::getType() const { @@ -909,7 +909,7 @@ namespace OOX } std::wstring CEndnoteRef::toXML() const { - return _T(""); + return _T(""); } EElementType CEndnoteRef::getType() const { @@ -995,7 +995,7 @@ namespace OOX } std::wstring CFootnoteRef::toXML() const { - return _T(""); + return _T(""); } EElementType CFootnoteRef::getType() const { @@ -1146,7 +1146,7 @@ namespace OOX } std::wstring CSeparator::toXML() const { - return _T(""); + return _T(""); } EElementType CSeparator::getType() const From 5904bb3507021eb16ba07961eeb6bc1e50de8b5a Mon Sep 17 00:00:00 2001 From: Green Date: Tue, 10 Sep 2024 21:07:39 +0300 Subject: [PATCH 32/82] Fix bug #69865 --- .../raster/Metafile/svg/CSvgParser.cpp | 3 +- .../Metafile/svg/SvgObjects/CClipPath.cpp | 4 +- .../Metafile/svg/SvgObjects/CContainer.cpp | 4 +- .../Metafile/svg/SvgObjects/CMarker.cpp | 64 +++++++++--------- .../raster/Metafile/svg/SvgObjects/CMarker.h | 2 + .../Metafile/svg/SvgObjects/CObjectBase.cpp | 65 ++++++++++--------- .../Metafile/svg/SvgObjects/CObjectBase.h | 2 +- .../raster/Metafile/svg/SvgObjects/CPath.cpp | 2 +- .../raster/Metafile/svg/SvgObjects/CText.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CUse.cpp | 16 ++--- 10 files changed, 86 insertions(+), 80 deletions(-) diff --git a/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp b/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp index 9026263cdc..03a4afd679 100644 --- a/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp +++ b/DesktopEditor/raster/Metafile/svg/CSvgParser.cpp @@ -47,7 +47,8 @@ namespace SVG return false; std::wstring wsXml; - NSFile::CFileBinary::ReadAllTextUtf8(wsFile, wsXml); + if (!NSFile::CFileBinary::ReadAllTextUtf8(wsFile, wsXml)) + return false; XmlUtils::IXmlDOMDocument::DisableOutput(); bool bResult = LoadFromString(wsXml, pContainer, pFile); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp index 1e3999f931..6e26551035 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CClipPath.cpp @@ -23,8 +23,8 @@ namespace SVG if (NULL == pRenderer || NULL == pFile) return false; - ApplyClip(pRenderer, &m_oTransformtaion.m_oClip, pFile, oObjectBounds); - + ApplyClip(pRenderer, &m_oTransformation.m_oClip, pFile, oObjectBounds); + for (const CRenderedObject* pObject : m_oContainer.m_arObjects) pObject->Draw(pRenderer, pFile, CommandeModeClip); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp index 016715c5c0..e029f8265c 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp @@ -55,13 +55,13 @@ namespace SVG { Aggplus::CMatrix oOldTransform; - if (!StartPath(pRenderer, pFile, oOldTransform, oMode)) + if (!StartPath(pRenderer, pFile, oOldTransform, CommandeModeDraw)) return false; for (const CRenderedObject* pObject : m_arObjects) pObject->Draw(pRenderer, pFile, oMode, pOtherStyles); - EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, CommandeModeDraw, pOtherStyles); return true; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp index 943894bd05..548aa4a636 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp @@ -6,7 +6,7 @@ namespace SVG { CMarker::CMarker(XmlUtils::CXmlNode &oNode) - : CObject(oNode), m_pImage(NULL) + : CObject(oNode), m_oBounds{0., 0., 0., 0.}, m_pImage(NULL) { m_oWindow.m_oX .SetValue(oNode.GetAttribute(L"refX")); m_oWindow.m_oY .SetValue(oNode.GetAttribute(L"refY")); @@ -14,6 +14,8 @@ namespace SVG m_oWindow.m_oWidth .SetValue(oNode.GetAttribute(L"markerWidth", L"3")); m_oWindow.m_oHeight.SetValue(oNode.GetAttribute(L"markerHeight", L"3")); + m_oViewBox = m_oWindow; + const std::wstring wsViewBox = oNode.GetAttribute(L"viewBox"); if (!wsViewBox.empty()) @@ -66,22 +68,28 @@ namespace SVG (!m_oViewBox.m_oWidth.Empty() && m_oViewBox.m_oWidth.Zero()) || (!m_oViewBox.m_oHeight.Empty() && m_oViewBox.m_oHeight.Zero())) return; - double dVBWidth = m_oViewBox.m_oWidth .ToDouble(NSCSS::Pixel); - double dVBHeight = m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel); + TBounds oTempBounds; - double dMaxValue = std::max(dVBWidth, dVBHeight); + for (const CRenderedObject* pObject : m_arObjects) + { + oTempBounds = pObject->GetBounds(); + m_oBounds.m_dLeft = std::min(m_oBounds.m_dLeft, oTempBounds.m_dLeft); + m_oBounds.m_dTop = std::min(m_oBounds.m_dTop, oTempBounds.m_dTop); + m_oBounds.m_dRight = std::max(m_oBounds.m_dRight, oTempBounds.m_dRight); + m_oBounds.m_dBottom = std::max(m_oBounds.m_dBottom, oTempBounds.m_dBottom); + } NSGraphics::IGraphicsRenderer* pGrRenderer = NSGraphics::Create(); - double dMMtoPx = 96. / 25.4; + const double dMaxScale = std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); + const double dMMtoPx = 96. / 25.4; + const double dWidth = std::max(std::abs(m_oBounds.m_dRight - m_oBounds.m_dLeft), std::abs(m_oBounds.m_dBottom - m_oBounds.m_dTop)) * dMaxScale; + const int nWidth = dWidth * dMMtoPx; - int nWidth = dMaxValue * dMMtoPx + 1; - int nHeight = dMaxValue * dMMtoPx + 1; - - if (0 == nWidth || 0 == nHeight) + if (0 == nWidth) return; - BYTE* pBgraData = new(std::nothrow) BYTE[nWidth * nHeight * 4]; + BYTE* pBgraData = new(std::nothrow) BYTE[nWidth * nWidth * 4]; if (!pBgraData) return; @@ -89,21 +97,21 @@ namespace SVG unsigned int alfa = 0xffffff; //дефолтный тон должен быть прозрачным, а не белым //memset(pBgraData, 0xff, nWidth * nHeight * 4); - for (int i = 0; i < nWidth * nHeight; i++) + for (int i = 0; i < nWidth * nWidth; i++) ((unsigned int*)pBgraData)[i] = alfa; CBgraFrame oFrame; oFrame.put_Data(pBgraData); oFrame.put_Width(nWidth); - oFrame.put_Height(nHeight); + oFrame.put_Height(nWidth); oFrame.put_Stride(-4 * nWidth); pGrRenderer->CreateFromBgraFrame(&oFrame); - pGrRenderer->put_Width (dMaxValue); - pGrRenderer->put_Height(dMaxValue); + pGrRenderer->put_Width (dWidth); + pGrRenderer->put_Height(dWidth); - pGrRenderer->SetCoordTransformOffset(((dMaxValue - dVBWidth) / 2. - m_oViewBox.m_oX.ToDouble(NSCSS::Pixel)) * dMMtoPx, - ((dMaxValue - dVBHeight) / 2. - m_oViewBox.m_oY.ToDouble(NSCSS::Pixel)) * dMMtoPx); + pGrRenderer->SetTransform(dMaxScale, 0, 0, dMaxScale, 0, 0); + pGrRenderer->SetCoordTransformOffset(-((m_oBounds.m_dLeft) * dMaxScale * dMMtoPx), -(m_oBounds.m_dTop * dMaxScale * dMMtoPx)); pGrRenderer->SetSwapRGB(false); pGrRenderer->BeginCommand(c_nImageType); @@ -125,26 +133,18 @@ namespace SVG if (NULL == m_pImage || arPoints.empty() || Equals(0., dStrokeWidth)) return; - double dWidth = m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) * ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.); - double dHeight = m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) * ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.); + const double dMaxScale = std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); + const double dWidth = std::max(std::abs(m_oBounds.m_dRight - m_oBounds.m_dLeft), std::abs(m_oBounds.m_dBottom - m_oBounds.m_dTop)) * ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.) * dMaxScale; - double dVBWidth = m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel); - double dVBHeight = m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel); + const double dSkipX = m_oBounds.m_dLeft * dStrokeWidth * dMaxScale; + const double dSkipY = m_oBounds.m_dTop * dStrokeWidth * dMaxScale; - double dMaxValue = std::max(dVBWidth, dVBHeight); - double dMaxScale = std::max(dMaxValue / dVBWidth, dMaxValue / dVBHeight); - - double dSkipX = (m_oWindow.m_oX.ToDouble(NSCSS::Pixel) - m_oViewBox.m_oX.ToDouble(NSCSS::Pixel)) / dMaxScale + (dMaxValue - dVBWidth) * (dWidth / (2 * dMaxValue)); - double dSkipY = (m_oWindow.m_oY.ToDouble(NSCSS::Pixel) - m_oViewBox.m_oY.ToDouble(NSCSS::Pixel)) / dMaxScale + (dMaxValue - dVBHeight) * (dHeight / (2 * dMaxValue)); - - for (const Point& oPoint : arPoints) + for (Point oPoint : arPoints) { - Point oNewPoint(oPoint); + oPoint.dX += dSkipX; + oPoint.dY += dSkipY; - oNewPoint.dX -= dSkipX; - oNewPoint.dY -= dSkipY; - - pRenderer->DrawImage((IGrObject*)m_pImage, oNewPoint.dX, oNewPoint.dY, dWidth, dHeight); + pRenderer->DrawImage((IGrObject*)m_pImage, oPoint.dX, oPoint.dY, dWidth, dWidth); } } } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h index ef301c69f3..45a1a28671 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h @@ -30,6 +30,8 @@ namespace SVG TRect m_oWindow; TRect m_oViewBox; + TBounds m_oBounds; + Aggplus::CImage *m_pImage; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp index a5076af047..e98fec10ae 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp @@ -50,28 +50,28 @@ namespace SVG void CObject::SetTransform(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"transform")) - m_oTransformtaion.m_oTransform.SetMatrix(mAttributes.at(L"transform"), ushLevel, bHardMode); + m_oTransformation.m_oTransform.SetMatrix(mAttributes.at(L"transform"), ushLevel, bHardMode); else - m_oTransformtaion.m_oTransform.SetMatrix(L"", ushLevel, false); + m_oTransformation.m_oTransform.SetMatrix(L"", ushLevel, false); } void CObject::SetClip(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"clip-path")) - m_oTransformtaion.m_oClip.m_oHref.SetValue(mAttributes.at(L"clip-path"), ushLevel, bHardMode); + m_oTransformation.m_oClip.m_oHref.SetValue(mAttributes.at(L"clip-path"), ushLevel, bHardMode); else - m_oTransformtaion.m_oClip.m_oHref.SetValue(L"", ushLevel, false); + m_oTransformation.m_oClip.m_oHref.SetValue(L"", ushLevel, false); if (mAttributes.end() != mAttributes.find(L"clip-rule")) - m_oTransformtaion.m_oClip.m_oRule.SetValue(mAttributes.at(L"clip-rule"), std::vector{L"nonzero", L"evenodd"}, ushLevel, bHardMode); + m_oTransformation.m_oClip.m_oRule.SetValue(mAttributes.at(L"clip-rule"), std::vector{L"nonzero", L"evenodd"}, ushLevel, bHardMode); } void CObject::SetMask(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"mask")) - m_oTransformtaion.m_oMask.SetValue(mAttributes.at(L"mask"), ushLevel, bHardMode); + m_oTransformation.m_oMask.SetValue(mAttributes.at(L"mask"), ushLevel, bHardMode); else - m_oTransformtaion.m_oMask.SetValue(L"", ushLevel, false); + m_oTransformation.m_oMask.SetValue(L"", ushLevel, false); } void CObject::SetDisplay(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) @@ -85,15 +85,15 @@ namespace SVG wsVisibility = mAttributes.at(L"visibility"); if (L"none" == wsDisplay || L"hidden" == wsVisibility || L"collapse" == wsVisibility) - m_oTransformtaion.m_bDraw = false; + m_oTransformation.m_bDraw = false; else - m_oTransformtaion.m_bDraw = true; + m_oTransformation.m_bDraw = true; } void CObject::SetOpacity(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) { if (mAttributes.end() != mAttributes.find(L"opacity")) - m_oTransformtaion.m_oOpacity.SetValue(mAttributes.at(L"opacity"), ushLevel, bHardMode); + m_oTransformation.m_oOpacity.SetValue(mAttributes.at(L"opacity"), ushLevel, bHardMode); } bool CObject::ApplyTransform(IRenderer *pRenderer, const NSCSS::NSProperties::CTransform *pTransform, Aggplus::CMatrix& oOldMatrix) const @@ -118,12 +118,9 @@ namespace SVG bool CObject::ApplyClip(IRenderer *pRenderer, const TClip *pClip, const CSvgFile *pFile, const TBounds &oBounds) const { - if (NULL == pRenderer || NULL == pClip || NULL == pFile) + if (NULL == pRenderer || NULL == pClip || NULL == pFile || pClip->m_oHref.Empty() || NSCSS::NSProperties::ColorType::ColorUrl != pClip->m_oHref.GetType()) return false; - if (pClip->m_oHref.Empty() || NSCSS::NSProperties::ColorType::ColorUrl != pClip->m_oHref.GetType()) - return true; - if (pClip->m_oRule == L"evenodd") pRenderer->put_ClipMode(c_nClipRegionTypeEvenOdd); else @@ -242,8 +239,8 @@ namespace SVG m_oStyles.m_oStroke.m_oMiterlimit = 4.; - m_oTransformtaion.m_oOpacity = 1.; - m_oTransformtaion.m_bDraw = true; + m_oTransformation.m_oOpacity = 1.; + m_oTransformation.m_bDraw = true; } void CRenderedObject::SetStroke(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) @@ -282,21 +279,23 @@ namespace SVG m_oStyles.m_oFill.SetOpacity(mAttributes.at(L"fill-opacity"), ushLevel, bHardMode); } - bool CRenderedObject::StartPath(IRenderer *pRenderer, const CSvgFile *pFile, Aggplus::CMatrix &oOldTransform, CommandeMode oMode) const + bool CRenderedObject::StartPath(IRenderer *pRenderer, const CSvgFile *pFile, Aggplus::CMatrix& oOldTransform, CommandeMode oMode) const { - if (NULL == pRenderer || !m_oTransformtaion.m_bDraw || Equals(0., m_oTransformtaion.m_oOpacity.ToDouble())) + if (NULL == pRenderer || !m_oTransformation.m_bDraw || Equals(0., m_oTransformation.m_oOpacity.ToDouble())) return false; - ApplyTransform(pRenderer, &m_oTransformtaion.m_oTransform, oOldTransform); - ApplyClip(pRenderer, &m_oTransformtaion.m_oClip, pFile, GetBounds()); - ApplyMask(pRenderer, &m_oTransformtaion.m_oMask, pFile, GetBounds()); + const TBounds oBounds{GetBounds()}; + + ApplyTransform(pRenderer, &m_oTransformation.m_oTransform, oOldTransform); + ApplyClip(pRenderer, &m_oTransformation.m_oClip, pFile, oBounds); + ApplyMask(pRenderer, &m_oTransformation.m_oMask, pFile, oBounds); if (CommandeModeClip == oMode) pRenderer->BeginCommand(c_nClipType); - else if (1. != m_oTransformtaion.m_oOpacity.ToDouble()) + else if (1. != m_oTransformation.m_oOpacity.ToDouble()) { pRenderer->BeginCommand(c_nLayerType); - pRenderer->put_LayerOpacity(m_oTransformtaion.m_oOpacity.ToDouble()); + pRenderer->put_LayerOpacity(m_oTransformation.m_oOpacity.ToDouble()); } pRenderer->BeginCommand(c_nPathType); @@ -305,17 +304,19 @@ namespace SVG return true; } - void CRenderedObject::EndPath(IRenderer *pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix &oOldTransform, CommandeMode oMode, const TSvgStyles* pOtherStyles) const + void CRenderedObject::EndPath(IRenderer *pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode, const TSvgStyles* pOtherStyles) const { if (CommandeModeClip == oMode) { pRenderer->EndCommand(c_nClipType); pRenderer->EndCommand(c_nPathType); pRenderer->PathCommandEnd(); - pRenderer->SetTransform(oOldTransform.sx(), oOldTransform.shy(), oOldTransform.shx(), oOldTransform.sy(), oOldTransform.tx(), oOldTransform.ty()); + pRenderer->SetTransform(oOldTransform.sx(), oOldTransform.shy(), + oOldTransform.shx(), oOldTransform.sy(), + oOldTransform.tx(), oOldTransform.ty()); return; } - + int nPathType = 0; if (NULL == pOtherStyles) @@ -331,22 +332,24 @@ namespace SVG pRenderer->EndCommand(c_nPathType); pRenderer->PathCommandEnd(); - if (!m_oTransformtaion.m_oClip.m_oHref.Empty()) + if (!m_oTransformation.m_oClip.m_oHref.Empty()) { pRenderer->BeginCommand(c_nResetClipType); pRenderer->EndCommand(c_nResetClipType); } - if (!m_oTransformtaion.m_oMask.Empty()) + if (!m_oTransformation.m_oMask.Empty()) { pRenderer->BeginCommand(c_nResetMaskType); pRenderer->EndCommand(c_nResetMaskType); } - - if (1. != m_oTransformtaion.m_oOpacity.ToDouble()) + + if (1. != m_oTransformation.m_oOpacity.ToDouble()) pRenderer->EndCommand(c_nLayerType); - pRenderer->SetTransform(oOldTransform.sx(), oOldTransform.shy(), oOldTransform.shx(), oOldTransform.sy(), oOldTransform.tx(), oOldTransform.ty()); + pRenderer->SetTransform(oOldTransform.sx(), oOldTransform.shy(), + oOldTransform.shx(), oOldTransform.sy(), + oOldTransform.tx(), oOldTransform.ty()); } void CRenderedObject::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h index affcb3f420..7b6d3c6d57 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h @@ -86,7 +86,7 @@ namespace SVG friend class CClipPath; NSCSS::CNode m_oXmlNode; - TSvgTransformation m_oTransformtaion; + TSvgTransformation m_oTransformation; }; enum CommandeMode diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp index d1b0f60c70..429ceba098 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp @@ -514,7 +514,7 @@ namespace SVG if (!StartPath(pRenderer, pFile, oOldMatrix, oMode)) return false; - double dStrokeWidth = (m_oStyles.m_oStroke.m_oWidth.Empty()) ? 1. : m_oStyles.m_oStroke.m_oWidth.ToDouble(NSCSS::Pixel); + const double dStrokeWidth = (m_oStyles.m_oStroke.m_oWidth.Empty()) ? 1. : m_oStyles.m_oStroke.m_oWidth.ToDouble(NSCSS::Pixel); if (!m_oMarkers.m_oStart.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oStart.GetType()) { diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp index 2628f664be..8caa092e57 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp @@ -136,7 +136,7 @@ namespace SVG { double dX, dY; CalculatePosition(dX, dY); - m_oTransformtaion.m_oTransform.RotateAt(NSCSS::NS_STATIC_FUNCTIONS::ReadDouble(mAttributes.at(L"rotate")), dX, dY); + m_oTransformation.m_oTransform.RotateAt(NSCSS::NS_STATIC_FUNCTIONS::ReadDouble(mAttributes.at(L"rotate")), dX, dY); } } @@ -409,7 +409,7 @@ namespace SVG if (NULL == pRenderer) return; - Aggplus::CMatrix oCurrentMatrix(m_oTransformtaion.m_oTransform.GetMatrix().GetFinalValue()); + Aggplus::CMatrix oCurrentMatrix(m_oTransformation.m_oTransform.GetMatrix().GetFinalValue()); double dXScale = 1., dYScale = 1.; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp index 4f8f14500a..a92dbb14aa 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp @@ -27,14 +27,14 @@ namespace SVG bool CUse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles) const { - if (NULL == pRenderer || !m_oTransformtaion.m_bDraw) + if (NULL == pRenderer || !m_oTransformation.m_bDraw) return false; - - Aggplus::CMatrix oTransform; - - if (!StartPath(pRenderer, pFile, oTransform)) + + Aggplus::CMatrix oOldTransform; + + if (!StartPath(pRenderer, pFile, oOldTransform)) return false; - + double dM11, dM12, dM21, dM22, dDx, dDy; pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy); @@ -56,8 +56,8 @@ namespace SVG else pFoundObj->Draw(pRenderer, pFile, oMode, &m_oStyles); } - - EndPath(pRenderer, pFile, oTransform); + + EndPath(pRenderer, pFile, oOldTransform); return true; } From 0b16086ff5c37650d59548af7557d4926ce39c95 Mon Sep 17 00:00:00 2001 From: Green Date: Tue, 10 Sep 2024 21:08:12 +0300 Subject: [PATCH 33/82] Fix bugs in svg conversion and optimization --- Common/3dParty/html/css/src/CNode.cpp | 9 +++++ Common/3dParty/html/css/src/CNode.h | 2 + Common/3dParty/html/css/src/ConstValues.cpp | 10 ++++- Common/3dParty/html/css/src/ConstValues.h | 2 + .../3dParty/html/css/src/StyleProperties.cpp | 39 +++++++++---------- HtmlFile2/htmlfile2.cpp | 1 + 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Common/3dParty/html/css/src/CNode.cpp b/Common/3dParty/html/css/src/CNode.cpp index 8073a6266e..2799e375c3 100644 --- a/Common/3dParty/html/css/src/CNode.cpp +++ b/Common/3dParty/html/css/src/CNode.cpp @@ -14,6 +14,15 @@ namespace NSCSS return m_wsName.empty() && m_wsClass.empty() && m_wsId.empty() && m_wsStyle.empty(); } + void CNode::Clear() + { + m_wsName .clear(); + m_wsClass .clear(); + m_wsId .clear(); + m_wsStyle .clear(); + m_mAttributes.clear(); + } + std::vector CNode::GetData() const { std::vector arValues; diff --git a/Common/3dParty/html/css/src/CNode.h b/Common/3dParty/html/css/src/CNode.h index 57409a67a5..d8f6d8e4f0 100644 --- a/Common/3dParty/html/css/src/CNode.h +++ b/Common/3dParty/html/css/src/CNode.h @@ -22,6 +22,8 @@ namespace NSCSS bool Empty() const; + void Clear(); + std::vector GetData() const; bool operator< (const CNode& oNode) const; bool operator== (const CNode& oNode) const; diff --git a/Common/3dParty/html/css/src/ConstValues.cpp b/Common/3dParty/html/css/src/ConstValues.cpp index 56f1b28f79..b654ee9206 100644 --- a/Common/3dParty/html/css/src/ConstValues.cpp +++ b/Common/3dParty/html/css/src/ConstValues.cpp @@ -7,12 +7,18 @@ namespace NSCSS return sValue < oStatistickElement.sValue; } + void CTree::Clear() + { + m_arrChild.clear(); + m_oNode.Clear(); + } + void CTree::CountingNumberRepetitions(const CTree &oTree, std::map &mStatictics) { if (!oTree.m_oNode.m_wsId.empty()) ++mStatictics[StatistickElement{StatistickElement::IsId, L'#' + oTree.m_oNode.m_wsId}]; - if (!oTree.m_oNode.m_wsStyle.empty()) - ++mStatictics[StatistickElement{StatistickElement::IsStyle, oTree.m_oNode.m_wsStyle}]; + if (!oTree.m_oNode.m_wsStyle.empty()) + ++mStatictics[StatistickElement{StatistickElement::IsStyle, oTree.m_oNode.m_wsStyle}]; if (!oTree.m_arrChild.empty()) for (const CTree& oChildren : oTree.m_arrChild) diff --git a/Common/3dParty/html/css/src/ConstValues.h b/Common/3dParty/html/css/src/ConstValues.h index 4e7f8ab9fe..2bc546b54d 100644 --- a/Common/3dParty/html/css/src/ConstValues.h +++ b/Common/3dParty/html/css/src/ConstValues.h @@ -33,6 +33,8 @@ namespace NSCSS NSCSS::CNode m_oNode; std::vector m_arrChild; + void Clear(); + static void CountingNumberRepetitions(const CTree &oTree, std::map &mStatictics); }; diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 4874c22a7a..52fb291a10 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -614,11 +614,11 @@ namespace NSCSS void CColor::SetHEX(const std::wstring &wsValue) { - Clear(); - if (6 != wsValue.length() && 3 != wsValue.length()) return; + Clear(); + if (6 == wsValue.length()) m_oValue = new std::wstring(wsValue); else @@ -632,8 +632,6 @@ namespace NSCSS void CColor::SetUrl(const std::wstring &wsValue) { - Clear(); - if (wsValue.empty()) return; @@ -648,6 +646,8 @@ namespace NSCSS return; } + Clear(); + m_oValue = pURL; m_enType = ColorUrl; } @@ -659,6 +659,16 @@ namespace NSCSS m_enType = ColorNone; } + char NormalizeNegativeColorValue(INT nValue) + { + if (nValue > 255) + return 0xff; + else if (nValue < 0) + return (char)(std::abs(nValue) % 255); + + return (char)nValue; + } + bool CColor::SetValue(const std::wstring &wsValue, unsigned int unLevel, bool bHardMode) { if ((CHECK_CONDITIONS && !bHardMode) || (wsValue.empty() && unLevel == m_unLevel)) @@ -704,29 +714,18 @@ namespace NSCSS if (3 > arValues.size()) return false; - INT nRed = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[0], 255)); - INT nGreen = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[1], 255)); - INT nBlue = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[2], 255)); + const char chRed = NormalizeNegativeColorValue(std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[0], 255))); + const char chGreen = NormalizeNegativeColorValue(std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[1], 255))); + const char chBlue = NormalizeNegativeColorValue(std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[2], 255))); - if (nRed < 0 || nGreen < 0 || nBlue < 0) - { - SetEmpty(unLevel); - return false; - } - - if (255 < nRed) nRed = 255; - if (255 < nGreen) nGreen = 255; - if (255 < nBlue) nBlue = 255; - - SetRGB(nRed, nGreen, nBlue); + SetRGB(chRed, chGreen, chBlue); if (wsNewValue.substr(0, 4) == L"rgba" && 4 == arValues.size()) m_oOpacity.SetValue(arValues[3], unLevel, bHardMode); bResult = true; } - - if (5 <= wsNewValue.length()) + else if (5 <= wsNewValue.length()) { SetUrl(wsValue); diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index c53563ecbe..8bd0eb8cb6 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -4214,6 +4214,7 @@ HRESULT CHtmlFile2::OpenMht(const std::wstring& sSrc, const std::wstring& sDst, m_internal->readStyle(); m_internal->m_oStylesCalculator.SetBodyTree(m_internal->m_oTree); + m_internal->m_oTree.Clear(); // Переходим в начало if(!m_internal->m_oLightReader.MoveToStart()) From e345eff63ad92f14cdc6c9f0db8ff7d627254622 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 11 Sep 2024 01:09:50 +0300 Subject: [PATCH 34/82] Fix build pdf files --- DesktopEditor/doctrenderer/doctrenderer.cpp | 53 +++++++----- DesktopEditor/doctrenderer/doctrenderer.h | 8 ++ DesktopEditor/doctrenderer/drawingfile.h | 29 ++++++- .../doctrenderer/embed/DrawingFileEmbed.cpp | 25 ++++++ .../doctrenderer/embed/DrawingFileEmbed.h | 16 ++-- .../doctrenderer/js_internal/js_base.h | 8 ++ .../doctrenderer/js_internal/jsc/jsc_base.h | 5 ++ .../doctrenderer/js_internal/v8/v8_base.h | 9 ++ DesktopEditor/graphics/pro/js/after.py | 1 + .../pro/js/wasm/js/drawingfile_native.js | 85 ++++++++++++++----- X2tConverter/src/lib/pdf_image.h | 71 ++++++++++++---- 11 files changed, 243 insertions(+), 67 deletions(-) diff --git a/DesktopEditor/doctrenderer/doctrenderer.cpp b/DesktopEditor/doctrenderer/doctrenderer.cpp index 121446a3d7..68e8df2c13 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.cpp +++ b/DesktopEditor/doctrenderer/doctrenderer.cpp @@ -39,6 +39,7 @@ #include "embed/Default.h" #include "embed/NativeControlEmbed.h" #include "embed/GraphicsEmbed.h" +#include "embed/DrawingFileEmbed.h" #include "./editors.h" #include @@ -232,10 +233,13 @@ namespace NSDoctRenderer std::vector m_arImagesInChanges; + IOfficeDrawingFile* m_pDrawingFile; + public: CDoctRenderer_Private(const std::wstring& sAllFontsPath = L"") : CDoctRendererConfig() { LoadConfig(NSFile::GetProcessDirectory(), sAllFontsPath); + m_pDrawingFile = NULL; } ~CDoctRenderer_Private() { @@ -274,9 +278,9 @@ namespace NSDoctRenderer std::cerr << sT << ": " << sE << std::endl; } - static bool Doct_renderer_SaveFile( - CExecuteParams* pParams, NSNativeControl::CNativeControl* pNative, JSSmart context, JSSmart* args, std::wstring& strError, JSSmart& api_js_maybe_null, - bool bIsPdfBase64 = false) + static bool Doct_renderer_SaveFile(CExecuteParams* pParams, + NSNativeControl::CNativeControl* pNative, JSSmart context, + JSSmart* args, std::wstring& strError, JSSmart& api_js_maybe_null) { JSSmart try_catch = context->GetExceptions(); JSSmart global_js = context->GetGlobal(); @@ -446,23 +450,12 @@ namespace NSDoctRenderer JSSmart typedArray = js_result2->toTypedArray(); NSJSBase::CJSDataBuffer oBuffer = typedArray->getData(); + DWORD bufferSize = (pNative->m_nSaveBinaryLen == 0) ? (DWORD)oBuffer.Len : (DWORD)pNative->m_nSaveBinaryLen; + NSFile::CFileBinary oFile; if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) { - if (!bIsPdfBase64) - { - oFile.WriteFile(oBuffer.Data, (DWORD)pNative->m_nSaveBinaryLen); - } - else - { - char* pDataDst = NULL; - int nDataDst = 0; - if (NSFile::CBase64Converter::Encode(oBuffer.Data, pNative->m_nSaveBinaryLen, pDataDst, nDataDst)) - { - oFile.WriteFile((BYTE*)pDataDst, (DWORD)nDataDst); - RELEASEARRAYOBJECTS(pDataDst); - } - } + oFile.WriteFile(oBuffer.Data, bufferSize); oFile.CloseFile(); } @@ -601,6 +594,9 @@ namespace NSDoctRenderer NSDoctRenderer::RunEditor(editorType, context, try_catch, this); + if (editorType == DoctRendererEditorType::PDF && m_pDrawingFile) + EmbedDrawingFile(context, m_pDrawingFile); + if (try_catch->Check()) { strError = L"code=\"run\""; @@ -662,10 +658,15 @@ namespace NSDoctRenderer if (!bIsWatermark) { CChangesWorker oWorkerLoader; - int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath()); + int nVersion = 0; + + if (editorType == DoctRendererEditorType::PDF) + nVersion = -1; + else + nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath()); JSSmart args_open[4]; - args_open[0] = oWorkerLoader.GetDataFull()->toValue(); + args_open[0] = (nVersion != -1) ? oWorkerLoader.GetDataFull()->toValue() : CJSContext::createUndefined(); args_open[1] = CJSContext::createInt(nVersion); std::wstring sXlsx = NSFile::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx"; args_open[2] = NSFile::CFileBinary::Exists(sXlsx) ? CJSContext::createString(sXlsx) : CJSContext::createUndefined(); @@ -1103,6 +1104,18 @@ namespace NSDoctRenderer } #endif } + + void CDoctrenderer::SetAdditionalParam(const AdditionalParamType& type, void* data) + { + switch (type) + { + case AdditionalParamType::DRAWINGFILE: + m_pInternal->m_pDrawingFile = (IOfficeDrawingFile*)data; + break; + default: + break; + } + } } // namespace NSDoctRenderer bool Doct_renderer_SaveFile_ForBuilder( @@ -1114,5 +1127,5 @@ bool Doct_renderer_SaveFile_ForBuilder( oParams.m_sJsonParams = jsonParams; JSSmart js_objectApi; // empty - return NSDoctRenderer::CDoctRenderer_Private::Doct_renderer_SaveFile(&oParams, pNative, context, args, strError, js_objectApi, false); + return NSDoctRenderer::CDoctRenderer_Private::Doct_renderer_SaveFile(&oParams, pNative, context, args, strError, js_objectApi); } diff --git a/DesktopEditor/doctrenderer/doctrenderer.h b/DesktopEditor/doctrenderer/doctrenderer.h index 57dc581c14..b3aa76d8d7 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.h +++ b/DesktopEditor/doctrenderer/doctrenderer.h @@ -55,6 +55,12 @@ namespace NSDoctRenderer INVALID = 255 }; } + + enum class AdditionalParamType + { + DRAWINGFILE = 0, + INVALID = 255 + }; } namespace NSDoctRenderer @@ -73,6 +79,8 @@ namespace NSDoctRenderer void CreateCache(const std::wstring& sAllFontsPath, const std::wstring& sCacheDir); void CreateSnapshots(); + void SetAdditionalParam(const AdditionalParamType& type, void* data); + private: CDoctRenderer_Private* m_pInternal; }; diff --git a/DesktopEditor/doctrenderer/drawingfile.h b/DesktopEditor/doctrenderer/drawingfile.h index 1a74d8f371..546f469ae7 100644 --- a/DesktopEditor/doctrenderer/drawingfile.h +++ b/DesktopEditor/doctrenderer/drawingfile.h @@ -53,6 +53,8 @@ private: IOfficeDrawingFile* m_pFile; int m_nType = -1; + bool m_bIsExternalFile; + public: CDrawingFile(NSFonts::IApplicationFonts* pFonts) { @@ -69,16 +71,41 @@ public: m_pImageStorage = NULL; m_pFile = NULL; + m_bIsExternalFile = false; } ~CDrawingFile() { - RELEASEOBJECT(m_pFile); + if (!m_bIsExternalFile) + RELEASEOBJECT(m_pFile); RELEASEOBJECT(m_pTextRenderer); RELEASEOBJECT(m_pFontManager); RELEASEINTERFACE(m_pApplicationFonts); RELEASEOBJECT(m_pImageStorage); } + void SetInternalFile(IOfficeDrawingFile* pFile) + { + m_pFile = pFile; + if (!m_pFile) + return; + + m_bIsExternalFile = true; + switch (m_pFile->GetType()) + { + case odftPDF: + m_nType = 0; + break; + case odftDJVU: + m_nType = 1; + break; + case odftXPS: + m_nType = 2; + break; + default: + break; + } + } + public: static void InitFontsGlobalStorage() { diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp index ed0ebd3f0d..32a0c9d2f4 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp @@ -1,4 +1,5 @@ #include "DrawingFileEmbed.h" +#include "../drawingfile.h" JSSmart WasmMemoryToJS(BYTE* pWasmData) { @@ -13,6 +14,15 @@ JSSmart WasmMemoryToJS(BYTE* pWasmData) return NSJSBase::CJSContext::createUint8Array(pWasmData + 4, nLen - 4, true); } +CDrawingFileEmbed::CDrawingFileEmbed() +{ + m_pFile = NULL; +} +CDrawingFileEmbed::~CDrawingFileEmbed() +{ + RELEASEOBJECT(m_pFile); +} + JSSmart CDrawingFileEmbed::OpenFile(JSSmart sFile, JSSmart sPassword) { bool bResult = m_pFile->OpenFile(sFile->toStringW(), sPassword->isString() ? sPassword->toStringW() : L""); @@ -136,7 +146,22 @@ JSSmart CDrawingFileEmbed::FreeWasmData(JSSmart typedArray) if (!typedArray->isTypedArray()) return NULL; BYTE* data = typedArray->toTypedArray()->getData().Data; + typedArray->toTypedArray()->Detach(); data -= 4; // sizeof int (length in NSWasm::Data) free(data); return NULL; } + +bool EmbedDrawingFile(JSSmart& context, IOfficeDrawingFile* pFile) +{ + CJSContext::Embed(false); + + JSSmart oNativeDrawingFile = CJSContext::createEmbedObject("CDrawingFileEmbed"); + context->GetGlobal()->set("g_native_drawing_file", oNativeDrawingFile); + + CDrawingFile* pDrFile = new CDrawingFile(pFile->GetFonts()); + pDrFile->SetInternalFile(pFile); + ((CDrawingFileEmbed*)oNativeDrawingFile->getNative())->m_pFile = pDrFile; + + return true; +} diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h index 15cc3598ad..42f56aced4 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h @@ -1,8 +1,10 @@ #ifndef _BUILD_DRAWING_EMBED_H_ #define _BUILD_DRAWING_EMBED_H_ -#include "../drawingfile.h" #include "../js_internal/js_base.h" +#include "../../graphics/pro/officedrawingfile.h" + +class CDrawingFile; using namespace NSJSBase; class JS_DECL CDrawingFileEmbed : public CJSEmbedObject @@ -11,14 +13,8 @@ public: CDrawingFile* m_pFile; public: - CDrawingFileEmbed() - { - m_pFile = NULL; - } - ~CDrawingFileEmbed() - { - RELEASEOBJECT(m_pFile); - } + CDrawingFileEmbed(); + ~CDrawingFileEmbed(); virtual void* getObject() override { return (void*)m_pFile; } @@ -57,4 +53,6 @@ public: DECLARE_EMBED_METHODS }; +bool EmbedDrawingFile(JSSmart& context, IOfficeDrawingFile* pFile); + #endif // _BUILD_NATIVE_ZIP_EMBED_H_ diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h index fc20f63172..ffa1c7a7f0 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base.h +++ b/DesktopEditor/doctrenderer/js_internal/js_base.h @@ -386,6 +386,14 @@ namespace NSJSBase * Converts the typed array to a value. */ virtual JSSmart toValue() = 0; + + /** + * Detaches this ArrayBuffer and all its views (typed arrays). + * Detaching sets the byte length of the buffer and all typed arrays to zero, + * preventing JavaScript from ever accessing underlying backing store. + * ArrayBuffer should have been externalized. + */ + virtual void Detach() = 0; }; /** diff --git a/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h index e71d0a10d6..0093c00295 100644 --- a/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h +++ b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h @@ -385,6 +385,11 @@ namespace NSJSBase _value->value = value; return _value; } + + virtual void Detach() + { + // None + } }; class CJSFunctionJSC : public CJSValueJSCTemplate diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 7c9ca925db..8710b41cc8 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -705,6 +705,15 @@ namespace NSJSBase _value->value = value; return _value; } + + virtual void Detach() + { +#ifdef V8_ARRAY_BUFFER_USE_BACKING_STORE + value->Buffer()->Detach(); +#else + value->Buffer()->Neuter(); +#endif + } }; class CJSFunctionV8 : public CJSValueV8Template diff --git a/DesktopEditor/graphics/pro/js/after.py b/DesktopEditor/graphics/pro/js/after.py index c992eca246..b11b83257d 100644 --- a/DesktopEditor/graphics/pro/js/after.py +++ b/DesktopEditor/graphics/pro/js/after.py @@ -33,6 +33,7 @@ for item in content_native_files: content_native += base.readFile(item) content_native += "\n})(window, undefined);" content_native = content_native.replace("//file_internal", base.readFile("./wasm/js/drawingfile_native.js")) +content_native = content_native.replace("//string_utf8", base.readFile("./../../../../Common/js/string_utf8.js")) base.writeFile("./deploy/drawingfile_native.js", content_native) base.cmd_in_dir("../../../../Common/js", "python", ["./min.py", "./../../DesktopEditor/graphics/pro/js/deploy/drawingfile_native.js", "WHITESPACE_ONLY"]) diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js index 45071224a1..7fed46a3f8 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js @@ -30,12 +30,16 @@ * */ +//string_utf8 + function CNativePointer() { this.ptr = null; } CNativePointer.prototype.free = function() { + if (this.ptr) + g_native_drawing_file["FreeWasmData"](this.ptr); this.ptr = null; }; CNativePointer.prototype.getReader = function() @@ -65,120 +69,159 @@ CFile.prototype._getUint8ClampedArray = function(ptr, len) // FILE CFile.prototype._openFile = function(buffer, password) { - // TODO: + let res = false; + if (!buffer) + res = -1 !== g_native_drawing_file["GetType"](); + + if (res) + this.nativeFile = 1; + return res; }; CFile.prototype._closeFile = function() { - // TODO: + g_native_drawing_file["CloseFile"](); + this.nativeFile = 0; }; CFile.prototype._getType = function() { - // TODO: + return g_native_drawing_file["GetType"](); }; CFile.prototype._getError = function() { - // TODO: + return g_native_drawing_file["GetErrorCode"](); }; // FONTS CFile.prototype._isNeedCMap = function() { - // TODO: + return g_native_drawing_file["IsNeedCMap"](); }; CFile.prototype._setCMap = function(memoryBuffer) { - // TODO: + // none }; CFile.prototype._getFontByID = function(ID) { - // TODO: + return null; }; CFile.prototype._getInteractiveFormsFonts = function(type) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetInteractiveFormsFonts"](type); + return g_module_pointer; }; // INFO DOCUMENT CFile.prototype._getInfo = function() { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetInfo"](); + return g_module_pointer; }; CFile.prototype._getStructure = function() { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetStructure"](); + return g_module_pointer; }; CFile.prototype._getLinks = function(pageIndex) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetLinks"](pageIndex); + return g_module_pointer; }; // WIDGETS & ANNOTATIONS CFile.prototype._getInteractiveFormsInfo = function() { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetInteractiveFormsInfo"](); + return g_module_pointer; }; CFile.prototype._getAnnotationsInfo = function(pageIndex) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetAnnotationsInfo"](pageIndex); + return g_module_pointer; }; CFile.prototype._getButtonIcons = function(backgroundColor, pageIndex, isBase64, nWidget, nView) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetButtonIcons"]( + backgroundColor === undefined ? 0xFFFFFF : backgroundColor, + pageIndex, + isBase64 ? 1 : 0, + nWidget === undefined ? -1 : nWidget, + nView); + return g_module_pointer; }; CFile.prototype._getAnnotationsAP = function(width, height, backgroundColor, pageIndex, nAnnot, nView) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetAnnotationsAP"]( + width, + height, + backgroundColor === undefined ? 0xFFFFFF : backgroundColor, + pageIndex, + nAnnot === undefined ? -1 : nAnnot, + nView); + return g_module_pointer; }; CFile.prototype._getInteractiveFormsAP = function(width, height, backgroundColor, pageIndex, nWidget, nView, nButtonView) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["GetInteractiveFormsAP"]( + width, + height, + backgroundColor === undefined ? 0xFFFFFF : backgroundColor, + pageIndex, + nWidget === undefined ? -1 : nWidget, + nView, nButtonView); + return g_module_pointer; }; // SCAN PAGES CFile.prototype._scanPage = function(page, mode) { - // TODO: + g_module_pointer.ptr = g_native_drawing_file["ScanPage"](page, (mode === undefined) ? 0 : mode); + return g_module_pointer; }; CFile.prototype._getImageBase64 = function(rId) { - // TODO: + return g_native_drawing_file["GetImageBase64"](rId); }; // TEXT CFile.prototype._getGlyphs = function(pageIndex) { - // TODO: + let res = {}; + res.info = [0, 0, 0, 0]; + res.result = []; + return res; }; CFile.prototype._destroyTextInfo = function() { - // TODO: + g_native_drawing_file["DestroyTextInfo"](rId); }; // RASTER CFile.prototype._getPixmap = function(pageIndex, width, height, backgroundColor) { - // TODO: + return null; }; // STATIC FUNCTIONS CFile.prototype._InitializeFonts = function(basePath) { + // none }; CFile.prototype._CheckStreamId = function(data, status) { + // none }; diff --git a/X2tConverter/src/lib/pdf_image.h b/X2tConverter/src/lib/pdf_image.h index d5ceeef6f9..2167125111 100644 --- a/X2tConverter/src/lib/pdf_image.h +++ b/X2tConverter/src/lib/pdf_image.h @@ -651,6 +651,33 @@ namespace NExtractTools return nRes; } + bool applyCompiledChangesPdf(CPdfFile* pFile, const std::wstring& sCompiledChangesPath, CConvertFromBinParams& oConvertParams) + { + bool bRes = false; + NSFile::CFileBinary oFile; + if (oFile.OpenFile(sCompiledChangesPath)) + { + char signature[4]; + if (oFile.ReadFile((BYTE*)signature, 4)) + { + if ('%' == signature[0] && 'P' == signature[1] && 'D' == signature[2] && 'F' == signature[3]) + { + DWORD dwChangesSize = (DWORD)(oFile.GetFileSize() - 4); + BYTE* pChangesData = NULL; + + if (oFile.ReadFile(pChangesData, dwChangesSize)) + { + bRes = (S_OK == pFile->AddToPdfFromBinary(pChangesData, (unsigned int)dwChangesSize, &oConvertParams)); + RELEASEARRAYOBJECTS(pChangesData); + } + } + } + + oFile.CloseFile(); + } + return bRes; + } + bool applyChangesPdf(const std::wstring& sFrom, const std::wstring& sTo, NSFonts::IApplicationFonts* pApplicationFonts, InputParams& params, ConvertParams& convertParams, @@ -676,6 +703,34 @@ namespace NExtractTools oConvertParams.m_sInternalMediaDirectory = NSFile::GetDirectoryName(sFrom); oConvertParams.m_sMediaDirectory = oConvertParams.m_sInternalMediaDirectory; + bool bIsCompiledChanges = false; + if (changes.size() > 0) + { + bIsCompiledChanges = applyCompiledChangesPdf(&oPdfResult, changes[0], oConvertParams); + + if (!bIsCompiledChanges) + { + NSDoctRenderer::CDoctrenderer oDoctRenderer(NULL != params.m_sAllFontsPath ? *params.m_sAllFontsPath : L""); + + std::wstring sPdfFileCompiledChanges = NSFile::CFileBinary::CreateTempFileWithUniqueName(convertParams.m_sTempDir, L"PDF_"); + if (NSFile::CFileBinary::Exists(sPdfFileCompiledChanges)) + NSFile::CFileBinary::Remove(sPdfFileCompiledChanges); + + std::wstring sXml = getDoctXml(NSDoctRenderer::DoctRendererFormat::PDF, + NSDoctRenderer::DoctRendererFormat::PDF, + sFrom, sPdfFileCompiledChanges, + oConvertParams.m_sInternalMediaDirectory, convertParams.m_sThemesDir, + -1, L"", params); + + std::wstring sResult = L""; + oDoctRenderer.SetAdditionalParam(NSDoctRenderer::AdditionalParamType::DRAWINGFILE, (void*)&oPdfResult); + oDoctRenderer.Execute(sXml, sResult); + + if (NSFile::CFileBinary::Exists(sPdfFileCompiledChanges)) + bIsCompiledChanges = applyCompiledChangesPdf(&oPdfResult, sPdfFileCompiledChanges, oConvertParams); + } + } + if (!sResultDirectory.empty() && !params.getDontSaveAdditional()) { //apply and zip changes @@ -689,9 +744,6 @@ namespace NExtractTools //add changes to zip std::wstring sFilename = NSSystemPath::GetFileName(*i); oFolderWithChanges.write(sFilename, pChangesData, dwChangesSize); - //apply changes - oPdfResult.AddToPdfFromBinary(pChangesData, (unsigned int)dwChangesSize, &oConvertParams); - RELEASEARRAYOBJECTS(pChangesData); } } //add images @@ -717,19 +769,6 @@ namespace NExtractTools oFile.CloseFile(); RELEASEOBJECT(pBuffer); } - else - { - for (std::vector::const_iterator i = changes.begin(); i != changes.end(); i++) - { - BYTE* pChangesData = NULL; - DWORD dwChangesSize = 0; - if (NSFile::CFileBinary::ReadAllBytes(*i, &pChangesData, dwChangesSize)) - { - oPdfResult.AddToPdfFromBinary(pChangesData, (unsigned int)dwChangesSize, &oConvertParams); - RELEASEARRAYOBJECTS(pChangesData); - } - } - } oPdfResult.Close(); return true; From f90022c50cbfc3e6955f8a4641735e739426ff85 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Mon, 9 Sep 2024 13:42:48 +0400 Subject: [PATCH 35/82] Fix bug #70086 --- DesktopEditor/doctrenderer/docbuilder_p.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder_p.h b/DesktopEditor/doctrenderer/docbuilder_p.h index a6443ff25c..5827becaa7 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.h +++ b/DesktopEditor/doctrenderer/docbuilder_p.h @@ -126,16 +126,17 @@ namespace NSDoctRenderer public: CString_Private() { - m_data = NULL; + m_data = new wchar_t[1]; + m_data[0] = '\0'; } ~CString_Private() { - if (m_data) - delete [] m_data; + delete[] m_data; } void Attach(wchar_t* data) { + delete[] m_data; m_data = data; } @@ -143,7 +144,7 @@ namespace NSDoctRenderer { if (copy->m_data) { - delete [] copy->m_data; + delete[] copy->m_data; copy->m_data = NULL; } From 765c27bdab5b5ff78d2585f87c5f809c78f1f310 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Tue, 10 Sep 2024 12:46:43 +0400 Subject: [PATCH 36/82] Remove creation of empty string by default --- DesktopEditor/doctrenderer/docbuilder_p.cpp | 7 +++++++ DesktopEditor/doctrenderer/docbuilder_p.h | 10 ++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder_p.cpp b/DesktopEditor/doctrenderer/docbuilder_p.cpp index ba250a992e..8f52c8570c 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.cpp +++ b/DesktopEditor/doctrenderer/docbuilder_p.cpp @@ -668,10 +668,17 @@ namespace NSDoctRenderer } if (IsEmpty() || !m_internal->m_value->isString()) + { + ret.m_internal->MakeEmpty(); return ret; + } std::wstring sValue = m_internal->m_value->toStringW(); if (sValue.empty()) + { + // return valid empty string + ret.m_internal->MakeEmpty(); return ret; + } size_t len = sValue.length(); wchar_t* buffer = new wchar_t[len + 1]; memcpy(buffer, sValue.c_str(), len * sizeof(wchar_t)); diff --git a/DesktopEditor/doctrenderer/docbuilder_p.h b/DesktopEditor/doctrenderer/docbuilder_p.h index 5827becaa7..76ad99cad7 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.h +++ b/DesktopEditor/doctrenderer/docbuilder_p.h @@ -126,8 +126,7 @@ namespace NSDoctRenderer public: CString_Private() { - m_data = new wchar_t[1]; - m_data[0] = '\0'; + m_data = NULL; } ~CString_Private() { @@ -155,6 +154,13 @@ namespace NSDoctRenderer copy->m_data = new wchar_t[len + 1]; memcpy(copy->m_data, m_data, (len + 1) * sizeof(wchar_t)); } + + void MakeEmpty() + { + delete[] m_data; + m_data = new wchar_t[1]; + m_data[0] = '\0'; + } }; } From f811822364ea955c38f2e8b34c0c8f2be56abd89 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 6 Sep 2024 17:06:11 +0400 Subject: [PATCH 37/82] Fix bug #70046 --- .../doctrenderer/docbuilder.python/src/docbuilder.py | 6 ++++++ .../docbuilder.python/src/docbuilder_functions.cpp | 5 +++++ .../docbuilder.python/src/docbuilder_functions.h | 1 + 3 files changed, 12 insertions(+) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index 978b306176..b2bee6b2fa 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -49,6 +49,9 @@ def _loadLibrary(path): _lib.CDocBuilderValue_IsUndefined.argtypes = [OBJECT_HANDLE] _lib.CDocBuilderValue_IsUndefined.restype = ctypes.c_bool + _lib.CDocBuilderValue_IsBool.argtypes = [OBJECT_HANDLE] + _lib.CDocBuilderValue_IsBool.restype = ctypes.c_bool + _lib.CDocBuilderValue_IsInt.argtypes = [OBJECT_HANDLE] _lib.CDocBuilderValue_IsInt.restype = ctypes.c_bool @@ -301,6 +304,9 @@ class CDocBuilderValue: def IsUndefined(self): return _lib.CDocBuilderValue_IsUndefined(self._internal) + def IsBool(self): + return _lib.CDocBuilderValue_IsBool(self._internal) + def IsInt(self): return _lib.CDocBuilderValue_IsInt(self._internal) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp index 6df39de00e..726fee54e2 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -39,6 +39,11 @@ bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self) return self->IsUndefined(); } +bool CDocBuilderValue_IsBool(CDocBuilderValue* self) +{ + return self->IsBool(); +} + bool CDocBuilderValue_IsInt(CDocBuilderValue* self) { return self->IsInt(); diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h index 64b94140b3..297e8237b0 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h @@ -24,6 +24,7 @@ DOCBUILDER_FUNC_DECL void CDocBuilderValue_Clear(CDocBuilderValue* self); DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsNull(CDocBuilderValue* self); DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsUndefined(CDocBuilderValue* self); +DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsBool(CDocBuilderValue* self); DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsInt(CDocBuilderValue* self); DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsDouble(CDocBuilderValue* self); DOCBUILDER_FUNC_DECL bool CDocBuilderValue_IsString(CDocBuilderValue* self); From 71342eb03d1f5b9bfc9a043c7908406c049d273b Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 6 Sep 2024 17:06:43 +0400 Subject: [PATCH 38/82] Add IsBool function to NET wrapper --- .../doctrenderer/docbuilder.net/src/docbuilder.net.cpp | 4 ++++ .../doctrenderer/docbuilder.net/src/docbuilder.net.h | 3 +++ 2 files changed, 7 insertions(+) diff --git a/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.cpp b/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.cpp index f5022fbde7..e8e0fcacd5 100644 --- a/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.cpp @@ -137,6 +137,10 @@ namespace docbuilder_net bool CDocBuilderValue::IsUndefined() { return m_internal->IsUndefined(); + } + bool CDocBuilderValue::IsBool() + { + return m_internal->IsBool(); } bool CDocBuilderValue::IsInt() { diff --git a/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.h b/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.h index f3d2370f74..226c4c84d7 100644 --- a/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.h +++ b/DesktopEditor/doctrenderer/docbuilder.net/src/docbuilder.net.h @@ -72,6 +72,9 @@ namespace docbuilder_net /// True if this object is undefined. bool IsUndefined(); + /// True if this object is a boolean value. + bool IsBool(); + /// True if this object is an integer. bool IsInt(); From 56551c3745cb1297d28aac2a431dd390a03b3ff9 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 6 Sep 2024 17:30:39 +0400 Subject: [PATCH 39/82] Add IsBool function to Java wrapper + Add functionality of generating JNI headers --- DesktopEditor/doctrenderer/docbuilder.java/make.py | 10 +++++++--- .../src/java/docbuilder/CDocBuilderValue.java | 6 ++++++ .../src/jni/docbuilder_CDocBuilderValue.cpp | 6 ++++++ .../src/jni/docbuilder_CDocBuilderValue.h | 8 ++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.java/make.py b/DesktopEditor/doctrenderer/docbuilder.java/make.py index 0fdd820f06..9578394f17 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/make.py +++ b/DesktopEditor/doctrenderer/docbuilder.java/make.py @@ -88,16 +88,20 @@ if __name__ == "__main__": print('Error: javac version is not supported') exit() + # BUILD release_flags = [] if jdk_version > 8: release_flags = ['--release', '8'] - # BUILD + gen_headers_flags = [] + if args.headers: + headers_dir = file_dir + '/src/jni' + gen_headers_flags = ['-h', headers_dir] + classes_dir = file_dir + '/build/classes' makedirs(classes_dir + '/docbuilder/utils') - headers_dir = file_dir + '/src/jni' # build all Java classes - subprocess.call([javac, '-d', classes_dir] + release_flags + java_files, cwd=os.getcwd(), stderr=subprocess.STDOUT) + subprocess.call([javac, '-d', classes_dir] + release_flags + gen_headers_flags + java_files, cwd=os.getcwd(), stderr=subprocess.STDOUT) # PACKING TO JAR if not args.no_jar: diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java index ba17a2ef53..a1c49361ba 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/java/docbuilder/CDocBuilderValue.java @@ -38,6 +38,11 @@ public class CDocBuilderValue { return c_IsUndefined(c_internal); } + public boolean isBool() + { + return c_IsBool(c_internal); + } + public boolean isInt() { return c_IsInt(c_internal); @@ -239,6 +244,7 @@ public class CDocBuilderValue { private static native boolean c_IsNull(long self); private static native boolean c_IsUndefined(long self); + private static native boolean c_IsBool(long self); private static native boolean c_IsInt(long self); private static native boolean c_IsDouble(long self); private static native boolean c_IsString(long self); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp index cfb3099ea9..d5bb3c18c4 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.cpp @@ -49,6 +49,12 @@ jboolean Java_docbuilder_CDocBuilderValue_c_1IsUndefined(JNIEnv* env, jclass cls return (jboolean)pSelf->IsUndefined(); } +jboolean Java_docbuilder_CDocBuilderValue_c_1IsBool(JNIEnv* env, jclass cls, jlong self) +{ + CDocBuilderValue* pSelf = reinterpret_cast(self); + return (jboolean)pSelf->IsBool(); +} + jboolean Java_docbuilder_CDocBuilderValue_c_1IsInt(JNIEnv* env, jclass cls, jlong self) { CDocBuilderValue* pSelf = reinterpret_cast(self); diff --git a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h index 2e0c8e4eb0..32d0018345 100644 --- a/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h +++ b/DesktopEditor/doctrenderer/docbuilder.java/src/jni/docbuilder_CDocBuilderValue.h @@ -63,6 +63,14 @@ JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsNull JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsUndefined (JNIEnv *, jclass, jlong); +/* + * Class: docbuilder_CDocBuilderValue + * Method: c_IsBool + * Signature: (J)Z + */ +JNIEXPORT jboolean JNICALL Java_docbuilder_CDocBuilderValue_c_1IsBool + (JNIEnv *, jclass, jlong); + /* * Class: docbuilder_CDocBuilderValue * Method: c_IsInt From ad18d65f7c023a993b7c8b6514af12b2682684fc Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Mon, 2 Sep 2024 17:54:44 +0400 Subject: [PATCH 40/82] Implement toJSON --- DesktopEditor/doctrenderer/json/json.cpp | 182 ++++++++++++++ DesktopEditor/doctrenderer/json/json.h | 16 ++ DesktopEditor/doctrenderer/test/json/main.cpp | 230 ++++++++++++++++++ 3 files changed, 428 insertions(+) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 88b4825f60..a0e2807b1b 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -5,6 +5,11 @@ // for working with typed arrays: Alloc() and Free() #include "js_base.h" +// for converting primitive types to JSON-string +#include +#include +#include + namespace NSJSON { CTypedValue::CTypedValue() : m_type(vtUndefined) @@ -175,6 +180,177 @@ namespace NSJSON return ToStringW(); } + namespace + { + std::string doubleToJsonString(double value) + { + // handle special cases + if (std::isnan(value) || std::isinf(value)) + return "null"; + + // convert to string with full precision + std::ostringstream oss; + oss.precision(std::numeric_limits::digits10); + oss << std::noshowpoint << value; + + return oss.str(); + } + + std::string stringToJsonString(const std::string& value) + { + std::string result; + for (char ch : value) + { + if (ch <= 0x1F) + { + result += '\\'; + if (ch == '\b') + { + result += 'b'; + } + else if (ch == '\t') + { + result += 't'; + } + else if (ch == '\n') + { + result += 'n'; + } + else if (ch == '\f') + { + result += 'f'; + } + else if (ch == '\r') + { + result += 'r'; + } + else + { + result += "u00"; + std::ostringstream oss; + oss << std::setfill('0') << std::setw(2) << std::hex << (int)ch; + result += oss.str(); + } + } + else if (ch == '\\') + { + result += "\\\\"; + } + else if (ch == '\"') + { + result += "\\\""; + } + else + { + result += ch; + } + } + + return result; + } + } + + std::string IValue::ToJSON() + { + std::string strRes; + CTypedValue::ValueType type = m_internal->m_type; + switch (type) + { + case CTypedValue::vtUndefined: + { + break; + } + case CTypedValue::vtNull: + { + strRes = "null"; + break; + } + case CTypedValue::vtPrimitive: + { + CPrimitive* pPrimitiveValue = static_cast(m_internal->m_value.get()); + if (pPrimitiveValue->isBool()) + { + strRes = pPrimitiveValue->toBool() ? "true" : "false"; + } + else if (pPrimitiveValue->isInt()) + { + strRes = std::to_string(pPrimitiveValue->toInt()); + } + else if (pPrimitiveValue->isDouble()) + { + strRes = doubleToJsonString(pPrimitiveValue->toDouble()); + } + else + { + strRes = "\"" + stringToJsonString(pPrimitiveValue->toStringA()) + "\""; + } + break; + } + case CTypedValue::vtArray: + { + CArray* pArrayValue = static_cast(m_internal->m_value.get()); + strRes = "["; + const int len = pArrayValue->getCount(); + for (int i = 0; i < len; i++) + { + CValue& value = pArrayValue->get(i); + if (value.IsUndefined()) + strRes += "null"; + else + strRes += value.ToJSON(); + strRes += ','; + } + // remove last ',' + if (strRes.back() == ',') + strRes.pop_back(); + strRes += "]"; + break; + } + case CTypedValue::vtTypedArray: + { + CTypedArray* pTypedArrayValue = static_cast(m_internal->m_value.get()); + strRes += "{"; + const int size = pTypedArrayValue->getCount(); + BYTE* data = pTypedArrayValue->getData(); + for (int i = 0; i < size; i++) + { + strRes += "\"" + std::to_string(i) + "\":"; + strRes += std::to_string((int)data[i]); + strRes += ','; + } + // remove last ',' + if (strRes.back() == ',') + strRes.pop_back(); + strRes += "}"; + break; + } + case CTypedValue::vtObject: + { + CObject* pObjectValue = static_cast(m_internal->m_value.get()); + strRes += "{"; + std::vector propertyNames = pObjectValue->getPropertyNames(); + const int count = propertyNames.size(); + for (int i = 0; i < count; i++) + { + CValue& value = pObjectValue->get(propertyNames[i]); + if (value.IsUndefined()) + continue; + + strRes += "\"" + propertyNames[i] + "\":"; + strRes += value.ToJSON(); + strRes += ','; + } + // remove last ',' + if (strRes.back() == ',') + strRes.pop_back(); + strRes += "}"; + break; + } + } + + return strRes; + } + IValue::IValue(bool value) : m_internal(new CTypedValue(new CPrimitive(value), CTypedValue::vtPrimitive)) { } @@ -430,6 +606,12 @@ namespace NSJSON return ret; } + CValue CValue::FromJSON(const std::string& jsonString) + { + // TODO: + return CValue(); + } + CValueRef::CValueRef(const CValueRef& other) : IValue(other.m_internal) { } diff --git a/DesktopEditor/doctrenderer/json/json.h b/DesktopEditor/doctrenderer/json/json.h index efd9ac6ae6..ada6baaf03 100644 --- a/DesktopEditor/doctrenderer/json/json.h +++ b/DesktopEditor/doctrenderer/json/json.h @@ -123,6 +123,14 @@ namespace NSJSON operator std::string() const; operator std::wstring() const; + public: + // JSON CONVERSION + /** + * Converts this value to a JSON-string. + * @return The JSON-string or empty string in case of errors. + */ + std::string ToJSON(); + protected: // Creates a value from primitive types IValue(bool value); @@ -259,6 +267,14 @@ namespace NSJSON */ static CValue CreateNull(); + // JSON CONVERSION + /** + * Creates and returns new value from JSON-string. + * @param jsonString The JSON-string from which new value will be created. + * @returns created value. If JSON-string is invalid, value will be undefined. + */ + static CValue FromJSON(const std::string& jsonString); + friend class CValueRef; }; diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index be3ada4908..eecceadb8f 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -3,6 +3,7 @@ #ifdef JSON_GOOGLE_TEST #include "gtest/gtest.h" #include +#include #else #include #endif @@ -899,6 +900,235 @@ TEST_F(CJSONTest, serialization_with_script) EXPECT_TRUE(compare(obj, args[0])); } +// ----------- CValue::ToJSON() tests ----------- +TEST_F(CJSONTest, ToJSON_undefined) +{ + CValue val = CValue::CreateUndefined(); + EXPECT_EQ(val.ToJSON(), ""); +} + +TEST_F(CJSONTest, ToJSON_null) +{ + CValue val = CValue::CreateNull(); + EXPECT_EQ(val.ToJSON(), "null"); +} + +TEST_F(CJSONTest, ToJSON_bool) +{ + CValue val(false); + EXPECT_EQ(val.ToJSON(), "false"); + val = true; + EXPECT_EQ(val.ToJSON(), "true"); +} + +TEST_F(CJSONTest, ToJSON_int) +{ + CValue val = 42; + EXPECT_EQ(val.ToJSON(), "42"); + val = 0; + EXPECT_EQ(val.ToJSON(), "0"); + val = -73; + EXPECT_EQ(val.ToJSON(), "-73"); + val = INT_MIN; + EXPECT_EQ(val.ToJSON(), "-2147483648"); + val = INT_MAX; + EXPECT_EQ(val.ToJSON(), "2147483647"); +} + +TEST_F(CJSONTest, ToJSON_double) +{ + CValue val = 4.2; + EXPECT_EQ(val.ToJSON(), "4.2"); + val = 42.0; + EXPECT_EQ(val.ToJSON(), "42"); + val = 0.0; + EXPECT_EQ(val.ToJSON(), "0"); + val = 3.1415926535; + EXPECT_EQ(val.ToJSON(), "3.1415926535"); + val = (double)INT_MIN; + EXPECT_EQ(val.ToJSON(), "-2147483648"); + val = (double)INT_MAX; + EXPECT_EQ(val.ToJSON(), "2147483647"); +} + +TEST_F(CJSONTest, ToJSON_double_critical_values) +{ + CValue val = 8e30; + EXPECT_EQ(val.ToJSON(), "8e+30"); + val = 8e-30; + EXPECT_EQ(val.ToJSON(), "8e-30"); + + val = INFINITY; + EXPECT_EQ(val.ToJSON(), "null"); + val = NAN; + EXPECT_EQ(val.ToJSON(), "null"); + val = -INFINITY; + EXPECT_EQ(val.ToJSON(), "null"); + + val = std::numeric_limits::max(); + std::string strResult = val.ToJSON(); + // we cannot expect predefined specified result from this test case so just check if it is not empty + EXPECT_TRUE(!strResult.empty()); + EXPECT_TRUE(strResult != "null"); + + val = std::numeric_limits::min(); + strResult = val.ToJSON(); + // we cannot expect predefined specified result from this test case so just check if it is not empty + EXPECT_TRUE(!strResult.empty()); + EXPECT_TRUE(strResult != "null"); +} + +TEST_F(CJSONTest, ToJSON_string) +{ + CValue val = " test "; + EXPECT_EQ(val.ToJSON(), "\" test \""); + val = ""; + EXPECT_EQ(val.ToJSON(), "\"\""); + val = L" test "; + EXPECT_EQ(val.ToJSON(), "\" test \""); + // test parsing of special symbols inside strings + val = "foo: {bar: 42}[} ,))"; + EXPECT_EQ(val.ToJSON(), "\"foo: {bar: 42}[} ,))\""); +} + +TEST_F(CJSONTest, ToJSON_string_backslashed_characters) +{ + // For this test cases results are quite unusual. + // So the results are compared with JSON.stringify() alternative instead of hard-coded expected strings. + CValue val = "HEL\"LO"; + std::string strRes = val.ToJSON(); + std::string strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); + // EXPECT_EQ(strRes, "\"HEL\\\"LO\""); + EXPECT_EQ(strRes, strExpected); + + val = "HEL\\/LO"; + strRes = val.ToJSON(); + strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); + // EXPECT_EQ(strRes, "\"HEL\\\\/LO\""); + EXPECT_EQ(strRes, strExpected); + + val = "\tH\bE\fL\nL\nO\r"; + strRes = val.ToJSON(); + strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); + // EXPECT_EQ(strRes, "\"\\tH\\bE\\fL\\nL\\nO\\r\""); + EXPECT_EQ(strRes, strExpected); + + // other symbols + std::string spec = "/"; + for (char ch = 0; ch <= 0x1F; ch++) + { + spec += ch; + } + spec += '/'; + + val = spec; + strRes = val.ToJSON(); + strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); + EXPECT_EQ(strRes, strExpected); +} + +TEST_F(CJSONTest, ToJSON_typed_arrays) +{ + BYTE* data = CValue::AllocTypedArray(4); + data[0] = 0x1A; + data[1] = 0x54; + data[2] = 0xFE; + data[3] = 0xFF; + CValue typedArr = CValue::CreateTypedArray(data, 4, false); + EXPECT_EQ(typedArr.ToJSON(), "{\"0\":26,\"1\":84,\"2\":254,\"3\":255}"); +} + +TEST_F(CJSONTest, ToJSON_arrays) +{ + CValue arr = CValue::CreateArray(0); + EXPECT_EQ(arr.ToJSON(), "[]"); + + arr = CValue::CreateArray(4); + arr[0] = 42; + arr[1] = "foo"; + arr[2] = 2.71828; + EXPECT_EQ(arr.ToJSON(), "[42,\"foo\",2.71828,null]"); + + CValue arrInner = {CValue::CreateNull(), 73.0}; + arr[3] = arrInner; + EXPECT_EQ(arr.ToJSON(), "[42,\"foo\",2.71828,[null,73]]"); +} + +TEST_F(CJSONTest, ToJSON_arrays_complex) +{ + BYTE* data = CValue::AllocTypedArray(5); + data[0] = 0x1A; + data[1] = 0x54; + data[2] = 0xFE; + data[3] = 0xFF; + data[0] = 0x00; + CValue typedArr = CValue::CreateTypedArray(data, 5, false); + + CValue arrInner = {true, 42, L"test function ToJSON()", 2.71828, CValue(), "abc de f", L"test"}; + CValue arr = {0, arrInner, arrInner, CValue::CreateNull(), arrInner, CValue::CreateArray(4), typedArr}; + + std::string strRes = arr.ToJSON(); + std::string strExpected = m_pContext->JSON_Stringify(toJS(arr)); + EXPECT_EQ(strRes, strExpected); +} + +TEST_F(CJSONTest, ToJSON_arrays_circular) +{ + // NOTE: BE CAREFULL WHEN CREATING CIRCULAR REFERENCE DEPENDENCY IN YOUR ARRAY OR OBJECT! + CValue arr = CValue::CreateArray(2); + CValue ref = arr; + arr[0] = 3; + arr[1] = ref; + + // here you will get stack overflow, because each inner array reference will be recursively converted to JSON-string + // arr.ToJSON(); + + // remove recursions + CValue arrRec = arr[1][1]; + arrRec[1] = 42; + + EXPECT_EQ(arr.ToJSON(), "[3,42]"); +} + +TEST_F(CJSONTest, ToJSON_objects) +{ + CValue obj = CValue::CreateObject(); + EXPECT_EQ(obj.ToJSON(), "{}"); + + obj["name"] = "Foo"; + obj["number"] = 42; + EXPECT_EQ(obj.ToJSON(), "{\"name\":\"Foo\",\"number\":42}"); + + obj["undef"] = CValue::CreateUndefined(); + obj["null"] = CValue::CreateNull(); + EXPECT_EQ(obj.ToJSON(), "{\"name\":\"Foo\",\"number\":42,\"null\":null}"); +} + +TEST_F(CJSONTest, ToJSON_objects_complex) +{ + CValue obj = CValue::CreateObject(); + + obj["name"] = L"Foo"; + obj["parameters"] = CValue::CreateObject(); + CValueRef parameters = obj["parameters"]; + parameters["0"] = 0; + parameters["size"] = 42; + parameters["arr"] = {CValue::CreateNull(), CValue::CreateArray(1), {42, L"test function ToJSON()", 2.71828}, CValue::CreateObject(), CValue(), "abc de f", L"test"}; + + BYTE* data = CValue::AllocTypedArray(4); + data[0] = 0x1A; + data[1] = 0x54; + data[2] = 0xFE; + data[3] = 0xFF; + CValue typedArr = CValue::CreateTypedArray(data, 4, false); + obj["typed"] = typedArr; + // property without a name + obj[""] = "Bar"; + + std::string strRes = obj.ToJSON(); + std::string strExpected = m_pContext->JSON_Stringify(toJS(obj)); + EXPECT_EQ(strRes, strExpected); +} #else int main() { From 150079e2f616b7e999717bc09b01e86575b97230 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Wed, 4 Sep 2024 18:02:32 +0400 Subject: [PATCH 41/82] Implement FromJSON for primitives --- DesktopEditor/doctrenderer/json/json.cpp | 212 ++++++++++- DesktopEditor/doctrenderer/test/json/main.cpp | 346 +++++++++++++++++- 2 files changed, 540 insertions(+), 18 deletions(-) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index a0e2807b1b..4218e35a07 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -7,8 +7,12 @@ // for converting primitive types to JSON-string #include -#include #include +#include +// for strtod() +#include +// for modf() +#include namespace NSJSON { @@ -606,10 +610,212 @@ namespace NSJSON return ret; } + namespace + { + // moves pos to first non-space symbol and returns `true` if pos is still inside the string after moving + bool skipWhitespaces(const std::string& str, int& pos) + { + for (; pos < str.size(); pos++) + { + char ch = str[pos]; + if (ch != '\t' && ch != '\n' && ch != '\r' && ch != ' ') + break; + } + return pos < str.size(); + } + + CValue parseNumberFromJSON(const std::string& str, int& pos) + { + const char* startPos = str.c_str() + pos; + char* newPos; + double number = std::strtod(startPos, &newPos); + if (newPos == startPos) + return CValue(); + + CValue value; + if (std::isfinite(number)) + { + // check if number can be represented as an integer type without loss of precision + double integral; // integral part + double fractional = std::modf(number, &integral); // fractional part + if (fractional == 0.0 && integral >= std::numeric_limits::min() && integral <= std::numeric_limits::max()) + value = (int)integral; + else + value = number; + } + else + { + value = number; + } + + pos += newPos - startPos; + return value; + } + + CValue parseStringFromJSON(const std::string& str, int& pos) + { + // skip '\"' cause it has already been checked + pos++; + std::string result; + while (pos < str.size() && str[pos] != '\"') + { + // any non-escaped control characters are not allowed + if (str[pos] < 0x20) + return CValue(); + + if (str[pos] != '\\') + { + result += str[pos++]; + } + else + { + pos++; + if (pos >= str.size()) + return CValue(); + + char ch = str[pos++]; + if (ch == '\\' || ch == '\"' || ch == '/') + { + result += ch; + } + else if (ch == 'b') + { + result += '\b'; + } + else if (ch == 't') + { + result += '\t'; + } + else if (ch == 'n') + { + result += '\n'; + } + else if (ch == 'f') + { + result += '\f'; + } + else if (ch == 'r') + { + result += '\r'; + } + else if (ch == 'u') + { + if (str.size() - pos < 4) + return CValue(); + // TODO: support unicode symbols with codes > U+0020 + if (str[pos] != '0' || str[pos + 1] != '0') + return CValue(); + pos += 2; + std::string strHex = str.substr(pos, 2); + pos += 2; + // std::stoi throws std::invalid_argument if string is invalid + try + { + std::size_t count; + char symbol = (char)std::stoi(strHex, &count, 16); + if (count < 2) + return CValue(); + + result += symbol; + } + catch (std::invalid_argument& e) + { + return CValue(); + } + } + else + { + return CValue(); + } + } + } + // if did not encounter closing qoutes, return undefined + if (pos == str.size()) + return CValue(); + + pos++; + return result; + } + + CValue parseArrayFromJSON(const std::string& str, int& pos) + { + return CValue(); + } + + CValue parseObjectFromJSON(const std::string& str, int& pos) + { + return CValue(); + } + } + CValue CValue::FromJSON(const std::string& jsonString) { - // TODO: - return CValue(); + CValue value; + int pos = 0; + while (skipWhitespaces(jsonString, pos)) + { + // if value has been already parsed on previous iteration and there are still some symbols left, + // the json is considered invalid + if (!value.IsUndefined()) + return CValue(); + + char ch = jsonString[pos]; + if (ch == '\"') + { + // string + value = parseStringFromJSON(jsonString, pos); + } + else if (ch == '[') + { + // array + value = parseArrayFromJSON(jsonString, pos); + } + else if (ch == '{') + { + // object + value = parseObjectFromJSON(jsonString, pos); + } + else if (ch == 'n') + { + // null + if (jsonString.substr(pos, 4) == "null") + value = CValue::CreateNull(); + else + return CValue(); + pos += 4; + } + else if (ch == 't') + { + // true (bool) + if (jsonString.substr(pos, 4) == "true") + value = true; + else + return CValue(); + pos += 4; + } + else if (ch == 'f') + { + // false (bool) + if (jsonString.substr(pos, 5) == "false") + value = false; + else + return CValue(); + pos += 5; + } + else if (ch == '-' || std::isdigit(ch)) + { + value = parseNumberFromJSON(jsonString, pos); + } + else + { + return CValue(); + } + // if value is still undefined, the json is also invalid + if (value.IsUndefined()) + break; + } + + return value; } CValueRef::CValueRef(const CValueRef& other) : IValue(other.m_internal) diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index eecceadb8f..83ab41f857 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -991,31 +991,23 @@ TEST_F(CJSONTest, ToJSON_string) EXPECT_EQ(val.ToJSON(), "\"foo: {bar: 42}[} ,))\""); } -TEST_F(CJSONTest, ToJSON_string_backslashed_characters) +TEST_F(CJSONTest, ToJSON_string_escaped_characters) { - // For this test cases results are quite unusual. - // So the results are compared with JSON.stringify() alternative instead of hard-coded expected strings. CValue val = "HEL\"LO"; std::string strRes = val.ToJSON(); - std::string strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); - // EXPECT_EQ(strRes, "\"HEL\\\"LO\""); - EXPECT_EQ(strRes, strExpected); + EXPECT_EQ(strRes, "\"HEL\\\"LO\""); val = "HEL\\/LO"; strRes = val.ToJSON(); - strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); - // EXPECT_EQ(strRes, "\"HEL\\\\/LO\""); - EXPECT_EQ(strRes, strExpected); + EXPECT_EQ(strRes, "\"HEL\\\\/LO\""); val = "\tH\bE\fL\nL\nO\r"; strRes = val.ToJSON(); - strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); - // EXPECT_EQ(strRes, "\"\\tH\\bE\\fL\\nL\\nO\\r\""); - EXPECT_EQ(strRes, strExpected); + EXPECT_EQ(strRes, "\"\\tH\\bE\\fL\\nL\\nO\\r\""); // other symbols std::string spec = "/"; - for (char ch = 0; ch <= 0x1F; ch++) + for (char ch = 0; ch <= 0x21; ch++) { spec += ch; } @@ -1023,8 +1015,9 @@ TEST_F(CJSONTest, ToJSON_string_backslashed_characters) val = spec; strRes = val.ToJSON(); - strExpected = m_pContext->JSON_Stringify(CJSContext::createString(val.ToStringA())); - EXPECT_EQ(strRes, strExpected); + EXPECT_EQ(strRes, "\"/\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b" + "\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017" + "\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !/\""); } TEST_F(CJSONTest, ToJSON_typed_arrays) @@ -1129,6 +1122,329 @@ TEST_F(CJSONTest, ToJSON_objects_complex) std::string strExpected = m_pContext->JSON_Stringify(toJS(obj)); EXPECT_EQ(strRes, strExpected); } + +// ----------- CValue::FromJSON() tests ----------- +TEST_F(CJSONTest, FromJSON_null) +{ + std::string strJson = "null"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsNull()); +} + +TEST_F(CJSONTest, FromJSON_bool) +{ + std::string strJson = "false"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsBool()); + EXPECT_EQ((bool)val, false); + + strJson = "true"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsBool()); + EXPECT_EQ((bool)val, true); +} + +TEST_F(CJSONTest, FromJSON_int) +{ + std::string strJson = "42"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 42); + + strJson = "0"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 0); + + strJson = "-73"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, -73); + + strJson = "-2147483648"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, -2147483648); + + strJson = "2147483647"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 2147483647); + + strJson = "2147483648"; + val = CValue::FromJSON(strJson); + // this value does not fit into 32-bit integer limits + EXPECT_FALSE(val.IsInt()); +} + +TEST_F(CJSONTest, FromJSON_double) +{ + std::string strJson = "4.2"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_DOUBLE_EQ((double)val, 4.2); + + strJson = "42.0"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 42); + + strJson = "0.0"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 0); + + strJson = "3.1415926535"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_DOUBLE_EQ((double)val, 3.1415926535); + + strJson = "2147483648"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_DOUBLE_EQ((double)val, 2147483648.0); +} + +TEST_F(CJSONTest, FromJSON_double_critical_values) +{ + std::string strJson = "-8e30"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_DOUBLE_EQ((double)val, -8e30); + + strJson = "8e+30"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_DOUBLE_EQ((double)val, 8e30); + + strJson = "8e-30"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_DOUBLE_EQ((double)val, 8e-30); + + // divide by 10 to prevent getting 'inf' when converting to string + CValue maxDouble = std::numeric_limits::max() / 10; + strJson = maxDouble.ToJSON(); + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_NEAR((double)val, (double)maxDouble, 1e-15 * std::numeric_limits::max()); + + // multiply by 10 to prevent getting '0' when converting to string + CValue minDouble = std::numeric_limits::min() * 10; + strJson = minDouble.ToJSON(); + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_NEAR((double)val, (double)minDouble, 1e-15); + + // if value is outside of double range, it is expected to be inf + strJson = "10e+1000"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_EQ((double)val, INFINITY); + + strJson = "-10e1000"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_EQ((double)val, -INFINITY); + + // expected zero for too small values + strJson = "10e-1000"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_EQ((double)val, 0.0); +} + +TEST_F(CJSONTest, FromJSON_numbers_invalid) +{ + // leading zeroes are invalid in JSON standard, but here it is considered valid + std::string strJson = "0123"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 123); + // multiple decimal points + strJson = "12.34.56"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // trailing decimal point also considered invalid in JSON, but allowed here + strJson = "42."; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsDouble()); + EXPECT_EQ((int)val, 42); + // invalid exponent format + strJson = "1e"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "1e+"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "1e+a"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "1e+-"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // invalid characters + strJson = "123abc"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "123\"abc\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "123-42"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // sign without digits + strJson = "-"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // sign without digits + strJson = "-"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // whitespace in numbers + strJson = "1 234"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "1 a"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} + +TEST_F(CJSONTest, FromJSON_string) +{ + std::string strJson = "\" test \""; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), " test "); + + strJson = "\"\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), ""); + + // test for parsing of special symbols inside strings + strJson = "\"foo: {bar: 42}[} ,))\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), "foo: {bar: 42}[} ,))"); + + // test for using unicode codes instead of ASCII characters + strJson = "\"\\u0061\\u006E\\u0073\\u0077\\u0065\\u0072\\u0020\\u0069\\u0073\\u0020\\u0034\\u0032\\u0021\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), "answer is 42!"); +} + +TEST_F(CJSONTest, FromJSON_string_escaped_characters) +{ + std::string strJson = "\"\\\\\""; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), "\\"); + + strJson = "\"HEL\\\"LO\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), "HEL\"LO"); + + strJson = "\"HEL\\\\/LO\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), "HEL\\/LO"); + + strJson = "\"\\tH\\bE\\fL\\nL\\nO\\r\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), "\tH\bE\fL\nL\nO\r"); + + // characters from 0x00 to 0x21 (inclusive) + strJson = "\"/\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b" + "\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017" + "\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\/\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + + std::string spec = "/"; + for (char ch = 0; ch <= 0x21; ch++) + { + spec += ch; + } + spec += '/'; + + EXPECT_EQ(val.ToStringA(), spec); +} + +TEST_F(CJSONTest, FromJSON_string_invalid) +{ + // using unescaped control characters + std::string strJson = "\"this\nis a test"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "\"\t\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // no closing quote + strJson = "\" test "; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // no symbol after backslash + strJson = "\"\\\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // wrong symbol after backslash + strJson = "\"\\x\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // invalid unicode sequence + strJson = "\"\\u\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "\"\\u00\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "\"\\u0100\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "\"\\u001\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "\"\\u00GH\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "\"\\u00fH\""; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} + +TEST_F(CJSONTest, FromJSON_whitespace_symbols) +{ + // allowed space symbols are: 0x09 (\t), 0x0A (\n), 0x0D (\r) and 0x20 (space) + std::string strJson = " null "; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsNull()); + + strJson = "\t \n\n42\r"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + EXPECT_EQ((int)val, 42); + + strJson = "\n\t \" foo\\n \"\n \t\n"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsString()); + EXPECT_EQ(val.ToStringA(), " foo\n "); + + strJson = " \t\v 42 \t"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = " a 42 \t"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} + +// TODO: add incorrects JSONs + #else int main() { From 436d9ecdb7606f2f25fe2beda9d42f77806ae918 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Wed, 4 Sep 2024 21:35:56 +0400 Subject: [PATCH 42/82] Implement arrays parsing in FromJSON --- DesktopEditor/doctrenderer/json/json.cpp | 95 ++++++-- DesktopEditor/doctrenderer/test/json/main.cpp | 211 +++++++++++++++++- 2 files changed, 279 insertions(+), 27 deletions(-) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 4218e35a07..3eb93fe432 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -612,7 +612,7 @@ namespace NSJSON namespace { - // moves pos to first non-space symbol and returns `true` if pos is still inside the string after moving + // moves pos to first non-space symbol and returns false if end of the string was reached bool skipWhitespaces(const std::string& str, int& pos) { for (; pos < str.size(); pos++) @@ -732,53 +732,93 @@ namespace NSJSON // if did not encounter closing qoutes, return undefined if (pos == str.size()) return CValue(); - pos++; + return result; } + // parse one value of JSON-string `str` starting from `pos` + CValue valueFromJSON(const std::string& str, int& pos); + CValue parseArrayFromJSON(const std::string& str, int& pos) { - return CValue(); + // skip opening bracket '[' cause it has already been checked + pos++; + // handle first element separately to get pattern: [(firstValue)(,value)(,value)...] + CValue firstValue = valueFromJSON(str, pos); + if (firstValue.IsUndefined()) + { + if (pos < str.size() && str[pos] == ']') + { + pos++; + return CValue::CreateArray(0); + } + else + { + return CValue(); + } + } + + std::vector values; + values.emplace_back(firstValue); + while (skipWhitespaces(str, pos) && str[pos] != ']') + { + // expect ',' + if (str[pos] != ',') + return CValue(); + pos++; + // expect value + CValue value = valueFromJSON(str, pos); + if (value.IsUndefined()) + return CValue(); + values.emplace_back(value); + } + // if did not encounter closing bracket ']', return undefined + if (pos == str.size()) + return CValue(); + pos++; + + // copy values from vector to CValue array + CValue result = CValue::CreateArray(values.size()); + for (int i = 0; i < values.size(); i++) + { + result[i] = values[i]; + } + + return result; } CValue parseObjectFromJSON(const std::string& str, int& pos) { return CValue(); } - } - CValue CValue::FromJSON(const std::string& jsonString) - { - CValue value; - int pos = 0; - while (skipWhitespaces(jsonString, pos)) + CValue valueFromJSON(const std::string& str, int& pos) { - // if value has been already parsed on previous iteration and there are still some symbols left, - // the json is considered invalid - if (!value.IsUndefined()) + if (!skipWhitespaces(str, pos)) return CValue(); - char ch = jsonString[pos]; + CValue value; + char ch = str[pos]; if (ch == '\"') { // string - value = parseStringFromJSON(jsonString, pos); + value = parseStringFromJSON(str, pos); } else if (ch == '[') { // array - value = parseArrayFromJSON(jsonString, pos); + value = parseArrayFromJSON(str, pos); } else if (ch == '{') { // object - value = parseObjectFromJSON(jsonString, pos); + value = parseObjectFromJSON(str, pos); } else if (ch == 'n') { // null - if (jsonString.substr(pos, 4) == "null") + if (str.substr(pos, 4) == "null") value = CValue::CreateNull(); else return CValue(); @@ -787,7 +827,7 @@ namespace NSJSON else if (ch == 't') { // true (bool) - if (jsonString.substr(pos, 4) == "true") + if (str.substr(pos, 4) == "true") value = true; else return CValue(); @@ -796,7 +836,7 @@ namespace NSJSON else if (ch == 'f') { // false (bool) - if (jsonString.substr(pos, 5) == "false") + if (str.substr(pos, 5) == "false") value = false; else return CValue(); @@ -804,16 +844,25 @@ namespace NSJSON } else if (ch == '-' || std::isdigit(ch)) { - value = parseNumberFromJSON(jsonString, pos); + value = parseNumberFromJSON(str, pos); } else { return CValue(); } - // if value is still undefined, the json is also invalid - if (value.IsUndefined()) - break; + + return value; } + } + + CValue CValue::FromJSON(const std::string& jsonString) + { + int pos = 0; + CValue value = valueFromJSON(jsonString, pos); + // if there are still some non-space characters after the value has been parsed, + // the JSON-string is considered invalid + if (skipWhitespaces(jsonString, pos)) + return CValue(); return value; } diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index 83ab41f857..d9ba6d9abc 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -1131,6 +1131,34 @@ TEST_F(CJSONTest, FromJSON_null) EXPECT_TRUE(val.IsNull()); } +TEST_F(CJSONTest, FromJSON_null_invalid) +{ + // empty json string is invalid + std::string strJson = ""; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // there is no undefined in JSON standard + strJson = "undefined"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "nil"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "n"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "NULL"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "nullptr"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} + TEST_F(CJSONTest, FromJSON_bool) { std::string strJson = "false"; @@ -1138,12 +1166,35 @@ TEST_F(CJSONTest, FromJSON_bool) EXPECT_TRUE(val.IsBool()); EXPECT_EQ((bool)val, false); - strJson = "true"; + strJson = "true "; val = CValue::FromJSON(strJson); EXPECT_TRUE(val.IsBool()); EXPECT_EQ((bool)val, true); } +TEST_F(CJSONTest, FromJSON_bool_invalid) +{ + std::string strJson = "fals"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "truE"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "f"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "t"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + + strJson = "True"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} + TEST_F(CJSONTest, FromJSON_int) { std::string strJson = "42"; @@ -1164,17 +1215,18 @@ TEST_F(CJSONTest, FromJSON_int) strJson = "-2147483648"; val = CValue::FromJSON(strJson); EXPECT_TRUE(val.IsInt()); - EXPECT_EQ((int)val, -2147483648); + EXPECT_EQ((int)val, std::numeric_limits::min()); strJson = "2147483647"; val = CValue::FromJSON(strJson); EXPECT_TRUE(val.IsInt()); - EXPECT_EQ((int)val, 2147483647); + EXPECT_EQ((int)val, std::numeric_limits::max()); strJson = "2147483648"; val = CValue::FromJSON(strJson); // this value does not fit into 32-bit integer limits EXPECT_FALSE(val.IsInt()); + EXPECT_TRUE(val.IsDouble()); } TEST_F(CJSONTest, FromJSON_double) @@ -1443,7 +1495,158 @@ TEST_F(CJSONTest, FromJSON_whitespace_symbols) EXPECT_TRUE(val.IsUndefined()); } -// TODO: add incorrects JSONs +TEST_F(CJSONTest, FromJSON_arrays) +{ + std::string strJson = "[]"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 0); + EXPECT_TRUE(val[0].IsUndefined()); + + strJson = "[1, 2, 3]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 3); + EXPECT_EQ((int)val[0], 1); + EXPECT_EQ((int)val[1], 2); + EXPECT_EQ((int)val[2], 3); + + strJson = " [ \"][\" ] "; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 1); + EXPECT_EQ(val[0].ToStringA(), "]["); + + strJson = " [ 73 , null\n\t,4.2]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 3); + EXPECT_EQ((int)val[0], 73); + EXPECT_TRUE(val[1].IsNull()); + EXPECT_DOUBLE_EQ((double)val[2], 4.2); + + strJson = "[1, \"two\", 3.14, true, null]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 5); + EXPECT_EQ(val[0].ToInt(), 1); + EXPECT_EQ(val[1].ToStringA(), "two"); + EXPECT_DOUBLE_EQ(val[2].ToDouble(), 3.14); + EXPECT_TRUE(val[3].ToBool()); + EXPECT_TRUE(val[4].IsNull()); +} + +TEST_F(CJSONTest, FromJSON_arrays_inner) +{ + std::string strJson = "[[1, 2, 3]]"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 1); + EXPECT_TRUE(val[0].IsArray()); + EXPECT_EQ(val[0].GetCount(), 3); + EXPECT_EQ((int)val[0][0], 1); + EXPECT_EQ((int)val[0][1], 2); + EXPECT_EQ((int)val[0][2], 3); + + strJson = "[1, [2, 3], [4, [5, 6]], 7]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 4); + EXPECT_EQ((int)val[0], 1); + EXPECT_TRUE(val[1].IsArray()); + EXPECT_EQ(val[1].GetCount(), 2); + EXPECT_EQ((int)val[1][0], 2); + EXPECT_EQ((int)val[1][1], 3); + EXPECT_TRUE(val[2].IsArray()); + EXPECT_EQ(val[2].GetCount(), 2); + EXPECT_EQ((int)val[2][0], 4); + EXPECT_TRUE(val[2][1].IsArray()); + EXPECT_EQ(val[2][1].GetCount(), 2); + EXPECT_EQ((int)val[2][1][0], 5); + EXPECT_EQ((int)val[2][1][1], 6); + EXPECT_EQ((int)val[3], 7); + + strJson = "[[],[[]],[[],[]]]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsArray()); + EXPECT_EQ(val.GetCount(), 3); + EXPECT_TRUE(val[0].IsArray()); + EXPECT_EQ(val[0].GetCount(), 0); + EXPECT_TRUE(val[1].IsArray()); + EXPECT_EQ(val[1].GetCount(), 1); + EXPECT_TRUE(val[1][0].IsArray()); + EXPECT_EQ(val[1][0].GetCount(), 0); + EXPECT_TRUE(val[2].IsArray()); + EXPECT_EQ(val[2].GetCount(), 2); + EXPECT_TRUE(val[2][0].IsArray()); + EXPECT_EQ(val[2][0].GetCount(), 0); + EXPECT_TRUE(val[2][1].IsArray()); + EXPECT_EQ(val[2][1].GetCount(), 0); +} + +TEST_F(CJSONTest, FromJSON_arrays_invalid) +{ + // no closing bracket + std::string strJson = "["; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "[1,2,3"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // trailing comma + strJson = "[1,2,]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // leading comma + strJson = "[,1]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // missing comma + strJson = "[1 2, 3]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // extra commas + strJson = "[1,,2,3]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "[,]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // invalid elements + strJson = "[1, 2, undefined, 4]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // non-JSON values as elements + strJson = "[1, 2, f(), 4]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // invalid syntax within elements + strJson = "[\"foo\", 123, [1, 2, }, 4]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // whitespace issues + strJson = "[1, 2 3, 4]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // empty array without brackets + strJson = "]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // extra brackets + strJson = "[[1, 2, 3]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "[1, 2, 3]]"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // elements outside of the array + strJson = "[1, 2, 3], 5"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "[1, 2, 3] 4"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} #else int main() From 2673b158352aaa202b1befe0b27b3ad31a2647e2 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Thu, 5 Sep 2024 16:35:14 +0400 Subject: [PATCH 43/82] Implement objects parsing in FromJSON --- DesktopEditor/doctrenderer/json/json.cpp | 63 ++++- DesktopEditor/doctrenderer/test/json/main.cpp | 231 +++++++++++++++++- 2 files changed, 292 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 3eb93fe432..f7f7b86fda 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -788,9 +788,70 @@ namespace NSJSON return result; } + std::pair parseKeyValuePair(const std::string& str, int& pos) + { + std::pair result; + + if (!skipWhitespaces(str, pos) || str[pos] != '\"') + return result; + // parse key + CValue key = parseStringFromJSON(str, pos); + if (key.IsUndefined()) + return result; + result.first = key.ToStringA(); + // expect ':' + if (!skipWhitespaces(str, pos) || str[pos] != ':') + return result; + pos++; + // parse value + CValue value = valueFromJSON(str, pos); + if (value.IsUndefined()) + return result; + result.second = value; + + return result; + } + CValue parseObjectFromJSON(const std::string& str, int& pos) { - return CValue(); + CValue result = CValue::CreateObject(); + // skip opening curly brace '{' cause it has already been checked + pos++; + // handle first key-value pair separately to get pattern: [(firstKey:firstValue)(,key:value)(,key:value)...] + std::pair keyValue = parseKeyValuePair(str, pos); + // if value is undefined, then something went wrong or object is empty + if (keyValue.second.IsUndefined()) + { + if (pos < str.size() && str[pos] == '}' && keyValue.first.empty()) + { + pos++; + return result; + } + else + { + return CValue(); + } + } + + result[keyValue.first.c_str()] = keyValue.second; + while (skipWhitespaces(str, pos) && str[pos] != '}') + { + // expect ',' + if (str[pos] != ',') + return CValue(); + pos++; + // expect key-value pair + std::pair keyValue = parseKeyValuePair(str, pos); + if (keyValue.second.IsUndefined()) + return CValue(); + result[keyValue.first.c_str()] = keyValue.second; + } + // if did not encounter closing curly brace '}', return undefined + if (pos == str.size()) + return CValue(); + pos++; + + return result; } CValue valueFromJSON(const std::string& str, int& pos) diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index d9ba6d9abc..faf5889fb5 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -1054,7 +1054,7 @@ TEST_F(CJSONTest, ToJSON_arrays_complex) data[1] = 0x54; data[2] = 0xFE; data[3] = 0xFF; - data[0] = 0x00; + data[4] = 0x00; CValue typedArr = CValue::CreateTypedArray(data, 5, false); CValue arrInner = {true, 42, L"test function ToJSON()", 2.71828, CValue(), "abc de f", L"test"}; @@ -1648,6 +1648,235 @@ TEST_F(CJSONTest, FromJSON_arrays_invalid) EXPECT_TRUE(val.IsUndefined()); } +TEST_F(CJSONTest, FromJSON_objects) +{ + std::string strJson = "{}"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 0); + + strJson = "{\"name\" : \"Foo\"}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 1); + EXPECT_EQ(val["name"].ToStringA(), "Foo"); + + strJson = "{\"name\":\"Bar\",\"value\":42}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 2); + EXPECT_EQ(val["name"].ToStringA(), "Bar"); + EXPECT_EQ((int)val["value"], 42); + + strJson = "{\"\\u0070\\u0069\":\n3.1415\t, \"\":null ,\"flag\":true,\"arr \":[4,2],\"str\":\"test\"}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 5); + EXPECT_DOUBLE_EQ((double)val["pi"], 3.1415); + EXPECT_TRUE(val[""].IsNull()); + EXPECT_EQ((bool)val["flag"], true); + EXPECT_TRUE(val["arr "].IsArray()); + EXPECT_EQ(val["arr "].GetCount(), 2); + EXPECT_EQ((int)val["arr "][0], 4); + EXPECT_EQ((int)val["arr "][1], 2); + EXPECT_EQ(val["str"].ToStringA(), "test"); +} + +TEST_F(CJSONTest, FromJSON_objects_as_typed_arrays) +{ + // typed arrays in JSON are represented as objects with properties "0", "1", ... and corresponding integer values + // if you still want to make typed array from such object, you need to do it manually + std::string strJson = "{\"0\":26,\"1\":179,\"2\":254,\"3\":255,\"4\":0}"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ((int)val["0"], 26); + EXPECT_EQ((int)val["1"], 179); + EXPECT_EQ((int)val["2"], 254); + EXPECT_EQ((int)val["3"], 255); + EXPECT_EQ((int)val["4"], 0); +} + +TEST_F(CJSONTest, FromJSON_objects_inner) +{ + std::string strJson = "{\"inner\":{}}"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 1); + EXPECT_TRUE(val["inner"].IsObject()); + EXPECT_TRUE(val["inner"].GetPropertyNames().empty()); +} + +TEST_F(CJSONTest, FromJSON_objects_and_arrays) +{ + // more complex example + std::string strJson = \ + "{\n" + " \"name\": \"Foo\",\n" + " \"parameters\": {\n" + " \"size\": 42,\n" + " \"arr\": [\n" + " null,\n" + " [],\n" + " [42, \"test\", 2.71828],\n" + " {\n" + " \"name\": \"Bar\",\n" + " \"good\": false\n" + " },\n" + " null,\n" + " \"abc de f\",\n" + " \"\"\n" + " ],\n" + " \"0\": 0,\n" + " \"data\": {\n" + " \"data\": null,\n" + " \"count\": 0\n" + " }\n" + " },\n" + " \"\": \"empty\"\n" + "}\n"; + + CValue val = CValue::FromJSON(strJson); + + // Check root-level object + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 3); + // Check "name" property + EXPECT_EQ(val["name"].ToStringA(), "Foo"); + // Check "parameters" object + EXPECT_TRUE(val["parameters"].IsObject()); + EXPECT_EQ(val["parameters"].GetPropertyNames().size(), 4); + // Check "size" property + EXPECT_EQ((int)val["parameters"]["size"], 42); + // Check "arr" property (array) + EXPECT_TRUE(val["parameters"]["arr"].IsArray()); + EXPECT_EQ(val["parameters"]["arr"].GetCount(), 7); + // First element of "arr" (null) + EXPECT_TRUE(val["parameters"]["arr"][0].IsNull()); + // Second element of "arr" (empty array) + EXPECT_TRUE(val["parameters"]["arr"][1].IsArray()); + EXPECT_EQ(val["parameters"]["arr"][1].GetCount(), 0); + // Third element of "arr" (array with mixed types) + EXPECT_TRUE(val["parameters"]["arr"][2].IsArray()); + EXPECT_EQ(val["parameters"]["arr"][2].GetCount(), 3); + EXPECT_EQ((int)val["parameters"]["arr"][2][0], 42); + EXPECT_EQ(val["parameters"]["arr"][2][1].ToStringA(), "test"); + EXPECT_DOUBLE_EQ((double)val["parameters"]["arr"][2][2], 2.71828); + // Fourth element of "arr" (object) + EXPECT_TRUE(val["parameters"]["arr"][3].IsObject()); + EXPECT_EQ(val["parameters"]["arr"][3].GetPropertyNames().size(), 2); + EXPECT_EQ(val["parameters"]["arr"][3]["name"].ToStringA(), "Bar"); + EXPECT_TRUE(val["parameters"]["arr"][3]["good"].IsBool()); + EXPECT_FALSE(val["parameters"]["arr"][3]["good"]); + // Fifth element of "arr" (null) + EXPECT_TRUE(val["parameters"]["arr"][4].IsNull()); + // Sixth element of "arr" (string) + EXPECT_EQ(val["parameters"]["arr"][5].ToStringA(), "abc de f"); + // Seventh element of "arr" (empty string) + EXPECT_EQ(val["parameters"]["arr"][6].ToStringA(), ""); + // Check "0" property (numeric value) + EXPECT_EQ((int)val["parameters"]["0"], 0); + // Check "data" object inside "parameters" + EXPECT_TRUE(val["parameters"]["data"].IsObject()); + EXPECT_EQ(val["parameters"]["data"].GetPropertyNames().size(), 2); + // Check "data" property inside "data" (null) + EXPECT_TRUE(val["parameters"]["data"]["data"].IsNull()); + // Check "count" property inside "data" + EXPECT_EQ((int)val["parameters"]["data"]["count"], 0); +} + +TEST_F(CJSONTest, FromJSON_objects_invalid) +{ + // no closing bracket + std::string strJson = "{"; + CValue val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"key1\": \"value1\", \"key2\": 42"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // trailing comma + strJson = "{ \"key1\": \"value1\", \"key2\": 42, }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // duplicating properties are technically allowed. Only the last value will apply. + strJson = "{ \"key\": \"value1\", \"key\": \"value2\" }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsObject()); + EXPECT_EQ(val.GetPropertyNames().size(), 1); + EXPECT_EQ(val["key"].ToStringA(), "value2"); + // keys are not enslosed in double quotes + strJson = "{ key1: \"value1\", \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // missing colon between the key and the value + strJson = "{ \"key1\" \"value1\", \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{\"key\"}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{key}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // wrong value formats + strJson = "{ \"key1\": undefined, \"key2\": 42 }"; ; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"key1\": 12.34.56, \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"key1\": \"value1, \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // non-string key + strJson = "{ 123: \"value\", \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // missing coma + strJson = "{ \"key1\": \"value1\" \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // some invalid inner object + strJson = "{ \"outerKey\": { \"innerKey\": \"value\", \"anotherInnerKey\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"outerKey\": { innerKey: \"value\" } }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"outerKey\": { \"innerKey\" \"value\" } }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"outerKey\": { \"innerKey\": \"value\", }, \"key2\": 42 }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{ \"outerKey\": { \"innerKey\": \"value\", \"anotherInnerKey\": 42, \"thirdKey\": { \"deepKey\": \"value\" } }"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // no opening bracket + strJson = "}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "\"key1\": \"value1\", \"key2\": 42}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // extra brackets + strJson = "{{\"key1\": \"value1\", \"key2\": 42}}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{{\"key1\": \"value1\", \"key2\": 42}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{\"key1\": \"value1\", \"key2\": 42}}"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + // elements outside of the object + strJson = "{\"key1\": \"value1\", \"key2\": 42}, \"key3\": 3.14"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); + strJson = "{\"key1\": \"value1\", \"key2\": 42} \"key3\": 3.14"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsUndefined()); +} + #else int main() { From 81d90420ddeff8fb7bab85fb383d3d57a115df84 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 6 Sep 2024 20:22:36 +0400 Subject: [PATCH 44/82] Normalize JSON in tests --- DesktopEditor/doctrenderer/test/json/main.cpp | 110 +++++++++++++++++- 1 file changed, 105 insertions(+), 5 deletions(-) diff --git a/DesktopEditor/doctrenderer/test/json/main.cpp b/DesktopEditor/doctrenderer/test/json/main.cpp index faf5889fb5..61e945e8ef 100644 --- a/DesktopEditor/doctrenderer/test/json/main.cpp +++ b/DesktopEditor/doctrenderer/test/json/main.cpp @@ -901,6 +901,88 @@ TEST_F(CJSONTest, serialization_with_script) } // ----------- CValue::ToJSON() tests ----------- +namespace +{ + // helper function + std::string normalizeJSONObject(const std::string& str, int& pos) + { + // '{' was checked + pos++; + + std::vector keyValuePairs; + std::string keyValue; + int nSquareBrackets = 0; + + for (; str[pos] != '}'; pos++) + { + if (str[pos] == '{') + { + keyValue += normalizeJSONObject(str, pos); + } + else if (str[pos] == ',' && nSquareBrackets == 0) + { + keyValuePairs.emplace_back(std::move(keyValue)); + keyValue = ""; + } + else + { + if (str[pos] == '[') + { + nSquareBrackets++; + } + else if (str[pos] == ']') + { + nSquareBrackets--; + } + keyValue += str[pos]; + } + } + + if (!keyValue.empty()) + keyValuePairs.emplace_back(std::move(keyValue)); + + std::sort(keyValuePairs.begin(), keyValuePairs.end()); + std::string result = "{"; + for (const std::string& keyValue : keyValuePairs) + { + result += keyValue; + result += ','; + } + // pop last ',' + if (result.back() == ',') + result.pop_back(); + result += '}'; + + return result; + } + + // test function that sorts key-value pairs for objects in JSON-strings + // works only with valid JSONs + std::string normalizeJSON(const std::string& str) + { + const int n = (int)str.size(); + + if (str[0] != '{' && str[0] != '[') + return str; + + std::string result; + for (int pos = 0; pos < n; pos++) + { + if (str[pos] == '{') + { + result += normalizeJSONObject(str, pos); + // decrement because it will be incremented again + } + else + { + result += str[pos]; + } + } + + return result; + } +} + TEST_F(CJSONTest, ToJSON_undefined) { CValue val = CValue::CreateUndefined(); @@ -1061,7 +1143,14 @@ TEST_F(CJSONTest, ToJSON_arrays_complex) CValue arr = {0, arrInner, arrInner, CValue::CreateNull(), arrInner, CValue::CreateArray(4), typedArr}; std::string strRes = arr.ToJSON(); - std::string strExpected = m_pContext->JSON_Stringify(toJS(arr)); + std::string strExpected = "[0," + "[true,42,\"test function ToJSON()\",2.71828,null,\"abc de f\",\"test\"]," + "[true,42,\"test function ToJSON()\",2.71828,null,\"abc de f\",\"test\"]," + "null," + "[true,42,\"test function ToJSON()\",2.71828,null,\"abc de f\",\"test\"]," + "[null,null,null,null]," + "{\"0\":26,\"1\":84,\"2\":254,\"3\":255,\"4\":0}]"; + EXPECT_EQ(strRes, strExpected); } @@ -1090,11 +1179,15 @@ TEST_F(CJSONTest, ToJSON_objects) obj["name"] = "Foo"; obj["number"] = 42; - EXPECT_EQ(obj.ToJSON(), "{\"name\":\"Foo\",\"number\":42}"); + std::string strRes = normalizeJSON(obj.ToJSON()); + std::string strExpected = normalizeJSON("{\"name\":\"Foo\",\"number\":42}"); + EXPECT_EQ(strRes, strExpected); obj["undef"] = CValue::CreateUndefined(); obj["null"] = CValue::CreateNull(); - EXPECT_EQ(obj.ToJSON(), "{\"name\":\"Foo\",\"number\":42,\"null\":null}"); + strRes = normalizeJSON(obj.ToJSON()); + strExpected = normalizeJSON("{\"name\":\"Foo\",\"number\":42,\"null\":null}"); + EXPECT_EQ(strRes, strExpected); } TEST_F(CJSONTest, ToJSON_objects_complex) @@ -1118,8 +1211,15 @@ TEST_F(CJSONTest, ToJSON_objects_complex) // property without a name obj[""] = "Bar"; - std::string strRes = obj.ToJSON(); - std::string strExpected = m_pContext->JSON_Stringify(toJS(obj)); + std::string strRes = normalizeJSON(obj.ToJSON()); + std::string strExpected = normalizeJSON( \ + "{" + "\"name\":\"Foo\"," + "\"parameters\":{\"arr\":[null,[null],[42,\"test function ToJSON()\",2.71828],{},null,\"abc de f\",\"test\"],\"size\":42,\"0\":0}," + "\"typed\":{\"0\":26,\"1\":84,\"2\":254,\"3\":255}," + "\"\":\"Bar\"" + "}"); + EXPECT_EQ(strRes, strExpected); } From 106f448042b6ddd69945752a22ae1f420ebc0f5a Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Wed, 11 Sep 2024 12:15:46 +0400 Subject: [PATCH 45/82] Fix build for xp --- DesktopEditor/doctrenderer/json/json.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index f7f7b86fda..9126c91e9e 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -903,7 +903,7 @@ namespace NSJSON return CValue(); pos += 5; } - else if (ch == '-' || std::isdigit(ch)) + else if (ch == '-' || (ch >= '0' && ch <= '9')) { value = parseNumberFromJSON(str, pos); } From 3c16ba01f0985b8a83bbd003caa1429475ba882b Mon Sep 17 00:00:00 2001 From: Green Date: Wed, 11 Sep 2024 13:23:36 +0300 Subject: [PATCH 46/82] Fix max font size in svg conversion --- .../raster/Metafile/svg/SvgObjects/CText.cpp | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp index 8caa092e57..61a6b16db0 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp @@ -18,6 +18,10 @@ namespace SVG { #define DefaultFontFamily L"Times New Roman" + #define MIN_FONT_SIZE 5 + #define MAX_FONT_SIZE 100 + #define MIN_SCALE 0.05 + #define MAX_SCALE 100 CTSpan::CTSpan(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent, NSFonts::IFontManager* pFontManager, bool bCheckText) : CRenderedObject(oNode, pParent), m_pFontManager(pFontManager) @@ -155,11 +159,13 @@ namespace SVG if (!UseExternalFont(pFile, dX, dY, pRenderer, oMode, pOtherStyles)) { - ApplyFont(pRenderer, dX, dY); - - pRenderer->CommandDrawText(m_wsText, dX, dY, 0, 0); - - for (const CRenderedObject* pTSpan : m_arObjects) + if (!m_wsText.empty()) + { + ApplyFont(pRenderer, dX, dY); + pRenderer->CommandDrawText(m_wsText, dX, dY, 0, 0); + } + + for (const CTSpan* pTSpan : m_arObjects) pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles); } @@ -413,21 +419,35 @@ namespace SVG double dXScale = 1., dYScale = 1.; - double dModuleM11 = std::abs(oCurrentMatrix.sx()); - double dModuleM22 = std::abs(oCurrentMatrix.sy()); + const double dModuleM11 = std::abs(oCurrentMatrix.sx()); + const double dModuleM22 = std::abs(oCurrentMatrix.sy()); - if (!ISZERO(dModuleM11) && (dModuleM11 < 0.05 || dModuleM11 > 100)) + if (!ISZERO(dModuleM11) && (dModuleM11 < MIN_SCALE || dModuleM11 > MAX_SCALE)) dXScale /= dModuleM11; - if (!ISZERO(dModuleM22) && (dModuleM22 < 0.05 || dModuleM22 > 100)) + if (!ISZERO(dModuleM22) && (dModuleM22 < MIN_SCALE || dModuleM22 > MAX_SCALE)) dYScale /= dModuleM22; + dFontHeight *= dYScale; + + if (!Equals(0., dFontHeight) && dFontHeight < MIN_FONT_SIZE) + { + dXScale *= MIN_FONT_SIZE / dFontHeight; + dYScale *= MIN_FONT_SIZE / dFontHeight; + dFontHeight = MIN_FONT_SIZE; + } + else if (!Equals(0., dFontHeight) && dFontHeight > MAX_FONT_SIZE) + { + dXScale *= dFontHeight / MAX_FONT_SIZE; + dYScale *= dFontHeight / MAX_FONT_SIZE; + dFontHeight = MAX_FONT_SIZE; + } + if (Equals(1., dXScale) && Equals(1., dYScale)) return; - dX /= dXScale; - dY /= dYScale; - dFontHeight /= dYScale; + dX /= dXScale; + dY /= dYScale; double dM11, dM12, dM21, dM22, dDx, dDy; @@ -483,9 +503,6 @@ namespace SVG CTSpan::Draw(pRenderer, pFile, oMode, pOtherStyles); - for (const CRenderedObject* pTSpan : m_arObjects) - pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles); - return true; } From a68b7e7354027293fedb8df36cd6350792ce2947 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Wed, 11 Sep 2024 17:38:40 +0300 Subject: [PATCH 47/82] fix bug #70134 --- .../ASCOfficeDrawingConverter.cpp | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 4b97f14b09..8222a19828 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -2654,6 +2654,7 @@ void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CX std::wstring sTextInsetMode = oNodeTextBox.GetAttribute(L"o:insetmode"); sTextboxStyle = oNodeTextBox.GetAttribute(L"style"); + //if (L"" != sTextInset && ((L"" == sTextInsetMode) || (L"custom" == sTextInsetMode))) if (sTextInsetMode.empty() || L"custom" == sTextInsetMode) { if (!sTextInset.empty()) @@ -2674,10 +2675,20 @@ void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CX } else { - pShape->oTextBoxBodyPr->lIns = 12700; - pShape->oTextBoxBodyPr->tIns = 12700; - pShape->oTextBoxBodyPr->rIns = 12700; - pShape->oTextBoxBodyPr->bIns = 12700; + if (pPPTShape->m_eType == PPTShapes::sptCTextBox) + { + pShape->oTextBoxBodyPr->lIns = 91440; + pShape->oTextBoxBodyPr->tIns = 45720; + pShape->oTextBoxBodyPr->rIns = 91440; + pShape->oTextBoxBodyPr->bIns = 45720; + } + else + { + pShape->oTextBoxBodyPr->lIns = 12700; + pShape->oTextBoxBodyPr->tIns = 12700; + pShape->oTextBoxBodyPr->rIns = 12700; + pShape->oTextBoxBodyPr->bIns = 12700; + } } } @@ -2998,9 +3009,9 @@ void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CX CheckBorderShape(elem, oNodeShape, pPPTShape); ////test - //NSBinPptxRW::CXmlWriter oXml; - //elem->toXmlWriter(&oXml); - //std::wstring test = oXml.GetXmlString(); + NSBinPptxRW::CXmlWriter oXml; + elem->toXmlWriter(&oXml); + std::wstring test = oXml.GetXmlString(); } From f738aa95ad9f18dddbfc2389261c2da20d55664b Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Thu, 12 Sep 2024 10:38:26 +0300 Subject: [PATCH 48/82] . --- OOXML/PPTXFormat/Logic/GraphicFrame.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/OOXML/PPTXFormat/Logic/GraphicFrame.cpp b/OOXML/PPTXFormat/Logic/GraphicFrame.cpp index 4d3cebf7aa..315dc2cb8e 100644 --- a/OOXML/PPTXFormat/Logic/GraphicFrame.cpp +++ b/OOXML/PPTXFormat/Logic/GraphicFrame.cpp @@ -357,14 +357,7 @@ namespace PPTX else if (L"chart" == strName) { chartRec = oNode; - - if (chartRec.IsInit()) - { - if (false == chartRec->m_bChartEx) - result = true; - else - chartRec.reset(); - } + result = chartRec.IsInit(); } else if (L"slicer" == strName) { From 42a4fe53dd9e104a3f7e8ac81314e1914d563af2 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Thu, 12 Sep 2024 11:01:32 +0300 Subject: [PATCH 49/82] fix bug #70160 --- .../DrawingConverter/ASCOfficeDrawingConverter.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 8222a19828..398ae90a65 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -5011,9 +5011,13 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pSpPr->Fill.m_type = PPTX::Logic::UniFill::noFill; pSpPr->Fill.Fill = pNoFill; + + pPPTShape->m_bIsFilled = false; } + else + pPPTShape->m_bIsFilled = true; // change parent ShapeType } - else if (!pPPTShape->m_bIsFilled) + else if (!pPPTShape->m_bIsFilled) // from parent ShapeType { PPTX::Logic::NoFill* pNoFill = new PPTX::Logic::NoFill(); pNoFill->m_namespace = L"a"; @@ -5040,7 +5044,7 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils } XmlUtils::CXmlNode oNodeFill = oNode.ReadNode(L"v:fill"); - if (oNodeFill.IsValid() && !pPPTShape->IsWordArt()) + if (pPPTShape->m_bIsFilled && oNodeFill.IsValid() && !pPPTShape->IsWordArt()) { nullable_string sOpacity2; nullable_string sColor2; @@ -5295,7 +5299,7 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pSpPr->Fill.as().blip->Effects.push_back(oEff); } } - if (true) + if (pPPTShape->m_bIsFilled) { XmlUtils::CXmlNode oNodeFillID = oNode.ReadNode(L"v:imagedata"); From d89d63e0db45273ee227e48068fd68f9acc965d5 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Thu, 12 Sep 2024 14:50:41 +0300 Subject: [PATCH 50/82] fix bug #70136 --- .../DocFile/TableCellPropertiesMapping.cpp | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/MsBinaryFile/DocFile/TableCellPropertiesMapping.cpp b/MsBinaryFile/DocFile/TableCellPropertiesMapping.cpp index fed7e759a2..d02d70edca 100644 --- a/MsBinaryFile/DocFile/TableCellPropertiesMapping.cpp +++ b/MsBinaryFile/DocFile/TableCellPropertiesMapping.cpp @@ -94,7 +94,7 @@ namespace DocFileFormat } bool bPresentDefTable = false; - for (std::vector::reverse_iterator iter = tapx->grpprl->rbegin(); iter != tapx->grpprl->rend(); ++iter) + for (std::vector::iterator iter = tapx->grpprl->begin(); iter != tapx->grpprl->end(); ++iter) { switch (iter->OpCode) { @@ -295,16 +295,20 @@ namespace DocFileFormat unsigned char brc80[size]; memcpy(brc80, iter->Arguments, size); - _brcTop = std::shared_ptr(new BorderCode(brc80, size)); + if (!_brcTop) + _brcTop = std::shared_ptr(new BorderCode(brc80, size)); memcpy(brc80, (iter->Arguments + 4), size); - _brcLeft = std::shared_ptr(new BorderCode(brc80, size)); + if (!_brcLeft) + _brcLeft = std::shared_ptr(new BorderCode(brc80, size)); memcpy(brc80, (iter->Arguments + 8), size); - _brcBottom = std::shared_ptr(new BorderCode(brc80, size)); + if (!_brcBottom) + _brcBottom = std::shared_ptr(new BorderCode(brc80, size)); memcpy(brc80, (iter->Arguments + 12), size); - _brcRight = std::shared_ptr(new BorderCode(brc80, size)); + if (!_brcRight) + _brcRight = std::shared_ptr(new BorderCode(brc80, size)); //memcpy(brc80, (iter->Arguments + 16), size); //_brcHorz = std::shared_ptr(new BorderCode(brc80, size)); @@ -319,16 +323,20 @@ namespace DocFileFormat unsigned char brc[size]; memcpy(brc, iter->Arguments, size); - _brcTop = std::shared_ptr(new BorderCode(brc, size)); + if (!_brcTop) + _brcTop = std::shared_ptr(new BorderCode(brc, size)); memcpy(brc, (iter->Arguments + 8), size); - _brcLeft = std::shared_ptr(new BorderCode(brc, size)); + if (!_brcLeft) + _brcLeft = std::shared_ptr(new BorderCode(brc, size)); memcpy(brc, (iter->Arguments + 16), size); - _brcBottom = std::shared_ptr(new BorderCode(brc, size)); + if (!_brcBottom) + _brcBottom = std::shared_ptr(new BorderCode(brc, size)); memcpy(brc, (iter->Arguments + 24), size); - _brcRight = std::shared_ptr(new BorderCode(brc, size)); + if (!_brcRight) + _brcRight = std::shared_ptr(new BorderCode(brc, size)); //memcpy(brc, (iter->Arguments + 32), size); //_brcHorz = std::shared_ptr(new BorderCode(brc, size)); From 7f7e89babf06c0f26b308a671fcfa08e809f1dbb Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Thu, 12 Sep 2024 18:07:19 +0300 Subject: [PATCH 51/82] fix bug #69781 --- MsBinaryFile/DocFile/VMLShapeMapping.cpp | 22 ++++++++++++-- .../Biff_structures/ODRAW/OfficeArtFOPTE.cpp | 29 ++++++++++--------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/MsBinaryFile/DocFile/VMLShapeMapping.cpp b/MsBinaryFile/DocFile/VMLShapeMapping.cpp index 186fc1701e..55e7d3aff5 100644 --- a/MsBinaryFile/DocFile/VMLShapeMapping.cpp +++ b/MsBinaryFile/DocFile/VMLShapeMapping.cpp @@ -294,7 +294,9 @@ namespace DocFileFormat boost::optional ShadowOriginY; boost::optional xCoord; boost::optional yCoord; - + boost::optional xCoord2; + boost::optional yCoord2; + bool bStroked = true; bool bFilled = true; bool hasTextbox = false; @@ -480,6 +482,14 @@ namespace DocFileFormat m_pXmlWriter->WriteAttribute(L"wrapcoords", wrapCoords); } }break; + case ODRAW::geoLeft: + { + xCoord2 = iter->op; + }break; + case ODRAW::geoTop: + { + yCoord2 = iter->op; + }break; case ODRAW::geoRight: { xCoord = iter->op; @@ -1021,7 +1031,15 @@ namespace DocFileFormat if ( xCoord && yCoord ) { - m_pXmlWriter->WriteAttribute( L"coordsize", ( FormatUtils::SizeTToWideString( *xCoord ) + L"," + FormatUtils::SizeTToWideString( *yCoord ) )); + if (xCoord2 && yCoord2) + { + m_pXmlWriter->WriteAttribute(L"coordorigin", (FormatUtils::SizeTToWideString(*xCoord2) + L"," + FormatUtils::SizeTToWideString(*yCoord2))); + m_pXmlWriter->WriteAttribute(L"coordsize", (FormatUtils::SizeTToWideString(*xCoord - *xCoord2) + L"," + FormatUtils::SizeTToWideString(*yCoord - *yCoord2))); + } + else + { + m_pXmlWriter->WriteAttribute(L"coordsize", (FormatUtils::SizeTToWideString(*xCoord) + L"," + FormatUtils::SizeTToWideString(*yCoord))); + } } int nCode = 0; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp index c0015b22e9..5ccc5ff6e9 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp @@ -1275,24 +1275,28 @@ void MSOPATHINFO::load(IBinaryReader* reader) case 0x09: { m_eRuler = ODRAW::rtQuadrBesier; - break; - } + + }break; case 0x0A: { m_eRuler = ODRAW::rtNoFill; - break; - } + + }break; case 0x0B: { m_eRuler = ODRAW::rtNoStroke; - break; - } - case 0x0C: - case 0x10: + + }break; + case 0x0C: //msopathEscapeAutoLine { m_eRuler = ODRAW::rtLineTo; - break; - } + mem = 2; + }break; + case 0x10: // msopathEscapeSmoothLine + { + m_eRuler = ODRAW::rtLineTo; + + }break; case 0x0D: case 0x0E: case 0x0F: @@ -1301,9 +1305,8 @@ void MSOPATHINFO::load(IBinaryReader* reader) case 0x13: case 0x14: { - m_eRuler = ODRAW::rtCurveTo; - break; - } + m_eRuler = ODRAW::rtCurveTo; + }break; case 0x15: { m_eRuler = ODRAW::rtFillColor; From 8c62dc448a51dc25d7cceed9062b7a51410baeba Mon Sep 17 00:00:00 2001 From: Green Date: Thu, 12 Sep 2024 20:04:22 +0300 Subject: [PATCH 52/82] Fixed bug width text position in svg conversion --- DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp index 61a6b16db0..7bc95654f9 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp @@ -350,7 +350,7 @@ namespace SVG double CTSpan::GetWidth() const { - if (m_wsText.empty()) + if (m_wsText.empty() && m_arObjects.empty()) return 0.; std::wstring wsName = DefaultFontFamily; From 4378becd0b72a4776be958a62c7205dcfea4cb05 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 13 Sep 2024 14:30:53 +0400 Subject: [PATCH 53/82] Enter new contexts by default --- DesktopEditor/doctrenderer/docbuilder.cpp | 4 ++-- DesktopEditor/doctrenderer/docbuilder.h | 3 ++- DesktopEditor/doctrenderer/docbuilder_p.h | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/DesktopEditor/doctrenderer/docbuilder.cpp b/DesktopEditor/doctrenderer/docbuilder.cpp index b0e4dd7bb6..bfb37ac573 100644 --- a/DesktopEditor/doctrenderer/docbuilder.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.cpp @@ -68,8 +68,8 @@ namespace NSDoctRenderer return m_pInternal->ExecuteCommand(command, retValue); } - CDocBuilderContext CDocBuilder::GetContext() + CDocBuilderContext CDocBuilder::GetContext(bool enterContext) { - return m_pInternal->GetContext(); + return m_pInternal->GetContext(enterContext); } } diff --git a/DesktopEditor/doctrenderer/docbuilder.h b/DesktopEditor/doctrenderer/docbuilder.h index 0f56481040..b256e97f4e 100644 --- a/DesktopEditor/doctrenderer/docbuilder.h +++ b/DesktopEditor/doctrenderer/docbuilder.h @@ -492,9 +492,10 @@ namespace NSDoctRenderer /** * Returns the current JS context. + * @param enterContext Whether returned context should be entered or not. * @return The current JS context */ - CDocBuilderContext GetContext(); + CDocBuilderContext GetContext(bool enterContext = true); public: /** diff --git a/DesktopEditor/doctrenderer/docbuilder_p.h b/DesktopEditor/doctrenderer/docbuilder_p.h index 76ad99cad7..e82fd1ffdc 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.h +++ b/DesktopEditor/doctrenderer/docbuilder_p.h @@ -407,6 +407,11 @@ public: { m_scopes.push_back(scope); } + + void AddNewScope(NSDoctRenderer::CDocBuilderContextScopeWrap* scope) + { + m_scopes.emplace_back(scope); + } }; class CV8RealTimeWorker @@ -1284,7 +1289,7 @@ namespace NSDoctRenderer return m_pWorker->ExecuteCommand(command, retValue); } - CDocBuilderContext GetContext() + CDocBuilderContext GetContext(bool enterContext) { CDocBuilderContext ctx; @@ -1292,6 +1297,14 @@ namespace NSDoctRenderer ctx.m_internal->m_context = m_pWorker->m_context; ctx.m_internal->m_context_data = &m_pWorker->m_oContextData; + + if (enterContext) + { + CDocBuilderContextScopeWrap* scopeWrap = new CDocBuilderContextScopeWrap(); + scopeWrap->m_scope = new CJSContextScope(m_pWorker->m_context); + m_pWorker->m_oContextData.AddNewScope(scopeWrap); + } + return ctx; } From 312a95d9e18184af61fdab4d73449457cb6ca484 Mon Sep 17 00:00:00 2001 From: Mikhail Lobotskiy Date: Fri, 13 Sep 2024 16:08:42 +0400 Subject: [PATCH 54/82] Fix bug #70010 --- DesktopEditor/doctrenderer/docbuilder.h | 5 +++++ .../docbuilder.python/src/docbuilder.py | 13 +++++++++++++ .../docbuilder.python/src/docbuilder_functions.cpp | 5 +++++ .../docbuilder.python/src/docbuilder_functions.h | 1 + DesktopEditor/doctrenderer/docbuilder_p.cpp | 8 ++++++++ 5 files changed, 32 insertions(+) diff --git a/DesktopEditor/doctrenderer/docbuilder.h b/DesktopEditor/doctrenderer/docbuilder.h index 0f56481040..925812367d 100644 --- a/DesktopEditor/doctrenderer/docbuilder.h +++ b/DesktopEditor/doctrenderer/docbuilder.h @@ -204,6 +204,11 @@ namespace NSDoctRenderer * Creates an array. This method returns the current context and calls its CreateArray method. */ static CDocBuilderValue CreateArray(const int& length); + /** + * Please use CDocBuilderContext::CreateObject + * Creates an object. This method returns the current context and calls its CreateObject method. + */ + static CDocBuilderValue CreateObject(); public: /** diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index b2bee6b2fa..c444b92d4a 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py @@ -121,6 +121,9 @@ def _loadLibrary(path): _lib.CDocBuilderValue_CreateArray.argtypes = [ctypes.c_int] _lib.CDocBuilderValue_CreateArray.restype = OBJECT_HANDLE + _lib.CDocBuilderValue_CreateObject.argtypes = [] + _lib.CDocBuilderValue_CreateObject.restype = OBJECT_HANDLE + _lib.CDocBuilderValue_Call0.argtypes = [OBJECT_HANDLE, ctypes.c_wchar_p] _lib.CDocBuilderValue_Call0.restype = OBJECT_HANDLE @@ -280,6 +283,12 @@ class CDocBuilderValue: self._internal = _lib.CDocBuilderValue_CreateArray(length) for i in range(length): self.Set(i, value[i]) + elif isinstance(value, dict): + self._internal = _lib.CDocBuilderValue_CreateObject() + for key in value.keys(): + if not isinstance(key, str): + raise TypeError("CDocBuilderValue constructor supports only str keys in dict") + self.SetProperty(key, value[key]) elif isinstance(value, CDocBuilderValue): self._internal = _lib.CDocBuilderValue_Copy(value._internal) elif isinstance(value, OBJECT_HANDLE): @@ -385,6 +394,10 @@ class CDocBuilderValue: def CreateArray(length): return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_CreateArray(length))) + @staticmethod + def CreateObject(): + return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_CreateObject())) + def Call(self, name, *args): if len(args) == 0: return CDocBuilderValue(OBJECT_HANDLE(_lib.CDocBuilderValue_Call0(self._internal, ctypes.c_wchar_p(name)))) diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp index 726fee54e2..c762f4c1b0 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.cpp @@ -164,6 +164,11 @@ CDocBuilderValue* CDocBuilderValue_CreateArray(int length) return new CDocBuilderValue(CDocBuilderValue::CreateArray(length)); } +CDocBuilderValue* CDocBuilderValue_CreateObject() +{ + return new CDocBuilderValue(CDocBuilderValue::CreateObject()); +} + CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name) { return new CDocBuilderValue(self->Call(name)); diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h index 297e8237b0..a82c52059e 100644 --- a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h +++ b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder_functions.h @@ -56,6 +56,7 @@ DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateWithString(const w DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateUndefined(); DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateNull(); DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateArray(int length); +DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_CreateObject(); DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call0(CDocBuilderValue* self, const wchar_t* name); DOCBUILDER_FUNC_DECL CDocBuilderValue* CDocBuilderValue_Call1(CDocBuilderValue* self, const wchar_t* name, CDocBuilderValue* p1); diff --git a/DesktopEditor/doctrenderer/docbuilder_p.cpp b/DesktopEditor/doctrenderer/docbuilder_p.cpp index 8f52c8570c..68add68351 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.cpp +++ b/DesktopEditor/doctrenderer/docbuilder_p.cpp @@ -821,6 +821,14 @@ namespace NSDoctRenderer return ret; } + CDocBuilderValue CDocBuilderValue::CreateObject() + { + CDocBuilderValue ret; + ret.m_internal->m_context = NSJSBase::CJSContext::GetCurrent(); + ret.m_internal->m_value = NSJSBase::CJSContext::createObject(); + return ret; + } + // Functions CDocBuilderValue CDocBuilderValue::Call(const char* name) { From 8ad7b123aa19ea724d0a4bd4efe9e5d5b5c0c55d Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 16 Sep 2024 14:39:43 +0300 Subject: [PATCH 55/82] Fix build pdf files --- X2tConverter/src/lib/pdf_image.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/X2tConverter/src/lib/pdf_image.h b/X2tConverter/src/lib/pdf_image.h index 2167125111..97bd09d86e 100644 --- a/X2tConverter/src/lib/pdf_image.h +++ b/X2tConverter/src/lib/pdf_image.h @@ -663,7 +663,7 @@ namespace NExtractTools if ('%' == signature[0] && 'P' == signature[1] && 'D' == signature[2] && 'F' == signature[3]) { DWORD dwChangesSize = (DWORD)(oFile.GetFileSize() - 4); - BYTE* pChangesData = NULL; + BYTE* pChangesData = new BYTE[dwChangesSize]; if (oFile.ReadFile(pChangesData, dwChangesSize)) { From 19e5a2db2d12ce9e2ff5c975149511686b380898 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Mon, 16 Sep 2024 19:06:11 +0300 Subject: [PATCH 56/82] fix bug #70240 --- .../ASCOfficeDrawingConverter.cpp | 85 ++++++++++--------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 398ae90a65..fd43c41968 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -5083,13 +5083,13 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils } nullable_string sRid; - XmlMacroReadAttributeBase(oNodeFill, L"r:id", sRid); + XmlMacroReadAttributeBase(oNodeFill, L"r:id", sRid); if (false == sRid.IsInit()) { - XmlMacroReadAttributeBase( oNodeFill, L"relationships:id", sRid ); + XmlMacroReadAttributeBase(oNodeFill, L"relationships:id", sRid); } if (sRid.is_init()) - { + { PPTX::Logic::BlipFill* pBlipFill = NULL; if (pPicture) { @@ -5098,22 +5098,22 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils else { pBlipFill = new PPTX::Logic::BlipFill(); - + pSpPr->Fill.m_type = PPTX::Logic::UniFill::blipFill; pSpPr->Fill.Fill = pBlipFill; } - pBlipFill->m_namespace = L"a"; + pBlipFill->m_namespace = L"a"; pBlipFill->blip = new PPTX::Logic::Blip(); pBlipFill->blip->embed = new OOX::RId(*sRid); - if (oType.is_init() && ((oType->GetValue() == SimpleTypes::filltypeTile) || (oType->GetValue() == SimpleTypes::filltypePattern))) + if (oType.is_init() && ((oType->GetValue() == SimpleTypes::filltypeTile) || (oType->GetValue() == SimpleTypes::filltypePattern))) { - pBlipFill->tile = new PPTX::Logic::Tile(); + pBlipFill->tile = new PPTX::Logic::Tile(); if (oType->GetValue() == SimpleTypes::filltypePattern) - { + { PPTX::Logic::Duotone* pDuotone = new PPTX::Logic::Duotone(); - + PPTX::Logic::UniColor bgClr; ConvertColor(bgClr, sColor2, sOpacity2); pDuotone->Colors.push_back(bgClr); @@ -5129,9 +5129,9 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils } else { - pBlipFill->stretch = new PPTX::Logic::Stretch(); + pBlipFill->stretch = new PPTX::Logic::Stretch(); } - } + } if ((oType.is_init() && (oType->GetValue() == SimpleTypes::filltypeGradient || oType->GetValue() == SimpleTypes::filltypeGradientRadial || @@ -5142,7 +5142,7 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pGradFill->m_namespace = L"a"; pGradFill->rotWithShape = false; - int nAngle = oAngle.is_init() ? (oAngle->GetValue() < - 90 ? oAngle->GetValue() + 180 : oAngle->GetValue() + 90 ) : 90; + int nAngle = oAngle.is_init() ? (oAngle->GetValue() < -90 ? oAngle->GetValue() + 180 : oAngle->GetValue() + 90) : 90; if (sColors.is_init()) { std::vector arSplit; @@ -5185,13 +5185,13 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils ConvertColor(Gs_2.color, sColor2, sOpacity2); double focusPoint = oFocus.IsInit() ? abs(oFocus->GetValue()) : 0; - bool bColorsInvert = ((oFocus.IsInit() && oFocus->GetValue() > 0 && nAngle == 0) || + bool bColorsInvert = ((oFocus.IsInit() && oFocus->GetValue() > 0 && nAngle == 0) || ((oFocus.IsInit() && oFocus->GetValue() < 0) && false == oAngle.is_init())); - + if (focusPoint > 0 && focusPoint < 100) { PPTX::Logic::Gs Gs_3; - + Gs_1.pos = 0; Gs_3.pos = focusPoint * 1000; Gs_2.pos = 100 * 1000; @@ -5240,7 +5240,7 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pGradFill->path->rect.Init(); pGradFill->path->rect->m_name = L"a:fillToRect"; - pGradFill->path->rect->b = XmlUtils::ToString(100 - int( y * 100)) + L"%"; + pGradFill->path->rect->b = XmlUtils::ToString(100 - int(y * 100)) + L"%"; pGradFill->path->rect->r = XmlUtils::ToString(100 - int(x * 100)) + L"%"; pGradFill->path->rect->t = XmlUtils::ToString(int(y * 100)) + L"%"; pGradFill->path->rect->l = XmlUtils::ToString(int(x * 100)) + L"%"; @@ -5270,7 +5270,7 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils } pSpPr->Fill.m_type = PPTX::Logic::UniFill::gradFill; pSpPr->Fill.Fill = pGradFill; - } + } if ((oType.IsInit() && oType->GetValue() == SimpleTypes::filltypePattern) && pSpPr->Fill.m_type != PPTX::Logic::UniFill::blipFill) @@ -5299,9 +5299,9 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pSpPr->Fill.as().blip->Effects.push_back(oEff); } } - if (pPPTShape->m_bIsFilled) + if (pPPTShape->m_bIsFilled || pPPTShape->m_eType == PPTShapes::sptCFrame) { - XmlUtils::CXmlNode oNodeFillID = oNode.ReadNode(L"v:imagedata"); + XmlUtils::CXmlNode oNodeFillID = oNode.ReadNode(L"v:imagedata"); if (oNodeFillID.IsValid()) { @@ -5320,21 +5320,21 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils XmlMacroReadAttributeBase(oNodeFillID, L"o:title", sTitle); nullable_string sRid; - XmlMacroReadAttributeBase(oNodeFillID, L"r:id", sRid); - + XmlMacroReadAttributeBase(oNodeFillID, L"r:id", sRid); + nullable_string sRelid; - XmlMacroReadAttributeBase(oNodeFillID, L"o:relid", sRelid); + XmlMacroReadAttributeBase(oNodeFillID, L"o:relid", sRelid); nullable_string sPictId; - XmlMacroReadAttributeBase(oNodeFillID, L"r:pict", sPictId); + XmlMacroReadAttributeBase(oNodeFillID, L"r:pict", sPictId); if (sRid.is_init() || sRelid.is_init() || sPictId.is_init() || oElem->m_binaryData.IsInit() || sTitle.IsInit()) - { + { nullable_string sType; - XmlMacroReadAttributeBase(oNodeFillID, L"type", sType); + XmlMacroReadAttributeBase(oNodeFillID, L"type", sType); PPTX::Logic::BlipFill* pBlipFill = NULL; - + if (pPicture) { pPicture->nvPicPr.cNvPr.descr = sTitle; @@ -5344,11 +5344,11 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils else { pBlipFill = new PPTX::Logic::BlipFill(); - + pSpPr->Fill.m_type = PPTX::Logic::UniFill::blipFill; pSpPr->Fill.Fill = pBlipFill; } - pBlipFill->m_namespace = L"a"; + pBlipFill->m_namespace = L"a"; pBlipFill->blip = new PPTX::Logic::Blip(); @@ -5357,52 +5357,53 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pBlipFill->blip->dataFilepathImageA = "data:base64," + *oElem->m_binaryData->m_sData; } else - { + { std::wstring sId = sRid.IsInit() ? *sRid : (sRelid.IsInit() ? *sRelid : (sPictId.IsInit() ? *sPictId : L"")); pBlipFill->blip->embed = new OOX::RId(sId); } - if (sType.is_init() && *sType == L"tile") + if (sType.is_init() && *sType == L"tile") { - pBlipFill->tile = new PPTX::Logic::Tile(); - }else + pBlipFill->tile = new PPTX::Logic::Tile(); + } + else { //stretch ??? bug 28238 pBlipFill->stretch.Init(); pBlipFill->stretch->fillRect.Init(); } - std::wstring strCropT = oNodeFillID.GetAttribute(L"croptop"); - std::wstring strCropL = oNodeFillID.GetAttribute(L"cropleft"); - std::wstring strCropR = oNodeFillID.GetAttribute(L"cropright"); - std::wstring strCropB = oNodeFillID.GetAttribute(L"cropbottom"); + std::wstring strCropT = oNodeFillID.GetAttribute(L"croptop"); + std::wstring strCropL = oNodeFillID.GetAttribute(L"cropleft"); + std::wstring strCropR = oNodeFillID.GetAttribute(L"cropright"); + std::wstring strCropB = oNodeFillID.GetAttribute(L"cropbottom"); NS_DWC_Common::CorrentCropString(strCropL); NS_DWC_Common::CorrentCropString(strCropT); NS_DWC_Common::CorrentCropString(strCropR); NS_DWC_Common::CorrentCropString(strCropB); - if (L"" != strCropL || L"" != strCropT || L"" != strCropR || L"" != strCropB) + if (L"" != strCropL || L"" != strCropT || L"" != strCropR || L"" != strCropB) { pBlipFill->srcRect = new PPTX::Logic::Rect(); - std::wstring str0 = L"0"; - if (L"" != strCropL) + std::wstring str0 = L"0"; + if (L"" != strCropL) pBlipFill->srcRect->l = strCropL; else pBlipFill->srcRect->l = str0; - if (L"" != strCropT) + if (L"" != strCropT) pBlipFill->srcRect->t = strCropT; else pBlipFill->srcRect->t = str0; - if (L"" != strCropR) + if (L"" != strCropR) pBlipFill->srcRect->r = strCropR; else pBlipFill->srcRect->r = str0; - if (L"" != strCropB) + if (L"" != strCropB) pBlipFill->srcRect->b = strCropB; else pBlipFill->srcRect->b = str0; From f5f0630b2d2112266020a9965c76db5108e7996e Mon Sep 17 00:00:00 2001 From: Green Date: Mon, 16 Sep 2024 21:52:37 +0300 Subject: [PATCH 57/82] Redesigned the drawing of markers in svg conversion --- .../3dParty/html/css/src/StyleProperties.cpp | 10 ++ Common/3dParty/html/css/src/StyleProperties.h | 4 +- .../Metafile/svg/SvgObjects/CCircle.cpp | 10 +- .../raster/Metafile/svg/SvgObjects/CCircle.h | 4 +- .../Metafile/svg/SvgObjects/CContainer.cpp | 6 +- .../Metafile/svg/SvgObjects/CContainer.h | 2 +- .../Metafile/svg/SvgObjects/CEllipse.cpp | 10 +- .../raster/Metafile/svg/SvgObjects/CEllipse.h | 4 +- .../raster/Metafile/svg/SvgObjects/CFont.cpp | 6 +- .../raster/Metafile/svg/SvgObjects/CFont.h | 2 +- .../raster/Metafile/svg/SvgObjects/CImage.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CImage.h | 2 +- .../raster/Metafile/svg/SvgObjects/CLine.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CLine.h | 2 +- .../Metafile/svg/SvgObjects/CMarker.cpp | 102 +++--------------- .../raster/Metafile/svg/SvgObjects/CMarker.h | 6 +- .../Metafile/svg/SvgObjects/CObjectBase.cpp | 28 +++-- .../Metafile/svg/SvgObjects/CObjectBase.h | 13 ++- .../raster/Metafile/svg/SvgObjects/CPath.cpp | 70 ++++++++---- .../raster/Metafile/svg/SvgObjects/CPath.h | 8 +- .../raster/Metafile/svg/SvgObjects/CRect.cpp | 10 +- .../raster/Metafile/svg/SvgObjects/CRect.h | 4 +- .../Metafile/svg/SvgObjects/CSwitch.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CSwitch.h | 2 +- .../Metafile/svg/SvgObjects/CSymbol.cpp | 4 +- .../raster/Metafile/svg/SvgObjects/CSymbol.h | 2 +- .../raster/Metafile/svg/SvgObjects/CText.cpp | 30 +++--- .../raster/Metafile/svg/SvgObjects/CText.h | 12 +-- .../raster/Metafile/svg/SvgObjects/CUse.cpp | 6 +- .../raster/Metafile/svg/SvgObjects/CUse.h | 2 +- 30 files changed, 173 insertions(+), 200 deletions(-) diff --git a/Common/3dParty/html/css/src/StyleProperties.cpp b/Common/3dParty/html/css/src/StyleProperties.cpp index 52fb291a10..fcfc62b0e3 100644 --- a/Common/3dParty/html/css/src/StyleProperties.cpp +++ b/Common/3dParty/html/css/src/StyleProperties.cpp @@ -702,6 +702,16 @@ namespace NSCSS SetNone(); bResult = true; } + else if (L"context-stroke" == wsNewValue) + { + Clear(); + m_enType = ColorContextStroke; + } + else if (L"context-fill" == wsNewValue) + { + Clear(); + m_enType = ColorContextFill; + } else if (10 <= wsNewValue.length() && wsNewValue.substr(0, 3) == L"rgb") { size_t unEnd = wsNewValue.find(L')', 4); diff --git a/Common/3dParty/html/css/src/StyleProperties.h b/Common/3dParty/html/css/src/StyleProperties.h index b8a9e20d0a..91a9afb2f9 100644 --- a/Common/3dParty/html/css/src/StyleProperties.h +++ b/Common/3dParty/html/css/src/StyleProperties.h @@ -215,7 +215,9 @@ namespace NSCSS ColorNone, ColorRGB, ColorHEX, - ColorUrl + ColorUrl, + ColorContextStroke, + ColorContextFill } ColorType; class CColor : public CValue diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp index 04aafda835..fdc7f15b45 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.cpp @@ -21,7 +21,7 @@ namespace SVG SetFill(mAttributes, ushLevel, bHardMode); } - bool CCircle::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CCircle::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { Aggplus::CMatrix oOldTransform; @@ -37,17 +37,17 @@ namespace SVG pRenderer->PathCommandMoveTo(dX + dR, dY); pRenderer->PathCommandArcTo(dX - dR, dY - dR, dR * 2.0, dR * 2.0, 0, 360); - EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject); return true; } - void CCircle::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CCircle::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const { - if (ApplyStroke(pRenderer, &pStyles->m_oStroke)) + if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject)) nTypePath += c_nStroke; - if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true)) + if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject)) nTypePath += c_nWindingFillMode; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h index 5f4c2f8518..68fc95b9a4 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CCircle.h @@ -12,9 +12,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp index e029f8265c..f6126cd9c0 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp @@ -51,7 +51,7 @@ namespace SVG : CRenderedObject(oNode, pParent), m_oWindow{0, 0, dWidth, dHeight} {} - bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CGraphicsContainer::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { Aggplus::CMatrix oOldTransform; @@ -59,9 +59,9 @@ namespace SVG return false; for (const CRenderedObject* pObject : m_arObjects) - pObject->Draw(pRenderer, pFile, oMode, pOtherStyles); + pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); - EndPath(pRenderer, pFile, oOldTransform, CommandeModeDraw, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, CommandeModeDraw, pOtherStyles, pContexObject); return true; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h index 3097507504..b1aed73810 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.h @@ -88,7 +88,7 @@ namespace SVG void SetData(XmlUtils::CXmlNode& oNode); - bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; TRect GetWindow() const; TRect GetViewBox() const; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp index 992e669a9d..ec40479098 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.cpp @@ -22,7 +22,7 @@ namespace SVG SetFill(mAttributes, ushLevel, bHardMode); } - bool CEllipse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CEllipse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { Aggplus::CMatrix oOldTransform; @@ -42,17 +42,17 @@ namespace SVG pRenderer->PathCommandMoveTo(dX + dRx, dY); pRenderer->PathCommandArcTo(dX - dRx, dY - dRy, dRx * 2.0, dRy * 2.0, 0, 360); - EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject); return true; } - void CEllipse::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CEllipse::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const { - if (ApplyStroke(pRenderer, &pStyles->m_oStroke)) + if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject)) nTypePath += c_nStroke; - if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true)) + if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject)) nTypePath += c_nWindingFillMode; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h index 86f543fee8..a6f01a97cd 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CEllipse.h @@ -13,9 +13,9 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp index 276a106b15..2b9b20ff2b 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.cpp @@ -52,7 +52,7 @@ namespace SVG return false; } - bool CFont::Draw(const std::wstring &wsText, double dX, double dY, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles) const + bool CFont::Draw(const std::wstring &wsText, double dX, double dY, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer) return false; @@ -78,12 +78,12 @@ namespace SVG if (NULL == m_pMissingGlyph) continue; - m_pMissingGlyph->Draw(pRenderer, pFile, oMode, pStyles); + m_pMissingGlyph->Draw(pRenderer, pFile, oMode, pStyles, pContexObject); oMatrix.Translate(m_oHorizAdvX.ToDouble(NSCSS::Pixel), 0); } else { - itFound->second->Draw(pRenderer, pFile, oMode, pStyles); + itFound->second->Draw(pRenderer, pFile, oMode, pStyles, pContexObject); if (!itFound->second->m_oHorizAdvX.Empty()) oMatrix.Translate(itFound->second->m_oHorizAdvX.ToDouble(NSCSS::Pixel), 0); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h index bb1b1627ad..397c319aa1 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CFont.h @@ -43,7 +43,7 @@ namespace SVG void SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) override; bool Apply(IRenderer* pRenderer, const CSvgFile *pFile, const TBounds &oObjectBounds) override; - bool Draw(const std::wstring& wsText, double dX, double dY, IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL) const; + bool Draw(const std::wstring& wsText, double dX, double dY, IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContexObject = NULL) const; private: void ParseGlyphs(XmlUtils::CXmlNode& oNode); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp index 465c40afdf..3c9908fc8f 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.cpp @@ -19,7 +19,7 @@ namespace SVG m_wsHref = oNode.GetAttribute(L"href", oNode.GetAttribute(L"xlink:href")); // TODO:: В дальнейшем возможно стоит реализовать отдельный класс CHref для всех типов ссылок } - bool CImage::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CImage::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { Aggplus::CMatrix oOldTransform; @@ -114,7 +114,7 @@ namespace SVG pRenderer->PathCommandClose(); } - EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject); delete[] pBuffer; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h index ab37eef19f..389ee46d0f 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CImage.h @@ -10,7 +10,7 @@ namespace SVG public: CImage(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL); - bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; private: TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp index e75d1d1396..c25329ede4 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.cpp @@ -27,9 +27,9 @@ namespace SVG SetMarker(mAttributes, ushLevel, bHardMode); } - void CLine::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CLine::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const { - if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true)) + if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true, pContexObject)) nTypePath += c_nStroke; } } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h index eb511e771e..a7b6678cd7 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CLine.h @@ -12,7 +12,7 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; private: - void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp index 548aa4a636..ded6a0c9a5 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp @@ -6,7 +6,7 @@ namespace SVG { CMarker::CMarker(XmlUtils::CXmlNode &oNode) - : CObject(oNode), m_oBounds{0., 0., 0., 0.}, m_pImage(NULL) + : CObject(oNode), m_oBounds{0., 0., 0., 0.} { m_oWindow.m_oX .SetValue(oNode.GetAttribute(L"refX")); m_oWindow.m_oY .SetValue(oNode.GetAttribute(L"refY")); @@ -30,16 +30,6 @@ namespace SVG } } -// if (m_oWindow.m_oWidth.Empty() && !m_oViewBox.m_oWidth.Empty()) -// m_oWindow.m_oWidth = m_oViewBox.m_oWidth; -// else if (!m_oWindow.m_oWidth.Empty() && m_oViewBox.m_oWidth.Empty()) -// m_oViewBox.m_oWidth = m_oWindow.m_oWidth; - -// if (m_oWindow.m_oHeight.Empty() && !m_oViewBox.m_oHeight.Empty()) -// m_oWindow.m_oHeight = m_oViewBox.m_oHeight; -// else if (!m_oWindow.m_oHeight.Empty() && m_oViewBox.m_oHeight.Empty()) -// m_oViewBox.m_oHeight = m_oWindow.m_oHeight; - const std::wstring& wsUnits = oNode.GetAttribute(L"markerUnits"); if (L"userSpaceOnUse" == wsUnits) @@ -50,8 +40,6 @@ namespace SVG CMarker::~CMarker() { - if (NULL != m_pImage) - delete m_pImage; } ObjectType CMarker::GetType() const @@ -62,89 +50,33 @@ namespace SVG void CMarker::SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) {} - void CMarker::Update(const CSvgFile *pFile) + void CMarker::Draw(IRenderer *pRenderer, const CSvgFile* pFile, const std::vector &arPoints, double dStrokeWidth, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const { - if (NULL != m_pImage || (!m_oWindow.m_oWidth.Empty() && m_oWindow.m_oWidth.Zero()) || (!m_oWindow.m_oHeight.Empty() && m_oWindow.m_oHeight.Zero()) || - (!m_oViewBox.m_oWidth.Empty() && m_oViewBox.m_oWidth.Zero()) || (!m_oViewBox.m_oHeight.Empty() && m_oViewBox.m_oHeight.Zero())) + if (arPoints.empty() || Equals(0., dStrokeWidth) || m_arObjects.empty()) return; - TBounds oTempBounds; + const double dMaxScale = ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.) * std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); - for (const CRenderedObject* pObject : m_arObjects) - { - oTempBounds = pObject->GetBounds(); - m_oBounds.m_dLeft = std::min(m_oBounds.m_dLeft, oTempBounds.m_dLeft); - m_oBounds.m_dTop = std::min(m_oBounds.m_dTop, oTempBounds.m_dTop); - m_oBounds.m_dRight = std::max(m_oBounds.m_dRight, oTempBounds.m_dRight); - m_oBounds.m_dBottom = std::max(m_oBounds.m_dBottom, oTempBounds.m_dBottom); - } + double dM11, dM12, dM21, dM22, dDx, dDy; + pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy); - NSGraphics::IGraphicsRenderer* pGrRenderer = NSGraphics::Create(); + Aggplus::CMatrix oTransform(dM11, dM12, dM21, dM22, dDx, dDy); - const double dMaxScale = std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); - const double dMMtoPx = 96. / 25.4; - const double dWidth = std::max(std::abs(m_oBounds.m_dRight - m_oBounds.m_dLeft), std::abs(m_oBounds.m_dBottom - m_oBounds.m_dTop)) * dMaxScale; - const int nWidth = dWidth * dMMtoPx; + const double dSkipX = m_oWindow.m_oX.ToDouble(NSCSS::Pixel) * dMaxScale; + const double dSkipY = m_oWindow.m_oY.ToDouble(NSCSS::Pixel) * dMaxScale; - if (0 == nWidth) - return; - - BYTE* pBgraData = new(std::nothrow) BYTE[nWidth * nWidth * 4]; - - if (!pBgraData) - return; - - unsigned int alfa = 0xffffff; - //дефолтный тон должен быть прозрачным, а не белым - //memset(pBgraData, 0xff, nWidth * nHeight * 4); - for (int i = 0; i < nWidth * nWidth; i++) - ((unsigned int*)pBgraData)[i] = alfa; - - CBgraFrame oFrame; - oFrame.put_Data(pBgraData); - oFrame.put_Width(nWidth); - oFrame.put_Height(nWidth); - oFrame.put_Stride(-4 * nWidth); - - pGrRenderer->CreateFromBgraFrame(&oFrame); - pGrRenderer->put_Width (dWidth); - pGrRenderer->put_Height(dWidth); - - pGrRenderer->SetTransform(dMaxScale, 0, 0, dMaxScale, 0, 0); - pGrRenderer->SetCoordTransformOffset(-((m_oBounds.m_dLeft) * dMaxScale * dMMtoPx), -(m_oBounds.m_dTop * dMaxScale * dMMtoPx)); - - pGrRenderer->SetSwapRGB(false); - pGrRenderer->BeginCommand(c_nImageType); - - for (const CRenderedObject* pObject : m_arObjects) - pObject->Draw(pGrRenderer, pFile); - - pGrRenderer->EndCommand(c_nImageType); - RELEASEINTERFACE(pGrRenderer); - - oFrame.put_Data(NULL); - - m_pImage = new Aggplus::CImage; - m_pImage->Create(pBgraData, oFrame.get_Width(), oFrame.get_Height(), oFrame.get_Stride()); - } - - void CMarker::Draw(IRenderer *pRenderer, const std::vector &arPoints, double dStrokeWidth) const - { - if (NULL == m_pImage || arPoints.empty() || Equals(0., dStrokeWidth)) - return; - - const double dMaxScale = std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); - const double dWidth = std::max(std::abs(m_oBounds.m_dRight - m_oBounds.m_dLeft), std::abs(m_oBounds.m_dBottom - m_oBounds.m_dTop)) * ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.) * dMaxScale; - - const double dSkipX = m_oBounds.m_dLeft * dStrokeWidth * dMaxScale; - const double dSkipY = m_oBounds.m_dTop * dStrokeWidth * dMaxScale; + oTransform.Translate(-dSkipX, -dSkipY); for (Point oPoint : arPoints) { - oPoint.dX += dSkipX; - oPoint.dY += dSkipY; + oTransform.TransformPoint(oPoint.dX, oPoint.dY); - pRenderer->DrawImage((IGrObject*)m_pImage, oPoint.dX, oPoint.dY, dWidth, dWidth); + pRenderer->SetTransform(dM11 * dMaxScale, dM12, dM21, dM22 * dMaxScale, oPoint.dX, oPoint.dY); + + for (const CRenderedObject* pObject : m_arObjects) + pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); } + + pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy); } } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h index 45a1a28671..1e8c7ab782 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h @@ -21,9 +21,7 @@ namespace SVG void SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) override; - void Update(const CSvgFile *pFile); - - void Draw(IRenderer* pRenderer, const std::vector& arPoints, double dStrokeWidth) const; + void Draw(IRenderer* pRenderer, const CSvgFile *pFile, const std::vector& arPoints, double dStrokeWidth, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const; private: MarkerUnits m_enUnits; @@ -31,8 +29,6 @@ namespace SVG TRect m_oViewBox; TBounds m_oBounds; - - Aggplus::CImage *m_pImage; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp index e98fec10ae..651b3f9e67 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp @@ -139,7 +139,7 @@ namespace SVG return ApplyDef(pRenderer, pFile, pMask->ToWString(), oBounds); } - + bool CObject::ApplyDef(IRenderer *pRenderer, const CSvgFile *pFile, const std::wstring &wsUrl, const TBounds &oBounds) const { if (NULL == pRenderer || NULL == pFile || wsUrl.empty()) @@ -238,7 +238,7 @@ namespace SVG m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineJoinMiter; m_oStyles.m_oStroke.m_oMiterlimit = 4.; - + m_oTransformation.m_oOpacity = 1.; m_oTransformation.m_bDraw = true; } @@ -304,7 +304,7 @@ namespace SVG return true; } - void CRenderedObject::EndPath(IRenderer *pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode, const TSvgStyles* pOtherStyles) const + void CRenderedObject::EndPath(IRenderer *pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContextObject) const { if (CommandeModeClip == oMode) { @@ -320,12 +320,12 @@ namespace SVG int nPathType = 0; if (NULL == pOtherStyles) - ApplyStyle(pRenderer, &m_oStyles, pFile, nPathType); + ApplyStyle(pRenderer, &m_oStyles, pFile, nPathType, pContextObject); else { TSvgStyles oNewStyles(m_oStyles); oNewStyles += *pOtherStyles; - ApplyStyle(pRenderer, &oNewStyles, pFile, nPathType); + ApplyStyle(pRenderer, &oNewStyles, pFile, nPathType, pContextObject); } pRenderer->DrawPath(nPathType); @@ -352,10 +352,10 @@ namespace SVG oOldTransform.tx(), oOldTransform.ty()); } - void CRenderedObject::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CRenderedObject::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContextObject) const {} - bool CRenderedObject::ApplyStroke(IRenderer *pRenderer, const TStroke *pStroke, bool bUseDefault) const + bool CRenderedObject::ApplyStroke(IRenderer *pRenderer, const TStroke *pStroke, bool bUseDefault, const CRenderedObject* pContextObject) const { if (NULL == pRenderer || NULL == pStroke || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType() || (!bUseDefault && ((pStroke->m_oWidth.Empty() || pStroke->m_oWidth.Zero()) && pStroke->m_oColor.Empty()))) { @@ -368,10 +368,14 @@ namespace SVG if (Equals(0., dStrokeWidth)) dStrokeWidth = 1.; - int nColor = (pStroke->m_oColor.Empty() || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType()) ? 0 : pStroke->m_oColor.ToInt(); + if (NSCSS::NSProperties::ColorType::ColorContextFill == pStroke->m_oColor.GetType() && NULL != pContextObject) + pRenderer->put_PenColor(pContextObject->m_oStyles.m_oFill.ToInt()); + else if (NSCSS::NSProperties::ColorType::ColorContextStroke == pStroke->m_oColor.GetType() && NULL != pContextObject) + pRenderer->put_PenColor(pContextObject->m_oStyles.m_oStroke.m_oColor.ToInt()); + else + pRenderer->put_PenColor((pStroke->m_oColor.Empty() || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType()) ? 0 : pStroke->m_oColor.ToInt()); pRenderer->put_PenSize(dStrokeWidth); - pRenderer->put_PenColor(nColor); pRenderer->put_PenAlpha(255. * pStroke->m_oColor.GetOpacity()); if (!pStroke->m_arDash.empty()) @@ -394,7 +398,7 @@ namespace SVG return true; } - bool CRenderedObject::ApplyFill(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pFill, const CSvgFile *pFile, bool bUseDefault) const + bool CRenderedObject::ApplyFill(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pFill, const CSvgFile *pFile, bool bUseDefault, const CRenderedObject* pContextObject) const { if (NULL == pRenderer || NULL == pFill || NSCSS::NSProperties::ColorType::ColorNone == pFill->GetType() || (!bUseDefault && pFill->Empty())) { @@ -420,6 +424,10 @@ namespace SVG return false; } } + else if (NSCSS::NSProperties::ColorType::ColorContextFill == pFill->GetType() && NULL != pContextObject) + pRenderer->put_BrushColor1(pContextObject->m_oStyles.m_oFill.ToInt()); + else if (NSCSS::NSProperties::ColorType::ColorContextStroke == pFill->GetType() && NULL != pContextObject) + pRenderer->put_BrushColor1(pContextObject->m_oStyles.m_oStroke.m_oColor.ToInt()); else if (bUseDefault) { pRenderer->put_BrushColor1(0); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h index 7b6d3c6d57..a31aafbaf4 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.h @@ -54,10 +54,9 @@ namespace SVG void SetMask(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false); void SetDisplay(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false); void SetOpacity(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false); - + std::wstring GetId() const; virtual std::vector GetFullPath() const; - private: bool ApplyTransform(IRenderer* pRenderer, const SvgTransform* pTransform, Aggplus::CMatrix& oOldMatrix) const; bool ApplyClip(IRenderer* pRenderer, const TClip* pClip, const CSvgFile *pFile, const TBounds& oBounds) const; @@ -107,7 +106,7 @@ namespace SVG virtual void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - virtual bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL) const = 0; + virtual bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContextObject = NULL) const = 0; virtual TBounds GetBounds() const = 0; @@ -119,12 +118,12 @@ namespace SVG void SetFill(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false); bool StartPath(IRenderer* pRenderer, const CSvgFile *pFile, Aggplus::CMatrix& oOldTransform, CommandeMode oMode = CommandeModeDraw) const; - void EndPath(IRenderer* pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const; + void EndPath(IRenderer* pRenderer, const CSvgFile *pFile, const Aggplus::CMatrix& oOldTransform, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContextObject = NULL) const; - virtual void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const; + virtual void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContextObject = NULL) const; - bool ApplyStroke(IRenderer* pRenderer, const TStroke* pStroke, bool bUseDefault = false) const; - bool ApplyFill(IRenderer* pRenderer, const SvgColor* pFill, const CSvgFile *pFile, bool bUseDefault = false) const; + bool ApplyStroke(IRenderer* pRenderer, const TStroke* pStroke, bool bUseDefault = false, const CRenderedObject* pContextObject = NULL) const; + bool ApplyFill(IRenderer* pRenderer, const SvgColor* pFill, const CSvgFile *pFile, bool bUseDefault = false, const CRenderedObject* pContextObject = NULL) const; bool ApplyOpacity(IRenderer* pRenderer, const SvgDigit* pOpacity) const; friend class CUse; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp index 429ceba098..8c9bbdb845 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp @@ -306,7 +306,7 @@ namespace SVG else { dEndAngle = copysign(ceil(std::abs(dStartAngle) / 90.), dStartAngle) * ((dSweep > 0. || dStartAngle < 0.) ? 90. : -90.); - + if (dStartAngle < 0. && dSweep > 0.) dEndAngle += 90.; } @@ -358,8 +358,8 @@ namespace SVG return; pRenderer->PathCommandCurveTo(m_arPoints[0].dX, m_arPoints[0].dY, - m_arPoints[1].dX, m_arPoints[1].dY, - m_arPoints[2].dX, m_arPoints[2].dY); + m_arPoints[1].dX, m_arPoints[1].dY, + m_arPoints[2].dX, m_arPoints[2].dY); } inline double ClampSinCos(const double& d) @@ -469,7 +469,7 @@ namespace SVG } } - bool CPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { Aggplus::CMatrix oOldTransform; @@ -479,7 +479,7 @@ namespace SVG for (const IPathElement* oElement : m_arElements) oElement->Draw(pRenderer); - EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject); DrawMarkers(pRenderer, pFile, oMode); @@ -494,16 +494,16 @@ namespace SVG return m_arElements[(nIndex >= 0) ? nIndex : m_arElements.size() + nIndex]; } - void CPath::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CPath::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const { - if (ApplyStroke(pRenderer, &pStyles->m_oStroke)) + if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject)) nTypePath += c_nStroke; - if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true)) + if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject)) nTypePath += (m_bEvenOddRule) ? c_nEvenOddFillMode : c_nWindingFillMode; } - bool CPath::DrawMarkers(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode) const + bool CPath::DrawMarkers(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer || NULL == pFile || m_arElements.empty() || m_oStyles.m_oStroke.m_oWidth.Zero() || (m_oMarkers.m_oStart.Empty() && m_oMarkers.m_oMid.Empty() && m_oMarkers.m_oEnd.Empty())) @@ -522,8 +522,9 @@ namespace SVG if (NULL != pStartMarker) { - pStartMarker->Update(pFile); - pStartMarker->Draw(pRenderer, {(*m_arElements.front())[0]}, dStrokeWidth); + const IPathElement* pFirstElement{FindFirstNotEmpty()}; + if (NULL != pFirstElement) + pStartMarker->Draw(pRenderer, pFile, {(*pFirstElement)[0]}, dStrokeWidth, oMode, pOtherStyles, this); } } @@ -534,27 +535,25 @@ namespace SVG std::vector arPoints(m_arElements.size() - 2); for (unsigned int unIndex = 1; unIndex < m_arElements.size() - 1; ++unIndex) - arPoints[unIndex - 1] = (*m_arElements[unIndex])[-1]; + { + if (EPathElement::Close != m_arElements[unIndex]->GetType()) + arPoints[unIndex - 1] = (*m_arElements[unIndex])[-1]; + } if (NULL != pMidMarker) - { - pMidMarker->Update(pFile); - pMidMarker->Draw(pRenderer, arPoints, dStrokeWidth); - } + pMidMarker->Draw(pRenderer, pFile, arPoints, dStrokeWidth, oMode, pOtherStyles, this); } if (!m_oMarkers.m_oEnd.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oEnd.GetType()) { CMarker *pEndMarker = dynamic_cast(pFile->GetMarkedObject(m_oMarkers.m_oEnd.ToWString())); - if (NULL != pEndMarker) - { - pEndMarker->Update(pFile); - pEndMarker->Draw(pRenderer, {(*m_arElements.back())[-1]}, dStrokeWidth); - } + const IPathElement* pLastElement{FindFirstNotEmpty(true)}; + if (NULL != pLastElement) + pEndMarker->Draw(pRenderer, pFile, {(*pLastElement)[-1]}, dStrokeWidth, oMode, pOtherStyles, this); } - EndPath(pRenderer, pFile, oOldMatrix, oMode); + EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject); return true; } @@ -569,6 +568,13 @@ namespace SVG if (mAttributes.end() != mAttributes.find(L"marker-end")) m_oMarkers.m_oEnd.SetValue(mAttributes.at(L"marker-end"), ushLevel, bHardMode); + + if (mAttributes.end() != mAttributes.find(L"marker")) + { + m_oMarkers.m_oStart.SetValue(mAttributes.at(L"marker"), ushLevel, bHardMode); + m_oMarkers.m_oMid .SetValue(mAttributes.at(L"marker"), ushLevel, bHardMode); + m_oMarkers.m_oEnd .SetValue(mAttributes.at(L"marker"), ushLevel, bHardMode); + } } TBounds CPath::GetBounds() const @@ -588,6 +594,24 @@ namespace SVG return oBounds; } + const IPathElement* CPath::FindFirstNotEmpty(bool bReverseSearch) const + { + if (!bReverseSearch) + { + std::vector::const_iterator itFound = std::find_if(m_arElements.cbegin(), m_arElements.cend(), [](const IPathElement* pElement){ return EPathElement::Close != pElement->GetType(); }); + if (m_arElements.cend() != itFound) + return *itFound; + } + else + { + std::vector::const_reverse_iterator itFound = std::find_if(m_arElements.crbegin(), m_arElements.crend(), [](const IPathElement* pElement){ return EPathElement::Close != pElement->GetType(); }); + if (m_arElements.crend() != itFound) + return *itFound; + } + + return NULL; + } + void CPath::ReadFromString(const std::wstring &wsValue) { CMoveElement *pMoveElement = NULL; @@ -608,7 +632,7 @@ namespace SVG } oSecondPos = std::find_if(oFirstPos + 1, wsValue.end(), [](wchar_t wChar){return ISPATHCOMMAND(wChar);}); - + std::vector arValues = StrUtils::ReadDoubleValues(oFirstPos, oSecondPos); switch(*oFirstPos) diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h index 4e66f9425f..16939e0c3a 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h @@ -110,17 +110,19 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; IPathElement* operator[](int nIndex) const; private: - void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath) const override; - bool DrawMarkers(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw) const; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile *pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override; + bool DrawMarkers(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const; void SetMarker(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode); TBounds GetBounds() const override; + const IPathElement* FindFirstNotEmpty(bool bReverseSearch = false) const; + void ReadFromString(const std::wstring& wsValue); bool AddElement(IPathElement* pElement); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp index 084c69b58e..1c95355c23 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.cpp @@ -33,7 +33,7 @@ namespace SVG SetFill(mAttributes, ushLevel, bHardMode); } - bool CRect::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CRect::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { Aggplus::CMatrix oOldTransform; @@ -80,17 +80,17 @@ namespace SVG pRenderer->PathCommandClose(); } - EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldTransform, oMode, pOtherStyles, pContexObject); return true; } - void CRect::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CRect::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const { - if (ApplyStroke(pRenderer, &pStyles->m_oStroke)) + if (ApplyStroke(pRenderer, &pStyles->m_oStroke, false, pContexObject)) nTypePath += c_nStroke; - if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true)) + if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject)) nTypePath += c_nWindingFillMode; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h index 2be5e03655..525c62ce6a 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CRect.h @@ -14,10 +14,10 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; private: - void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override; TBounds GetBounds() const override; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp index 51e3c868cd..58c0b59223 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.cpp @@ -7,11 +7,11 @@ namespace SVG { } - bool CSwitch::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles) const + bool CSwitch::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pStyles, const CRenderedObject* pContexObject) const { for (const CRenderedObject* pObject : m_arObjects) { - if (NULL != pObject && pObject->Draw(pRenderer, pFile, oMode, pStyles)) + if (NULL != pObject && pObject->Draw(pRenderer, pFile, oMode, pStyles, pContexObject)) return true; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h index ddde16083d..d15cf21732 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSwitch.h @@ -10,7 +10,7 @@ namespace SVG public: CSwitch(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL); - bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile *pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; TBounds GetBounds() const override; }; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp index c030c3aa4c..2bc5a07ce4 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.cpp @@ -6,7 +6,7 @@ namespace SVG : CGraphicsContainer(oNode) {} - bool CSymbol::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CSymbol::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer) return false; @@ -31,7 +31,7 @@ namespace SVG pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty()); - CGraphicsContainer::Draw(pRenderer, pFile, oMode, pOtherStyles); + CGraphicsContainer::Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h index 7efe2b10fe..7ba0c3a8b1 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CSymbol.h @@ -11,7 +11,7 @@ namespace SVG public: CSymbol(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager *pFontManager = NULL); - bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp index 7bc95654f9..ac93bd0e6c 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.cpp @@ -144,7 +144,7 @@ namespace SVG } } - bool CTSpan::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CTSpan::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer || (m_wsText.empty() && m_arObjects.empty())) return false; @@ -166,10 +166,10 @@ namespace SVG } for (const CTSpan* pTSpan : m_arObjects) - pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles); + pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); } - EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject); return true; } @@ -195,12 +195,12 @@ namespace SVG } } - void CTSpan::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath) const + void CTSpan::ApplyStyle(IRenderer *pRenderer, const TSvgStyles *pStyles, const CSvgFile *pFile, int &nTypePath, const CRenderedObject* pContexObject) const { - if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true)) + if (ApplyStroke(pRenderer, &pStyles->m_oStroke, true, pContexObject)) nTypePath += c_nStroke; - if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true)) + if (ApplyFill(pRenderer, &pStyles->m_oFill, pFile, true, pContexObject)) nTypePath += c_nWindingFillMode; } @@ -303,7 +303,7 @@ namespace SVG pRenderer->put_BrushAlpha1(255); } - bool CTSpan::UseExternalFont(const CSvgFile *pFile, double dX, double dY, IRenderer *pRenderer, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CTSpan::UseExternalFont(const CSvgFile *pFile, double dX, double dY, IRenderer *pRenderer, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { std::wstring wsFontFamily = DefaultFontFamily; @@ -318,7 +318,7 @@ namespace SVG if (NULL == pFont) return false; - pFont->Draw(m_wsText, dX, dY, pRenderer, pFile, oMode, pOtherStyles); + pFont->Draw(m_wsText, dX, dY, pRenderer, pFile, oMode, pOtherStyles, pContexObject); return true; } @@ -496,12 +496,12 @@ namespace SVG return new CText(oNode, pParent, pFontManager); } - bool CText::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CText::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer || NULL == pRenderer) return false; - CTSpan::Draw(pRenderer, pFile, oMode, pOtherStyles); + CTSpan::Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); return true; } @@ -529,7 +529,7 @@ namespace SVG } } - bool CTextPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles) const + bool CTextPath::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles *pOtherStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer || CommandeModeClip == oMode || NULL == m_pPath) return false; @@ -539,7 +539,7 @@ namespace SVG oMovingPath.Move(m_oX.ToDouble(NSCSS::Pixel)); for (CTSpan& oTSpan : Split()) - DrawGlyph(&oTSpan, oMovingPath, pRenderer, pFile, oMode); + DrawGlyph(&oTSpan, oMovingPath, pRenderer, pFile, oMode, pContexObject); for (const CTSpan* pTSpan : m_arObjects) { @@ -549,7 +549,7 @@ namespace SVG oMovingPath.Move(pTSpan->m_oX.ToDouble(NSCSS::Pixel)); } for (CTSpan& oGlyphs : pTSpan->Split()) - DrawGlyph(&oGlyphs, oMovingPath, pRenderer, pFile, oMode); + DrawGlyph(&oGlyphs, oMovingPath, pRenderer, pFile, oMode, pContexObject); } return true; @@ -566,7 +566,7 @@ namespace SVG return new CTextPath(oNode, pTSpan, pFontManager, pFile); } - void CTextPath::DrawGlyph(CTSpan* pTSpan, CMovingPath &oMovingPath, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode) const + void CTextPath::DrawGlyph(CTSpan* pTSpan, CMovingPath &oMovingPath, IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const CRenderedObject* pContexObject) const { if (NULL == pTSpan) return; @@ -583,7 +583,7 @@ namespace SVG pTSpan->SetPosition(oPoint); pTSpan->SetTransform({std::make_pair(L"transform", L"rotate(" + std::to_wstring(dAngle) + L',' + std::to_wstring(oPoint.dX) + L',' + std::to_wstring(oPoint.dY) + L')')}, 0, true); - pTSpan->Draw(pRenderer, pFile, oMode); + pTSpan->Draw(pRenderer, pFile, oMode, NULL, pContexObject); oMovingPath.Move(dWidthSpan / 2); } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h index 4cc61f1559..5eb30892d6 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CText.h @@ -22,16 +22,16 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; bool AddObject(CTSpan* pObject) override; void InheritStyles(const CTSpan* pTSpan); private: - void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath) const override; + void ApplyStyle(IRenderer* pRenderer, const TSvgStyles* pStyles, const CSvgFile* pFile, int& nTypePath, const CRenderedObject* pContexObject = NULL) const override; void ApplyFont(IRenderer* pRenderer, double& dX, double& dY) const; - bool UseExternalFont(const CSvgFile* pFile, double dX, double dY, IRenderer* pRenderer, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const; + bool UseExternalFont(const CSvgFile* pFile, double dX, double dY, IRenderer* pRenderer, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const; TBounds GetBounds() const override; @@ -66,7 +66,7 @@ namespace SVG static CText* Create(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL); - bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; }; class CTextPath : public CText @@ -74,11 +74,11 @@ namespace SVG public: CTextPath(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL, const CSvgFile* pFile = NULL); - bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; static CTextPath* Create(XmlUtils::CXmlNode& oNode, CRenderedObject* pParent = NULL, NSFonts::IFontManager* pFontManager = NULL, const CSvgFile* pFile = NULL); private: - void DrawGlyph(CTSpan* pTSpan, CMovingPath& oMovingPath, IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode) const; + void DrawGlyph(CTSpan* pTSpan, CMovingPath& oMovingPath, IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode, const CRenderedObject* pContexObject = NULL) const; const CPath *m_pPath; }; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp index a92dbb14aa..a2ae8aa6aa 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp @@ -25,7 +25,7 @@ namespace SVG SetFill(mAttributes, ushLevel, bHardMode); } - bool CUse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles) const + bool CUse::Draw(IRenderer *pRenderer, const CSvgFile *pFile, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const { if (NULL == pRenderer || !m_oTransformation.m_bDraw) return false; @@ -51,10 +51,10 @@ namespace SVG { TSvgStyles oNewStyles(m_oStyles); oNewStyles += *pOtherStyles; - pFoundObj->Draw(pRenderer, pFile, oMode, &oNewStyles); + pFoundObj->Draw(pRenderer, pFile, oMode, &oNewStyles, this); } else - pFoundObj->Draw(pRenderer, pFile, oMode, &m_oStyles); + pFoundObj->Draw(pRenderer, pFile, oMode, &m_oStyles, this); } EndPath(pRenderer, pFile, oOldTransform); diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h index f4c5f24ae5..fcbfa02970 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.h @@ -14,7 +14,7 @@ namespace SVG void SetData(const std::map& mAttributes, unsigned short ushLevel, bool bHardMode = false) override; - bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL) const override; + bool Draw(IRenderer* pRenderer, const CSvgFile* pFile, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const override; private: TBounds GetBounds() const override; From 9f81e37196f5b70e88527b59d7479cb5dd7b3d52 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Tue, 17 Sep 2024 18:11:18 +0300 Subject: [PATCH 58/82] fox bug #70227 --- .../PptFile/PPTXWriter/TableWriter.cpp | 4 +- .../ASCOfficeDrawingConverter.cpp | 8 +-- OOXML/PPTXFormat/Logic/LineJoin.cpp | 24 --------- OOXML/PPTXFormat/Logic/LineJoin.h | 5 +- OOXML/PPTXFormat/Logic/Ln.cpp | 52 +++++++++++++------ OOXML/PPTXFormat/Logic/Ln.h | 2 +- OOXML/PPTXFormat/Theme.cpp | 3 ++ OOXML/PPTXFormat/Theme.h | 1 + 8 files changed, 49 insertions(+), 50 deletions(-) diff --git a/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp index 47a9ce4e2a..d20540b458 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp @@ -744,8 +744,8 @@ void TCell::FillLn(PPTX::Logic::Ln &Ln, TCell::eBorderPossition eBP, CElementPtr pLineEnd->len = new PPTX::Limit::LineEndSize; Ln.tailEnd = pLineEnd; - Ln.Join.Init(); - Ln.Join->type = PPTX::Logic::eJoin::JoinRound; + Ln.join.Init(); + Ln.join->type = PPTX::Logic::eJoin::JoinRound; } void TCell::SetLnName(PPTX::Logic::Ln &Ln, eBorderPossition eBP) const diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index fd43c41968..4a047a1530 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -5683,10 +5683,10 @@ void CDrawingConverter::CheckPenShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils:: if (!pSpPr->ln.is_init()) pSpPr->ln = new PPTX::Logic::Ln(); - pSpPr->ln->Join.Init(); - if (*sLineJoin == L"bevel") pSpPr->ln->Join->type = PPTX::Logic::JoinBevel; - else if (*sLineJoin == L"miter") pSpPr->ln->Join->type = PPTX::Logic::JoinMiter; - else if (*sLineJoin == L"round") pSpPr->ln->Join->type = PPTX::Logic::JoinRound; + pSpPr->ln->join.Init(); + if (*sLineJoin == L"bevel") pSpPr->ln->join->type = PPTX::Logic::JoinBevel; + else if (*sLineJoin == L"miter") pSpPr->ln->join->type = PPTX::Logic::JoinMiter; + else if (*sLineJoin == L"round") pSpPr->ln->join->type = PPTX::Logic::JoinRound; } } nullable_string sStroked; diff --git a/OOXML/PPTXFormat/Logic/LineJoin.cpp b/OOXML/PPTXFormat/Logic/LineJoin.cpp index e6ae369521..dc6b88b62d 100644 --- a/OOXML/PPTXFormat/Logic/LineJoin.cpp +++ b/OOXML/PPTXFormat/Logic/LineJoin.cpp @@ -71,30 +71,6 @@ namespace PPTX WritingElement_ReadAttributes_Read_if ( oReader, _T("lim"), lim ) WritingElement_ReadAttributes_End_No_NS ( oReader ) } - void LineJoin::GetJoinFrom(XmlUtils::CXmlNode& element) - { - type = JoinEmpty; - XmlUtils::CXmlNode oNode = element.ReadNodeNoNS(_T("round")); - if (oNode.IsValid()) - type = JoinRound; - else - { - oNode = element.ReadNodeNoNS(_T("bevel")); - if (oNode.IsValid()) - type = JoinBevel; - else - { - oNode = element.ReadNodeNoNS(_T("miter")); - if (oNode.IsValid()) - { - type = JoinMiter; - XmlMacroReadAttributeBase(oNode, L"lim", lim); - } - } - } - - Normalize(); - } void LineJoin::fromXML(XmlUtils::CXmlNode& node) { std::wstring name = XmlUtils::GetNameNoNS(node.GetName()); diff --git a/OOXML/PPTXFormat/Logic/LineJoin.h b/OOXML/PPTXFormat/Logic/LineJoin.h index ad2573177c..bace5fa67f 100644 --- a/OOXML/PPTXFormat/Logic/LineJoin.h +++ b/OOXML/PPTXFormat/Logic/LineJoin.h @@ -51,7 +51,6 @@ namespace PPTX virtual OOX::EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - virtual void GetJoinFrom(XmlUtils::CXmlNode& element); virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -60,8 +59,8 @@ namespace PPTX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - eJoin type = Logic::JoinEmpty; - nullable_int lim; + eJoin type = Logic::JoinEmpty; + nullable_int lim; protected: virtual void FillParentPointersForChilds(); diff --git a/OOXML/PPTXFormat/Logic/Ln.cpp b/OOXML/PPTXFormat/Logic/Ln.cpp index c4c7ab867a..71a8120ddb 100644 --- a/OOXML/PPTXFormat/Logic/Ln.cpp +++ b/OOXML/PPTXFormat/Logic/Ln.cpp @@ -58,7 +58,7 @@ namespace PPTX L"miter" == sName || L"round" == sName ) { - Join = oReader; + join = oReader; } else if ( L"tailEnd" == sName ) tailEnd = oReader; @@ -113,10 +113,30 @@ namespace PPTX XmlMacroReadAttributeBase(node, L"w", w); Fill.GetFillFrom(node); - prstDash = node.ReadNodeNoNS(L"prstDash"); - Join.Init(); Join->GetJoinFrom(node); - headEnd = node.ReadNodeNoNS(L"headEnd"); - tailEnd = node.ReadNodeNoNS(L"tailEnd"); + + std::vector oNodes; + if (node.GetNodes(_T("*"), oNodes)) + { + size_t count = oNodes.size(); + for (size_t i = 0; i < count; ++i) + { + XmlUtils::CXmlNode& oNode = oNodes[i]; + + std::wstring strName = XmlUtils::GetNameNoNS(oNode.GetName()); + if (_T("headEnd") == strName) + { + headEnd = oNode; + } + else if (_T("tailEnd") == strName) + { + tailEnd = oNode; + } + else if (_T("round") == strName || _T("bevel") == strName || _T("miter") == strName) + { + join = oNode; + } + } + } FillParentPointersForChilds(); } @@ -151,7 +171,7 @@ namespace PPTX XmlUtils::CNodeValue oValue; oValue.Write(Fill); oValue.WriteNullable(prstDash); - oValue.WriteNullable(Join); + oValue.WriteNullable(join); oValue.WriteNullable(headEnd); oValue.WriteNullable(tailEnd); @@ -181,7 +201,7 @@ namespace PPTX Fill.toXmlWriter(pWriter); pWriter->Write(prstDash); - pWriter->Write(Join); + pWriter->Write(join); pWriter->Write(headEnd); pWriter->Write(tailEnd); @@ -198,7 +218,7 @@ namespace PPTX pWriter->WriteRecord1(0, Fill); pWriter->WriteRecord2(1, prstDash); - pWriter->WriteRecord2(2, Join); + pWriter->WriteRecord2(2, join); pWriter->WriteRecord2(3, headEnd); pWriter->WriteRecord2(4, tailEnd); } @@ -260,8 +280,8 @@ namespace PPTX } case 2: { - Join.Init(); - Join->fromPPTY(pReader); + join.Init(); + join->fromPPTY(pReader); break; } case 3: @@ -294,8 +314,8 @@ namespace PPTX line->Fill = Fill;//.fromXML(Fill.toXML()); if(prstDash.is_init()) line->prstDash = *prstDash; - if(Join.is_init()) - line->Join = Join; + if(join.is_init()) + line->join = join; if(headEnd.is_init()) headEnd->Merge(line->headEnd); if(tailEnd.is_init()) @@ -316,8 +336,8 @@ namespace PPTX line.Fill = Fill;//.fromXML(Fill.toXML()); if(prstDash.is_init()) line.prstDash = *prstDash; - if(Join.is_init()) - line.Join = Join; + if(join.is_init()) + line.join = join; if(headEnd.is_init()) headEnd->Merge(line.headEnd); if(tailEnd.is_init()) @@ -335,8 +355,8 @@ namespace PPTX void Ln::FillParentPointersForChilds() { Fill.SetParentPointer(this); - if (Join.IsInit()) - Join->SetParentPointer(this); + if (join.IsInit()) + join->SetParentPointer(this); if(prstDash.IsInit()) prstDash->SetParentPointer(this); if(headEnd.IsInit()) diff --git a/OOXML/PPTXFormat/Logic/Ln.h b/OOXML/PPTXFormat/Logic/Ln.h index 26f7f3a682..f8f5f0f0e4 100644 --- a/OOXML/PPTXFormat/Logic/Ln.h +++ b/OOXML/PPTXFormat/Logic/Ln.h @@ -77,7 +77,7 @@ namespace PPTX nullable prstDash; //custDash (Custom Dash) ยง20.1.8.21 - nullable Join; + nullable join; nullable headEnd; nullable tailEnd; diff --git a/OOXML/PPTXFormat/Theme.cpp b/OOXML/PPTXFormat/Theme.cpp index e9ed0f0715..ebfa2f6df7 100644 --- a/OOXML/PPTXFormat/Theme.cpp +++ b/OOXML/PPTXFormat/Theme.cpp @@ -87,6 +87,9 @@ namespace PPTX docx->m_pTheme = this; } } + Theme::~Theme() + { + } void Theme::read(const std::string &contentTheme, FileMap& map) { isThemeOverride = false; diff --git a/OOXML/PPTXFormat/Theme.h b/OOXML/PPTXFormat/Theme.h index cce76a3e72..fb94036dea 100644 --- a/OOXML/PPTXFormat/Theme.h +++ b/OOXML/PPTXFormat/Theme.h @@ -58,6 +58,7 @@ namespace PPTX Theme(OOX::Document *pMain, const std::string &contentTheme); Theme(OOX::Document *pMain, const OOX::CPath& filename); Theme(OOX::Document *pMain, const OOX::CPath& filename, FileMap& map); + virtual ~Theme(); void read(const std::string &contentTheme, FileMap& map); virtual void read(const OOX::CPath& filename, FileMap& map); From 33627ab79c1bfba111a9fa82511cc8b03d4082b9 Mon Sep 17 00:00:00 2001 From: Green Date: Tue, 17 Sep 2024 19:45:13 +0300 Subject: [PATCH 59/82] Added support for marker orientation in svg conversion --- Common/3dParty/html/css/src/ConstValues.cpp | 2 +- .../Metafile/svg/SvgObjects/CMarker.cpp | 54 +++++++-- .../raster/Metafile/svg/SvgObjects/CMarker.h | 57 +++++++-- .../raster/Metafile/svg/SvgObjects/CPath.cpp | 111 +++++++++++++++--- .../raster/Metafile/svg/SvgObjects/CPath.h | 3 +- DesktopEditor/raster/Metafile/svg/SvgUtils.h | 35 ++++++ 6 files changed, 219 insertions(+), 43 deletions(-) diff --git a/Common/3dParty/html/css/src/ConstValues.cpp b/Common/3dParty/html/css/src/ConstValues.cpp index b654ee9206..edef26c42e 100644 --- a/Common/3dParty/html/css/src/ConstValues.cpp +++ b/Common/3dParty/html/css/src/ConstValues.cpp @@ -88,7 +88,7 @@ namespace NSCSS {L"gainsboro", L"DCDCDC"}, {L"lightgray", L"D3D3D3"}, {L"silver", L"C0C0C0"}, {L"darkgray", L"A9A9A9"}, {L"gray", L"808080"}, {L"dimgray", L"696969"}, {L"lightslategray", L"778899"}, {L"slategray", L"708090"}, {L"darkslategray", L"2F4F4F"}, - {L"black", L"000000"}, + {L"black", L"000000"}, {L"grey", L"808080"}, /* Outdated */ {L"windowtext", L"000000"}, {L"transparent", L"000000"} }; diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp index ded6a0c9a5..f48a55f9e6 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.cpp @@ -6,7 +6,7 @@ namespace SVG { CMarker::CMarker(XmlUtils::CXmlNode &oNode) - : CObject(oNode), m_oBounds{0., 0., 0., 0.} + : CObject(oNode), m_dAngle(0.), m_oBounds{0., 0., 0., 0.} { m_oWindow.m_oX .SetValue(oNode.GetAttribute(L"refX")); m_oWindow.m_oY .SetValue(oNode.GetAttribute(L"refY")); @@ -33,9 +33,22 @@ namespace SVG const std::wstring& wsUnits = oNode.GetAttribute(L"markerUnits"); if (L"userSpaceOnUse" == wsUnits) - m_enUnits = Marker_UserSpaceOnUse; + m_enUnits = EMarkerUnits::UserSpaceOnUse; else - m_enUnits = Marker_StrokeWidth; + m_enUnits = EMarkerUnits::StrokeWidth; + + const std::wstring& wsOrient = oNode.GetAttribute(L"orient"); + + if (L"auto" == wsOrient) + m_enOrient = EMarkerOrient::Auto; + else if (L"auto-start-reverse" == wsOrient) + m_enOrient = EMarkerOrient::Auto_start_reverse; + else + { + m_enOrient = EMarkerOrient::Angle; + if (!StrUtils::ReadAngle(wsOrient, m_dAngle)) + StrUtils::ReadDoubleValue(wsOrient, m_dAngle); + } } CMarker::~CMarker() @@ -50,28 +63,33 @@ namespace SVG void CMarker::SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) {} - void CMarker::Draw(IRenderer *pRenderer, const CSvgFile* pFile, const std::vector &arPoints, double dStrokeWidth, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const + void CMarker::Draw(IRenderer *pRenderer, const CSvgFile* pFile, const TMarkerExternData& oExternalData, CommandeMode oMode, const TSvgStyles* pOtherStyles, const CRenderedObject* pContexObject) const { - if (arPoints.empty() || Equals(0., dStrokeWidth) || m_arObjects.empty()) + if (NULL == oExternalData.m_pPoints || oExternalData.m_pPoints->empty() || m_arObjects.empty() || (EMarkerUnits::StrokeWidth == m_enUnits && Equals(0., oExternalData.m_dStroke))) return; - const double dMaxScale = ((Marker_StrokeWidth == m_enUnits) ? dStrokeWidth : 1.) * std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); + const double dMaxScale = ((EMarkerUnits::StrokeWidth == m_enUnits) ? oExternalData.m_dStroke : 1.) * std::max((m_oWindow.m_oWidth.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel)), (m_oWindow.m_oHeight.ToDouble(NSCSS::Pixel) / m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel))); double dM11, dM12, dM21, dM22, dDx, dDy; pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy); - Aggplus::CMatrix oTransform(dM11, dM12, dM21, dM22, dDx, dDy); - const double dSkipX = m_oWindow.m_oX.ToDouble(NSCSS::Pixel) * dMaxScale; const double dSkipY = m_oWindow.m_oY.ToDouble(NSCSS::Pixel) * dMaxScale; - oTransform.Translate(-dSkipX, -dSkipY); - - for (Point oPoint : arPoints) + for (const TPointData& oPoint : *oExternalData.m_pPoints) { - oTransform.TransformPoint(oPoint.dX, oPoint.dY); + Aggplus::CMatrix oTransform(dM11, dM12, dM21, dM22, dDx, dDy); + oTransform.Translate(oPoint.m_oPoint.dX - dSkipX, oPoint.m_oPoint.dY - dSkipY); - pRenderer->SetTransform(dM11 * dMaxScale, dM12, dM21, dM22 * dMaxScale, oPoint.dX, oPoint.dY); + if (EMarkerOrient::Angle == m_enOrient) + oTransform.RotateAt(m_dAngle, -dSkipX, -dSkipY); + else if (!Equals(0., oPoint.m_dAngle)) + oTransform.RotateAt(oPoint.m_dAngle, -dSkipX, -dSkipY); + + Aggplus::CMatrix oTransform2(oTransform); + oTransform2.Scale(dMaxScale, dMaxScale); + + pRenderer->SetTransform(oTransform2.sx(), oTransform2.shy(), oTransform2.shx(), oTransform2.sy(), oTransform.tx(), oTransform.ty()); for (const CRenderedObject* pObject : m_arObjects) pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); @@ -79,4 +97,14 @@ namespace SVG pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy); } + + bool CMarker::NeedExternalAngle() const + { + return m_enOrient != EMarkerOrient::Angle; + } + + EMarkerOrient CMarker::GetOrientType() const + { + return m_enOrient; + } } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h index 1e8c7ab782..8bb7b97924 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CMarker.h @@ -5,11 +5,43 @@ namespace SVG { - typedef enum + enum class EMarkerUnits { - Marker_StrokeWidth, - Marker_UserSpaceOnUse - } MarkerUnits; + StrokeWidth, + UserSpaceOnUse + }; + + enum class EMarkerOrient + { + Auto, + Auto_start_reverse, + Angle + }; + + struct TPointData + { + Point m_oPoint; + double m_dAngle; + + TPointData() + : m_dAngle(0.) + {} + }; + + struct TMarkerExternData + { + std::vector* m_pPoints; + double m_dStroke; + + TMarkerExternData() + : m_pPoints(NULL), m_dStroke(0.) + {} + + ~TMarkerExternData() + { + RELEASEOBJECT(m_pPoints); + } + }; class CMarker : public CObject, public CContainer { @@ -21,14 +53,21 @@ namespace SVG void SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) override; - void Draw(IRenderer* pRenderer, const CSvgFile *pFile, const std::vector& arPoints, double dStrokeWidth, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const; + void Draw(IRenderer* pRenderer, const CSvgFile *pFile, const TMarkerExternData& oExternalData, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const; + + bool NeedExternalAngle() const; + EMarkerOrient GetOrientType() const; private: - MarkerUnits m_enUnits; + EMarkerUnits m_enUnits; + EMarkerOrient m_enOrient; - TRect m_oWindow; - TRect m_oViewBox; + double m_dAngle; + + TRect m_oWindow; + TRect m_oViewBox; + + TBounds m_oBounds; - TBounds m_oBounds; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp index 8c9bbdb845..c43cac0b75 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.cpp @@ -29,6 +29,11 @@ namespace SVG return oBounds; } + UINT IPathElement::GetPointCount() const + { + return m_arPoints.size(); + } + Point IPathElement::operator[](int nIndex) const { if (m_arPoints.empty() || (nIndex > 0 && nIndex >= m_arPoints.size()) || (nIndex < 0 && -nIndex > m_arPoints.size())) @@ -516,15 +521,44 @@ namespace SVG const double dStrokeWidth = (m_oStyles.m_oStroke.m_oWidth.Empty()) ? 1. : m_oStyles.m_oStroke.m_oWidth.ToDouble(NSCSS::Pixel); + #define CALCULATE_ANGLE(firstPoint, secondPoint) std::atan2(secondPoint.dY - firstPoint.dY, secondPoint.dX - firstPoint.dX) * 180. / M_PI + if (!m_oMarkers.m_oStart.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oStart.GetType()) { CMarker *pStartMarker = dynamic_cast(pFile->GetMarkedObject(m_oMarkers.m_oStart.ToWString())); if (NULL != pStartMarker) { - const IPathElement* pFirstElement{FindFirstNotEmpty()}; - if (NULL != pFirstElement) - pStartMarker->Draw(pRenderer, pFile, {(*pFirstElement)[0]}, dStrokeWidth, oMode, pOtherStyles, this); + TMarkerExternData oExternalData; + oExternalData.m_dStroke = dStrokeWidth; + oExternalData.m_pPoints = new std::vector(1); + + int unIndex = FindIndexFirstNotEmpty(); + + if (0 <= unIndex) + { + const IPathElement* pFirstElement{m_arElements[unIndex]}; + + (*oExternalData.m_pPoints)[0].m_oPoint = (*pFirstElement)[0]; + + if (pStartMarker->NeedExternalAngle()) + { + Point oCurent{(*pFirstElement)[0]}; + Point oNext; + + if (pFirstElement->GetPointCount() > 1) + oNext = (*pFirstElement)[1]; + else if (unIndex < m_arElements.size() - 1 && EPathElement::Close != m_arElements[unIndex + 1]->GetType() && EPathElement::Move != m_arElements[unIndex + 1]->GetType()) + oNext = (*m_arElements[unIndex + 1])[0]; + + (*oExternalData.m_pPoints)[0].m_dAngle = CALCULATE_ANGLE(oCurent, oNext); + + if (EMarkerOrient::Auto_start_reverse == pStartMarker->GetOrientType()) + (*oExternalData.m_pPoints)[0].m_dAngle += 180.; + } + + pStartMarker->Draw(pRenderer, pFile, oExternalData, oMode, pOtherStyles, this); + } } } @@ -532,25 +566,64 @@ namespace SVG { CMarker *pMidMarker = dynamic_cast(pFile->GetMarkedObject(m_oMarkers.m_oMid.ToWString())); - std::vector arPoints(m_arElements.size() - 2); - - for (unsigned int unIndex = 1; unIndex < m_arElements.size() - 1; ++unIndex) - { - if (EPathElement::Close != m_arElements[unIndex]->GetType()) - arPoints[unIndex - 1] = (*m_arElements[unIndex])[-1]; - } - if (NULL != pMidMarker) - pMidMarker->Draw(pRenderer, pFile, arPoints, dStrokeWidth, oMode, pOtherStyles, this); + { + TMarkerExternData oExternalData; + oExternalData.m_dStroke = dStrokeWidth; + oExternalData.m_pPoints = new std::vector(m_arElements.size() - 2); + + for (unsigned int unIndex = 1; unIndex < m_arElements.size() - 1; ++unIndex) + { + if (EPathElement::Close != m_arElements[unIndex]->GetType()) + (*oExternalData.m_pPoints)[unIndex - 1].m_oPoint = (*m_arElements[unIndex])[-1]; + + if (pMidMarker->NeedExternalAngle()) + { + const Point oCurrent{(*m_arElements[unIndex])[0]}; + const Point oPrev{(*m_arElements[unIndex + 1])[-1]}; + + (*oExternalData.m_pPoints)[unIndex - 1].m_dAngle = CALCULATE_ANGLE(oCurrent, oPrev); + } + } + + pMidMarker->Draw(pRenderer, pFile, oExternalData, oMode, pOtherStyles, this); + } } if (!m_oMarkers.m_oEnd.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oEnd.GetType()) { CMarker *pEndMarker = dynamic_cast(pFile->GetMarkedObject(m_oMarkers.m_oEnd.ToWString())); - const IPathElement* pLastElement{FindFirstNotEmpty(true)}; - if (NULL != pLastElement) - pEndMarker->Draw(pRenderer, pFile, {(*pLastElement)[-1]}, dStrokeWidth, oMode, pOtherStyles, this); + if (NULL != pEndMarker) + { + TMarkerExternData oExternalData; + oExternalData.m_dStroke = dStrokeWidth; + oExternalData.m_pPoints = new std::vector(1); + + int unIndex = FindIndexFirstNotEmpty(true); + + if (0 <= unIndex) + { + const IPathElement* pLastElement{m_arElements[unIndex]}; + + (*oExternalData.m_pPoints)[0].m_oPoint = (*pLastElement)[-1]; + + if (pEndMarker->NeedExternalAngle()) + { + Point oCurent{(*pLastElement)[-1]}; + Point oPrev; + + if (pLastElement->GetPointCount() > 1) + oPrev = (*pLastElement)[-2]; + else if (unIndex > 0 && EPathElement::Close != m_arElements[unIndex - 1]->GetType() && EPathElement::Move != m_arElements[unIndex - 1]->GetType()) + oPrev = (*m_arElements[unIndex - 1])[0]; + + (*oExternalData.m_pPoints)[0].m_dAngle = CALCULATE_ANGLE(oPrev, oCurent); + } + + pEndMarker->Draw(pRenderer, pFile, oExternalData, oMode, pOtherStyles, this); + } + } } EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject); @@ -594,22 +667,22 @@ namespace SVG return oBounds; } - const IPathElement* CPath::FindFirstNotEmpty(bool bReverseSearch) const + const int CPath::FindIndexFirstNotEmpty(bool bReverseSearch) const { if (!bReverseSearch) { std::vector::const_iterator itFound = std::find_if(m_arElements.cbegin(), m_arElements.cend(), [](const IPathElement* pElement){ return EPathElement::Close != pElement->GetType(); }); if (m_arElements.cend() != itFound) - return *itFound; + return itFound - m_arElements.cbegin(); } else { std::vector::const_reverse_iterator itFound = std::find_if(m_arElements.crbegin(), m_arElements.crend(), [](const IPathElement* pElement){ return EPathElement::Close != pElement->GetType(); }); if (m_arElements.crend() != itFound) - return *itFound; + return itFound.base() - m_arElements.cbegin() - 1; } - return NULL; + return -1; } void CPath::ReadFromString(const std::wstring &wsValue) diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h index 16939e0c3a..4854a0fc4a 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CPath.h @@ -35,6 +35,7 @@ namespace SVG virtual void Draw(IRenderer* pRenderer) const = 0; TBounds GetBounds() const; + UINT GetPointCount() const; virtual Point operator[](int nIndex) const; private: @@ -121,7 +122,7 @@ namespace SVG TBounds GetBounds() const override; - const IPathElement* FindFirstNotEmpty(bool bReverseSearch = false) const; + const int FindIndexFirstNotEmpty(bool bReverseSearch = false) const; void ReadFromString(const std::wstring& wsValue); bool AddElement(IPathElement* pElement); diff --git a/DesktopEditor/raster/Metafile/svg/SvgUtils.h b/DesktopEditor/raster/Metafile/svg/SvgUtils.h index 6a5e76fbda..34b24a6373 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgUtils.h +++ b/DesktopEditor/raster/Metafile/svg/SvgUtils.h @@ -53,6 +53,41 @@ namespace SVG return ReadDoubleValues(wsValue.begin(), wsValue.end()); } + inline bool ReadDoubleValue(const std::wstring& wsValue, double& dValue) + { + std::wregex oPattern(LR"([-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)"); + std::wsmatch oMatch; + + if (!std::regex_search(wsValue, oMatch, oPattern)) + return false; + + dValue = std::stod(oMatch[0].str()); + + return true; + } + + inline bool ReadAngle(const std::wstring& wsValue, double& dValue) + { + std::wregex oPattern(LR"(([-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)(deg|rad|grad|turn))"); + std::wsmatch oMatch; + + if (!std::regex_search(wsValue, oMatch, oPattern)) + return false; + + const std::wstring wsUnit{oMatch[5].str()}; + + dValue = std::stod(oMatch[1].str()); + + if (L"grad" == wsUnit) + dValue *= 400. / 360.; + else if (L"rad" == wsUnit) + dValue *= 180. / 3.14159; + else if (L"turn" == wsUnit) + dValue *= 360.; + + return true; + } + inline std::wstring TrimExtraEnding(const std::wstring& wsString) { std::wstring::const_iterator itBeginPos = std::find_if(wsString.begin(), wsString.end(), [](const wchar_t& wChar){ return !iswspace(wChar);}); From 375f79cdac8e69137a78216cad912738095af4e8 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Tue, 17 Sep 2024 21:22:24 +0300 Subject: [PATCH 60/82] fix bug #69904 --- .../XlsFormatLib/Windows/XlsFormat.vcxproj | 2 + .../Windows/XlsFormat.vcxproj.filters | 6 + .../XlsFile/Converter/XlsConverter.cpp | 2 +- .../XlsFile/Format/Logic/Biff_records/BOF.cpp | 2 +- .../Format/Logic/Biff_records/Formula.cpp | 10 +- .../Format/Logic/Biff_records/Label.cpp | 32 +- .../Format/Logic/Biff_records/Number.cpp | 23 +- .../XlsFile/Format/Logic/Biff_records/XF.cpp | 4 +- .../Logic/Biff_structures/BiffString.cpp | 563 +++++++++--------- .../Format/Logic/Biff_structures/BiffString.h | 1 + .../Logic/Biff_structures/BorderFillInfo.cpp | 2 +- .../Logic/Biff_structures/BorderFillInfo.h | 2 +- .../Format/Logic/Biff_structures/Cell.cpp | 3 +- .../Format/Logic/Biff_structures/Ptg.cpp | 5 +- .../Format/Logic/Biff_unions/FORMATTING.cpp | 3 + .../Format/Logic/WorksheetSubstream.cpp | 21 + 16 files changed, 377 insertions(+), 304 deletions(-) diff --git a/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj b/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj index 0f24884188..48d1e40588 100644 --- a/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj +++ b/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj @@ -501,6 +501,7 @@ + @@ -1315,6 +1316,7 @@ + diff --git a/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj.filters b/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj.filters index 94eeff77a5..ef84b54866 100644 --- a/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj.filters +++ b/MsBinaryFile/Projects/XlsFormatLib/Windows/XlsFormat.vcxproj.filters @@ -2440,6 +2440,9 @@ Logic\Biff_structures\BIFF12 + + Logic\Biff_structures + @@ -4893,5 +4896,8 @@ Logic\Biff_structures\BIFF12 + + Logic\Biff_structures + \ No newline at end of file diff --git a/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp b/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp index f91c255d65..9a28d8681c 100644 --- a/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp +++ b/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp @@ -189,7 +189,7 @@ XlsConverter::XlsConverter(const std::wstring & xlsFileName, const std::wstring if (globals) { globals->m_Formating = worksheet->m_Formating; - globals->UpdateXFC(); + globals->UpdateXFC(); } } } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/BOF.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/BOF.cpp index 57fb2d8a77..e7066f62b1 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/BOF.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/BOF.cpp @@ -114,9 +114,9 @@ void BOF::readFields(CFRecord& record) } else { + short not_used = 0; if (type_id_ == rt_BOF_BIFF3 || type_id_ == rt_BOF_BIFF4) { - short not_used; record >> not_used; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Formula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Formula.cpp index f2b3198e78..351d22e0be 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Formula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Formula.cpp @@ -61,8 +61,14 @@ void Formula::readFields(CFRecord& record) fShrFmla = GETBIT(flags, 3); fClearErrors = GETBIT(flags, 5); - _UINT32 chn = 0; - record >> chn; // cache + if (bBiff_3_4 && record.getGlobalWorkbookInfo()->Version < 0x0600) + { + } + else + { + _UINT32 chn = 0; + record >> chn; // cache + } formula.load(record); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp index 96200f2720..4d8070ccbe 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Label.cpp @@ -57,7 +57,7 @@ void Label::readFields(CFRecord& record) record >> cell; - if (global_info_->Version == 0x0200 || global_info_->Version == 0x0400) + if (global_info_->Version == 0x0200) { ShortXLAnsiString name; record >> name; @@ -66,13 +66,37 @@ void Label::readFields(CFRecord& record) } else if (global_info_->Version < 0x0600) { - LPAnsiString name; - record >> name; + unsigned short test; + record >> test; + record.RollRdPtrBack(2); - st = name; + if (test > record.getDataSize()) + { + //wrong version !! + record.RollRdPtrBack(record.getRdPtr()); + + int store = global_info_->Version; + global_info_->Version = 0x0200; + + ShortXLAnsiString name; + + record >> cell >> name; + st = name; + + global_info_->Version = store; + } + else + { + LPAnsiString name; + record >> name; + + st = name; + } } else + { record >> st; + } isst_ = global_info_->startAddedSharedStrings + global_info_->arAddedSharedStrings.size() ; global_info_->arAddedSharedStrings.push_back(st.value()); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp index 3b7549da4d..5c25ca8a63 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/Number.cpp @@ -58,7 +58,21 @@ void Number::readFields(CFRecord& record) { global_info_ = record.getGlobalWorkbookInfo(); - record >> cell >> num; + if (record.getDataSize() == 15) + { + //wrong version !! + int store = global_info_->Version; + global_info_->Version = 0x0200; + + record >> cell >> num; + + global_info_->Version = store; + } + else + { // sizeof record == 14 + record >> cell >> num; + } + _INT32 val = 0; if (record.getDataSize() >= 18)//SchetPrintForm.xls @@ -103,9 +117,12 @@ BaseObjectPtr Integer_BIFF2::clone() return BaseObjectPtr(new Integer_BIFF2(*this)); } void Integer_BIFF2::readFields(CFRecord& record) -{ +{//only version 0x0200 global_info_ = record.getGlobalWorkbookInfo(); + int store = global_info_->Version; + global_info_->Version = 0x0200; + record >> cell; if (record.getRdPtr() + 2 < record.getDataSize()) @@ -118,6 +135,8 @@ void Integer_BIFF2::readFields(CFRecord& record) record >> num_2byte; num = num_2byte; } + + global_info_->Version = store; } const CellRef Integer_BIFF2::getLocation() const { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/XF.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/XF.cpp index 9f84ef871c..04d81c5622 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_records/XF.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_records/XF.cpp @@ -221,8 +221,8 @@ void XF::readFields(CFRecord& record) fill.fls = static_cast(GETBITS(flags4, 0, 5)); - fill.icvFore = GETBITS(flags4, 0, 6); - fill.icvBack = GETBITS(flags4, 7, 13); + fill.icvFore = GETBITS(flags4, 6, 10); + fill.icvBack = GETBITS(flags4, 11, 15); border.dgTop = static_cast(GETBITS(flags5, 0, 2)); border.icvTop = (0 != border.dgTop) ? static_cast(GETBITS(flags5, 3, 7)) : 0; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.cpp index 369e8aef72..4443acc6c2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.cpp @@ -36,329 +36,318 @@ namespace XLS { -BiffString::BiffString() -: struct_size(0), - bDeleteZero(false) -{ -} - - -BiffString::BiffString(const size_t size) -: struct_size(0), - cch_(size), - bDeleteZero(false) -{ -} - - -BiffString::BiffString(const std::wstring & str) -: struct_size(0), - str_(str), - cch_(str.length()), - bDeleteZero(false) -{ -} - - -BiffString::~BiffString() -{ -} - - - - -BiffString::operator std::wstring () const -{ - return str_; -} - - -BiffString BiffString::operator=(const std::wstring & str) -{ - str_ = str; - cch_ = str_.length(); - return *this; -} - - -BiffStructurePtr BiffString::clone() -{ - return BiffStructurePtr(new BiffString(*this)); -} - -void BiffString::load(CFRecord& record) -{ - // EXCEPT::LE::WhatIsTheFuck("Wrong usage of BiffString. Stack overflow stopped.", __FUNCTION__); - // record >> *this; // :-) -} -void BiffString::load(IBinaryReader* reader) -{ -} - -void BiffString::load(IBinaryReader* reader, const size_t cch1, const bool is_wide1) -{ - bool is_wide = is_wide1; - - size_t cch = cch1; - if ((cch_) && (*cch_ != cch1) && cch1 < 1) - { - cch = cch_.get(); - } - size_t raw_length = cch << (is_wide ? 1 : 0); - - if (reader->GetPosition() + cch > reader->GetSize()) - { - //ОШИБКА - нехватило Continue records - нужно найти место где именно и подзагрузить - return; - } - unsigned char* pData = reader->ReadBytes(cch, true); - - if(is_wide) - { -#if defined(_WIN32) || defined(_WIN64) - str_ = std::wstring((wchar_t*)pData, cch); -#else - str_ = convertUtf16ToWString((UTF16*)pData, cch); -#endif - } - else + BiffString::BiffString() + : struct_size(0), + bDeleteZero(false) { } - delete []pData; -} -void BiffString::load(CFRecord& record, const size_t cch1, const bool is_wide1) -{ - bool is_wide = is_wide1; - - size_t cch = cch1; - if ((cch_) && (*cch_ != cch1) && cch1 < 1) + BiffString::BiffString(const size_t size) + : struct_size(0), + cch_(size), + bDeleteZero(false) { - cch = cch_.get(); - } - size_t raw_length = cch << (is_wide ? 1 : 0); - - if (record.checkFitRead(raw_length)==false) - { - //ОШИБКА - нехватило Continue records - нужно найти место где именно и подзагрузить - return; } - if(is_wide) + BiffString::BiffString(const std::wstring & str) + : struct_size(0), + str_(str), + cch_(str.length()), + bDeleteZero(false) { - if (false == bDeleteZero) - { -#if defined(_WIN32) || defined(_WIN64) - str_ = std::wstring(record.getCurData(), cch); -#else - str_= convertUtf16ToWString(record.getCurData(), cch); -#endif - record.skipNunBytes(raw_length); - } - else - { - //5804543.xls - font name in dx for table - c a l i 0 0 0 0 b r i - !!!! - UTF16 *buf_read = new UTF16[cch]; - - for (size_t i = 0; i < cch; i++) - { - unsigned short val; - do - { - record >> val; - }while(val == 0); - buf_read[i] = val; - } - #if defined(_WIN32) || defined(_WIN64) - str_ = std::wstring((wchar_t*)buf_read, cch); - #else - str_= convertUtf16ToWString(buf_read, cch); - #endif - delete []buf_read; - } - } - else - { - std::string inp_str(record.getCurData(), cch); - - if (record.getGlobalWorkbookInfo()->CodePage == 1200) - { - int inp_str_size = inp_str.length(); - UTF16 *out_str = new UTF16[inp_str_size + 1]; - char* out_str_char = (char*) out_str; - for (int i = 0; i < inp_str_size; i++) - { - out_str_char[2*i+0] = inp_str.c_str()[i]; - out_str_char[2*i+1] = 0; - } - out_str[inp_str_size] = 0; - -#if defined(_WIN32) || defined(_WIN64) - str_ = std::wstring((wchar_t*)out_str, inp_str_size); -#else - str_ = convertUtf16ToWString(out_str, inp_str_size); -#endif - delete []out_str; - } - else - { - str_ = STR::toStdWString(inp_str, record.getGlobalWorkbookInfo()->CodePage).c_str(); - } - record.skipNunBytes(raw_length); - } -} - -void BiffString::save(CFRecord& record, const size_t cch1, const bool is_wide1) -{ - bool is_wide = is_wide1; - - size_t cch = cch1; - if ((cch_) && (*cch_ != cch1) && cch1 < 1) - { - cch = cch_.get(); } - if (is_wide) + + BiffString::~BiffString() { - unsigned char *out_str = nullptr; - int out_size = 0; - -#if defined(_WIN32) || defined(_WIN64) - record.appendRawDataToStatic(str_.c_str(), str_.size()); -#else - convertWStringToUtf16(str_, out_str, out_size); - record.appendRawDataToStatic(out_str, out_size); -#endif - } - else - { - //stub - } -} -const size_t BiffString::getSize() const -{ - if(!cch_) - { - // EXCEPT::LE::StructureSizeNotSet("BiffString", __FUNCTION__/*__FUNCDNAME__*/); - } - return *cch_; -} - - -void BiffString::setSize(const size_t size) -{ - cch_ = size; -} - - -const size_t BiffString::getStructSize() const -{ - return struct_size; -} - - -// Set number of unsigned chars read while loading. Must be used by >> operator only -void BiffString::setStructSize(const size_t size) -{ - struct_size = size; -} - -const std::wstring BiffString::getEscaped_ST_Xstring() const -{ - if(!str_.length()) + BiffString::operator std::wstring () const { return str_; } - std::wstring copy_str(str_); - return STR::escape_ST_Xstring(copy_str).c_str(); -} - -void BiffString::Escape_ST_Xstring() -{ - str_ = getEscaped_ST_Xstring(); -} - - -const bool BiffString::getWideRecommendation() const -{ - std::wstring str(str_); - for(std::wstring::const_iterator it = str.begin(), itEnd = str.end(); it != itEnd; ++it) + BiffString BiffString::operator=(const std::wstring & str) { - if(0xff00 & *it) + str_ = str; + cch_ = str_.length(); + return *this; + } + + BiffStructurePtr BiffString::clone() + { + return BiffStructurePtr(new BiffString(*this)); + } + + void BiffString::load(CFRecord& record) + { + // EXCEPT::LE::WhatIsTheFuck("Wrong usage of BiffString. Stack overflow stopped.", __FUNCTION__); + // record >> *this; // :-) + } + void BiffString::load(IBinaryReader* reader) + { + } + + void BiffString::load(IBinaryReader* reader, const size_t cch1, const bool is_wide1) + { + bool is_wide = is_wide1; + + size_t cch = cch1; + if ((cch_) && (*cch_ != cch1) && cch1 < 1) { - return true; + cch = cch_.get(); + } + size_t raw_length = cch << (is_wide ? 1 : 0); + + if (reader->GetPosition() + cch > reader->GetSize()) + { + //ОШИБКА - нехватило Continue records - нужно найти место где именно и подзагрузить + return; + } + unsigned char* pData = reader->ReadBytes(cch, true); + + if(is_wide) + { + #if defined(_WIN32) || defined(_WIN64) + str_ = std::wstring((wchar_t*)pData, cch); + #else + str_ = convertUtf16ToWString((UTF16*)pData, cch); + #endif + } + else + { + } + delete []pData; + } + + void BiffString::load(CFRecord& record, const size_t cch1, const bool is_wide1) + { + bool is_wide = is_wide1; + + size_t cch = cch1; + if ((cch_) && (*cch_ != cch1) && cch1 < 1) + { + cch = cch_.get(); + } + size_t raw_length = cch << (is_wide ? 1 : 0); + + if (record.checkFitRead(raw_length)==false) + { + //ОШИБКА - нехватило Continue records - нужно найти место где именно и подзагрузить + return; + } + + if(is_wide) + { + if (false == bDeleteZero) + { + #if defined(_WIN32) || defined(_WIN64) + str_ = std::wstring(record.getCurData(), cch); + #else + str_= convertUtf16ToWString(record.getCurData(), cch); + #endif + record.skipNunBytes(raw_length); + } + else + { + //5804543.xls - font name in dx for table - c a l i 0 0 0 0 b r i - !!!! + UTF16 *buf_read = new UTF16[cch]; + + for (size_t i = 0; i < cch; i++) + { + unsigned short val; + do + { + record >> val; + }while(val == 0); + buf_read[i] = val; + } + #if defined(_WIN32) || defined(_WIN64) + str_ = std::wstring((wchar_t*)buf_read, cch); + #else + str_= convertUtf16ToWString(buf_read, cch); + #endif + delete []buf_read; + } + } + else + { + std::string inp_str(record.getCurData(), cch); + + if (record.getGlobalWorkbookInfo()->CodePage == 1200) + { + int inp_str_size = inp_str.length(); + UTF16 *out_str = new UTF16[inp_str_size + 1]; + char* out_str_char = (char*) out_str; + for (int i = 0; i < inp_str_size; i++) + { + out_str_char[2*i+0] = inp_str.c_str()[i]; + out_str_char[2*i+1] = 0; + } + out_str[inp_str_size] = 0; + + #if defined(_WIN32) || defined(_WIN64) + str_ = std::wstring((wchar_t*)out_str, inp_str_size); + #else + str_ = convertUtf16ToWString(out_str, inp_str_size); + #endif + delete []out_str; + } + else + { + str_ = STR::toStdWString(inp_str, record.getGlobalWorkbookInfo()->CodePage).c_str(); + } + record.skipNunBytes(raw_length); } } - return false; -} -//----------------------------------------------------------------- -BiffStructurePtr XLUnicodeStringSegmented::clone() -{ - return BiffStructurePtr(new XLUnicodeStringSegmented(*this)); -} -void XLUnicodeStringSegmented::load(CFRecord& record) -{ - record >> cchTotal; - if (cchTotal < 1) return; + void BiffString::save(CFRecord& record, const size_t cch1, const bool is_wide1) + { + bool is_wide = is_wide1; + + size_t cch = cch1; + if ((cch_) && (*cch_ != cch1) && cch1 < 1) + { + cch = cch_.get(); + } + + if (is_wide) + { + unsigned char *out_str = nullptr; + int out_size = 0; + + #if defined(_WIN32) || defined(_WIN64) + record.appendRawDataToStatic(str_.c_str(), str_.size()); + #else + convertWStringToUtf16(str_, out_str, out_size); + record.appendRawDataToStatic(out_str, out_size); + #endif + + } + else + { + //stub + } + } + + const size_t BiffString::getSize() const + { + if(!cch_) + { + // EXCEPT::LE::StructureSizeNotSet("BiffString", __FUNCTION__/*__FUNCDNAME__*/); + } + return *cch_; + } + + + void BiffString::setSize(const size_t size) + { + cch_ = size; + } + + const size_t BiffString::getStructSize() const + { + return struct_size; + } + + // Set number of unsigned chars read while loading. Must be used by >> operator only + void BiffString::setStructSize(const size_t size) + { + struct_size = size; + } + + const std::wstring BiffString::getEscaped_ST_Xstring() const + { + if(!str_.length()) + { + return str_; + } + std::wstring copy_str(str_); + return STR::escape_ST_Xstring(copy_str).c_str(); + } + + void BiffString::Escape_ST_Xstring() + { + str_ = getEscaped_ST_Xstring(); + } + + const bool BiffString::getWideRecommendation() const + { + std::wstring str(str_); + for(std::wstring::const_iterator it = str.begin(), itEnd = str.end(); it != itEnd; ++it) + { + if(0xff00 & *it) + { + return true; + } + } + return false; + } + //----------------------------------------------------------------- + BiffStructurePtr XLUnicodeStringSegmented::clone() + { + return BiffStructurePtr(new XLUnicodeStringSegmented(*this)); + } + void XLUnicodeStringSegmented::load(CFRecord& record) + { + record >> cchTotal; + + if (cchTotal < 1) return; - if (cchTotal > record.getDataSize() - record.getRdPtr()) - { - cchTotal = cchTotal >> 8; - } + if (cchTotal > record.getDataSize() - record.getRdPtr()) + { + cchTotal = cchTotal >> 8; + } - _UINT32 cchTotal_test = 0; - while(true) - { - if (record.isEOF()) - break; + _UINT32 cchTotal_test = 0; + while(true) + { + if (record.isEOF()) + break; - if (cchTotal_test >= cchTotal) - break; + if (cchTotal_test >= cchTotal) + break; - _UINT32 max_string_size = cchTotal - cchTotal_test; + _UINT32 max_string_size = cchTotal - cchTotal_test; - XLUnicodeString string; - record >> string; + XLUnicodeString string; + record >> string; - arStrings.push_back(string.value()); + arStrings.push_back(string.value()); - cchTotal_test += arStrings.back().length(); - strTotal += arStrings.back(); + cchTotal_test += arStrings.back().length(); + strTotal += arStrings.back(); + } } -} -void XLUnicodeStringSegmented::load(IBinaryReader* reader) -{ - cchTotal = reader->ReadUInt32(); + void XLUnicodeStringSegmented::load(IBinaryReader* reader) + { + cchTotal = reader->ReadUInt32(); - if (cchTotal < 1) return; + if (cchTotal < 1) return; - if (cchTotal > reader->GetSize() - reader->GetPosition()) - { - cchTotal = cchTotal >> 8; - } + if (cchTotal > reader->GetSize() - reader->GetPosition()) + { + cchTotal = cchTotal >> 8; + } - _UINT32 cchTotal_test = 0; - while(true) - { - if (reader->GetPosition() >= reader->GetSize()) - break; + _UINT32 cchTotal_test = 0; + while(true) + { + if (reader->GetPosition() >= reader->GetSize()) + break; - if (cchTotal_test >= cchTotal) - break; + if (cchTotal_test >= cchTotal) + break; - _UINT32 max_string_size = cchTotal - cchTotal_test; + _UINT32 max_string_size = cchTotal - cchTotal_test; - XLUnicodeString string; - string.load(reader); + XLUnicodeString string; + string.load(reader); - arStrings.push_back(string.value()); + arStrings.push_back(string.value()); - cchTotal_test += arStrings.back().length(); - strTotal += arStrings.back(); + cchTotal_test += arStrings.back().length(); + strTotal += arStrings.back(); + } } -} } // namespace XLS diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h index 03443bef33..b7c74f9efc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h @@ -141,6 +141,7 @@ public: case cch_READ_FROM_RECORD: cchType cch_l; // Just to conform size read. record >> cch_l; + cch = cch_l; struct_size += sizeof(cchType); break; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.cpp index 708512df93..17177f4fe2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.cpp @@ -293,7 +293,7 @@ int FontInfo::serialize(std::wostream & stream) } } - if (uls > 0) + if (uls > 0 && uls < 0xff) { CP_XML_NODE(L"u") { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.h index 72cf83a28d..2aa39e73ba 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BorderFillInfo.h @@ -141,7 +141,7 @@ struct FontInfo unsigned short bls = 0; unsigned short sss = 0; unsigned short scheme = 0; - unsigned char uls; + unsigned char uls = 0xff; unsigned char bFamily = 0; unsigned char bCharSet = 0; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp index f8b19e0b4b..b4cff4fc91 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Cell.cpp @@ -59,8 +59,7 @@ void Cell::load(CFRecord& record) { record >> rw >> col; - if (record.getGlobalWorkbookInfo()->Version == 0x0200 || - record.getGlobalWorkbookInfo()->Version == 0x0400) + if (record.getGlobalWorkbookInfo()->Version == 0x0200) { unsigned char flags1, flags2, flags3; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ptg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ptg.cpp index 0e14f130b3..240ed8b59d 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ptg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/Ptg.cpp @@ -61,7 +61,10 @@ const size_t Ptg::getSizeOfStruct() const void Ptg::addFuncWrapper(AssemblerStack& ptg_stack, const std::wstring& func_name) { - ptg_stack.top() = func_name + L'(' + ptg_stack.top() + L')'; + if (false == ptg_stack.empty()) + { + ptg_stack.top() = func_name + L'(' + ptg_stack.top() + L')'; + } } void Ptg::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/FORMATTING.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/FORMATTING.cpp index 1acc388886..11510a8d2b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/FORMATTING.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/FORMATTING.cpp @@ -196,6 +196,9 @@ void FORMATTING::update_xfs() } } xfs->RegisterFillBorder(); + + global_info->cellXfs_count = xfs->m_arCellXFs.size(); + global_info->cellStyleXfs_count = xfs->m_arCellStyles.size(); } void FORMATTING::concatinate(FORMATTING* ext) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/WorksheetSubstream.cpp b/MsBinaryFile/XlsFile/Format/Logic/WorksheetSubstream.cpp index 0398daa20f..e6d83c91c1 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/WorksheetSubstream.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/WorksheetSubstream.cpp @@ -89,6 +89,7 @@ #include "Biff_records/XF.h" #include "Biff_records/Format.h" #include "Biff_records/Font.h" +#include "Biff_records/Palette.h" #include "Biff_structures/ODRAW/OfficeArtDgContainer.h" @@ -618,6 +619,7 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) case rt_XF_BIFF2: case rt_XF_BIFF3: case rt_XF_BIFF4: + case rt_XF: { size_t cell_xf_current_id = 0; size_t style_xf_current_id = 0; @@ -638,6 +640,15 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) XF_BIFF2 xf(cell_xf_current_id, style_xf_current_id); count = proc.repeated(xf, 0, 0); } + else + { + int store = global_info_->Version; + global_info_->Version = 0x0600; + XF xf(cell_xf_current_id, style_xf_current_id); + count = proc.repeated(xf, 0, 0); + + global_info_->Version = store; + } XFS* xfs = new XFS(); int ind = 0; while (count > 0 && !elements_.empty()) @@ -696,6 +707,16 @@ const bool WorksheetSubstream::loadContent(BinProcessor& proc) elements_.pop_back(); } }break; + case rt_Palette: + { + if (proc.optional()) + { + FORMATTING* fmts = dynamic_cast(m_Formating.get()); + if (fmts) + fmts->m_Palette = elements_.back(); + elements_.pop_back(); + } + }break; default://unknown .... skip { proc.SkipRecord(); From 830c5ec12c368a1755a0dff9fe09e7bf954f7244 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Wed, 18 Sep 2024 10:52:04 +0300 Subject: [PATCH 61/82] fix bug #46132 --- MsBinaryFile/XlsFile/Format/Logic/Biff_unions/CELLTABLE.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/CELLTABLE.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/CELLTABLE.cpp index de5672ed05..d13a880414 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/CELLTABLE.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_unions/CELLTABLE.cpp @@ -258,8 +258,8 @@ int CELLTABLE::serialize(std::wostream & stream) if (xf < global_info_->cellXfs_count && xf >= 0) { CP_XML_ATTR(L"s", xf); - CP_XML_ATTR(L"customFormat", true); } + CP_XML_ATTR(L"customFormat", true); } if (row->miyRw > 0 && row->miyRw < 0x8000 && row->bValid && ((row->fUnsynced && row->fGhostDirty) || !row->fGhostDirty)) From 81c9ae120f7038066b30a7921b5596e24026d306 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 18 Sep 2024 14:45:20 +0300 Subject: [PATCH 62/82] Fix bug 70293 --- DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js index bf47932f88..895a4e4250 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js @@ -841,6 +841,8 @@ CFile.prototype["getButtonIcons"] = function(pageIndex, width, height, backgroun let reader = ptr.getReader(); if (!reader) return {}; + + let res = {}; res["MK"] = []; res["View"] = []; From db287518751e5e2cdd8fc839077a0d7bd8257349 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 18 Sep 2024 22:02:21 +0500 Subject: [PATCH 63/82] Fix placeholder conversion --- OdfFile/DataTypes/presentationclass.cpp | 2 ++ OdfFile/DataTypes/presentationclass.h | 3 +- OdfFile/Reader/Converter/pptx_drawing.cpp | 21 +++++++++++++- OdfFile/Reader/Format/draw_frame.cpp | 1 - OdfFile/Reader/Format/draw_frame.h | 2 ++ OdfFile/Reader/Format/draw_frame_pptx.cpp | 29 ++++++++++++++++++- OdfFile/Writer/Converter/ConvertDrawing.cpp | 17 +++++++++-- OdfFile/Writer/Converter/PptxConverter.cpp | 2 +- OdfFile/Writer/Format/odf_drawing_context.cpp | 1 + 9 files changed, 70 insertions(+), 8 deletions(-) diff --git a/OdfFile/DataTypes/presentationclass.cpp b/OdfFile/DataTypes/presentationclass.cpp index c8239e863f..d57a34dad6 100644 --- a/OdfFile/DataTypes/presentationclass.cpp +++ b/OdfFile/DataTypes/presentationclass.cpp @@ -57,6 +57,7 @@ std::wostream & operator << (std::wostream & _Wostream, const presentation_class case presentation_class::handout: _Wostream << L"handout"; break; case presentation_class::outline: _Wostream << L"outline"; break; case presentation_class::text: _Wostream << L"text"; break; + case presentation_class::body: _Wostream << L"body"; break; } return _Wostream; } @@ -81,6 +82,7 @@ presentation_class presentation_class::parse(const std::wstring & Str) else if (tmp == L"footer") return presentation_class( footer ); else if (tmp == L"date-time") return presentation_class( date_time ); else if (tmp == L"page-number") return presentation_class( page_number ); + else if (tmp == L"body") return presentation_class( body ); else { return presentation_class( page ); diff --git a/OdfFile/DataTypes/presentationclass.h b/OdfFile/DataTypes/presentationclass.h index d91c067d63..7521aa695e 100644 --- a/OdfFile/DataTypes/presentationclass.h +++ b/OdfFile/DataTypes/presentationclass.h @@ -56,8 +56,9 @@ public: header, footer, date_time, - page_number + page_number, + body }; presentation_class() {} diff --git a/OdfFile/Reader/Converter/pptx_drawing.cpp b/OdfFile/Reader/Converter/pptx_drawing.cpp index 3a8563756d..eb2821d40d 100644 --- a/OdfFile/Reader/Converter/pptx_drawing.cpp +++ b/OdfFile/Reader/Converter/pptx_drawing.cpp @@ -58,7 +58,26 @@ void pptx_serialize_text(std::wostream & strm, _pptx_drawing & val) { CP_XML_NODE(L"a:p")//empty a:p { - CP_XML_NODE(L"a:endParaRPr"); + CP_XML_NODE(L"a:endParaRPr") + { + _CP_OPT(double) font_size; + odf_reader::GetProperty(val.additional, L"placeholder-font-size", font_size); + if (font_size) + CP_XML_ATTR(L"sz", *font_size * 100); + + _CP_OPT(std::wstring) text_color; + odf_reader::GetProperty(val.additional, L"placeholder-text-color", text_color); + if (text_color) + { + CP_XML_NODE(L"a:solidFill") + { + CP_XML_NODE(L"a:srgbClr") + { + CP_XML_ATTR_OPT(L"val", text_color); + } + } + } + } } } } diff --git a/OdfFile/Reader/Format/draw_frame.cpp b/OdfFile/Reader/Format/draw_frame.cpp index 53a0079c75..d595634c86 100644 --- a/OdfFile/Reader/Format/draw_frame.cpp +++ b/OdfFile/Reader/Format/draw_frame.cpp @@ -313,7 +313,6 @@ void draw_frame::add_child_element( xml::sax * Reader, const std::wstring & Ns, } } - /////////////////////// void draw_text_box_attlist::add_attributes( const xml::attributes_wc_ptr & Attributes ) diff --git a/OdfFile/Reader/Format/draw_frame.h b/OdfFile/Reader/Format/draw_frame.h index 6325d12a70..157e06d0d9 100644 --- a/OdfFile/Reader/Format/draw_frame.h +++ b/OdfFile/Reader/Format/draw_frame.h @@ -159,6 +159,8 @@ public: virtual void pptx_convert(oox::pptx_conversion_context & Context); virtual void pptx_convert_placeHolder(oox::pptx_conversion_context & Context); + void pptx_convert_placeHolder_styles(oox::pptx_conversion_context& Context, const paragraph_format_properties* paragraph_props, const text_format_properties* text_props); + virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const; int idx_in_owner ; diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index a4f43aeff6..1202f9063d 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -204,6 +204,17 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) bool is_placeholder = common_presentation_attlist_.presentation_placeholder_.get_value_or(Bool(false)).get(); Context.get_slide_context().set_is_placeHolder(is_placeholder); } + + if (!textStyleName.empty()) + { + odf_reader::style_instance* textStyleInst = + Context.root()->odf_context().styleContainer().style_by_name(textStyleName, odf_types::style_family::Paragraph, Context.process_masters_); + + paragraph_format_properties paragraph_properties = calc_paragraph_properties_content(textStyleInst); + text_format_properties_ptr text_properties = calc_text_properties_content(textStyleInst); + + pptx_convert_placeHolder_styles(Context, ¶graph_properties, text_properties.get()); + } } if (common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_) @@ -251,6 +262,23 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) Context.get_slide_context().end_frame(); } +void draw_frame::pptx_convert_placeHolder_styles(oox::pptx_conversion_context& Context, const paragraph_format_properties* paragraph_props, const text_format_properties* text_props) +{ + if (text_props) + { + if (text_props->fo_color_) + Context.get_slide_context().set_property(odf_reader::_property(L"placeholder-text-color", text_props->fo_color_->get_hex_value())); + if (text_props->fo_font_size_) + Context.get_slide_context().set_property( + odf_reader::_property(L"placeholder-font-size", text_props->fo_font_size_->get_length().get_value_unit(odf_types::length::pt))); + } + + if (paragraph_props) + { + //if(paragraph_props->fo_text_align_) + } +} + void draw_image::pptx_convert(oox::pptx_conversion_context & Context) { if (draw_frame_ptr) @@ -329,7 +357,6 @@ void draw_text_box::pptx_convert(oox::pptx_conversion_context & Context) frame->content_.push_back(elm); frame->pptx_convert(Context); - } return; } diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 6c94c353cb..a9dec20018 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -874,7 +874,7 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape) //----------------------------------------------------------------------------- odf_context()->drawing_context()->start_shape(type); - if (odf_context()->drawing_context()->placeholder_replacing()) + if (oox_shape->nvSpPr.nvPr.ph.is_init()) { _CP_PTR(cpdoccore::odf_writer::paragraph_format_properties) paragraph_properties = boost::make_shared(); _CP_PTR(cpdoccore::odf_writer::text_format_properties) text_properties = boost::make_shared(); @@ -882,12 +882,23 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape) convert(oox_shape->txBody->lstStyle.GetPointer(), 0, paragraph_properties.get(), text_properties.get()); - graphic_properties->draw_textarea_horizontal_align_ = odf_types::text_align(odf_types::text_align::Left); - graphic_properties->draw_textarea_vertical_align_ = odf_types::vertical_align(odf_types::vertical_align::Top); + if (odf_context()->drawing_context()->placeholder_replacing()) + { + graphic_properties->draw_textarea_horizontal_align_ = odf_types::text_align(odf_types::text_align::Left); + graphic_properties->draw_textarea_vertical_align_ = odf_types::vertical_align(odf_types::vertical_align::Top); + } odf_context()->drawing_context()->set_text_properties(text_properties.get()); odf_context()->drawing_context()->set_paragraph_properties(paragraph_properties.get()); odf_context()->drawing_context()->set_graphic_properties(graphic_properties.get()); + + if (oox_shape->txBody.IsInit()) + { + odf_context()->start_text_context(); + convert(oox_shape->txBody->bodyPr.GetPointer()); + odf_context()->drawing_context()->set_text(odf_context()->text_context()); + odf_context()->end_text_context(); + } } convert(&oox_shape->spPr, oox_shape->style.GetPointer()); diff --git a/OdfFile/Writer/Converter/PptxConverter.cpp b/OdfFile/Writer/Converter/PptxConverter.cpp index a6f8187776..4bc2d877ef 100644 --- a/OdfFile/Writer/Converter/PptxConverter.cpp +++ b/OdfFile/Writer/Converter/PptxConverter.cpp @@ -2783,7 +2783,7 @@ void PptxConverter::convert_slide(PPTX::Logic::CSld *oox_slide, PPTX::Logic::TxS if (type == Slide && ph_type == 0) { placeholder_replacing = true; - ph_type = 13; // subtitle + ph_type = 16; // body } if (type == Layout && (ph_type == 5 || ph_type == 6 || ph_type == 7 || ph_type == 12)) diff --git a/OdfFile/Writer/Format/odf_drawing_context.cpp b/OdfFile/Writer/Format/odf_drawing_context.cpp index 74d64642ce..586c9da949 100644 --- a/OdfFile/Writer/Format/odf_drawing_context.cpp +++ b/OdfFile/Writer/Format/odf_drawing_context.cpp @@ -1519,6 +1519,7 @@ void odf_drawing_context::set_placeholder_type (int val) case 13: impl_->current_drawing_state_.presentation_class_ = presentation_class::subtitle; break; case 14: impl_->current_drawing_state_.presentation_class_ = presentation_class::table; break; case 15: impl_->current_drawing_state_.presentation_class_ = presentation_class::title; break; + case 16: impl_->current_drawing_state_.presentation_class_ = presentation_class::body; break; default: impl_->current_drawing_state_.presentation_class_ = presentation_class::outline; break; } From 07c0c583757a1ea9f11aaebb3900aa5568ef3c30 Mon Sep 17 00:00:00 2001 From: Green Date: Wed, 18 Sep 2024 20:50:33 +0300 Subject: [PATCH 64/82] Fix bug #70320 --- HtmlFile2/htmlfile2.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index c53563ecbe..23d5e161c8 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -3943,6 +3943,11 @@ private: CloseR(pXml); } + #define WRITE_ENCODE_ARGUMENT(ptrStringBuilder, argumentName, argumentValue) \ + ptrStringBuilder->WriteString(L" " + std::wstring(argumentName) + L"=\""); \ + ptrStringBuilder->WriteEncodeXmlString(argumentValue); \ + ptrStringBuilder->WriteString(L"\"") + void WriteEmptyImage(NSStringUtils::CStringBuilder* pXml, int nWidth, int nHeight, const std::wstring& wsName = L"", const std::wstring& wsDescr = L"") { if (NULL == pXml) @@ -3951,10 +3956,17 @@ private: OpenR(pXml); pXml->WriteString(L""); - pXml->WriteString(L""); + pXml->WriteString(L"WriteString(L"/>"); pXml->WriteString(L""); pXml->WriteString(L""); - pXml->WriteString(L""); + pXml->WriteString(L"WriteString(L"/>"); + pXml->WriteString(L""); pXml->WriteString(L""); pXml->WriteString(L""); pXml->WriteString(L""); From 2456501f1d633cdfe6dd6850d2d58be452b3557c Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Thu, 19 Sep 2024 08:03:30 +0300 Subject: [PATCH 65/82] Fixes for txt/csv --- X2tConverter/src/cextracttools.h | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index ad14339145..32f0e3811f 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -1042,7 +1042,7 @@ namespace NExtractTools } else { - if (!getDontSaveAdditional()) + if (false/*not used*/ && !getDontSaveAdditional()) { int nCodePage = getEncodingByContent(); if (nCodePage < 0) @@ -1056,26 +1056,13 @@ namespace NExtractTools oBuilder.WriteString(_T("}")); std::wstring sFilePath = NSSystemPath::GetDirectoryName(*m_sFileTo) + FILE_SEPARATOR_STR + _T("settings.json"); NSFile::CFileBinary::SaveToFile(sFilePath, oBuilder.GetData()); - copyOrigin(*m_sFileFrom, *m_sFileTo); - - eRes = TCD_ERROR; } - else - { - if (!m_nCsvTxtEncoding) - { - m_nCsvTxtEncoding = new int(getEncodingByContent()); - if (*m_nCsvTxtEncoding < 0) - { - *m_nCsvTxtEncoding = 46; // utf-8 - } - } - if (!m_nCsvDelimiter && !m_sCsvDelimiterChar) - { - m_sCsvDelimiterChar = new std::wstring(L","); // TCSVD_COMMA - } + if (!getDontSaveAdditional()) + { + copyOrigin(*m_sFileFrom, *m_sFileTo); } + eRes = TCD_ERROR; } } return eRes; From fd90fbae21a0e7b5a0df4d948b632b2dd11030e4 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Thu, 19 Sep 2024 13:01:07 +0500 Subject: [PATCH 66/82] Fix bug #70318 --- OdfFile/Reader/Format/anim_elements.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/OdfFile/Reader/Format/anim_elements.cpp b/OdfFile/Reader/Format/anim_elements.cpp index b83df357d4..6577dfee8d 100644 --- a/OdfFile/Reader/Format/anim_elements.cpp +++ b/OdfFile/Reader/Format/anim_elements.cpp @@ -1176,8 +1176,11 @@ void anim_transitionFilter::convert_slide_transition_filter(oox::pptx_conversion break; case smil_transition_type::randomBarWipe: type = L"randomBar"; - if (filter_attlist_.smil_subtype_.get() == L"vertical") dir = L"vert"; - else if (filter_attlist_.smil_subtype_.get() == L"horizontal") dir = L"horz"; + if (filter_attlist_.smil_subtype_) + { + if (filter_attlist_.smil_subtype_.get() == L"vertical") dir = L"vert"; + else if (filter_attlist_.smil_subtype_.get() == L"horizontal") dir = L"horz"; + } break; case smil_transition_type::pushWipe: type = L"push"; From 30868b81bcd0ecd7f15d74a086b4188663da5d25 Mon Sep 17 00:00:00 2001 From: Green Date: Sat, 21 Sep 2024 16:16:53 +0300 Subject: [PATCH 67/82] Fix bug #70339 --- HtmlFile2/htmlfile2.cpp | 1718 +++++++++++++++++++++++++-------------- 1 file changed, 1107 insertions(+), 611 deletions(-) diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index ce7dea25f7..9c3bfda306 100644 --- a/HtmlFile2/htmlfile2.cpp +++ b/HtmlFile2/htmlfile2.cpp @@ -57,6 +57,167 @@ const static double HTML_FONTS[7] = {7.5, 10, 12, 13.5, 18, 24, 36}; +#define HTML_TAG(tag) GUMBO_TAG_##tag +#define ADD_TAG(strName, enumName) {strName, HTML_TAG(enumName)} +#define SKIP_TAG SCRIPT +#define UNKNOWN_TAG GumboTag::GUMBO_TAG_UNKNOWN + +#define HtmlTag GumboTag + +const std::map m_HTML_TAGS +{ + ADD_TAG(L"a", A), + ADD_TAG(L"abbr", ABBR), + ADD_TAG(L"acronym", ACRONYM), + ADD_TAG(L"address", ADDRESS), + ADD_TAG(L"applet", APPLET), + ADD_TAG(L"area", AREA), + ADD_TAG(L"article", ARTICLE), + ADD_TAG(L"aside", ASIDE), + ADD_TAG(L"audio", AUDIO), + ADD_TAG(L"b", B), + ADD_TAG(L"base", BASE), + ADD_TAG(L"basefont", BASEFONT), + ADD_TAG(L"bdi", BDI), + ADD_TAG(L"bdo", BDO), + ADD_TAG(L"bgsound", BGSOUND), + ADD_TAG(L"blockquote", BLOCKQUOTE), + ADD_TAG(L"big", BIG), + ADD_TAG(L"body", BODY), + ADD_TAG(L"blink", BLINK), + ADD_TAG(L"br", BR), + ADD_TAG(L"button", BUTTON), + ADD_TAG(L"canvas", CANVAS), + ADD_TAG(L"caption", CAPTION), + ADD_TAG(L"center", CENTER), + ADD_TAG(L"cite", CITE), + ADD_TAG(L"code", CODE), + ADD_TAG(L"col", COL), + ADD_TAG(L"colgroup", COLGROUP), + ADD_TAG(L"command", SKIP_TAG), // Данного обозначения нет, но т.к.мы всё равно пропускаем, то делаем script + ADD_TAG(L"comment", SKIP_TAG), // Данного обозначения нет, но т.к.мы всё равно пропускаем, то делаем script + ADD_TAG(L"datalist", DATALIST), + ADD_TAG(L"dd", DD), + ADD_TAG(L"del", DEL), + ADD_TAG(L"details", DETAILS), + ADD_TAG(L"dfn", DFN), + ADD_TAG(L"dir", DIR), + ADD_TAG(L"div", DIV), + ADD_TAG(L"dl", DL), + ADD_TAG(L"dt", DT), + ADD_TAG(L"em", EM), + ADD_TAG(L"embed", EMBED), + ADD_TAG(L"fieldset", FIELDSET), + ADD_TAG(L"figcaption", FIGCAPTION), + ADD_TAG(L"figure", FIGURE), + ADD_TAG(L"font", FONT), + ADD_TAG(L"form", FORM), + ADD_TAG(L"footer", FOOTER), + ADD_TAG(L"frame", FRAME), + ADD_TAG(L"frameset", FRAMESET), + ADD_TAG(L"h1", H1), + ADD_TAG(L"h2", H2), + ADD_TAG(L"h3", H3), + ADD_TAG(L"h4", H4), + ADD_TAG(L"h5", H5), + ADD_TAG(L"h6", H6), + ADD_TAG(L"head", HEAD), + ADD_TAG(L"header", HEADER), + ADD_TAG(L"hgroup", HGROUP), + ADD_TAG(L"hr", HR), + ADD_TAG(L"html", HTML), + ADD_TAG(L"i", I), + ADD_TAG(L"iframe", IFRAME), + ADD_TAG(L"img", IMG), + ADD_TAG(L"input", INPUT), + ADD_TAG(L"ins", INS), + ADD_TAG(L"isindex", ISINDEX), + ADD_TAG(L"kbd", KBD), + ADD_TAG(L"keygen", KEYGEN), + ADD_TAG(L"label", LABEL), + ADD_TAG(L"legend", LEGEND), + ADD_TAG(L"li", LI), + ADD_TAG(L"link", LINK), + ADD_TAG(L"main", MAIN), + ADD_TAG(L"map", MAP), + ADD_TAG(L"marquee", MARQUEE), + ADD_TAG(L"mark", MARK), + ADD_TAG(L"menu", MENU), + ADD_TAG(L"meta", META), + ADD_TAG(L"meter", METER), + ADD_TAG(L"nav", NAV), + ADD_TAG(L"nobr", NOBR), + ADD_TAG(L"noembed", NOEMBED), + ADD_TAG(L"noframes", NOFRAMES), + ADD_TAG(L"noscript", NOSCRIPT), + ADD_TAG(L"object", OBJECT), + ADD_TAG(L"ol", OL), + ADD_TAG(L"optgroup", OPTGROUP), + ADD_TAG(L"option", OPTION), + ADD_TAG(L"output", OUTPUT), + ADD_TAG(L"p", P), + ADD_TAG(L"param", PARAM), + ADD_TAG(L"plaintext", PLAINTEXT), + ADD_TAG(L"pre", PRE), + ADD_TAG(L"progress", PROGRESS), + ADD_TAG(L"q", Q), + ADD_TAG(L"rp", RP), + ADD_TAG(L"rt", RT), + ADD_TAG(L"ruby", RUBY), + ADD_TAG(L"s", S), + ADD_TAG(L"samp", SAMP), + ADD_TAG(L"script", SCRIPT), + ADD_TAG(L"section", SECTION), + ADD_TAG(L"select", SELECT), + ADD_TAG(L"small", SMALL), + ADD_TAG(L"span", SPAN), + ADD_TAG(L"source", SOURCE), + ADD_TAG(L"strike", STRIKE), + ADD_TAG(L"strong", STRONG), + ADD_TAG(L"style", STYLE), + ADD_TAG(L"sub", SUB), + ADD_TAG(L"summary", SUMMARY), + ADD_TAG(L"sup", SUP), + ADD_TAG(L"table", TABLE), + ADD_TAG(L"tbody", TBODY), + ADD_TAG(L"td", TD), + ADD_TAG(L"textarea", TEXTAREA), + ADD_TAG(L"tfoot", TFOOT), + ADD_TAG(L"th", TH), + ADD_TAG(L"thead", THEAD), + ADD_TAG(L"time", TIME), + ADD_TAG(L"title", TITLE), + ADD_TAG(L"tr", TR), + ADD_TAG(L"tt", TT), + ADD_TAG(L"u", U), + ADD_TAG(L"ul", UL), + ADD_TAG(L"var", VAR), + ADD_TAG(L"video", VIDEO), + ADD_TAG(L"wbr", WBR), + ADD_TAG(L"xmp", XMP), + + ADD_TAG(L"svg", SVG) +}; + +bool TagIsUnprocessed(const std::wstring& wsTagName) +{ + return L"xml" == wsTagName; +} + +static inline HtmlTag GetHtmlTag(const std::wstring& wsStrTag) +{ + std::map::const_iterator oFound = m_HTML_TAGS.find(wsStrTag); + + if (oFound == m_HTML_TAGS.cend()) + { + if (wsStrTag.length() > 3 && wsStrTag.compare(wsStrTag.length() - 3, 3, L"svg") == 0) + return HTML_TAG(SVG); + return UNKNOWN_TAG; + } + + return oFound->second; +} + // Ячейка таблицы struct CTc { @@ -1289,8 +1450,10 @@ private: bool m_bWasSpace; // Был пробел? bool m_bInHyperlink; // открыт? + bool m_bBanUpdatePageData; // Запретить обновление данных о странице? + TState() - : m_bInP(false), m_bInR(false), m_bInT(false), m_bWasPStyle(false), m_bWasSpace(true), m_bInHyperlink(false) + : m_bInP(false), m_bInR(false), m_bInT(false), m_bWasPStyle(false), m_bWasSpace(true), m_bInHyperlink(false), m_bBanUpdatePageData(false) {} } m_oState; @@ -2151,638 +2314,965 @@ private: readStream(&m_oDocXml, sSelectors, oTS); } + bool ReadText(NSStringUtils::CStringBuilder* pXml, const std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + std::wstring sText = m_oLightReader.GetText(); + + if (sText.end() == std::find_if_not(sText.begin(), sText.end(), [](wchar_t wchChar){ return iswspace(wchChar);})) + return false; + + if(oTS.bBdo) + std::reverse(sText.begin(), sText.end()); + + const bool bInT = m_oState.m_bInT; + + if (oTS.bPre) + { + CloseT(pXml); + CloseR(pXml); + } + + if (oTS.bAddSpaces && m_oState.m_bInP && !m_oState.m_bInR && !iswspace(sText.front()) && !m_oState.m_bWasSpace && CTextSettings::Normal == oTS.eTextMode) + WriteSpace(pXml); + + OpenP(pXml); + + NSStringUtils::CStringBuilder oPPr; + + std::wstring sPStyle = wrP(&oPPr, arSelectors, oTS); + + pXml->WriteString(oPPr.GetData()); + + NSStringUtils::CStringBuilder oRPr; + std::wstring sRStyle; + + if (OpenR(pXml)) + { + sRStyle = wrRPr(&oRPr, arSelectors, oTS); + + pXml->WriteString(oRPr.GetData()); + + if (oTS.bQ) + pXml->WriteString(L"""); + } + + if (oTS.bQ) + pXml->WriteString(L"""); + + if(oTS.bPre) + { + if (L'\n' == sText.front() || L'\r' == sText.front()) + sText.erase(0, 1); + + size_t nAfter = sText.find_first_of(L"\n\r\t"); + while(nAfter != std::wstring::npos) + { + if (L'\t' == sText[0]) + { + pXml->WriteString(L""); + sText.erase(0, 1); + + if (0 == nAfter) + { + nAfter = sText.find_first_of(L"\n\r\t"); + continue; + } + + nAfter--; + } + + OpenT(pXml); + pXml->WriteEncodeXmlString(sText.c_str(), nAfter); + CloseT(pXml); + CloseR(pXml); + + if (L'\t' == sText[nAfter]) + { + sText.erase(0, nAfter); + nAfter = 1; + } + else + { + CloseP(pXml, arSelectors); + OpenP(pXml); + pXml->WriteString(oPPr.GetData()); + sText.erase(0, nAfter + 1); + nAfter = 0; + } + OpenR(pXml); + pXml->WriteString(oRPr.GetData()); + nAfter = sText.find_first_of(L"\n\r\t", nAfter); + } + + if (sText.empty()) + return true; + } + else + ReplaceSpaces(sText); + + if (!sText.empty() && L'\t' == sText[0]) + { + pXml->WriteString(L""); + sText.erase(0, 1); + } + + if (!oTS.bPre && !sText.empty() && std::iswspace(sText.front()) && m_oState.m_bWasSpace) + sText.erase(0, 1); + + if (!sText.empty()) + { + OpenT(pXml); + + if (oTS.bMergeText && !m_oState.m_bWasSpace && bInT && !oTS.bPre) + pXml->WriteEncodeXmlString(L" "); + + m_oState.m_bWasSpace = std::iswspace(sText.back()); + + pXml->WriteEncodeXmlString(sText); + } + + if (oTS.bQ) + pXml->WriteString(L"""); + + if (!oTS.bMergeText) + { + CloseT(pXml); + CloseR(pXml); + } + + return true; + } + + bool ReadAbbr(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS, std::wstring& wsNote) + { + if (NULL == pXml || wsNote.empty()) + return false; + + wrP(pXml, arSelectors, oTS); + const std::wstring wsName{L"Bookmark" + std::to_wstring(m_mBookmarks.size() + 1)}; + m_mBookmarks.insert(std::make_pair(wsName, m_mBookmarks.size() + 1)); + pXml->WriteString(L"HYPERLINK \\l \"" + wsName + L"\" \\o \""); + pXml->WriteEncodeXmlString(wsNote); + pXml->WriteString(L"\""); + pXml->WriteString(L""); + const bool bResult = readStream(pXml, arSelectors, oTS); + pXml->WriteString(L""); + wsNote.clear(); + + return bResult; + } + + bool ReadBold(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oFont.SetWeight(L"bold", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadBdo(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + const std::wstring sDir{GetArgumentValue(L"dir")}; + + CTextSettings oTSBdo(oTS); + oTSBdo.bBdo = (sDir == L"rtl"); + + return readStream(pXml, arSelectors, oTSBdo); + } + + bool ReadBdi(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSBdo(oTS); + oTSBdo.bBdo = false; + return readStream(pXml, arSelectors, oTSBdo); + } + + bool ReadBr(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + if (m_oState.m_bInP) + { + OpenR(pXml); + NSCSS::CCompiledStyle oStyle = m_oStylesCalculator.GetCompiledStyle(arSelectors); + if(oStyle.m_oText.GetAlign() == L"both") + pXml->WriteString(L""); + pXml->WriteString(L""); + CloseR(pXml); + } + else + WriteEmptyParagraph(pXml, false, m_oState.m_bInP); + + m_oState.m_bWasSpace = true; + + return true; + } + + bool ReadCenter(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSP(oTS); + oTSP.oAdditionalStyle.m_oText.SetAlign(L"center", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSP); + } + + bool ReadItalic(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oFont.SetStyle(L"italic", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadCode(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml || arSelectors.empty()) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", UINT_MAX, true); + oTSR.oAdditionalStyle.m_oFont.SetSize(20, UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadKbd(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", UINT_MAX, true); + oTSR.oAdditionalStyle.m_oFont.SetSize(20, UINT_MAX, true); + oTSR.oAdditionalStyle.m_oFont.SetWeight(L"bold", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadSamp(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadStrike(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oText.SetDecoration(L"line-through", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadFont(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + + while(m_oLightReader.MoveToNextAttribute()) + { + std::wstring sAName = m_oLightReader.GetName(); + if(sAName == L"color") + oTSR.oAdditionalStyle.m_oText.SetColor(m_oLightReader.GetText(), UINT_MAX, true); + else if(sAName == L"face") + oTSR.oAdditionalStyle.m_oFont.SetFamily(m_oLightReader.GetText(), UINT_MAX, true); + else if(sAName == L"size") + { + int nSize = 3; + const std::wstring sSize = m_oLightReader.GetText(); + if(!sSize.empty()) + { + if(sSize.front() == L'+') + nSize += NSStringFinder::ToInt(sSize.substr(1)); + else if(sSize.front() == L'-') + nSize -= NSStringFinder::ToInt(sSize.substr(1)); + else + nSize = NSStringFinder::ToInt(sSize); + } + + if (nSize < 1 || nSize > 7) + nSize = 3; + + oTSR.oAdditionalStyle.m_oFont.SetSize(HTML_FONTS[nSize - 1], UINT_MAX, true); + } + } + m_oLightReader.MoveToElement(); + const bool bResult = readStream(pXml, arSelectors, oTSR); + m_oState.m_bWasSpace = true; + + return bResult; + } + + bool ReadUnderline(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oText.SetDecoration(L"underline", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadMark(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.oAdditionalStyle.m_oText.SetHighlight(L"yellow", UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadQ(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSQ(oTS); + oTSQ.bQ = true; + + return readStream(pXml, arSelectors, oTSQ); + } + + bool ReadSup(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.eTextMode = CTextSettings::Superscript; + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadSub(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSR(oTS); + oTSR.eTextMode = CTextSettings::Subscript; + + return readStream(pXml, arSelectors, oTSR); + } + + bool ReadSpan(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml || arSelectors.empty() || arSelectors.back().m_wsClass == L"MsoFootnoteReference") + return false; + + return readStream(pXml, arSelectors, oTS); + } + + bool ReadNobr(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSPre(oTS); + oTSPre.bPre = true; + + return readStream(pXml, arSelectors, oTSPre); + } + + bool ReadBasefont(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml || !m_oLightReader.MoveToFirstAttribute()) + return false; + + do + { + if (L"face" == m_oLightReader.GetName()) + oTS.oAdditionalStyle.m_oFont.SetFamily(m_oLightReader.GetText(), UINT_MAX, true); + else if (L"size" == m_oLightReader.GetName()) + { + switch(NSStringFinder::ToInt(m_oLightReader.GetText(), 3)) + { + case 1: oTS.oAdditionalStyle.m_oFont.SetSize(7.5, UINT_MAX, true); break; + case 2: oTS.oAdditionalStyle.m_oFont.SetSize(10, UINT_MAX, true); break; + default: + case 3: oTS.oAdditionalStyle.m_oFont.SetSize(12, UINT_MAX, true); break; + case 4: oTS.oAdditionalStyle.m_oFont.SetSize(13.5, UINT_MAX, true); break; + case 5: oTS.oAdditionalStyle.m_oFont.SetSize(18, UINT_MAX, true); break; + case 6: oTS.oAdditionalStyle.m_oFont.SetSize(24, UINT_MAX, true); break; + case 7: oTS.oAdditionalStyle.m_oFont.SetSize(36, UINT_MAX, true); break; + } + } + else if (L"color" == m_oLightReader.GetName()) + oTS.oAdditionalStyle.m_oText.SetColor(m_oLightReader.GetText(), UINT_MAX, true); + } while (m_oLightReader.MoveToNextAttribute()); + + m_oLightReader.MoveToElement(); + + oTS.oAdditionalStyle.SetID(m_oStylesCalculator.CalculateStyleId(arSelectors.back())); + + return true; + } + + bool ReadDD(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSP(oTS); + oTSP.oAdditionalStyle.m_oMargin.SetLeft(720, UINT_MAX, true); + + return readStream(pXml, arSelectors, oTSP); + } + + bool ReadDiv(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + if (!m_oState.m_bBanUpdatePageData) + m_oStylesCalculator.CalculatePageStyle(m_oPageData, arSelectors); + + int bMsoFootnote = 0; + std::wstring sFootnoteID; + while (m_oLightReader.MoveToNextAttribute()) + { + std::wstring sAName = m_oLightReader.GetName(); + std::wstring sAText = m_oLightReader.GetText(); + if (sAName == L"epub:type" && sAText == L"footnote") + bMsoFootnote++; + else if (sAName == L"style" && sAText == L"mso-element:footnote") + bMsoFootnote++; + else if (sAName == L"id") + { + std::map::iterator it = m_mFootnotes.find(sAText); + if (it != m_mFootnotes.end()) + { + bMsoFootnote++; + sFootnoteID = it->second; + } + } + } + m_oLightReader.MoveToElement(); + if (bMsoFootnote >= 2) + { + m_oNoteXml.WriteString(L""); + readStream(&m_oNoteXml, arSelectors, oTS); + m_oNoteXml.WriteString(L""); + } + else + return readStream(pXml, arSelectors, oTS); + + return true; + } + + bool ReadBlockquote(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oNewTS{oTS}; + oNewTS.sPStyle += L""; + + return readStream(pXml, arSelectors, oNewTS); + } + + bool ReadHr(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + bool bPrint = true; + + for (const NSCSS::CNode& item : arSelectors) + { + if (item.m_wsName == L"div" && item.m_wsStyle == L"mso-element:footnote-list") + { + bPrint = false; + break; + } + } + + if (bPrint) + { + NSCSS::NSProperties::CDigit oSize, oWidth; + NSCSS::NSProperties::CColor oColor; + bool bShade = false; + std::wstring wsAlign{L"center"}; + + if (m_oLightReader.MoveToFirstAttribute()) + { + std::wstring wsAttributeName; + do + { + wsAttributeName = m_oLightReader.GetName(); + + if (L"align" == wsAttributeName) + { + const std::wstring wsValue{m_oLightReader.GetText()}; + + if (NSStringFinder::Equals(L"left", wsValue)) + wsAlign = L"left"; + else if (NSStringFinder::Equals(L"right", wsValue)) + wsAlign = L"right"; + else if (NSStringFinder::Equals(L"center", wsValue)) + wsAlign = L"center"; + } + if (L"color" == wsAttributeName) + oColor.SetValue(m_oLightReader.GetText()); + else if (L"noshade" == wsAttributeName) + bShade = true; + else if (L"size" == wsAttributeName) + oSize.SetValue(m_oLightReader.GetText()); + else if (L"width" == wsAttributeName) + oWidth.SetValue(m_oLightReader.GetText()); + } while (m_oLightReader.MoveToNextAttribute()); + + m_oLightReader.MoveToElement(); + } + + const bool bOpenedP = OpenP(pXml); + + OpenR(pXml); + WriteLine(pXml, wsAlign, (!oColor.Empty()) ? oColor.ToWString() : L"a0a0a0", bShade, (!oSize.Empty()) ? oSize.ToDouble(NSCSS::Point) : 1.5, (NSCSS::UnitMeasure::Percent == oWidth.GetUnitMeasure()) ? oWidth.ToDouble() : 0); + CloseR(pXml); + + if (bOpenedP) + CloseP(pXml, arSelectors); + + return true; + } + + return false; + } + + bool ReadPre(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSPre(oTS); + oTSPre.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", NEXT_LEVEL); + oTSPre.oAdditionalStyle.m_oFont.SetSize(20, NEXT_LEVEL); + oTSPre.oAdditionalStyle.m_oMargin.SetTop(0, NEXT_LEVEL); + oTSPre.oAdditionalStyle.m_oMargin.SetBottom(0, NEXT_LEVEL); + oTSPre.bPre = true; + + return readStream(pXml, arSelectors, oTSPre); + } + + bool ReadTextarea(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + CTextSettings oTSP(oTS); + oTSP.AddPStyle(L""); + + return readStream(pXml, arSelectors, oTSP); + } + + bool ReadDetails(NSStringUtils::CStringBuilder* pXml, std::vector& arSelectors, CTextSettings& oTS) + { + if (NULL == pXml) + return false; + + bool bOpened = false; + if (m_oLightReader.MoveToFirstAttribute()) + { + do + { + bOpened = (L"open" == m_oLightReader.GetName()); + } while (m_oLightReader.MoveToNextAttribute() && !bOpened); + } + m_oLightReader.MoveToElement(); + + int nDeath = m_oLightReader.GetDepth(); + if(m_oLightReader.IsEmptyNode() || !m_oLightReader.ReadNextSiblingNode2(nDeath)) + return false; + + NSStringUtils::CStringBuilder oSummary; + NSStringUtils::CStringBuilder oBody; + + const TState oCurrentState{m_oState}; + TState oSummaryState{m_oState}; + TState oBodyState{m_oState}; + + do + { + if (L"summary" == m_oLightReader.GetName()) + { + m_oState = oSummaryState; + if (0 == oSummary.GetSize()) + { + OpenP(&oSummary); + OpenR(&oSummary); + OpenT(&oSummary); + oSummary.WriteString((bOpened) ? L"\u25BD" : L"\u25B7"); + } + + readStream(&oSummary, arSelectors, oTS); + CloseP(&oSummary, arSelectors); + oSummaryState = m_oState; + m_oState = oCurrentState; + } + else if (bOpened) + { + m_oState = oBodyState; + readStream(&oBody, arSelectors, oTS); + CloseP(&oBody, arSelectors); + oBodyState = m_oState; + m_oState = oCurrentState; + } + } while (m_oLightReader.ReadNextSiblingNode2(nDeath)); + + pXml->WriteString(oSummary.GetData()); + + if (bOpened) + { + m_oState = oBodyState; + pXml->WriteString(oBody.GetData()); + } + + return true; + } + bool readInside (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS, const std::wstring& sName) { //TODO:: обработать все варианты return'а if(sName == L"#text") - { - std::wstring sText = m_oLightReader.GetText(); + return ReadText(oXml, sSelectors, oTS); - if (sText.end() == std::find_if_not(sText.begin(), sText.end(), [](wchar_t wchChar){ return iswspace(wchChar);})) - return false; - - if(oTS.bBdo) - std::reverse(sText.begin(), sText.end()); - - const bool bInT = m_oState.m_bInT; - - if (oTS.bPre) - { - CloseT(oXml); - CloseR(oXml); - } - - if (oTS.bAddSpaces && m_oState.m_bInP && !m_oState.m_bInR && !iswspace(sText.front()) && !m_oState.m_bWasSpace && CTextSettings::Normal == oTS.eTextMode) - WriteSpace(oXml); - - OpenP(oXml); - - NSStringUtils::CStringBuilder oPPr; - - std::wstring sPStyle = wrP(&oPPr, sSelectors, oTS); - - oXml->WriteString(oPPr.GetData()); - - NSStringUtils::CStringBuilder oRPr; - std::wstring sRStyle; - - if (OpenR(oXml)) - { - sRStyle = wrRPr(&oRPr, sSelectors, oTS); - - oXml->WriteString(oRPr.GetData()); - - if (oTS.bQ) - oXml->WriteString(L"""); - } - - if (oTS.bQ) - oXml->WriteString(L"""); - - if(oTS.bPre) - { - if (L'\n' == sText.front() || L'\r' == sText.front()) - sText.erase(0, 1); - - size_t nAfter = sText.find_first_of(L"\n\r\t"); - while(nAfter != std::wstring::npos) - { - if (L'\t' == sText[0]) - { - oXml->WriteString(L""); - sText.erase(0, 1); - - if (0 == nAfter) - { - nAfter = sText.find_first_of(L"\n\r\t"); - continue; - } - - nAfter--; - } - - OpenT(oXml); - oXml->WriteEncodeXmlString(sText.c_str(), nAfter); - CloseT(oXml); - CloseR(oXml); - - if (L'\t' == sText[nAfter]) - { - sText.erase(0, nAfter); - nAfter = 1; - } - else - { - CloseP(oXml, sSelectors); - OpenP(oXml); - oXml->WriteString(oPPr.GetData()); - sText.erase(0, nAfter + 1); - nAfter = 0; - } - OpenR(oXml); - oXml->WriteString(oRPr.GetData()); - nAfter = sText.find_first_of(L"\n\r\t", nAfter); - } - - if (sText.empty()) - return true; - } - else - ReplaceSpaces(sText); - - if (!sText.empty() && L'\t' == sText[0]) - { - oXml->WriteString(L""); - sText.erase(0, 1); - } - - if (!oTS.bPre && !sText.empty() && std::iswspace(sText.front()) && m_oState.m_bWasSpace) - sText.erase(0, 1); - - if (!sText.empty()) - { - OpenT(oXml); - - if (oTS.bMergeText && !m_oState.m_bWasSpace && bInT && !oTS.bPre) - oXml->WriteEncodeXmlString(L" "); - - m_oState.m_bWasSpace = std::iswspace(sText.back()); - - oXml->WriteEncodeXmlString(sText); - } - - if (oTS.bQ) - oXml->WriteString(L"""); - - if (!oTS.bMergeText) - { - CloseT(oXml); - CloseR(oXml); - } - - return true; - } + if (TagIsUnprocessed(sName)) + return false; std::wstring sNote = GetSubClass(oXml, sSelectors); bool bResult = true; // Ссылка // Область ссылки - if(sName == L"a" || sName == L"area") - readA(oXml, sSelectors, oTS, sNote); - else if (sName == L"abbr") + + const HtmlTag eHtmlTag{GetHtmlTag(sName)}; + + switch(eHtmlTag) { - if (!sNote.empty()) + case HTML_TAG(A): + case HTML_TAG(AREA): + { + bResult = readA(oXml, sSelectors, oTS, sNote); + break; + } + case HTML_TAG(ABBR): + { + bResult = ReadAbbr(oXml, sSelectors, oTS, sNote); + break; + } + case HTML_TAG(B): + case HTML_TAG(STRONG): + { + bResult = ReadBold(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(BDO): + { + bResult = ReadBdo(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(BDI): + { + bResult = ReadBdi(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(BR): + { + bResult = ReadBr(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(CENTER): + { + bResult = ReadCenter(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(CITE): + case HTML_TAG(DFN): + case HTML_TAG(EM): + case HTML_TAG(I): + case HTML_TAG(VAR): + { + bResult = ReadItalic(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(CODE): + case HTML_TAG(TT): + { + bResult = ReadCode(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(KBD): + { + bResult = ReadKbd(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(SAMP): + { + bResult = ReadSamp(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(DEL): + case HTML_TAG(S): + case HTML_TAG(STRIKE): + { + bResult = ReadStrike(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(FONT): + { + bResult = ReadFont(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(IMG): + { + bResult = readImage(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(INS): + case HTML_TAG(U): + { + bResult = ReadUnderline(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(MARK): + { + bResult = ReadMark(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(Q): + { + bResult = ReadQ(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(SUP): + { + bResult = ReadSup(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(SUB): + { + bResult = ReadSub(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(SVG): { wrP(oXml, sSelectors, oTS); - const std::wstring wsName{L"Bookmark" + std::to_wstring(m_mBookmarks.size() + 1)}; - m_mBookmarks.insert(std::make_pair(wsName, m_mBookmarks.size() + 1)); - oXml->WriteString(L"HYPERLINK \\l \"" + wsName + L"\" \\o \""); - oXml->WriteEncodeXmlString(sNote); - oXml->WriteString(L"\""); - oXml->WriteString(L""); - bResult = readStream(oXml, sSelectors, oTS); - oXml->WriteString(L""); - sNote.clear(); - } - } - // Полужирный текст - // Акцентированный текст - else if(sName == L"b" || sName == L"strong") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oFont.SetWeight(L"bold", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - // Направление текста - else if(sName == L"bdo") - { - const std::wstring sDir{GetArgumentValue(L"dir")}; + bResult = readSVG(m_oLightReader.GetOuterXml()); - CTextSettings oTSBdo(oTS); - oTSBdo.bBdo = (sDir == L"rtl"); - bResult = readStream(oXml, sSelectors, oTSBdo); - } - // Отмена направления текста - else if(sName == L"bdi") - { - CTextSettings oTSBdo(oTS); - oTSBdo.bBdo = false; - bResult = readStream(oXml, sSelectors, oTSBdo); - } - // Перенос строки - else if(sName == L"br") - { - if (m_oState.m_bInP) - { - OpenR(oXml); - NSCSS::CCompiledStyle oStyle = m_oStylesCalculator.GetCompiledStyle(sSelectors); - if(oStyle.m_oText.GetAlign() == L"both") - oXml->WriteString(L""); - oXml->WriteString(L""); - CloseR(oXml); + if (bResult) + ImageRels(oXml, -1, L"", L"png"); + + break; } - else + case HTML_TAG(INPUT): + { + bResult = readInput(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(CANVAS): + case HTML_TAG(VIDEO): + case HTML_TAG(MATH): + case HTML_TAG(IFRAME): + case HTML_TAG(EMBED): + case HTML_TAG(WBR): + case HTML_TAG(AUDIO): + case HTML_TAG(BGSOUND): + case HTML_TAG(APPLET): + case HTML_TAG(BLINK): + case HTML_TAG(KEYGEN): + case HTML_TAG(TITLE): + case HTML_TAG(STYLE): + case HTML_TAG(SCRIPT): + { WriteEmptyParagraph(oXml, false, m_oState.m_bInP); - - m_oState.m_bWasSpace = true; - } - else if(sName == L"center") - { - CTextSettings oTSP(oTS); - oTSP.oAdditionalStyle.m_oText.SetAlign(L"center", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSP); - } - // Цитата, обычно выделяется курсивом - // Новый термин, обычно выделяется курсивом - // Акцентированный текст - // Курсивный текст - // Переменная, обычно выделяется курсивом - else if(sName == L"cite" || sName == L"dfn" || sName == L"em" || sName == L"i" || sName == L"var") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oFont.SetStyle(L"italic", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - // Код - // Моноширинный шрифт, например, Courier New - // Результат скрипта - else if(sName == L"code" || sName == L"tt") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", UINT_MAX, true); - oTSR.oAdditionalStyle.m_oFont.SetSize(20, UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - else if (sName == L"kbd") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", UINT_MAX, true); - oTSR.oAdditionalStyle.m_oFont.SetSize(20, UINT_MAX, true); - oTSR.oAdditionalStyle.m_oFont.SetWeight(L"bold", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - else if (sName == L"samp") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - // Зачеркнутый текст - else if(sName == L"del" || sName == L"s" || sName == L"strike") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oText.SetDecoration(L"line-through", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - else if(sName == L"font") - { - CTextSettings oTSR(oTS); - - while(m_oLightReader.MoveToNextAttribute()) - { - std::wstring sAName = m_oLightReader.GetName(); - if(sAName == L"color") - oTSR.oAdditionalStyle.m_oText.SetColor(m_oLightReader.GetText(), UINT_MAX, true); - else if(sAName == L"face") - oTSR.oAdditionalStyle.m_oFont.SetFamily(m_oLightReader.GetText(), UINT_MAX, true); - else if(sAName == L"size") - { - int nSize = 3; - const std::wstring sSize = m_oLightReader.GetText(); - if(!sSize.empty()) - { - if(sSize.front() == L'+') - nSize += NSStringFinder::ToInt(sSize.substr(1)); - else if(sSize.front() == L'-') - nSize -= NSStringFinder::ToInt(sSize.substr(1)); - else - nSize = NSStringFinder::ToInt(sSize); - } - - if (nSize < 1 || nSize > 7) - nSize = 3; - - oTSR.oAdditionalStyle.m_oFont.SetSize(HTML_FONTS[nSize - 1], UINT_MAX, true); - } - } - m_oLightReader.MoveToElement(); - bResult = readStream(oXml, sSelectors, oTSR); - m_oState.m_bWasSpace = true; - } - // Картинки - else if(sName == L"img") - readImage(oXml, sSelectors, oTS); - // Подчеркнутый - else if(sName == L"ins" || sName == L"u") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oText.SetDecoration(L"underline", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - // Выделенный текст, обычно выделяется желтым - else if(sName == L"mark") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oText.SetHighlight(L"yellow", UINT_MAX, true); - bResult = readStream(oXml, sSelectors, oTSR); - } - // Цитата, выделенная кавычками, обычно выделяется курсивом - else if(sName == L"q") - { - CTextSettings oTSQ(oTS); - oTSQ.bQ = true; - bResult = readStream(oXml, sSelectors, oTSQ); - } - // Текст верхнего регистра - else if(sName == L"sup") - { - CTextSettings oTSR(oTS); - oTSR.eTextMode = CTextSettings::Superscript; - bResult = readStream(oXml, sSelectors, oTSR); - } - // Текст нижнего регистра - else if(sName == L"sub") - { - CTextSettings oTSR(oTS); - oTSR.eTextMode = CTextSettings::Subscript; - bResult = readStream(oXml, sSelectors, oTSR); - } - // Векторная картинка - else if(sName == L"svg" || (sName.length() > 3 && sName.compare(sName.length() - 3, 3, L"svg") == 0)) - { - wrP(oXml, sSelectors, oTS); - if (readSVG(m_oLightReader.GetOuterXml())) - ImageRels(oXml, -1, L"", L"png"); - } - else if(sName == L"input") - readInput(oXml, sSelectors, oTS); - // Игнорируются тэги выполняющие скрипт - else if(sName == L"template" || sName == L"canvas" || sName == L"video" || sName == L"math" || - sName == L"command" || sName == L"iframe" || sName == L"embed" || sName == L"wbr" || sName == L"audio" || - sName == L"bgsound" || sName == L"applet" || sName == L"blink" || sName == L"keygen"|| sName == L"script" || - sName == L"comment" || sName == L"title" || sName == L"style") - { - WriteEmptyParagraph(oXml, false, m_oState.m_bInP); - sSelectors.pop_back(); - return true; - } - else if (sName == L"span") - { - if (sSelectors.back().m_wsClass == L"MsoFootnoteReference") - { sSelectors.pop_back(); - return false; + return true; } - bResult = readStream(oXml, sSelectors, oTS); - } - else if (sName == L"nobr") - { - CTextSettings oTSPre(oTS); - oTSPre.bPre = true; - bResult = readStream(oXml, sSelectors, oTSPre); - } - else if (sName == L"basefont") - { - if (!m_oLightReader.MoveToFirstAttribute()) - return false; - - do + case HTML_TAG(SPAN): { - if (L"face" == m_oLightReader.GetName()) - oTS.oAdditionalStyle.m_oFont.SetFamily(m_oLightReader.GetText(), UINT_MAX, true); - else if (L"size" == m_oLightReader.GetName()) + bResult = ReadSpan(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(NOBR): + { + bResult = ReadNobr(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(BASEFONT): + { + bResult = ReadBasefont(oXml, sSelectors, oTS); + break; + } + case HTML_TAG(BUTTON): + case HTML_TAG(LABEL): + case HTML_TAG(DATA): + case HTML_TAG(OBJECT): + case HTML_TAG(NOSCRIPT): + case HTML_TAG(OUTPUT): + case HTML_TAG(TIME): + case HTML_TAG(SMALL): + case HTML_TAG(PROGRESS): + case HTML_TAG(HGROUP): + case HTML_TAG(METER): + case HTML_TAG(ACRONYM): + case HTML_TAG(BIG): + { + bResult = readStream(oXml, sSelectors, oTS); + break; + } + default: + { + NSStringUtils::CStringBuilder oXmlData; + TState oCurentState{m_oState}; + + CloseP(&oXmlData, sSelectors); + + switch(eHtmlTag) { - switch(NSStringFinder::ToInt(m_oLightReader.GetText(), 3)) + case HTML_TAG(ADDRESS): { - case 1: oTS.oAdditionalStyle.m_oFont.SetSize(7.5, UINT_MAX, true); break; - case 2: oTS.oAdditionalStyle.m_oFont.SetSize(10, UINT_MAX, true); break; - default: - case 3: oTS.oAdditionalStyle.m_oFont.SetSize(12, UINT_MAX, true); break; - case 4: oTS.oAdditionalStyle.m_oFont.SetSize(13.5, UINT_MAX, true); break; - case 5: oTS.oAdditionalStyle.m_oFont.SetSize(18, UINT_MAX, true); break; - case 6: oTS.oAdditionalStyle.m_oFont.SetSize(24, UINT_MAX, true); break; - case 7: oTS.oAdditionalStyle.m_oFont.SetSize(36, UINT_MAX, true); break; + bResult = ReadItalic(&oXmlData, sSelectors, oTS); + break; } - } - else if (L"color" == m_oLightReader.GetName()) - oTS.oAdditionalStyle.m_oText.SetColor(m_oLightReader.GetText(), UINT_MAX, true); - } while (m_oLightReader.MoveToNextAttribute()); - - m_oLightReader.MoveToElement(); - - oTS.oAdditionalStyle.SetID(m_oStylesCalculator.CalculateStyleId(sSelectors.back())); - - sSelectors.pop_back(); - return true; - } - // Без нового абзаца - else if(sName == L"button" || sName == L"label" || sName == L"data" || sName == L"object" || - sName == L"noscript" || sName == L"output" || sName == L"time" || sName == L"small" || - sName == L"progress" || sName == L"hgroup" || sName == L"meter" || sName == L"acronym" || sName == L"big") - bResult = readStream(oXml, sSelectors, oTS); - // С нового абзаца - else - { - NSStringUtils::CStringBuilder oXmlData; - TState oCurentState{m_oState}; - - CloseP(&oXmlData, sSelectors); - - // Адрес - if(sName == L"address") - { - CTextSettings oTSR(oTS); - oTSR.oAdditionalStyle.m_oFont.SetStyle(L"italic", UINT_MAX, true); - bResult = readStream(&oXmlData, sSelectors, oTSR); - } - // Определение термина, отступ от левого края - else if(sName == L"dd") - { - CTextSettings oTSP(oTS); - oTSP.oAdditionalStyle.m_oMargin.SetLeft(720, UINT_MAX, true); - bResult = readStream(&oXmlData, sSelectors, oTSP); - } - // aside возможно использовать для сносок в epub - else if (sName == L"aside" || sName == L"div") - { - m_oStylesCalculator.CalculatePageStyle(m_oPageData, sSelectors); - - int bMsoFootnote = 0; - std::wstring sFootnoteID; - while (m_oLightReader.MoveToNextAttribute()) - { - std::wstring sAName = m_oLightReader.GetName(); - std::wstring sAText = m_oLightReader.GetText(); - if (sAName == L"epub:type" && sAText == L"footnote") - bMsoFootnote++; - else if (sAName == L"style" && sAText == L"mso-element:footnote") - bMsoFootnote++; - else if (sAName == L"id") + case HTML_TAG(DD): { - std::map::iterator it = m_mFootnotes.find(sAText); - if (it != m_mFootnotes.end()) - { - bMsoFootnote++; - sFootnoteID = it->second; - } + bResult = ReadDD(&oXmlData, sSelectors, oTS); + break; } - } - m_oLightReader.MoveToElement(); - if (bMsoFootnote >= 2) - { - m_oNoteXml.WriteString(L""); - readStream(&m_oNoteXml, sSelectors, oTS); - m_oNoteXml.WriteString(L""); - } - else - bResult = readStream(&oXmlData, sSelectors, oTS); - } - else if (sName == L"blockquote") - { - CTextSettings oNewTS{oTS}; - oNewTS.sPStyle += L""; - bResult = readStream(&oXmlData, sSelectors, oNewTS); - } - // С нового абзаца - else if(sName == L"article" || sName == L"header" || sName == L"main" || - sName == L"summary" || sName == L"footer" || sName == L"nav" || sName == L"figcaption" || sName == L"form" || - sName == L"option" || sName == L"dt" || sName == L"p" || - sName == L"section" || sName == L"figure" || sName == L"dl" || sName == L"legend" || sName == L"map" || - sName == L"h1" || sName == L"h2" || sName == L"h3" || sName == L"h4" || sName == L"h5" || sName == L"h6") - bResult = readStream(&oXmlData, sSelectors, oTS); - // Горизонтальная линия - else if(sName == L"hr") - { - bool bPrint = true; - for (const NSCSS::CNode& item : sSelectors) - { - if (item.m_wsName == L"div" && item.m_wsStyle == L"mso-element:footnote-list") + case HTML_TAG(ASIDE): + case HTML_TAG(DIV): { - bPrint = false; + bResult = ReadDiv(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(BLOCKQUOTE): + { + bResult = ReadBlockquote(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(ARTICLE): + case HTML_TAG(HEADER): + case HTML_TAG(MAIN): + case HTML_TAG(SUMMARY): + case HTML_TAG(FOOTER): + case HTML_TAG(NAV): + case HTML_TAG(FIGCAPTION): + case HTML_TAG(FORM): + case HTML_TAG(OPTION): + case HTML_TAG(DT): + case HTML_TAG(P): + case HTML_TAG(SECTION): + case HTML_TAG(FIGURE): + case HTML_TAG(DL): + case HTML_TAG(LEGEND): + case HTML_TAG(MAP): + case HTML_TAG(H1): + case HTML_TAG(H2): + case HTML_TAG(H3): + case HTML_TAG(H4): + case HTML_TAG(H5): + case HTML_TAG(H6): + { + bResult = readStream(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(HR): + { + bResult = ReadHr(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(UL): + case HTML_TAG(MENU): + case HTML_TAG(SELECT): + case HTML_TAG(DATALIST): + case HTML_TAG(DIR): + case HTML_TAG(OL): + { + bResult = readLi(&oXmlData, sSelectors, oTS, HTML_TAG(OL) != eHtmlTag); + break; + } + case HTML_TAG(PRE): + case HTML_TAG(XMP): + { + bResult = ReadPre(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(TABLE): + { + bResult = ParseTable(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(RUBY): + { + bResult = ParseRuby(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(TEXTAREA): + case HTML_TAG(FIELDSET): + { + bResult = ReadTextarea(&oXmlData, sSelectors, oTS); + break; + } + case HTML_TAG(DETAILS): + { + bResult = ReadDetails(&oXmlData, sSelectors, oTS); + break; + } + default: + { + bResult = readStream(&oXmlData, sSelectors, oTS); break; } } - if (bPrint) - { - NSCSS::NSProperties::CDigit oSize, oWidth; - NSCSS::NSProperties::CColor oColor; - bool bShade = false; - std::wstring wsAlign{L"center"}; - if (m_oLightReader.MoveToFirstAttribute()) - { - std::wstring wsAttributeName; - do - { - wsAttributeName = m_oLightReader.GetName(); + readNote(&oXmlData, sSelectors, sNote); - if (L"align" == wsAttributeName) - { - const std::wstring wsValue{m_oLightReader.GetText()}; + CloseP(&oXmlData, sSelectors); - if (NSStringFinder::Equals(L"left", wsValue)) - wsAlign = L"left"; - else if (NSStringFinder::Equals(L"right", wsValue)) - wsAlign = L"right"; - else if (NSStringFinder::Equals(L"center", wsValue)) - wsAlign = L"center"; - } - if (L"color" == wsAttributeName) - oColor.SetValue(m_oLightReader.GetText()); - else if (L"noshade" == wsAttributeName) - bShade = true; - else if (L"size" == wsAttributeName) - oSize.SetValue(m_oLightReader.GetText()); - else if (L"width" == wsAttributeName) - oWidth.SetValue(m_oLightReader.GetText()); - } while (m_oLightReader.MoveToNextAttribute()); - - m_oLightReader.MoveToElement(); - } - - const bool bOpenedP = OpenP(&oXmlData); - OpenR(&oXmlData); - WriteLine(&oXmlData, wsAlign, (!oColor.Empty()) ? oColor.ToWString() : L"a0a0a0", bShade, (!oSize.Empty()) ? oSize.ToDouble(NSCSS::Point) : 1.5, (NSCSS::UnitMeasure::Percent == oWidth.GetUnitMeasure()) ? oWidth.ToDouble() : 0); - CloseR(&oXmlData); - if (bOpenedP) - CloseP(&oXmlData, sSelectors); - } + if (bResult) + oXml->WriteString(oXmlData.GetData()); + else + m_oState = oCurentState; } - // Меню - // Маркированный список - else if(sName == L"ul" || sName == L"menu" || sName == L"select" || sName == L"datalist" || sName == L"dir") - readLi(&oXmlData, sSelectors, oTS, true); - // Нумерованный список - else if(sName == L"ol") - readLi(&oXmlData, sSelectors, oTS, false); - // Предварительно форматированный текст - else if(sName == L"pre" || sName == L"xmp") - { - CTextSettings oTSPre(oTS); - oTSPre.oAdditionalStyle.m_oFont.SetFamily(L"Courier New", NEXT_LEVEL); - oTSPre.oAdditionalStyle.m_oFont.SetSize(20, NEXT_LEVEL); - oTSPre.oAdditionalStyle.m_oMargin.SetTop(0, NEXT_LEVEL); - oTSPre.oAdditionalStyle.m_oMargin.SetBottom(0, NEXT_LEVEL); - oTSPre.bPre = true; - bResult = readStream(&oXmlData, sSelectors, oTSPre); - } - // Таблицы - else if(sName == L"table") - bResult = ParseTable(&oXmlData, sSelectors, oTS); - else if(sName == L"ruby") - bResult = ParseRuby(&oXmlData, sSelectors, oTS); - // Текст с границами - else if(sName == L"textarea" || sName == L"fieldset") - { - CTextSettings oTSP(oTS); - oTSP.AddPStyle(L""); - bResult = readStream(&oXmlData, sSelectors, oTSP); - } - else if (sName == L"details") - { - bool bOpened = false; - if (m_oLightReader.MoveToFirstAttribute()) - { - do - { - bOpened = (L"open" == m_oLightReader.GetName()); - } while (m_oLightReader.MoveToNextAttribute() && !bOpened); - } - m_oLightReader.MoveToElement(); - - int nDeath = m_oLightReader.GetDepth(); - if(m_oLightReader.IsEmptyNode() || !m_oLightReader.ReadNextSiblingNode2(nDeath)) - { - sSelectors.pop_back(); - return false; - } - - NSStringUtils::CStringBuilder oSummary; - NSStringUtils::CStringBuilder oBody; - - const TState oCurrentState{m_oState}; - TState oSummaryState{m_oState}; - TState oBodyState{m_oState}; - - do - { - if (L"summary" == m_oLightReader.GetName()) - { - m_oState = oSummaryState; - if (0 == oSummary.GetSize()) - { - OpenP(&oSummary); - OpenR(&oSummary); - OpenT(&oSummary); - oSummary.WriteString((bOpened) ? L"\u25BD" : L"\u25B7"); - } - - readStream(&oSummary, sSelectors, oTS); - CloseP(&oSummary, sSelectors); - oSummaryState = m_oState; - m_oState = oCurrentState; - } - else if (bOpened) - { - m_oState = oBodyState; - readStream(&oBody, sSelectors, oTS); - CloseP(&oBody, sSelectors); - oBodyState = m_oState; - m_oState = oCurrentState; - } - } while (m_oLightReader.ReadNextSiblingNode2(nDeath)); - - oXmlData.WriteString(oSummary.GetData()); - - if (bOpened) - { - m_oState = oBodyState; - oXmlData.WriteString(oBody.GetData()); - } - - bResult = true; - } - else if (sName == L"xml") - { - sSelectors.pop_back(); - return false; - } - // Неизвестный тэг. Выделять ли его абзацем? - else - bResult = readStream(&oXmlData, sSelectors, oTS); - - readNote(&oXmlData, sSelectors, sNote); - - CloseP(&oXmlData, sSelectors); - - if (bResult) - oXml->WriteString(oXmlData.GetData()); - else - m_oState = oCurentState; } + + if (HTML_TAG(DIV) != eHtmlTag && HTML_TAG(ASIDE) != eHtmlTag) + m_oState.m_bBanUpdatePageData = true; + readNote(oXml, sSelectors, sNote); sSelectors.pop_back(); return bResult; @@ -3274,7 +3764,7 @@ private: return true; } - void readInput (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS) + bool readInput (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS) { std::wstring sValue; std::wstring sAlt; @@ -3291,7 +3781,7 @@ private: } m_oLightReader.MoveToElement(); if(sType == L"hidden") - return; + return false; if(sValue.empty()) sValue = sAlt; if(!sValue.empty()) @@ -3305,13 +3795,13 @@ private: CloseR(oXml); } - readStream(oXml, sSelectors, oTS, ElementInTable(sSelectors)); + return readStream(oXml, sSelectors, oTS, ElementInTable(sSelectors)); } - void readLi (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS, bool bType) + bool readLi (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS, bool bType) { if(m_oLightReader.IsEmptyNode()) - return; + return false; int nStart = 1; while(m_oLightReader.MoveToNextAttribute()) @@ -3439,9 +3929,11 @@ private: m_oNumberXml.WriteString(wsStart); m_oNumberXml.WriteString(L"\"/>"); } + + return true; } - void readA (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS, std::wstring& sNote) + bool readA (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, CTextSettings& oTS, std::wstring& sNote) { std::wstring sRef; std::wstring sAlt; @@ -3562,6 +4054,8 @@ private: } sNote.clear(); + + return true; } bool readBase64 (const std::wstring& sSrcM, std::wstring& sExtention) @@ -3659,7 +4153,7 @@ private: CloseP(oXml, sSelectors); } - void readImage (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, const CTextSettings& oTS) + bool readImage (NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, const CTextSettings& oTS) { std::wstring wsAlt, sSrcM; bool bRes = false; @@ -3698,7 +4192,7 @@ private: if (sSrcM.empty()) { ImageAlternative(oXml, sSelectors, oTS, wsAlt, sSrcM, oImageData); - return; + return true; } const bool bIsAllowExternalLocalFiles = GetStatusUsingExternalLocalFiles(); @@ -3712,7 +4206,7 @@ private: sSrcM = NSSystemPath::ShortenPath(sSrcM); if (!CanUseThisPath(sSrcM, bIsAllowExternalLocalFiles)) - return; + return true; } int nImageId = -1; @@ -3729,7 +4223,7 @@ private: if (NotValidExtension(sExtention)) { ImageAlternative(oXml, sSelectors, oTS, wsAlt, sSrcM, oImageData); - return; + return true; } // Проверка на повтор @@ -3780,9 +4274,11 @@ private: wrP(oXml, sSelectors, oTS); ImageRels(oXml, nImageId, sImageSrc, sExtention, oImageData); } + + return true; } - std::wstring wrP(NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, const CTextSettings& oTS) + std::wstring wrP(NSStringUtils::CStringBuilder* oXml, const std::vector& sSelectors, const CTextSettings& oTS) { OpenP(oXml); @@ -3824,7 +4320,7 @@ private: return sPStyle; } - std::wstring wrRPr(NSStringUtils::CStringBuilder* oXml, std::vector& sSelectors, const CTextSettings& oTS) + std::wstring wrRPr(NSStringUtils::CStringBuilder* oXml, const std::vector& sSelectors, const CTextSettings& oTS) { if (!m_oState.m_bInP) return L""; From 6b4b6451804f6b6f8fe9a0521fd8393ee5aa0dac Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Mon, 23 Sep 2024 13:09:05 +0300 Subject: [PATCH 68/82] Create GetEmbeddedFontPath --- DesktopEditor/doctrenderer/drawingfile.h | 2 +- .../pro/js/wasm/src/drawingfile_test.cpp | 8 ++-- PdfFile/PdfFile.cpp | 2 +- PdfFile/PdfFile.h | 2 +- PdfFile/PdfReader.cpp | 37 ++++++++++++++++--- PdfFile/PdfReader.h | 2 +- 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/DesktopEditor/doctrenderer/drawingfile.h b/DesktopEditor/doctrenderer/drawingfile.h index 546f469ae7..10e12c4577 100644 --- a/DesktopEditor/doctrenderer/drawingfile.h +++ b/DesktopEditor/doctrenderer/drawingfile.h @@ -447,7 +447,7 @@ public: std::wstring sFontFile; if (m_nType == 0) - sFontFile = ((CPdfFile*)m_pFile)->GetFontPath(sFontName); + sFontFile = ((CPdfFile*)m_pFile)->GetEmbeddedFontPath(sFontName); if (sFontFile.empty()) sFontFile = sFontName; diff --git a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp index a6926cef5d..6da3eb1c2b 100644 --- a/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp +++ b/DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp @@ -821,7 +821,7 @@ void ReadFileAttachment(BYTE* pAnnots, int& i, int n) RELEASEARRAYOBJECTS(res); } -void ReadInteractiveFormsFonts(CGraphicsFileDrawing* pGrFile, int nType) +void ReadInteractiveFormsFonts(CDrawingFile* pGrFile, int nType) { BYTE* pFonts = GetInteractiveFormsFonts(pGrFile, nType); int nLength = READ_INT(pFonts); @@ -923,7 +923,7 @@ int main(int argc, char* argv[]) if (!NSFile::CFileBinary::ReadAllBytes(sFilePath, &pFileData, nFileDataLen)) return 1; - CGraphicsFileDrawing* pGrFile = Open(pFileData, (LONG)nFileDataLen, ""); + CDrawingFile* pGrFile = Open(pFileData, (LONG)nFileDataLen, ""); int nError = GetErrorCode(pGrFile); if (nError != 0) @@ -1084,7 +1084,7 @@ int main(int argc, char* argv[]) } // INTERACTIVE FORMS - if (false) + if (true) { ReadInteractiveFormsFonts(pGrFile, 1); ReadInteractiveFormsFonts(pGrFile, 2); @@ -1199,7 +1199,7 @@ int main(int argc, char* argv[]) } // ANNOTS - if (false) + if (true) { BYTE* pAnnots = GetAnnotationsInfo(pGrFile, -1); nLength = READ_INT(pAnnots); diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index 37c3b95330..f959237575 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -425,7 +425,7 @@ BYTE* CPdfFile::GetAnnotStandardFonts() return NULL; return m_pInternal->pReader->GetFonts(true); } -std::wstring CPdfFile::GetFontPath(const std::wstring& wsFontName) +std::wstring CPdfFile::GetEmbeddedFontPath(const std::wstring& wsFontName) { if (!m_pInternal->pReader) return L""; diff --git a/PdfFile/PdfFile.h b/PdfFile/PdfFile.h index b168f06df9..13a446fb8e 100644 --- a/PdfFile/PdfFile.h +++ b/PdfFile/PdfFile.h @@ -136,7 +136,7 @@ public: BYTE* GetAPWidget (int nRasterW, int nRasterH, int nBackgroundColor, int nPageIndex, int nWidget = -1, const char* sView = NULL, const char* sBView = NULL); BYTE* GetAPAnnots (int nRasterW, int nRasterH, int nBackgroundColor, int nPageIndex, int nAnnot = -1, const char* sView = NULL); BYTE* GetButtonIcon(int nBackgroundColor, int nPageIndex, bool bBase64 = false, int nBWidget = -1, const char* sIView = NULL); - std::wstring GetFontPath(const std::wstring& wsFontName); + std::wstring GetEmbeddedFontPath(const std::wstring& wsFontName); // --- WRITER --- diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index 1d43cd7155..b6351c85ee 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -398,10 +398,8 @@ bool CPdfReader::LoadFromFile(NSFonts::IApplicationFonts* pAppFonts, const std:: m_pFontList->Clear(); -#ifdef BUILDING_WASM_MODULE std::map mFonts = PdfReader::CAnnotFonts::GetAllFonts(m_pPDFDocument, m_pFontManager, m_pFontList); m_mFonts.insert(mFonts.begin(), mFonts.end()); -#endif return true; } @@ -440,10 +438,8 @@ bool CPdfReader::LoadFromMemory(NSFonts::IApplicationFonts* pAppFonts, BYTE* dat m_pFontList->Clear(); -#ifdef BUILDING_WASM_MODULE std::map mFonts = PdfReader::CAnnotFonts::GetAllFonts(m_pPDFDocument, m_pFontManager, m_pFontList); m_mFonts.insert(mFonts.begin(), mFonts.end()); -#endif return true; } @@ -752,10 +748,39 @@ std::wstring CPdfReader::GetInfo() return sRes; } -std::wstring CPdfReader::GetFontPath(const std::wstring& wsFontName) +std::wstring CPdfReader::GetFontPath(const std::wstring& wsFontName, bool bSave) { std::map::const_iterator oIter = m_mFonts.find(wsFontName); - return oIter != m_mFonts.end() ? oIter->second : L""; + if (oIter == m_mFonts.end()) + return std::wstring(); + + if (!bSave) + return oIter->second; + + NSFonts::IFontsMemoryStorage* pMemoryStorage = NSFonts::NSApplicationFontStream::GetGlobalMemoryStorage(); + if (pMemoryStorage) + { + NSFonts::IFontStream* pStream = pMemoryStorage->Get(oIter->second); + if (pStream) + { + BYTE* pData = NULL; + LONG lLength = 0; + pStream->GetMemory(pData, lLength); + if (pData) + { + NSFile::CFileBinary oFile; + std::wstring sFilePath = oFile.CreateTempFileWithUniqueName(m_wsTempFolder, L"EF"); + if (oFile.WriteFile(pData, lLength)) + { + oFile.CloseFile(); + return sFilePath; + } + oFile.CloseFile(); + } + } + } + + return std::wstring(); } void getBookmarks(PDFDoc* pdfDoc, OutlineItem* pOutlineItem, NSWasm::CData& out, int level) { diff --git a/PdfFile/PdfReader.h b/PdfFile/PdfReader.h index 151e5e91f8..7c287db8ca 100644 --- a/PdfFile/PdfReader.h +++ b/PdfFile/PdfReader.h @@ -65,7 +65,7 @@ public: void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); std::wstring GetInfo(); - std::wstring GetFontPath(const std::wstring& wsFontName); + std::wstring GetFontPath(const std::wstring& wsFontName, bool bSave = false); std::wstring ToXml(const std::wstring& wsXmlPath, bool isPrintStreams = false); void ChangeLength(DWORD nLength); From 1b8c59ff87b589c44dfb0d790b25efbc9a5b1abe Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Mon, 23 Sep 2024 13:15:39 +0300 Subject: [PATCH 69/82] Separate GetFontPath --- PdfFile/PdfFile.cpp | 6 ++++++ PdfFile/PdfFile.h | 1 + PdfFile/PdfReader.h | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index f959237575..249beee837 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -425,6 +425,12 @@ BYTE* CPdfFile::GetAnnotStandardFonts() return NULL; return m_pInternal->pReader->GetFonts(true); } +std::wstring CPdfFile::GetFontPath(const std::wstring& wsFontName) +{ + if (!m_pInternal->pReader) + return L""; + return m_pInternal->pReader->GetFontPath(wsFontName, false); +} std::wstring CPdfFile::GetEmbeddedFontPath(const std::wstring& wsFontName) { if (!m_pInternal->pReader) diff --git a/PdfFile/PdfFile.h b/PdfFile/PdfFile.h index 13a446fb8e..8c3073a211 100644 --- a/PdfFile/PdfFile.h +++ b/PdfFile/PdfFile.h @@ -136,6 +136,7 @@ public: BYTE* GetAPWidget (int nRasterW, int nRasterH, int nBackgroundColor, int nPageIndex, int nWidget = -1, const char* sView = NULL, const char* sBView = NULL); BYTE* GetAPAnnots (int nRasterW, int nRasterH, int nBackgroundColor, int nPageIndex, int nAnnot = -1, const char* sView = NULL); BYTE* GetButtonIcon(int nBackgroundColor, int nPageIndex, bool bBase64 = false, int nBWidget = -1, const char* sIView = NULL); + std::wstring GetFontPath(const std::wstring& wsFontName); std::wstring GetEmbeddedFontPath(const std::wstring& wsFontName); // --- WRITER --- diff --git a/PdfFile/PdfReader.h b/PdfFile/PdfReader.h index 7c287db8ca..e2b70438bf 100644 --- a/PdfFile/PdfReader.h +++ b/PdfFile/PdfReader.h @@ -65,7 +65,7 @@ public: void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); std::wstring GetInfo(); - std::wstring GetFontPath(const std::wstring& wsFontName, bool bSave = false); + std::wstring GetFontPath(const std::wstring& wsFontName, bool bSave = true); std::wstring ToXml(const std::wstring& wsXmlPath, bool isPrintStreams = false); void ChangeLength(DWORD nLength); From 5c3a6978806c9daed1053ae5b660a62dc7189679 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Mon, 23 Sep 2024 13:31:55 +0300 Subject: [PATCH 70/82] Fix for drawingfile --- DesktopEditor/doctrenderer/drawingfile.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/doctrenderer/drawingfile.h b/DesktopEditor/doctrenderer/drawingfile.h index 10e12c4577..546f469ae7 100644 --- a/DesktopEditor/doctrenderer/drawingfile.h +++ b/DesktopEditor/doctrenderer/drawingfile.h @@ -447,7 +447,7 @@ public: std::wstring sFontFile; if (m_nType == 0) - sFontFile = ((CPdfFile*)m_pFile)->GetEmbeddedFontPath(sFontName); + sFontFile = ((CPdfFile*)m_pFile)->GetFontPath(sFontName); if (sFontFile.empty()) sFontFile = sFontName; From 0af65b1137638e81192634e4d3a3ab839598244c Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Mon, 23 Sep 2024 16:44:16 +0500 Subject: [PATCH 71/82] Convert odp placeholder styles to pptx --- OdfFile/DataTypes/presentationclass.cpp | 1 + OdfFile/Reader/Converter/pptx_drawing.cpp | 5 +++++ OdfFile/Reader/Format/draw_frame.h | 2 +- OdfFile/Reader/Format/draw_frame_pptx.cpp | 18 ++++++++++++++++-- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/OdfFile/DataTypes/presentationclass.cpp b/OdfFile/DataTypes/presentationclass.cpp index d57a34dad6..d302b07be7 100644 --- a/OdfFile/DataTypes/presentationclass.cpp +++ b/OdfFile/DataTypes/presentationclass.cpp @@ -130,6 +130,7 @@ std::wstring presentation_class::get_type_ms() case notes: case handout: case outline: + case body: case text: res = L"body"; break; diff --git a/OdfFile/Reader/Converter/pptx_drawing.cpp b/OdfFile/Reader/Converter/pptx_drawing.cpp index eb2821d40d..144f0fa0f7 100644 --- a/OdfFile/Reader/Converter/pptx_drawing.cpp +++ b/OdfFile/Reader/Converter/pptx_drawing.cpp @@ -64,6 +64,11 @@ void pptx_serialize_text(std::wostream & strm, _pptx_drawing & val) odf_reader::GetProperty(val.additional, L"placeholder-font-size", font_size); if (font_size) CP_XML_ATTR(L"sz", *font_size * 100); + + _CP_OPT(bool) bold_text; + odf_reader::GetProperty(val.additional, L"placeholder-font-bold", bold_text); + if (bold_text && *bold_text) + CP_XML_ATTR(L"b", 1); _CP_OPT(std::wstring) text_color; odf_reader::GetProperty(val.additional, L"placeholder-text-color", text_color); diff --git a/OdfFile/Reader/Format/draw_frame.h b/OdfFile/Reader/Format/draw_frame.h index 157e06d0d9..30ff4f0de7 100644 --- a/OdfFile/Reader/Format/draw_frame.h +++ b/OdfFile/Reader/Format/draw_frame.h @@ -159,7 +159,7 @@ public: virtual void pptx_convert(oox::pptx_conversion_context & Context); virtual void pptx_convert_placeHolder(oox::pptx_conversion_context & Context); - void pptx_convert_placeHolder_styles(oox::pptx_conversion_context& Context, const paragraph_format_properties* paragraph_props, const text_format_properties* text_props); + void pptx_convert_placeHolder_styles(oox::pptx_conversion_context& Context, const graphic_format_properties* graphic_props, const paragraph_format_properties* paragraph_props, const text_format_properties* text_props); virtual std::wostream & text_to_stream(std::wostream & _Wostream, bool bXmlEncode = true) const; diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 1202f9063d..9813af7601 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -213,7 +213,7 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) paragraph_format_properties paragraph_properties = calc_paragraph_properties_content(textStyleInst); text_format_properties_ptr text_properties = calc_text_properties_content(textStyleInst); - pptx_convert_placeHolder_styles(Context, ¶graph_properties, text_properties.get()); + pptx_convert_placeHolder_styles(Context, properties.get(), ¶graph_properties, text_properties.get()); } } @@ -262,8 +262,20 @@ void draw_frame::pptx_convert(oox::pptx_conversion_context & Context) Context.get_slide_context().end_frame(); } -void draw_frame::pptx_convert_placeHolder_styles(oox::pptx_conversion_context& Context, const paragraph_format_properties* paragraph_props, const text_format_properties* text_props) +void draw_frame::pptx_convert_placeHolder_styles(oox::pptx_conversion_context& Context, const graphic_format_properties* graphic_props, const paragraph_format_properties* paragraph_props, const text_format_properties* text_props) { + if (graphic_props) + { + int vert_align; + + if (graphic_props->draw_textarea_vertical_align_) + vert_align = (int)graphic_props->draw_textarea_vertical_align_->get_type(); + else + vert_align = (int)odf_types::vertical_align::Auto; + + Context.get_slide_context().set_property(odf_reader::_property(L"textarea-vertical_align", vert_align)); + } + if (text_props) { if (text_props->fo_color_) @@ -271,6 +283,8 @@ void draw_frame::pptx_convert_placeHolder_styles(oox::pptx_conversion_context& C if (text_props->fo_font_size_) Context.get_slide_context().set_property( odf_reader::_property(L"placeholder-font-size", text_props->fo_font_size_->get_length().get_value_unit(odf_types::length::pt))); + if(text_props->fo_font_weight_ && text_props->fo_font_weight_->get_type() == odf_types::font_weight::WBold) + Context.get_slide_context().set_property(odf_reader::_property(L"placeholder-font-bold", true)); } if (paragraph_props) From b536d6eb41590f4e2537befd90f7ac4906e481af Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Mon, 23 Sep 2024 15:43:48 +0300 Subject: [PATCH 72/82] Create test GetEmbeddedFont --- PdfFile/PdfReader.cpp | 31 +------------------------------ PdfFile/SrcReader/PdfAnnot.cpp | 10 +++++++--- PdfFile/test/test.cpp | 11 ++++++++++- 3 files changed, 18 insertions(+), 34 deletions(-) diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index b6351c85ee..f6ed37edc1 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -751,36 +751,7 @@ std::wstring CPdfReader::GetInfo() std::wstring CPdfReader::GetFontPath(const std::wstring& wsFontName, bool bSave) { std::map::const_iterator oIter = m_mFonts.find(wsFontName); - if (oIter == m_mFonts.end()) - return std::wstring(); - - if (!bSave) - return oIter->second; - - NSFonts::IFontsMemoryStorage* pMemoryStorage = NSFonts::NSApplicationFontStream::GetGlobalMemoryStorage(); - if (pMemoryStorage) - { - NSFonts::IFontStream* pStream = pMemoryStorage->Get(oIter->second); - if (pStream) - { - BYTE* pData = NULL; - LONG lLength = 0; - pStream->GetMemory(pData, lLength); - if (pData) - { - NSFile::CFileBinary oFile; - std::wstring sFilePath = oFile.CreateTempFileWithUniqueName(m_wsTempFolder, L"EF"); - if (oFile.WriteFile(pData, lLength)) - { - oFile.CloseFile(); - return sFilePath; - } - oFile.CloseFile(); - } - } - } - - return std::wstring(); + return oIter == m_mFonts.end() ? std::wstring() : oIter->second; } void getBookmarks(PDFDoc* pdfDoc, OutlineItem* pOutlineItem, NSWasm::CData& out, int level) { diff --git a/PdfFile/SrcReader/PdfAnnot.cpp b/PdfFile/SrcReader/PdfAnnot.cpp index a0a3b4d3ca..91dc41ee34 100644 --- a/PdfFile/SrcReader/PdfAnnot.cpp +++ b/PdfFile/SrcReader/PdfAnnot.cpp @@ -856,7 +856,9 @@ std::map CAnnotFonts::GetFreeTextFont(PDFDoc* pdfDoc std::map mRes; std::map mFontFreeText = GetAnnotFont(pdfDoc, pFontManager, pFontList, oAnnotRef); - +#ifndef BUILDING_WASM_MODULE + return mFontFreeText; +#endif CFontList* pAppFontList = (CFontList*)pFontManager->GetApplication()->GetList(); for (int i = 0; i < arrRC.size(); ++i) { @@ -891,8 +893,10 @@ std::map CAnnotFonts::GetFreeTextFont(PDFDoc* pdfDoc const unsigned char* pData14 = NULL; unsigned int nSize14 = 0; - if (!NSFonts::NSApplicationFontStream::GetGlobalMemoryStorage()->Get(wsFontName) && GetBaseFont(wsFontName, pData14, nSize14)) - NSFonts::NSApplicationFontStream::GetGlobalMemoryStorage()->Add(wsFontName, (BYTE*)pData14, nSize14, false); + NSFonts::IFontsMemoryStorage* pMemoryStorage = NSFonts::NSApplicationFontStream::GetGlobalMemoryStorage(); + if (pMemoryStorage && !pMemoryStorage->Get(wsFontName) && GetBaseFont(wsFontName, pData14, nSize14)) + pMemoryStorage->Add(wsFontName, (BYTE*)pData14, nSize14, false); + std::string sFontNameBefore = arrRC[i]->sFontFamily; arrRC[i]->sFontFamily = sFontName; arrRC[i]->bFind = true; diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index c30ed7cd96..87f56ea6e2 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -196,6 +196,15 @@ TEST_F(CPdfFileTest, GetMetaData) RELEASEARRAYOBJECTS(pMetaData); } +TEST_F(CPdfFileTest, GetEmbeddedFont) +{ + //GTEST_SKIP(); + + LoadFromFile(); + + std::wcout << pdfFile->GetEmbeddedFontPath(L"Symbol") << std::endl; +} + TEST_F(CPdfFileTest, ValidMetaData) { GTEST_SKIP(); @@ -282,7 +291,7 @@ TEST_F(CPdfFileTest, SetMetaData) TEST_F(CPdfFileTest, ConvertToRaster) { - //GTEST_SKIP(); + GTEST_SKIP(); LoadFromFile(); From f0f4e39f5c5922c5a491e51c683ed6558e609886 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Mon, 23 Sep 2024 19:08:27 +0300 Subject: [PATCH 73/82] Fix bug 70042 --- Common/OfficeFileFormatChecker2.cpp | 21 +++++++++++++---- PdfFile/test/test.cpp | 36 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index 8fce91db66..ec8a16a627 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -238,11 +238,24 @@ bool COfficeFileFormatChecker::isPdfFormatFile(unsigned char *pBuffer, int dwByt if (NULL == pFirst) { - //skip special - _UINT16 sz = pBuffer[0] + (pBuffer[1] << 8); - if (sz < dwBytes - 8) + char* pData = (char*)pBuffer; + for (int i = 0; i < dwBytes - 5; ++i) { - pFirst = strstr((char*)(pBuffer + sz), "%PDF-"); + int nPDF = strncmp(&pData[i], "%PDF-", 5); + if (!nPDF) + { + pFirst = (char*)pBuffer + i; + break; + } + } + if (NULL == pFirst) + { + //skip special + _UINT16 sz = pBuffer[0] + (pBuffer[1] << 8); + if (sz < dwBytes - 8) + { + pFirst = strstr((char*)(pBuffer + sz), "%PDF-"); + } } } if (NULL != pFirst) diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index c30ed7cd96..19ef8db16d 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -196,6 +196,42 @@ TEST_F(CPdfFileTest, GetMetaData) RELEASEARRAYOBJECTS(pMetaData); } +TEST_F(CPdfFileTest, PdfType) +{ + //GTEST_SKIP(); + + NSFile::CFileBinary oFile; + ASSERT_TRUE(oFile.OpenFile(wsSrcFile)); + + int nSize = 4096; + BYTE* pBuffer = new BYTE[nSize]; + if (!pBuffer) + { + oFile.CloseFile(); + return; + } + + DWORD dwReadBytes = 0; + oFile.ReadFile(pBuffer, nSize, dwReadBytes); + oFile.CloseFile(); + + char* pData = (char*)pBuffer; + bool bPDF = false; + for (int i = 0; i < nSize - 5; ++i) + { + int nPDF = strncmp(&pData[i], "%PDF-", 5); + if (!nPDF) + { + bPDF = true; + break; + } + } + + ASSERT_TRUE(bPDF); + + RELEASEARRAYOBJECTS(pBuffer); +} + TEST_F(CPdfFileTest, ValidMetaData) { GTEST_SKIP(); From a5c73127fd0afa021a66b7ec5f8dadcc6dad8aa8 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 23 Sep 2024 21:59:36 +0300 Subject: [PATCH 74/82] Fix pdf bugs (add build with embedded fonts in changes) --- DesktopEditor/doctrenderer/drawingfile.h | 22 +++++++++++++++++-- .../doctrenderer/embed/DrawingFileEmbed.cpp | 13 +++++++++++ .../doctrenderer/embed/DrawingFileEmbed.h | 1 + .../embed/jsc/jsc_DrawingFileEmbed.mm | 2 ++ .../embed/v8/v8_DrawingFileEmbed.cpp | 2 ++ .../graphics/pro/js/wasm/js/drawingfile.js | 2 +- .../pro/js/wasm/js/drawingfile_native.js | 2 +- .../pro/js/wasm/js/drawingfile_wasm.js | 2 +- 8 files changed, 41 insertions(+), 5 deletions(-) diff --git a/DesktopEditor/doctrenderer/drawingfile.h b/DesktopEditor/doctrenderer/drawingfile.h index 546f469ae7..d065058580 100644 --- a/DesktopEditor/doctrenderer/drawingfile.h +++ b/DesktopEditor/doctrenderer/drawingfile.h @@ -127,7 +127,12 @@ public: m_pFile = new CPdfFile(m_pApplicationFonts); if (!m_pFile->LoadFromFile(sFile, L"", sPassword, sPassword)) { - RELEASEOBJECT(m_pFile); + if (4 != ((CPdfFile*)m_pFile)->GetError()) + { + RELEASEOBJECT(m_pFile); + } + else + m_nType = 0; } else m_nType = 0; @@ -167,7 +172,12 @@ public: m_pFile = new CPdfFile(m_pApplicationFonts); if (!m_pFile->LoadFromMemory(data, size, L"", sPassword, sPassword)) { - RELEASEOBJECT(m_pFile); + if (4 != ((CPdfFile*)m_pFile)->GetError()) + { + RELEASEOBJECT(m_pFile); + } + else + m_nType = 0; } else m_nType = 0; @@ -484,6 +494,14 @@ public: return NULL; } + std::wstring GetFontBinaryNative(const std::wstring& sName) + { + if (0 != m_nType) + return L""; + + return ((CPdfFile*)m_pFile)->GetEmbeddedFontPath(sName); + } + private: int GetPagesCount() { diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp index 32a0c9d2f4..163c958d38 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp @@ -71,6 +71,19 @@ JSSmart CDrawingFileEmbed::DestroyPixmap(JSSmart typedArray) return NULL; } +JSSmart CDrawingFileEmbed::GetFontBinary(JSSmart Id) +{ + if (0 != m_pFile->GetType()) + return NULL; + + std::wstring sName = Id->toStringW(); + std::wstring sFile = m_pFile->GetFontBinaryNative(sName); + if (sFile.empty()) + return NULL; + + return CJSContext::createUint8Array(sFile); +} + JSSmart CDrawingFileEmbed::GetGlyphs(JSSmart nPageIndex) { return WasmMemoryToJS(m_pFile->GetGlyphs(nPageIndex->toInt32())); diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h index 42f56aced4..06ad7e8f60 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.h @@ -40,6 +40,7 @@ public: JSSmart GetAnnotationsInfo(JSSmart nPageIndex); JSSmart GetAnnotationsAP(JSSmart nRasterW, JSSmart nRasterH, JSSmart nBackgroundColor, JSSmart nPageIndex, JSSmart nAnnot, JSSmart nView); + JSSmart GetFontBinary(JSSmart Id); JSSmart GetGlyphs(JSSmart nPageIndex); JSSmart DestroyTextInfo(); diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm index fe2af99105..bc460ff302 100644 --- a/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm +++ b/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm @@ -20,6 +20,7 @@ -(JSValue*) GetButtonIcons : (JSValue*)nBackgroundColor : (JSValue*)nPageIndex : (JSValue*)bBase64 : (JSValue*)nButtonWidget : (JSValue*)nIconView; -(JSValue*) GetAnnotationsInfo : (JSValue*)nPageIndex; -(JSValue*) GetAnnotationsAP : (JSValue*)nRasterW : (JSValue*)nRasterH : (JSValue*)nBackgroundColor : (JSValue*)nPageIndex : (JSValue*)nAnnot : (JSValue*)nView; +-(JSValue*) GetFontBinary : (JSValue*)Id; -(JSValue*) GetGlyphs : (JSValue*)nPageIndex; -(JSValue*) DestroyTextInfo; -(JSValue*) IsNeedCMap; @@ -53,6 +54,7 @@ FUNCTION_WRAPPER_JS_7(GetInteractiveFormsAP, GetInteractiveFormsAP) FUNCTION_WRAPPER_JS_5(GetButtonIcons, GetButtonIcons) FUNCTION_WRAPPER_JS_1(GetAnnotationsInfo, GetAnnotationsInfo) FUNCTION_WRAPPER_JS_6(GetAnnotationsAP, GetAnnotationsAP) +FUNCTION_WRAPPER_JS_1(GetFontBinary, GetFontBinary) FUNCTION_WRAPPER_JS_1(GetGlyphs, GetGlyphs) FUNCTION_WRAPPER_JS_0(DestroyTextInfo, DestroyTextInfo) FUNCTION_WRAPPER_JS_0(IsNeedCMap, IsNeedCMap) diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp index 600379c909..454b4790b2 100644 --- a/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/v8/v8_DrawingFileEmbed.cpp @@ -23,6 +23,7 @@ namespace NSDrawingFileEmbed FUNCTION_WRAPPER_V8_5(_GetButtonIcons, GetButtonIcons) FUNCTION_WRAPPER_V8_1(_GetAnnotationsInfo, GetAnnotationsInfo) FUNCTION_WRAPPER_V8_6(_GetAnnotationsAP, GetAnnotationsAP) + FUNCTION_WRAPPER_V8_1(_GetFontBinary, GetFontBinary) FUNCTION_WRAPPER_V8_1(_GetGlyphs, GetGlyphs) FUNCTION_WRAPPER_V8_0(_DestroyTextInfo, DestroyTextInfo) FUNCTION_WRAPPER_V8_0(_IsNeedCMap, IsNeedCMap) @@ -51,6 +52,7 @@ namespace NSDrawingFileEmbed NSV8Objects::Template_Set(result, "GetButtonIcons", _GetButtonIcons); NSV8Objects::Template_Set(result, "GetAnnotationsInfo", _GetAnnotationsInfo); NSV8Objects::Template_Set(result, "GetAnnotationsAP", _GetAnnotationsAP); + NSV8Objects::Template_Set(result, "GetFontBinary", _GetFontBinary); NSV8Objects::Template_Set(result, "GetGlyphs", _GetGlyphs); NSV8Objects::Template_Set(result, "DestroyTextInfo", _DestroyTextInfo); NSV8Objects::Template_Set(result, "IsNeedCMap", _IsNeedCMap); diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js index 895a4e4250..a766f62f47 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js @@ -115,7 +115,7 @@ CFile.prototype["loadFromDataWithPassword"] = function(password) if (0 != this.nativeFile) this._closeFile(); - let isSuccess = this._openFile(arrayBuffer, password); + let isSuccess = this._openFile(undefined, password); let error = this._getError(); // 0 - ok, 4 - password, else: error this.type = this._getType(); diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js index 7fed46a3f8..fc4f69cf23 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js @@ -107,7 +107,7 @@ CFile.prototype._setCMap = function(memoryBuffer) CFile.prototype._getFontByID = function(ID) { - return null; + return g_native_drawing_file["GetFontBinary"](ID); }; CFile.prototype._getInteractiveFormsFonts = function(type) diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js index 8aa600e208..7d091da84e 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js @@ -82,7 +82,7 @@ CFile.prototype._getUint8ClampedArray = function(ptr, len) // FILE CFile.prototype._openFile = function(buffer, password) { - if (this.stream && buffer) + if (buffer) { let data = new Uint8Array(buffer); this.stream_size = data.length; From 056bfb84ce6a24ffd7e597eb6910a69c33cf26d9 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 23 Sep 2024 22:40:21 +0300 Subject: [PATCH 75/82] Fix typo --- DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js index 7d091da84e..f2e81f7cb0 100644 --- a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js +++ b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js @@ -94,7 +94,7 @@ CFile.prototype._openFile = function(buffer, password) if (password) { let passwordBuf = password.toUtf8(); - let passwordPtr = Module["_malloc"](passwordBuf.length); + passwordPtr = Module["_malloc"](passwordBuf.length); Module["HEAP8"].set(passwordBuf, passwordPtr); } From 812fae8f6c6339a14db473175ac40cfec33c1fdc Mon Sep 17 00:00:00 2001 From: Green Date: Tue, 24 Sep 2024 11:46:34 +0300 Subject: [PATCH 76/82] Fix bug #69036 --- .../CInterpretatorSvgBase.cpp | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp index 0129b4f632..48cc8a57ba 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfInterpretator/CInterpretatorSvgBase.cpp @@ -281,23 +281,29 @@ namespace MetaFile arNodeAttributes.push_back({L"font-size", ConvertToWString(dFontHeight)}); - std::wstring wsFontName = pFont->GetFaceName(); + NSStringUtils::CStringBuilder oFontName; + oFontName.WriteEncodeXmlString(pFont->GetFaceName()); -#ifndef BUILDING_WASM_MODULE - if (!wsFontName.empty()) + if (0 != oFontName.GetSize()) { + #ifndef BUILDING_WASM_MODULE NSFonts::CFontSelectFormat oFormat; oFormat.wsName = new std::wstring(pFont->GetFaceName()); NSFonts::CFontInfo *pFontInfo = m_pParser->GetFontManager()->GetFontInfoByParams(oFormat); - if (NULL != pFontInfo && !StringEquals(wsFontName, pFontInfo->m_wsFontName)) - wsFontName = L"'" + wsFontName + L"', '" + pFontInfo->m_wsFontName + L"'"; + if (NULL != pFontInfo && !StringEquals(*oFormat.wsName, pFontInfo->m_wsFontName)) + { + oFontName.Clear(); + oFontName.WriteEncodeXmlString(L"\'"); + oFontName.WriteEncodeXmlString(*oFormat.wsName); + oFontName.WriteEncodeXmlString(L"\',\'"); + oFontName.WriteEncodeXmlString(pFontInfo->m_wsFontName); + oFontName.WriteEncodeXmlString(L"\'"); + } + #endif + arNodeAttributes.push_back({L"font-family", oFontName.GetData()}); } -#endif - - if (!wsFontName.empty()) - arNodeAttributes.push_back({L"font-family", wsFontName}); if (pFont->GetWeight() > 550) arNodeAttributes.push_back({L"font-weight", L"bold"}); From fc94de8549b646f2b409407caabca992717366dc Mon Sep 17 00:00:00 2001 From: Green Date: Tue, 24 Sep 2024 11:48:59 +0300 Subject: [PATCH 77/82] Refactoring and improving the debug mod --- .../Metafile/Wmf/WmfParser/CWmfParser.cpp | 9 +- .../Metafile/Wmf/WmfParser/CWmfParserBase.cpp | 3 + .../Metafile/Wmf/WmfParser/CWmfParserBase.h | 107 ++++++++++++++++++ 3 files changed, 113 insertions(+), 6 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp index 13df37bdf0..80c253233b 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParser.cpp @@ -27,15 +27,12 @@ namespace MetaFile unsigned int unSize; unsigned short ushType; - unsigned int ulNumber = 0; if (NULL != m_pInterpretator) m_pInterpretator->Begin(); Read_META_HEADER(); - unsigned int unRecordIndex = 1; - while (!CheckError()) { if (m_oStream.CanRead() < 6) @@ -54,6 +51,9 @@ namespace MetaFile m_oStream.SetCurrentBlockSize(m_unRecordSize); + if (NULL != m_pInterpretator) + PRINT_WMF_RECORD(ushType) + switch (ushType) { //----------------------------------------------------------- @@ -149,14 +149,11 @@ namespace MetaFile //----------------------------------------------------------- default: { - //std::cout << ushType << " "; Read_META_UNKNOWN(); break; } } - unRecordIndex++; - if (m_bEof) break; diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp index e7af599510..4e2400ecdf 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp @@ -1684,7 +1684,10 @@ namespace MetaFile void CWmfParserBase::HANDLE_META_ESCAPE(unsigned short ushEscapeFunction, unsigned short ushByteCount) { if (NULL != m_pInterpretator) + { m_pInterpretator->HANDLE_META_ESCAPE(ushEscapeFunction, ushByteCount); + PRINT_WMF_LOG(L"Escape function type: " << ushEscapeFunction << L" size: " << ushByteCount); + } if (WMF_META_ESCAPE_ENHANCED_METAFILE == ushEscapeFunction) { diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h index 43f1bdb298..cdea9bd40e 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h @@ -11,6 +11,113 @@ #undef DrawText #endif +#define PRINT_WMF_RECORD(type) do {} while(false) +#define PRINT_WMF_LOG(text) do {} while(false) + +#ifdef _DEBUG +#define LOG_WMF_RECORDS 1 + +#ifdef LOG_WMF_RECORDS + #if 1 == LOG_WMF_RECORDS + #include + + #define PRINTING_WMF_RECORDS 1 + + #define PRINT_WMF_LOG(text) \ + std::wcout << L"[LOG] " << text << std::endl + + #ifdef PRINTING_WMF_RECORDS + #if 1 == PRINTING_WMF_RECORDS + #define AddRecord(name) {name, L#name} + + static const std::map mWmfRecords = + { + AddRecord(META_EOF), + AddRecord(META_SETBKCOLOR), + AddRecord(META_SETBKMODE), + AddRecord(META_SETMAPMODE), + AddRecord(META_SETROP2), + AddRecord(META_SETRELABS), + AddRecord(META_SETPOLYFILLMODE), + AddRecord(META_SETSTRETCHBLTMODE), + AddRecord(META_SETTEXTCHAREXTRA), + AddRecord(META_SETTEXTCOLOR), + AddRecord(META_SETTEXTJUSTIFICATION), + AddRecord(META_SETWINDOWORG), + AddRecord(META_SETWINDOWEXT), + AddRecord(META_SETVIEWPORTORG), + AddRecord(META_SETVIEWPORTEXT), + AddRecord(META_OFFSETWINDOWORG), + AddRecord(META_SCALEWINDOWEXT), + AddRecord(META_OFFSETVIEWPORTORG), + AddRecord(META_SCALEVIEWPORTEXT), + AddRecord(META_LINETO), + AddRecord(META_MOVETO), + AddRecord(META_EXCLUDECLIPRECT), + AddRecord(META_INTERSECTCLIPRECT), + AddRecord(META_ARC), + AddRecord(META_ELLIPSE), + AddRecord(META_FLOODFILL), + AddRecord(META_PIE), + AddRecord(META_RECTANGLE), + AddRecord(META_ROUNDRECT), + AddRecord(META_PATBLT), + AddRecord(META_SAVEDC), + AddRecord(META_SETPIXEL), + AddRecord(META_OFFSETCLIPRGN), + AddRecord(META_TEXTOUT), + AddRecord(META_BITBLT), + AddRecord(META_STRETCHBLT), + AddRecord(META_POLYGON), + AddRecord(META_POLYLINE), + AddRecord(META_ESCAPE), + AddRecord(META_RESTOREDC), + AddRecord(META_FILLREGION), + AddRecord(META_FRAMEREGION), + AddRecord(META_INVERTREGION), + AddRecord(META_PAINTREGION), + AddRecord(META_SELECTCLIPREGION), + AddRecord(META_SELECTOBJECT), + AddRecord(META_SETTEXTALIGN), + AddRecord(META_CHORD), + AddRecord(META_SETMAPPERFLAGS), + AddRecord(META_EXTTEXTOUT), + AddRecord(META_SETDIBTODEV), + AddRecord(META_SELECTPALETTE), + AddRecord(META_REALIZEPALETTE), + AddRecord(META_ANIMATEPALETTE), + AddRecord(META_SETPALENTRIES), + AddRecord(META_POLYPOLYGON), + AddRecord(META_RESIZEPALETTE), + AddRecord(META_DIBBITBLT), + AddRecord(META_DIBSTRETCHBLT), + AddRecord(META_DIBCREATEPATTERNBRUSH), + AddRecord(META_STRETCHDIB), + AddRecord(META_EXTFLOODFILL), + AddRecord(META_SETLAYOUT), + AddRecord(META_DELETEOBJECT), + AddRecord(META_CREATEPALETTE), + AddRecord(META_CREATEPATTERNBRUSH), + AddRecord(META_CREATEPENINDIRECT), + AddRecord(META_CREATEFONTINDIRECT), + AddRecord(META_CREATEBRUSHINDIRECT), + AddRecord(META_CREATEREGION) + }; + + #define PRINT_WMF_RECORD(type) \ + {\ + std::map::const_iterator itFound = mWmfRecords.find(type); \ + if (mWmfRecords.cend() != itFound) \ + std::wcout << itFound->second << std::endl; \ + else \ + std::wcout << L"Unknown record: " << type << std::endl; \ + } + #endif + #endif + #endif +#endif +#endif + namespace MetaFile { enum WmfParserType From e1c2bf19d998c0e17836809f3bb2eef668c220de Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Tue, 24 Sep 2024 18:08:40 +0300 Subject: [PATCH 78/82] Fix build --- .../raster/Metafile/Wmf/WmfParser/CWmfParserBase.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h index cdea9bd40e..ea91c38867 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h @@ -28,9 +28,9 @@ #ifdef PRINTING_WMF_RECORDS #if 1 == PRINTING_WMF_RECORDS - #define AddRecord(name) {name, L#name} + #define AddRecord(name) {name, #name} - static const std::map mWmfRecords = + static const std::map mWmfRecords = { AddRecord(META_EOF), AddRecord(META_SETBKCOLOR), @@ -106,11 +106,11 @@ #define PRINT_WMF_RECORD(type) \ {\ - std::map::const_iterator itFound = mWmfRecords.find(type); \ + std::map::const_iterator itFound = mWmfRecords.find(type); \ if (mWmfRecords.cend() != itFound) \ - std::wcout << itFound->second << std::endl; \ + std::cout << itFound->second << std::endl; \ else \ - std::wcout << L"Unknown record: " << type << std::endl; \ + std::cout << "Unknown record: " << type << std::endl; \ } #endif #endif From 8c83b18216080b155b08127cb5b5a3519b440e34 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Tue, 24 Sep 2024 21:23:16 +0300 Subject: [PATCH 79/82] fix bug #70440 --- OOXML/Common/SimpleTypes_Drawing.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/Common/SimpleTypes_Drawing.h b/OOXML/Common/SimpleTypes_Drawing.h index e75ee11352..c86195de3d 100644 --- a/OOXML/Common/SimpleTypes_Drawing.h +++ b/OOXML/Common/SimpleTypes_Drawing.h @@ -2256,7 +2256,7 @@ namespace SimpleTypes hierBranch_std = 4 }; - DEFINE_SIMPLE_TYPE(CHierBranch, EHierBranch, hierBranch_hang) + DEFINE_SIMPLE_TYPE(CHierBranch, EHierBranch, hierBranch_std) //-------------------------------------------------------------------------------- // ResizeHandles From 0f3de35eb4015dff1ea46fd997b3ebe133d97dea Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Tue, 24 Sep 2024 21:44:52 +0300 Subject: [PATCH 80/82] Fix bug 69927 --- X2tConverter/src/lib/pdf_image.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/X2tConverter/src/lib/pdf_image.h b/X2tConverter/src/lib/pdf_image.h index 97bd09d86e..02ef86673b 100644 --- a/X2tConverter/src/lib/pdf_image.h +++ b/X2tConverter/src/lib/pdf_image.h @@ -1060,12 +1060,14 @@ namespace NExtractTools if (!NSDirectory::Exists(sTempDirOut)) NSDirectory::CreateDirectory(sTempDirOut); - oDocxRenderer.SetTempFolder(sTempDirOut); - bool bIsOutCompress = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo && !params.hasSavePassword(); + std::wstring sTempDirOutTmp = combinePath(convertParams.m_sTempDir, L"output_tmp"); + if (!NSDirectory::Exists(sTempDirOutTmp)) + NSDirectory::CreateDirectory(sTempDirOutTmp); - nRes = oDocxRenderer.Convert(pReader, sTo, bIsOutCompress); + oDocxRenderer.SetTempFolder(sTempDirOutTmp); + nRes = oDocxRenderer.Convert(pReader, sTempDirOut, false); - if (nRes == S_OK && !bIsOutCompress) + if (nRes == S_OK) nRes = fromDocxDir(sTempDirOut, sTo, nFormatTo, params, convertParams); } else From 57800ec8dd2daf4d4e1c64f63bdcbeb862fea8de Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Tue, 24 Sep 2024 21:46:58 +0300 Subject: [PATCH 81/82] fix bug #33177 --- .../Sheets/Reader/CellFormatController/DigitReader.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp index 445bc7bafe..cd003eddf3 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp @@ -116,6 +116,11 @@ bool DigitReader::ReadDigit(const std::wstring &value, std::wstring &digit, std: format = data_format; } } + else + { + digit = std::to_wstring(dValue); + format = data_format; + } } else { From 4242d32d9586e267fbdd004574924a8ba663fddc Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 25 Sep 2024 12:18:18 +0300 Subject: [PATCH 82/82] Fix release build --- .../raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp | 2 +- .../raster/Metafile/Wmf/WmfParser/CWmfParserBase.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp index 4e2400ecdf..aad2f61ba9 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.cpp @@ -1686,7 +1686,7 @@ namespace MetaFile if (NULL != m_pInterpretator) { m_pInterpretator->HANDLE_META_ESCAPE(ushEscapeFunction, ushByteCount); - PRINT_WMF_LOG(L"Escape function type: " << ushEscapeFunction << L" size: " << ushByteCount); + PRINT_WMF_LOG("Escape function type: " << ushEscapeFunction << " size: " << ushByteCount); } if (WMF_META_ESCAPE_ENHANCED_METAFILE == ushEscapeFunction) diff --git a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h index ea91c38867..d989b40255 100644 --- a/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h +++ b/DesktopEditor/raster/Metafile/Wmf/WmfParser/CWmfParserBase.h @@ -11,8 +11,8 @@ #undef DrawText #endif -#define PRINT_WMF_RECORD(type) do {} while(false) -#define PRINT_WMF_LOG(text) do {} while(false) +#define PRINT_WMF_RECORD(type) do {} while(false); +#define PRINT_WMF_LOG(text) do {} while(false); #ifdef _DEBUG #define LOG_WMF_RECORDS 1 @@ -24,7 +24,7 @@ #define PRINTING_WMF_RECORDS 1 #define PRINT_WMF_LOG(text) \ - std::wcout << L"[LOG] " << text << std::endl + std::cout << "[LOG] " << text << std::endl #ifdef PRINTING_WMF_RECORDS #if 1 == PRINTING_WMF_RECORDS