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..edef26c42e 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) @@ -82,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/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..fcfc62b0e3 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)) @@ -692,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); @@ -704,29 +724,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/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/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/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); 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 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/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/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..1177046c84 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: /** @@ -492,9 +497,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.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 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(); diff --git a/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py b/DesktopEditor/doctrenderer/docbuilder.python/src/docbuilder.py index 978b306176..c444b92d4a 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 @@ -118,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 @@ -277,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): @@ -301,6 +313,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) @@ -379,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 6df39de00e..c762f4c1b0 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(); @@ -159,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 64b94140b3..a82c52059e 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); @@ -55,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 f740456b2f..68add68351 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; @@ -669,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)); @@ -815,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) { diff --git a/DesktopEditor/doctrenderer/docbuilder_p.h b/DesktopEditor/doctrenderer/docbuilder_p.h index a6443ff25c..e82fd1ffdc 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.h +++ b/DesktopEditor/doctrenderer/docbuilder_p.h @@ -130,12 +130,12 @@ namespace NSDoctRenderer } ~CString_Private() { - if (m_data) - delete [] m_data; + delete[] m_data; } void Attach(wchar_t* data) { + delete[] m_data; m_data = data; } @@ -143,7 +143,7 @@ namespace NSDoctRenderer { if (copy->m_data) { - delete [] copy->m_data; + delete[] copy->m_data; copy->m_data = NULL; } @@ -154,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'; + } }; } @@ -400,6 +407,11 @@ public: { m_scopes.push_back(scope); } + + void AddNewScope(NSDoctRenderer::CDocBuilderContextScopeWrap* scope) + { + m_scopes.emplace_back(scope); + } }; class CV8RealTimeWorker @@ -1277,7 +1289,7 @@ namespace NSDoctRenderer return m_pWorker->ExecuteCommand(command, retValue); } - CDocBuilderContext GetContext() + CDocBuilderContext GetContext(bool enterContext) { CDocBuilderContext ctx; @@ -1285,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; } diff --git a/DesktopEditor/doctrenderer/doctrenderer.cpp b/DesktopEditor/doctrenderer/doctrenderer.cpp index d23142ac23..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(); } @@ -599,8 +592,10 @@ namespace NSDoctRenderer LOGGER_SPEED_LAP("compile"); - if (!context->isSnapshotUsed()) - NSDoctRenderer::RunEditor(editorType, context, try_catch, this); + NSDoctRenderer::RunEditor(editorType, context, try_catch, this); + + if (editorType == DoctRendererEditorType::PDF && m_pDrawingFile) + EmbedDrawingFile(context, m_pDrawingFile); if (try_catch->Check()) { @@ -663,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(); @@ -1087,7 +1087,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); @@ -1104,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( @@ -1115,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/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 387f0a787e..a5789be704 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 @@ -32,6 +27,7 @@ HEADERS += \ docbuilder.h SOURCES += \ + editors.cpp \ nativecontrol.cpp \ doctrenderer.cpp \ docbuilder.cpp \ @@ -49,8 +45,7 @@ HEADERS += \ nativecontrol.h \ graphics.h \ hash.h \ - server.h \ - drawingfile.h + server.h HEADERS += \ embed/PointerEmbed.h \ @@ -63,7 +58,6 @@ HEADERS += \ embed/TextMeasurerEmbed.h \ embed/HashEmbed.h \ embed/Default.h \ - embed/DrawingFileEmbed.h \ js_internal/js_base.h SOURCES += \ @@ -76,8 +70,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 +103,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 +110,19 @@ include(../../Common/3dParty/openssl/openssl.pri) # downloader 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) + + HEADERS += \ + drawingfile.h \ + embed/DrawingFileEmbed.h + + SOURCES += \ + ../../HtmlRenderer/src/HTMLRendererText.cpp \ + embed/DrawingFileEmbed.cpp + + ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/DrawingFileEmbed.h) +} diff --git a/DesktopEditor/doctrenderer/drawingfile.h b/DesktopEditor/doctrenderer/drawingfile.h index 1a74d8f371..d065058580 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() { @@ -100,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; @@ -140,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; @@ -457,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/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 4fbd706836..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,254 +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.InitNativeObject();\ -window.InitNativeTextMeasurer();\ -window.InitNativeZLib();\ -AscFonts.checkAllFonts();\n"; - - 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) - { - 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_VERSION_89_PLUS - return NULL; -#endif - -#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); - - NSJSBase::CJSContextScope scope(context); - - JSSmart try_catch = context->GetExceptions(); - - if (!RunEditorFooter(context, try_catch, config)) - return NULL; - - 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 diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp index 12263c5eab..163c958d38 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp @@ -1,6 +1,7 @@ #include "DrawingFileEmbed.h" +#include "../drawingfile.h" -JSSmart MoveMemoryToJS(BYTE* pWasmData) +JSSmart WasmMemoryToJS(BYTE* pWasmData) { if (NULL == pWasmData) return CJSContext::createNull(); @@ -10,12 +11,16 @@ JSSmart MoveMemoryToJS(BYTE* pWasmData) if (4 >= nLen) return CJSContext::createNull(); - size_t nBufferSize = (size_t)(nLen - 4); - BYTE* pMemory = NSJSBase::NSAllocator::Alloc(nBufferSize); - memcpy(pMemory, pWasmData + 4, nBufferSize); - free(pWasmData); + return NSJSBase::CJSContext::createUint8Array(pWasmData + 4, nLen - 4, true); +} - return NSJSBase::CJSContext::createUint8Array(pMemory, (int)nBufferSize, false); +CDrawingFileEmbed::CDrawingFileEmbed() +{ + m_pFile = NULL; +} +CDrawingFileEmbed::~CDrawingFileEmbed() +{ + RELEASEOBJECT(m_pFile); } JSSmart CDrawingFileEmbed::OpenFile(JSSmart sFile, JSSmart sPassword) @@ -40,58 +45,89 @@ 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::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 MoveMemoryToJS(m_pFile->GetGlyphs(nPageIndex->toInt32())); + 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() @@ -105,7 +141,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) @@ -117,3 +153,28 @@ JSSmart CDrawingFileEmbed::GetImageBase64(JSSmart rId) *pData = ""; return ret; } + +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 89ab6e228a..06ad7e8f60 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; } @@ -32,8 +28,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,13 +40,20 @@ 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(); + JSSmart IsNeedCMap(); JSSmart ScanPage(JSSmart nPageIndex, JSSmart mode); JSSmart GetImageBase64(JSSmart rId); + JSSmart FreeWasmData(JSSmart typedArray); + DECLARE_EMBED_METHODS }; +bool EmbedDrawingFile(JSSmart& context, IOfficeDrawingFile* pFile); + #endif // _BUILD_NATIVE_ZIP_EMBED_H_ diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_DrawingFileEmbed.mm index 38a6e013a5..bc460ff302 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,13 @@ -(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; -(JSValue*) ScanPage : (JSValue*)nPageIndex : (JSValue*)mode; -(JSValue*) GetImageBase64 : (JSValue*)rId; +-(JSValue*) FreeWasmData : (JSValue*)typedArray; @end @interface CJSCDrawingFileEmbed : NSObject @@ -42,7 +45,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 +54,13 @@ 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) 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..454b4790b2 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,13 @@ 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) 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 +43,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 +52,13 @@ 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); NSV8Objects::Template_Set(result, "ScanPage", _ScanPage); NSV8Objects::Template_Set(result, "GetImageBase64", _GetImageBase64); + NSV8Objects::Template_Set(result, "FreeWasmData", _FreeWasmData); return handle_scope.Escape(result); } diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h index 186b5966ac..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; }; /** @@ -490,7 +498,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/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.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..8710b41cc8 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 @@ -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/doctrenderer/json/json.cpp b/DesktopEditor/doctrenderer/json/json.cpp index 88b4825f60..9126c91e9e 100644 --- a/DesktopEditor/doctrenderer/json/json.cpp +++ b/DesktopEditor/doctrenderer/json/json.cpp @@ -5,6 +5,15 @@ // for working with typed arrays: Alloc() and Free() #include "js_base.h" +// for converting primitive types to JSON-string +#include +#include +#include +// for strtod() +#include +// for modf() +#include + namespace NSJSON { CTypedValue::CTypedValue() : m_type(vtUndefined) @@ -175,6 +184,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 +610,324 @@ namespace NSJSON return ret; } + namespace + { + // 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++) + { + 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; + } + + // 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) + { + // 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; + } + + 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) + { + 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) + { + if (!skipWhitespaces(str, pos)) + return CValue(); + + CValue value; + char ch = str[pos]; + if (ch == '\"') + { + // string + value = parseStringFromJSON(str, pos); + } + else if (ch == '[') + { + // array + value = parseArrayFromJSON(str, pos); + } + else if (ch == '{') + { + // object + value = parseObjectFromJSON(str, pos); + } + else if (ch == 'n') + { + // null + if (str.substr(pos, 4) == "null") + value = CValue::CreateNull(); + else + return CValue(); + pos += 4; + } + else if (ch == 't') + { + // true (bool) + if (str.substr(pos, 4) == "true") + value = true; + else + return CValue(); + pos += 4; + } + else if (ch == 'f') + { + // false (bool) + if (str.substr(pos, 5) == "false") + value = false; + else + return CValue(); + pos += 5; + } + else if (ch == '-' || (ch >= '0' && ch <= '9')) + { + value = parseNumberFromJSON(str, pos); + } + else + { + return CValue(); + } + + 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; + } + 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..61e945e8ef 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,1083 @@ TEST_F(CJSONTest, serialization_with_script) EXPECT_TRUE(compare(obj, args[0])); } +// ----------- 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(); + 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_escaped_characters) +{ + CValue val = "HEL\"LO"; + std::string strRes = val.ToJSON(); + EXPECT_EQ(strRes, "\"HEL\\\"LO\""); + + val = "HEL\\/LO"; + strRes = val.ToJSON(); + EXPECT_EQ(strRes, "\"HEL\\\\/LO\""); + + val = "\tH\bE\fL\nL\nO\r"; + strRes = val.ToJSON(); + EXPECT_EQ(strRes, "\"\\tH\\bE\\fL\\nL\\nO\\r\""); + + // other symbols + std::string spec = "/"; + for (char ch = 0; ch <= 0x21; ch++) + { + spec += ch; + } + spec += '/'; + + val = spec; + strRes = val.ToJSON(); + 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) +{ + 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[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"}; + CValue arr = {0, arrInner, arrInner, CValue::CreateNull(), arrInner, CValue::CreateArray(4), typedArr}; + + std::string strRes = arr.ToJSON(); + 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); +} + +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; + 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(); + strRes = normalizeJSON(obj.ToJSON()); + strExpected = normalizeJSON("{\"name\":\"Foo\",\"number\":42,\"null\":null}"); + EXPECT_EQ(strRes, strExpected); +} + +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 = 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); +} + +// ----------- 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_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"; + 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_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"; + 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, std::numeric_limits::min()); + + strJson = "2147483647"; + val = CValue::FromJSON(strJson); + EXPECT_TRUE(val.IsInt()); + 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) +{ + 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()); +} + +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()); +} + +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() { 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; } 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/DesktopEditor/graphics/pro/js/after.py b/DesktopEditor/graphics/pro/js/after.py index 138e3d2ddd..b11b83257d 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\"]();}];") @@ -31,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/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.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile.js index bf47932f88..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(); @@ -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"] = []; diff --git a/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_native.js index 45071224a1..fc4f69cf23 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 g_native_drawing_file["GetFontBinary"](ID); }; 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/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js b/DesktopEditor/graphics/pro/js/wasm/js/drawingfile_wasm.js index 81ff56a1fe..f2e81f7cb0 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; @@ -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); } @@ -273,6 +273,8 @@ CFile.prototype._getGlyphs = function(pageIndex) res.result = new Uint8Array(len); res.result.set(textCommandsSrc); } + else + res.result = []; return res; }; 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/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/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 034cedecf0..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,63 +165,63 @@ 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; } 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() @@ -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 84c6e33652..f170434373 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(); } @@ -250,7 +403,7 @@ namespace MetaFile CEmfParserBase::ClearFile(); } - EmfParserType CEmfParser::GetType() + EmfParserType CEmfParser::GetType() const { return EmfParserType::EmfParser; } @@ -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,10 +1638,13 @@ namespace MetaFile if (sType == "EMF+" && NULL != m_pInterpretator) { + SaveDC(); + if (NULL == m_pEmfPlusParser) { 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); @@ -1500,6 +1656,8 @@ namespace MetaFile m_pInterpretator->ChangeConditional(); m_oStream.Skip(m_ulRecordSize - 8); + + RestoreDC(-1); } else if (sType == "GDIC") { @@ -1522,6 +1680,7 @@ namespace MetaFile oWmfParser.SetFontManager(GetFontManager()); oWmfParser.SetStream(m_oStream.GetCurPtr(), unWinMetafileSize); + oWmfParser.SetParent(this); oWmfParser.Scan(); if (oWmfParser.CheckError()) @@ -1544,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); @@ -1598,7 +1757,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 +1784,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 +1816,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..f2870789b7 100644 --- a/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h +++ b/DesktopEditor/raster/Metafile/Emf/EmfParser/CEmfParser.h @@ -20,13 +20,12 @@ namespace MetaFile void ClearFile() override; - EmfParserType GetType() override; + EmfParserType GetType() const 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..18423b0fc0 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) @@ -228,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; @@ -445,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) { @@ -597,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(){} @@ -617,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; @@ -653,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; @@ -700,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) @@ -829,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; @@ -856,6 +857,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 +972,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 +980,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) @@ -1292,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(); } @@ -1338,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(); @@ -1408,9 +1419,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); } @@ -1695,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) { @@ -1726,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); @@ -1742,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 b0780663e2..8b7b0f6bc9 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 @@ -54,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); @@ -93,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); @@ -107,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(); @@ -151,13 +179,16 @@ 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); void HANDLE_EMR_HEADER(TEmfHeader& oTEmfHeader); void HANDLE_EMR_ALPHABLEND(TEmfAlphaBlend& oTEmfAlphaBlend); @@ -397,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 9145e5dd45..eff536c1d3 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 || m_ulRecordSize > 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() @@ -339,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; } @@ -707,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; } @@ -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); @@ -1336,19 +1365,21 @@ 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(); } 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; @@ -1493,40 +1524,60 @@ namespace MetaFile case MetafileDataTypeEmfPlusOnly: case MetafileDataTypeEmfPlusDual: { - CEmfParser oParser; - oParser.SetOnlyEmfPlus(MetafileDataTypeEmfPlusOnly == pImage->GetMetafileType()); - 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()) { @@ -1539,8 +1590,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; @@ -1605,7 +1655,7 @@ namespace MetaFile oParser.PlayFile(); - TXForm *pXForm = m_pDC->GetTransform(); + const TXForm& oXForm{m_pDC->GetTransform()}; TRectD oRect; @@ -1616,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; @@ -1685,7 +1735,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 +1743,6 @@ namespace MetaFile m_oStream >> m_unLogicalDpiX; m_oStream >> m_unLogicalDpiY; - m_bBanEmfProcessing = true; - if (NULL != m_pInterpretator) { m_pInterpretator->Begin(); @@ -1711,8 +1759,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 +1767,6 @@ namespace MetaFile Read_EMFPLUS_DRAWARC_BASE(unShFlags); else Read_EMFPLUS_DRAWARC_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -1781,8 +1825,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWBEZIERS_BASE(unShFlags); // абсолютное расположение } - - m_bBanEmfProcessing = true; } template @@ -1842,8 +1884,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWCLOSEDCURVE_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами. } - - m_bBanEmfProcessing = true; } template @@ -1896,8 +1936,6 @@ namespace MetaFile Read_EMFPLUS_DRAWCURVE_BASE(unShFlags); else Read_EMFPLUS_DRAWCURVE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -1974,8 +2012,6 @@ namespace MetaFile TEmfPlusXForm oMatrix; m_oStream >> oMatrix; - - m_bBanEmfProcessing = true; } //---------- if (NULL == m_pInterpretator || wsString.length() != arGlyphPos.size()) @@ -2004,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); @@ -2026,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); @@ -2039,8 +2075,6 @@ namespace MetaFile } m_pDC->RemoveFont(pFont); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_DRAWELLIPSE(unsigned short unShFlags) @@ -2049,8 +2083,6 @@ namespace MetaFile Read_EMFPLUS_DRAWELLIPSE_BASE(unShFlags); else Read_EMFPLUS_DRAWELLIPSE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2094,8 +2126,6 @@ namespace MetaFile Read_EMFPLUS_DRAWIMAGE_BASE(unShFlags); else Read_EMFPLUS_DRAWIMAGE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2142,8 +2172,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWIMAGEPOINTS_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2159,7 +2187,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 +2215,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_DRAWLINES_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2225,8 +2251,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 +2289,6 @@ namespace MetaFile m_pDC->RemovePen(pEmfPlusPen); } - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_DRAWPIE(unsigned short unShFlags) @@ -2275,8 +2297,6 @@ namespace MetaFile Read_EMFPLUS_DRAWPIE_BASE(unShFlags); else Read_EMFPLUS_DRAWPIE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2302,8 +2322,6 @@ namespace MetaFile Read_EMFPLUS_DRAWRECTS_BASE(unShFlags); else Read_EMFPLUS_DRAWRECTS_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2467,8 +2485,6 @@ namespace MetaFile m_pDC->SetTextAlign(unOldTextAlign); m_pDC->RemoveFont(pFont); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_FILLCLOSEDCURVE(unsigned short unShFlags) @@ -2488,8 +2504,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_FILLCLOSEDCURVE_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2518,8 +2532,6 @@ namespace MetaFile Read_EMFPLUS_FILLELLIPSE_BASE(unShFlags); else Read_EMFPLUS_FILLELLIPSE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2622,8 +2634,6 @@ namespace MetaFile m_pDC->RemoveBrush(pBrush); } - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_FILLPIE(unsigned short unShFlags) @@ -2632,8 +2642,6 @@ namespace MetaFile Read_EMFPLUS_FILLPIE_BASE(unShFlags); else Read_EMFPLUS_FILLPIE_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2671,8 +2679,6 @@ namespace MetaFile //Оба флага не определены Read_EMFPLUS_FILLPOLYGON_BASE(unShFlags); // абсолютное расположение с 32-разрядными координатами с плавующей запятой } - - m_bBanEmfProcessing = true; } template @@ -2746,8 +2752,6 @@ namespace MetaFile Read_EMFPLUS_FILLRECTS_BASE(unShFlags); else Read_EMFPLUS_FILLRECTS_BASE(unShFlags); - - m_bBanEmfProcessing = true; } template @@ -2815,7 +2819,6 @@ namespace MetaFile m_oStream >> unBrushId; //TODO: реализовать - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_OBJECT(unsigned short unShFlags) @@ -2828,7 +2831,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 +2841,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 +2851,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 +2894,7 @@ namespace MetaFile } case ObjectTypeRegion: { - LOGGING(L"Object Region") + PRINT_LOG(L"Object Region"); CEmfPlusRegion *pEmfPlusRegion = ReadRegion(); @@ -2901,13 +2904,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 +2921,7 @@ namespace MetaFile } case ObjectTypeStringFormat: { - LOGGING(L"Object String Format") + PRINT_LOG(L"Object String Format"); CEmfPlusStringFormat *pStringFormat = new CEmfPlusStringFormat; @@ -2929,7 +2933,7 @@ namespace MetaFile } case ObjectTypeImageAttributes: { - LOGGING(L"Object Image Attributes") + PRINT_LOG(L"Object Image Attributes"); CEmfPlusImageAttributes *pImageAttributes = new CEmfPlusImageAttributes(); @@ -2943,10 +2947,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 +3126,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 +3161,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 +3176,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 +3202,6 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_SETWORLDTRANSFORM() @@ -3206,8 +3214,6 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, MWT_SET); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_TRANSLATEWORLDTRANSFORM(unsigned short unShFlags) @@ -3221,8 +3227,6 @@ namespace MetaFile m_pDC->MultiplyTransform(oMatrix, (unShFlags & 0x2000) ? MWT_RIGHTMULTIPLY : MWT_LEFTMULTIPLY); UpdateOutputDC(); - - m_bBanEmfProcessing = true; } void CEmfPlusParser::Read_EMFPLUS_ENDOFFILE() @@ -3231,7 +3235,6 @@ namespace MetaFile m_pInterpretator->End(); m_bEof = true; - m_bBanEmfProcessing = false; if (NULL != m_pInterpretator) m_pInterpretator->HANDLE_EMFPLUS_ENDOFFILE(); @@ -3247,8 +3250,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMRPLUS_OFFSETCLIP() { - m_bBanEmfProcessing = true; - double dX, dY; m_oStream >> dX; @@ -3262,8 +3263,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMRPLUS_RESETCLIP() { - m_bBanEmfProcessing = true; - m_pDC->GetClip()->Reset(); UpdateOutputDC(); @@ -3273,8 +3272,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_SETCLIPPATH(unsigned short unShFlags) { - m_bBanEmfProcessing = true; - BYTE uchObjectId = ExpressValue(unShFlags, 0, 7); CEmfPlusPath* pPath = GetPath(uchObjectId); @@ -3284,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) @@ -3293,8 +3290,6 @@ namespace MetaFile void CEmfPlusParser::Read_EMFPLUS_SETCLIPRECT(unsigned short unShFlags) { - m_bBanEmfProcessing = true; - short shCM = ExpressValue(unShFlags, 8, 11); TEmfPlusRectF oRect; @@ -3310,8 +3305,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); @@ -3334,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; } @@ -3351,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 1709db3e04..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 291acd40b4..cbca118655 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; } } @@ -435,7 +438,7 @@ namespace MetaFile UpdateFinalTransform(); } - unsigned int CEmfDC::GetMapMode() + unsigned int CEmfDC::GetMapMode() const { return m_ulMapMode; } @@ -445,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) { @@ -486,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; } @@ -503,7 +506,7 @@ namespace MetaFile if (pBrush == m_pBrush) m_pBrush = NULL; } - IBrush* CEmfDC::GetBrush() + const IBrush* CEmfDC::GetBrush() const { return m_pBrush; } @@ -516,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; } @@ -524,7 +527,7 @@ namespace MetaFile { m_ulTextAlign = ulAlign; } - unsigned int CEmfDC::GetTextAlign() + unsigned int CEmfDC::GetTextAlign() const { return m_ulTextAlign; } @@ -532,7 +535,7 @@ namespace MetaFile { m_ulBgMode = ulBgMode; } - unsigned int CEmfDC::GetBgMode() + unsigned int CEmfDC::GetBgMode() const { return m_ulBgMode; } @@ -540,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; } @@ -556,7 +559,7 @@ namespace MetaFile { m_ulFillMode = ulFillMode; } - unsigned int CEmfDC::GetFillMode() + unsigned int CEmfDC::GetFillMode() const { return m_ulFillMode; } @@ -569,7 +572,7 @@ namespace MetaFile if (pPen == m_pPen) m_pPen = NULL; } - IPen* CEmfDC::GetPen() + const IPen* CEmfDC::GetPen() const { return m_pPen; } @@ -577,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; } @@ -597,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; @@ -622,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); @@ -634,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; @@ -663,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); @@ -675,9 +678,9 @@ namespace MetaFile UpdateFinalTransform(); } - TEmfWindow* CEmfDC::GetViewport() + const TEmfWindow& CEmfDC::GetViewport() const { - return &m_oViewport; + return m_oViewport; } bool CEmfDC::UpdatePixelMetrics() { @@ -708,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); @@ -746,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; } @@ -763,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); } @@ -776,7 +779,7 @@ namespace MetaFile m_oCurPos.X = lX; m_oCurPos.Y = lY; } - TPointL& CEmfDC::GetCurPos() + const TPointL& CEmfDC::GetCurPos() const { return m_oCurPos; } @@ -784,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 1c860b7517..48cc8a57ba 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; @@ -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"}); @@ -378,7 +384,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.); @@ -494,6 +500,7 @@ namespace MetaFile {L"fill", CalculateColor(pBuffer[2], pBuffer[1], pBuffer[0], 255)}}; AddTransform(arAttributes, &oTransform); + AddClip(); WriteNode(L"rect", arAttributes); @@ -548,21 +555,21 @@ namespace MetaFile void CInterpretatorSvgBase::ResetClip() { + CloseClip(); m_oClip.Reset(); + m_bUpdatedClip = false; } 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""; @@ -571,23 +578,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; @@ -713,11 +720,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; @@ -861,7 +868,7 @@ namespace MetaFile { CloseClip(); - CClip *pClip = m_pParser->GetClip(); + const CClip *pClip = m_pParser->GetClip(); if (NULL == pClip || pClip->Empty()) return false; @@ -1017,7 +1024,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()) { @@ -1049,7 +1056,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(); @@ -1102,7 +1109,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()) { @@ -1125,7 +1132,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(); @@ -1175,7 +1182,7 @@ namespace MetaFile return wsStyleId; } - std::wstring CInterpretatorSvgBase::CreateGradient(IBrush *pBrush) + std::wstring CInterpretatorSvgBase::CreateGradient(const IBrush* pBrush) { if (pBrush == NULL) return std::wstring(); @@ -1720,7 +1727,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..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; @@ -183,11 +180,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..aad2f61ba9 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,16 +1675,19 @@ 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); } } 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("Escape function type: " << ushEscapeFunction << " size: " << ushByteCount); + } if (WMF_META_ESCAPE_ENHANCED_METAFILE == ushEscapeFunction) { @@ -1766,7 +1746,7 @@ namespace MetaFile if (NULL == m_pInterpretator) { if (!IsPlaceable()) - m_oBoundingBox = *oEmfParser.GetDCBounds(); + m_oBoundingBox = oEmfParser.GetDCBounds(); HANDLE_META_EOF(); } @@ -1785,11 +1765,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..d989b40255 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::cout << "[LOG] " << text << std::endl + + #ifdef PRINTING_WMF_RECORDS + #if 1 == PRINTING_WMF_RECORDS + #define AddRecord(name) {name, #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::cout << itFound->second << std::endl; \ + else \ + std::cout << "Unknown record: " << type << std::endl; \ + } + #endif + #endif + #endif +#endif +#endif + namespace MetaFile { enum WmfParserType @@ -32,35 +139,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 +181,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 +212,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; 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/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/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..f6126cd9c0 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CContainer.cpp @@ -51,17 +51,17 @@ 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; - 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); + pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); - EndPath(pRenderer, pFile, oOldTransform, oMode, 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 943894bd05..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_pImage(NULL) + : 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")); @@ -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()) @@ -28,28 +30,29 @@ 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) - 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() { - if (NULL != m_pImage) - delete m_pImage; } ObjectType CMarker::GetType() const @@ -60,91 +63,48 @@ 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 TMarkerExternData& oExternalData, 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 (NULL == oExternalData.m_pPoints || oExternalData.m_pPoints->empty() || m_arObjects.empty() || (EMarkerUnits::StrokeWidth == m_enUnits && Equals(0., oExternalData.m_dStroke))) return; - double dVBWidth = m_oViewBox.m_oWidth .ToDouble(NSCSS::Pixel); - double dVBHeight = 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 dMaxValue = std::max(dVBWidth, dVBHeight); + double dM11, dM12, dM21, dM22, dDx, dDy; + pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy); - NSGraphics::IGraphicsRenderer* pGrRenderer = NSGraphics::Create(); + const double dSkipX = m_oWindow.m_oX.ToDouble(NSCSS::Pixel) * dMaxScale; + const double dSkipY = m_oWindow.m_oY.ToDouble(NSCSS::Pixel) * dMaxScale; - double dMMtoPx = 96. / 25.4; + for (const TPointData& oPoint : *oExternalData.m_pPoints) + { + Aggplus::CMatrix oTransform(dM11, dM12, dM21, dM22, dDx, dDy); + oTransform.Translate(oPoint.m_oPoint.dX - dSkipX, oPoint.m_oPoint.dY - dSkipY); - int nWidth = dMaxValue * dMMtoPx + 1; - int nHeight = dMaxValue * dMMtoPx + 1; + 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); - if (0 == nWidth || 0 == nHeight) - return; + Aggplus::CMatrix oTransform2(oTransform); + oTransform2.Scale(dMaxScale, dMaxScale); - BYTE* pBgraData = new(std::nothrow) BYTE[nWidth * nHeight * 4]; + pRenderer->SetTransform(oTransform2.sx(), oTransform2.shy(), oTransform2.shx(), oTransform2.sy(), oTransform.tx(), oTransform.ty()); - if (!pBgraData) - return; + for (const CRenderedObject* pObject : m_arObjects) + pObject->Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); + } - unsigned int alfa = 0xffffff; - //дефолтный тон должен быть прозрачным, а не белым - //memset(pBgraData, 0xff, nWidth * nHeight * 4); - for (int i = 0; i < nWidth * nHeight; i++) - ((unsigned int*)pBgraData)[i] = alfa; - - CBgraFrame oFrame; - oFrame.put_Data(pBgraData); - oFrame.put_Width(nWidth); - oFrame.put_Height(nHeight); - oFrame.put_Stride(-4 * nWidth); - - pGrRenderer->CreateFromBgraFrame(&oFrame); - pGrRenderer->put_Width (dMaxValue); - pGrRenderer->put_Height(dMaxValue); - - 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->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()); + pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy); } - void CMarker::Draw(IRenderer *pRenderer, const std::vector &arPoints, double dStrokeWidth) const + bool CMarker::NeedExternalAngle() const { - if (NULL == m_pImage || arPoints.empty() || Equals(0., dStrokeWidth)) - return; + return m_enOrient != EMarkerOrient::Angle; + } - 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.); - - double dVBWidth = m_oViewBox.m_oWidth.ToDouble(NSCSS::Pixel); - double dVBHeight = m_oViewBox.m_oHeight.ToDouble(NSCSS::Pixel); - - 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) - { - Point oNewPoint(oPoint); - - oNewPoint.dX -= dSkipX; - oNewPoint.dY -= dSkipY; - - pRenderer->DrawImage((IGrObject*)m_pImage, oNewPoint.dX, oNewPoint.dY, dWidth, dHeight); - } + 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 ef301c69f3..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,16 +53,21 @@ namespace SVG void SetData(const std::map &mAttributes, unsigned short ushLevel, bool bHardMode) override; - void Update(const CSvgFile *pFile); + void Draw(IRenderer* pRenderer, const CSvgFile *pFile, const TMarkerExternData& oExternalData, CommandeMode oMode = CommandeModeDraw, const TSvgStyles* pOtherStyles = NULL, const CRenderedObject* pContexObject = NULL) const; - void Draw(IRenderer* pRenderer, const std::vector& arPoints, double dStrokeWidth) 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; - Aggplus::CImage *m_pImage; }; } diff --git a/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp b/DesktopEditor/raster/Metafile/svg/SvgObjects/CObjectBase.cpp index a5076af047..651b3f9e67 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 @@ -142,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()) @@ -241,9 +238,9 @@ namespace SVG m_oStyles.m_oStroke.m_oLineCap = Aggplus::LineJoinMiter; 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,54 +304,58 @@ 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) { 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) - 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); 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 + 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()))) { @@ -365,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()) @@ -391,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())) { @@ -417,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 affcb3f420..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; @@ -86,7 +85,7 @@ namespace SVG friend class CClipPath; NSCSS::CNode m_oXmlNode; - TSvgTransformation m_oTransformtaion; + TSvgTransformation m_oTransformation; }; enum CommandeMode @@ -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 d1b0f60c70..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())) @@ -306,7 +311,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 +363,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 +474,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 +484,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 +499,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())) @@ -514,7 +519,9 @@ 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); + + #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()) { @@ -522,8 +529,36 @@ namespace SVG if (NULL != pStartMarker) { - pStartMarker->Update(pFile); - pStartMarker->Draw(pRenderer, {(*m_arElements.front())[0]}, dStrokeWidth); + 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); + } } } @@ -531,15 +566,27 @@ 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) - arPoints[unIndex - 1] = (*m_arElements[unIndex])[-1]; - if (NULL != pMidMarker) { - pMidMarker->Update(pFile); - pMidMarker->Draw(pRenderer, arPoints, dStrokeWidth); + 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); } } @@ -549,12 +596,37 @@ namespace SVG if (NULL != pEndMarker) { - pEndMarker->Update(pFile); - pEndMarker->Draw(pRenderer, {(*m_arElements.back())[-1]}, dStrokeWidth); + 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); + EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject); return true; } @@ -569,6 +641,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 +667,24 @@ namespace SVG return oBounds; } + 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 - 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.base() - m_arElements.cbegin() - 1; + } + + return -1; + } + void CPath::ReadFromString(const std::wstring &wsValue) { CMoveElement *pMoveElement = NULL; @@ -608,7 +705,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..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: @@ -110,17 +111,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 int FindIndexFirstNotEmpty(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 2628f664be..ac93bd0e6c 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) @@ -136,11 +140,11 @@ 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); } } - 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; @@ -155,15 +159,17 @@ 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) - pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles); + 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, pContexObject); } - EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles); + EndPath(pRenderer, pFile, oOldMatrix, oMode, pOtherStyles, pContexObject); return true; } @@ -189,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; } @@ -297,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; @@ -312,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; } @@ -344,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; @@ -409,25 +415,39 @@ 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.; - 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; @@ -476,15 +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); - - for (const CRenderedObject* pTSpan : m_arObjects) - pTSpan->Draw(pRenderer, pFile, oMode, pOtherStyles); + CTSpan::Draw(pRenderer, pFile, oMode, pOtherStyles, pContexObject); return true; } @@ -512,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; @@ -522,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) { @@ -532,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; @@ -549,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; @@ -566,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 4f8f14500a..a2ae8aa6aa 100644 --- a/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp +++ b/DesktopEditor/raster/Metafile/svg/SvgObjects/CUse.cpp @@ -25,16 +25,16 @@ 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_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); @@ -51,13 +51,13 @@ 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, oTransform); + + EndPath(pRenderer, pFile, oOldTransform); return true; } 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; 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);}); diff --git a/HtmlFile2/htmlfile2.cpp b/HtmlFile2/htmlfile2.cpp index 302b9cb57a..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""; @@ -3943,6 +4439,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 +4452,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""); @@ -4214,6 +4722,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()) @@ -4288,7 +4797,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 +4808,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"); 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(); 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)); 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/PptFile/PPTXWriter/TableWriter.cpp b/MsBinaryFile/PptFile/PPTXWriter/TableWriter.cpp index 47245d0fe1..d20540b458 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/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/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; 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/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)) 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(); diff --git a/OOXML/Binary/Document/BinReader/Readers.cpp b/OOXML/Binary/Document/BinReader/Readers.cpp index 79a97075cf..3dc3b50d03 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 ) { @@ -6026,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; @@ -7510,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 b1fd86542b..16d2cbef8a 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 { @@ -1060,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 03e1de696b..ffc049b7a1 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) @@ -5106,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) { @@ -9546,7 +9622,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); 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 { 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 diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 3db9b3ff33..e80a98d692 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/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 diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index 5eeac71200..4a047a1530 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(); } @@ -5000,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"; @@ -5029,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; @@ -5068,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) { @@ -5083,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); @@ -5114,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 || @@ -5127,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; @@ -5170,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; @@ -5225,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"%"; @@ -5255,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) @@ -5284,9 +5299,9 @@ void CDrawingConverter::CheckBrushShape(PPTX::Logic::SpTreeElem* oElem, XmlUtils pSpPr->Fill.as().blip->Effects.push_back(oEff); } } - if (true) + 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()) { @@ -5305,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; @@ -5329,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(); @@ -5342,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; @@ -5667,9 +5683,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/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/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) { diff --git a/OOXML/PPTXFormat/Logic/LineJoin.cpp b/OOXML/PPTXFormat/Logic/LineJoin.cpp index 8e3c1bc24c..dc6b88b62d 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()); @@ -75,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 465376be40..bace5fa67f 100644 --- a/OOXML/PPTXFormat/Logic/LineJoin.h +++ b/OOXML/PPTXFormat/Logic/LineJoin.h @@ -47,13 +47,10 @@ 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; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - virtual void GetJoinFrom(XmlUtils::CXmlNode& element); virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -62,9 +59,8 @@ namespace PPTX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); - public: - eJoin type; - 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 24b3477b5a..71a8120ddb 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,40 @@ 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")); + + 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(); } 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 +155,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 +181,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 +218,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 +280,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; } @@ -293,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()) @@ -315,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()) @@ -334,7 +355,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..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 - LineJoin Join; + nullable join; nullable headEnd; nullable tailEnd; 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/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); 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 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/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/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 3382e612bf..3219fc74d7 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) { @@ -2572,7 +2582,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; @@ -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()) { @@ -4880,54 +4890,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; } @@ -5071,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 { @@ -5083,6 +5100,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; @@ -5094,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) @@ -5157,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 ) } //------------------------------------ @@ -5775,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; @@ -5787,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; } @@ -6275,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) @@ -6784,14 +6809,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()) 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()) diff --git a/OdfFile/DataTypes/presentationclass.cpp b/OdfFile/DataTypes/presentationclass.cpp index f3918d04df..d302b07be7 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 ); @@ -127,6 +129,8 @@ std::wstring presentation_class::get_type_ms() break; case notes: case handout: + case outline: + case body: case text: res = L"body"; break; 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 155ccb3482..144f0fa0f7 100644 --- a/OdfFile/Reader/Converter/pptx_drawing.cpp +++ b/OdfFile/Reader/Converter/pptx_drawing.cpp @@ -58,7 +58,31 @@ 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(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); + if (text_color) + { + CP_XML_NODE(L"a:solidFill") + { + CP_XML_NODE(L"a:srgbClr") + { + CP_XML_ATTR_OPT(L"val", text_color); + } + } + } + } } } } @@ -226,19 +250,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/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"; 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..30ff4f0de7 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 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; int idx_in_owner ; diff --git a/OdfFile/Reader/Format/draw_frame_pptx.cpp b/OdfFile/Reader/Format/draw_frame_pptx.cpp index 1e713a4c40..9813af7601 100644 --- a/OdfFile/Reader/Format/draw_frame_pptx.cpp +++ b/OdfFile/Reader/Format/draw_frame_pptx.cpp @@ -186,17 +186,35 @@ 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(); - - Context.get_slide_context().set_placeHolder_type(type); + std::wstring type = common_presentation_attlist_.presentation_class_->get_type_ms(); + + 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); + + 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 (!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, properties.get(), ¶graph_properties, text_properties.get()); + } } if (common_draw_attlists_.shape_with_text_and_styles_.common_shape_draw_attlist_.drawooo_display_) @@ -244,6 +262,37 @@ 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 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_) + 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(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) + { + //if(paragraph_props->fo_text_align_) + } +} + void draw_image::pptx_convert(oox::pptx_conversion_context & Context) { if (draw_frame_ptr) @@ -322,7 +371,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/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); + } } 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); diff --git a/OdfFile/Reader/Format/text_elements.cpp b/OdfFile/Reader/Format/text_elements.cpp index 0a16beb27b..35a4d98c26 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_); diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 61d4f1ce85..a9dec20018 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,33 @@ void OoxConverter::convert(PPTX::Logic::Shape *oox_shape) if (type < 0)return; //----------------------------------------------------------------------------- odf_context()->drawing_context()->start_shape(type); + + 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(); + _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()); + + 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 a1a1e76585..4bc2d877ef 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 = 16; // body + } + 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..586c9da949 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); @@ -1515,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; } @@ -2592,18 +2597,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); 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++; } 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(); } diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index 37c3b95330..249beee837 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -426,6 +426,12 @@ BYTE* CPdfFile::GetAnnotStandardFonts() 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) return L""; diff --git a/PdfFile/PdfFile.h b/PdfFile/PdfFile.h index b168f06df9..8c3073a211 100644 --- a/PdfFile/PdfFile.h +++ b/PdfFile/PdfFile.h @@ -137,6 +137,7 @@ public: 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..f6ed37edc1 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,10 @@ 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""; + return oIter == m_mFonts.end() ? std::wstring() : oIter->second; } void getBookmarks(PDFDoc* pdfDoc, OutlineItem* pOutlineItem, NSWasm::CData& out, int level) { diff --git a/PdfFile/PdfReader.h b/PdfFile/PdfReader.h index 151e5e91f8..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); + std::wstring GetFontPath(const std::wstring& wsFontName, bool bSave = true); std::wstring ToXml(const std::wstring& wsXmlPath, bool isPrintStreams = false); void ChangeLength(DWORD nLength); 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/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/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index c30ed7cd96..a06c61274c 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -196,6 +196,51 @@ 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, GetEmbeddedFont) +{ + //GTEST_SKIP(); + + LoadFromFile(); + + std::wcout << pdfFile->GetEmbeddedFontPath(L"Symbol") << std::endl; +} + TEST_F(CPdfFileTest, ValidMetaData) { GTEST_SKIP(); @@ -282,7 +327,7 @@ TEST_F(CPdfFileTest, SetMetaData) TEST_F(CPdfFileTest, ConvertToRaster) { - //GTEST_SKIP(); + GTEST_SKIP(); LoadFromFile(); 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(); 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; diff --git a/X2tConverter/src/lib/pdf_image.h b/X2tConverter/src/lib/pdf_image.h index d5ceeef6f9..02ef86673b 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 = new BYTE[dwChangesSize]; + + 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; @@ -1021,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