From 2f525c1e4f0b3cee8653514cb1e0941f3db73764 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 11 Nov 2024 14:32:26 +0300 Subject: [PATCH 1/3] Remove using iterator after remove it from list --- DesktopEditor/graphics/BaseThreadMonitor.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/graphics/BaseThreadMonitor.cpp b/DesktopEditor/graphics/BaseThreadMonitor.cpp index 29e4bfe0974..b84268b76dd 100644 --- a/DesktopEditor/graphics/BaseThreadMonitor.cpp +++ b/DesktopEditor/graphics/BaseThreadMonitor.cpp @@ -107,9 +107,14 @@ namespace NSThreads { if (i->ID == nThreadId) { + CBaseThreadInfo last; + last.ID = i->ID; + last.Instance = i->Instance; + m_listThreads.erase(i); - m_listThreads.insert(m_listThreads.begin(), *i); - return i->Instance; + m_listThreads.insert(m_listThreads.begin(), last); + + return last.Instance; } i++; } From 8ad76e4e1f55ef573dfc4f8afd5ecf6f8534944a Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 13 Nov 2024 01:33:43 +0300 Subject: [PATCH 2/3] Fix bug 68072 --- .../doctrenderer/embed/GraphicsEmbed.cpp | 66 ++++++++++++++++++- .../doctrenderer/embed/GraphicsEmbed.h | 2 + DesktopEditor/doctrenderer/graphics.cpp | 10 ++- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/DesktopEditor/doctrenderer/embed/GraphicsEmbed.cpp b/DesktopEditor/doctrenderer/embed/GraphicsEmbed.cpp index 918277445f7..b2677c4b85e 100644 --- a/DesktopEditor/doctrenderer/embed/GraphicsEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/GraphicsEmbed.cpp @@ -1,4 +1,6 @@ #include "../graphics.h" +#include +#include "../../../Common/Network/FileTransporter/include/FileTransporter.h" // APPLICATION INFO class CGraphicsAppImage_private @@ -10,6 +12,8 @@ class CGraphicsAppImage_private std::wstring m_sThemesDirectory; bool m_bIsRgba; + std::map m_mapDownloads; + CGraphicsAppImage_private() { m_pFonts = NULL; @@ -21,6 +25,52 @@ class CGraphicsAppImage_private ~CGraphicsAppImage_private() { RELEASEINTERFACE(m_pFonts); + + for (std::map::iterator i = m_mapDownloads.begin(); i != m_mapDownloads.end(); i++) + { + std::wstring sTmp = i->second; + if (NSFile::CFileBinary::Exists(sTmp)) + NSFile::CFileBinary::Remove(sTmp); + } + } + + bool IsNeedDownload(const std::wstring& sUrl) + { + if ((0 == sUrl.find(L"www.")) || + (0 == sUrl.find(L"http://")) || + (0 == sUrl.find(L"https://"))) + return true; + return false; + } + + std::wstring GetImagePath(const std::wstring& sUrl) + { + std::map::iterator find = m_mapDownloads.find(sUrl); + if (find != m_mapDownloads.end()) + return find->second; + + NSNetwork::NSFileTransport::CFileDownloader oDownloader(sUrl, false); + + std::wstring sTmpFile = NSFile::CFileBinary::CreateTempFileWithUniqueName(NSFile::CFileBinary::GetTempPath(), L"IMG"); + if (NSFile::CFileBinary::Exists(sTmpFile)) + NSFile::CFileBinary::Remove(sTmpFile); + sTmpFile = sTmpFile + L".png"; + + oDownloader.SetFilePath(sTmpFile); + oDownloader.Start(0); + while ( oDownloader.IsRunned() ) + { + NSThreads::Sleep( 10 ); + } + bool bIsDownloaded = oDownloader.IsFileDownloaded(); + + if (bIsDownloaded) + { + m_mapDownloads.insert(std::pair(sUrl, sTmpFile)); + return sTmpFile; + } + + return sUrl; } }; @@ -270,11 +320,19 @@ JSSmart CGraphicsEmbed::ClearLastFont() } JSSmart CGraphicsEmbed::drawImage2(JSSmart img, JSSmart x, JSSmart y, JSSmart w, JSSmart h, JSSmart alpha, JSSmart srcRect) { - m_pInternal->drawImage(img->toStringW(), x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32()); + std::wstring sUrl = img->toStringW(); + if (m_pInternal->m_pAppImage && m_pInternal->m_pAppImage->m_internal->IsNeedDownload(sUrl)) + sUrl = m_pInternal->m_pAppImage->m_internal->GetImagePath(sUrl); + + m_pInternal->drawImage(sUrl, x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32()); return NULL; } JSSmart CGraphicsEmbed::drawImage (JSSmart img, JSSmart x, JSSmart y, JSSmart w, JSSmart h, JSSmart alpha, JSSmart srcRect, JSSmart nativeImage) { + std::wstring sUrl = img->toStringW(); + if (m_pInternal->m_pAppImage && m_pInternal->m_pAppImage->m_internal->IsNeedDownload(sUrl)) + sUrl = m_pInternal->m_pAppImage->m_internal->GetImagePath(sUrl); + m_pInternal->drawImage(img->toStringW(), x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32()); return NULL; } @@ -579,7 +637,11 @@ JSSmart CGraphicsEmbed::GetBrushColor() } JSSmart CGraphicsEmbed::put_brushTexture(JSSmart src, JSSmart type) { - m_pInternal->put_brushTexture(src->toStringW(), type->toInt32()); + std::wstring sUrl = src->toStringW(); + if (m_pInternal->m_pAppImage && m_pInternal->m_pAppImage->m_internal->IsNeedDownload(sUrl)) + sUrl = m_pInternal->m_pAppImage->m_internal->GetImagePath(sUrl); + + m_pInternal->put_brushTexture(sUrl, type->toInt32()); return NULL; } JSSmart CGraphicsEmbed::put_brushTextureMode(JSSmart mode) diff --git a/DesktopEditor/doctrenderer/embed/GraphicsEmbed.h b/DesktopEditor/doctrenderer/embed/GraphicsEmbed.h index 68d50c5814f..f6839e993c6 100644 --- a/DesktopEditor/doctrenderer/embed/GraphicsEmbed.h +++ b/DesktopEditor/doctrenderer/embed/GraphicsEmbed.h @@ -31,6 +31,8 @@ class JS_DECL CGraphicsAppImage private: CGraphicsAppImage_private* m_internal; + + friend class CGraphicsEmbed; }; namespace NSGraphics { class CGraphics; } diff --git a/DesktopEditor/doctrenderer/graphics.cpp b/DesktopEditor/doctrenderer/graphics.cpp index a85a4b1ef57..1df4b26bae8 100644 --- a/DesktopEditor/doctrenderer/graphics.cpp +++ b/DesktopEditor/doctrenderer/graphics.cpp @@ -313,7 +313,10 @@ namespace NSGraphics } void CGraphics::drawImage(const std::wstring& img, double x, double y, double w, double h, BYTE alpha) { - std::wstring strImage = (0 == img.find(L"theme") ? m_pAppImage->GetThemesDirectory() : m_pAppImage->GetImagesDirectory()) + L'/' + img; + std::wstring strImage = img; + if (!NSFile::CFileBinary::Exists(img)) + strImage = (0 == img.find(L"theme") ? m_pAppImage->GetThemesDirectory() : m_pAppImage->GetImagesDirectory()) + L'/' + img; + #ifdef ENABLE_GR_LOGS std::wcout << L"drawImage " << strImage << L" " << x << " " << y << L" " << w << L" " << h << L" " << alpha << std::endl; #endif @@ -1250,7 +1253,10 @@ namespace NSGraphics } else { - std::wstring strImage = (0 == src.find(L"theme") ? m_pAppImage->GetThemesDirectory() : m_pAppImage->GetImagesDirectory()) + L'/' + src; + std::wstring strImage = src; + if (!NSFile::CFileBinary::Exists(src)) + strImage = (0 == src.find(L"theme") ? m_pAppImage->GetThemesDirectory() : m_pAppImage->GetImagesDirectory()) + L'/' + src; + std::wstring sName = strImage.substr(0, strImage.rfind(L'.') + 1); std::wstring sExt = src.substr(src.rfind(L'.') + 1); if (sExt == L"svg") From 099ebc3de945d6fa78da681073bccdb758f8933f Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Fri, 15 Nov 2024 13:57:43 +0300 Subject: [PATCH 3/3] Enable JS error logs in release mode --- DesktopEditor/doctrenderer/js_internal/v8/v8_base.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 003ed3a1eb5..247ab50f557 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -54,9 +54,9 @@ v8::Local CreateV8String(v8::Isolate* i, const std::string& str); #ifdef __ANDROID__ -#ifdef _DEBUG +//#ifdef _DEBUG #define ANDROID_LOGS -#endif +//#endif #ifdef ANDROID_LOGS #include