Commit 399a1dd5 authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander Trofimov

Немного переделана работа со шрифтами: теперь список открытых FontFace...

Немного переделана работа со шрифтами: теперь список открытых FontFace храниться в документе, и если происходит их переполнение, то самые неиспользуемые закрываются.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63326 954022d7-b5bf-4e40-9824-e11837661b57
parent 6af1ad10
......@@ -318,6 +318,7 @@ namespace NSOnlineOfficeBinToPdf
bIsPathOpened = false;
pPdf->EndCommand(c_nPageType);
break;
}
case ctPenColor:
......
......@@ -232,8 +232,6 @@ private:
double m_dX;
double m_dY;
int m_nUpdateFlags;
CFontDict* m_pFont;
double m_dSize;
LONG m_lColor;
......@@ -382,7 +380,7 @@ void CPdfRenderer::CCommandManager::Clear()
for (int nIndex = 0, nCount = m_vCommands.size(); nIndex < nCount; nIndex++)
{
CRendererCommandBase* pCommand = m_vCommands.at(nIndex);
delete[] pCommand;
delete pCommand;
}
m_vCommands.clear();
}
......@@ -1374,7 +1372,6 @@ bool CPdfRenderer::DrawText(unsigned int* pUnicodes, unsigned int unLen, const d
return false;
unsigned char* pCodes = m_pFont->EncodeString(pUnicodes, unLen);
delete[] pUnicodes;
CTransform& t = m_oTransform;
m_oCommandManager.SetTransform(t.m11, -t.m12, -t.m21, t.m22, MM_2_PT(t.dx + t.m21 * m_dPageHeight), MM_2_PT(m_dPageHeight - m_dPageHeight * t.m22 - t.dy));
......@@ -1444,8 +1441,8 @@ void CPdfRenderer::UpdateTransform()
t.m12 = -m_oTransform.m12;
t.m21 = -m_oTransform.m21;
t.m22 = m_oTransform.m22;
t.dx = MM_2_PT(t.dx + t.m21 * m_dPageHeight);
t.dy = MM_2_PT(m_dPageHeight - m_dPageHeight * t.m22 - t.dy);
t.dx = MM_2_PT(m_oTransform.dx + m_oTransform.m21 * m_dPageHeight);
t.dy = MM_2_PT(m_dPageHeight - m_dPageHeight * m_oTransform.m22 - m_oTransform.dy);
if (!t.IsIdentity())
m_pPage->Concat(t.m11, t.m12, t.m21, t.m22, t.dx, t.dy);
......@@ -1629,6 +1626,7 @@ void CPdfRenderer::UpdateBrush()
m_pShading = m_pDocument->CreateRadialShading(m_pPage, MM_2_PT(dX0), MM_2_PT(m_dPageHeight - dY0), MM_2_PT(dR0), MM_2_PT(dX1), MM_2_PT(m_dPageHeight - dY1), MM_2_PT(dR1), pColors, pAlphas, pPoints, lCount, m_pShadingExtGrState);
}
delete[] pColors;
delete[] pAlphas;
}
}
}
......
......@@ -913,8 +913,8 @@ void ConvertFolder(std::wstring wsFolderPath, const int nType)
}
void TestMetafile()
{
//ConvertFolder(L"D://Test Files//Emf//", MetaFile::c_lMetaEmf);
ConvertFolder(L"D://Test Files//Wmf//", MetaFile::c_lMetaWmf);
ConvertFolder(L"D://Test Files//Emf//", MetaFile::c_lMetaEmf);
//ConvertFolder(L"D://Test Files//Wmf//", MetaFile::c_lMetaWmf);
}
void TestOnlineBin()
{
......@@ -961,8 +961,8 @@ void main()
//TestDocument7();
//TestDocument8();
//TestDocument9();
//TestMetafile();
TestOnlineBin();
TestMetafile();
//TestOnlineBin();
char q;
std::cin >> q;
......
......@@ -15,28 +15,13 @@
// Стандартный размер буфера в memory-stream-object
#define STREAM_BUF_SIZ 4096
// стандартный размер массива list-object
#define DEF_ITEMS_PER_BLOCK 20
// стандартный размер массива cross-reference-table
#define DEFALUT_XREF_ENTRY_NUM 1024
// стандартный размер таблицы ширин (widths-table) в cid-fontdef
#define DEF_CHAR_WIDTHS_NUM 128
// стандартный рамер массива page-list-tablef
#define DEF_PAGE_LIST_NUM 256
// стандартный размер таблицы range-table в cid-fontdef
#define DEF_RANGE_TBL_NUM 128
#define MAX_OPENED_FT_FACES 30
// Необходимый размер буффера для конвертирования с символьную строку.
#define TEMP_BUFFER_SIZE 512
#define SHORT_BUFFER_SIZE 32
#define REAL_LEN 31//11
#define INT_LEN 11
#define TEXT_DEFAULT_LEN 256
#define UNICODE_HEADER_LEN 2
#define DATE_TIME_STR_LEN 23
// Соответсвующие длины в таблицу cross-reference-table
......@@ -77,12 +62,10 @@
#define CENTER_WINDOW 16
// Ограничения, в соответствии со спецификацией (PDF1.4)
// Ограничения, в соответствии со спецификацией
#define LIMIT_MAX_INT 2147483647
#define LIMIT_MIN_INT -2147483647
#define LIMIT_MAX_REAL 3.402823466e+38F
#define LIMIT_MIN_REAL -3.402823466e+38F
......@@ -92,398 +75,6 @@
#define LIMIT_MAX_ARRAY 8191
#define LIMIT_MAX_DICT_ELEMENT 4095
#define LIMIT_MAX_XREF_ELEMENT 8388607
#define LIMIT_MAX_GSTATE 28
#define LIMIT_MAX_DEVICE_N 8
#define LIMIT_MAX_DEVICE_N_V15 32
#define LIMIT_MAX_CID 65535
#define MAX_GENERATION_NUM 65535
#define MIN_PAGE_HEIGHT 3
#define MIN_PAGE_WIDTH 3
#define MAX_PAGE_HEIGHT 14400
#define MAX_PAGE_WIDTH 14400
#define MIN_MAGNIFICATION_FACTOR 8
#define MAX_MAGNIFICATION_FACTOR 3200
// Коды стран
#define COUNTRY_AF "AF" /* AFGHANISTAN */
#define COUNTRY_AL "AL" /* ALBANIA */
#define COUNTRY_DZ "DZ" /* ALGERIA */
#define COUNTRY_AS "AS" /* AMERICAN SAMOA */
#define COUNTRY_AD "AD" /* ANDORRA */
#define COUNTRY_AO "AO" /* ANGOLA */
#define COUNTRY_AI "AI" /* ANGUILLA */
#define COUNTRY_AQ "AQ" /* ANTARCTICA */
#define COUNTRY_AG "AG" /* ANTIGUA AND BARBUDA */
#define COUNTRY_AR "AR" /* ARGENTINA */
#define COUNTRY_AM "AM" /* ARMENIA */
#define COUNTRY_AW "AW" /* ARUBA */
#define COUNTRY_AU "AU" /* AUSTRALIA */
#define COUNTRY_AT "AT" /* AUSTRIA */
#define COUNTRY_AZ "AZ" /* AZERBAIJAN */
#define COUNTRY_BS "BS" /* BAHAMAS */
#define COUNTRY_BH "BH" /* BAHRAIN */
#define COUNTRY_BD "BD" /* BANGLADESH */
#define COUNTRY_BB "BB" /* BARBADOS */
#define COUNTRY_BY "BY" /* BELARUS */
#define COUNTRY_BE "BE" /* BELGIUM */
#define COUNTRY_BZ "BZ" /* BELIZE */
#define COUNTRY_BJ "BJ" /* BENIN */
#define COUNTRY_BM "BM" /* BERMUDA */
#define COUNTRY_BT "BT" /* BHUTAN */
#define COUNTRY_BO "BO" /* BOLIVIA */
#define COUNTRY_BA "BA" /* BOSNIA AND HERZEGOWINA */
#define COUNTRY_BW "BW" /* BOTSWANA */
#define COUNTRY_BV "BV" /* BOUVET ISLAND */
#define COUNTRY_BR "BR" /* BRAZIL */
#define COUNTRY_IO "IO" /* BRITISH INDIAN OCEAN TERRITORY */
#define COUNTRY_BN "BN" /* BRUNEI DARUSSALAM */
#define COUNTRY_BG "BG" /* BULGARIA */
#define COUNTRY_BF "BF" /* BURKINA FASO */
#define COUNTRY_BI "BI" /* BURUNDI */
#define COUNTRY_KH "KH" /* CAMBODIA */
#define COUNTRY_CM "CM" /* CAMEROON */
#define COUNTRY_CA "CA" /* CANADA */
#define COUNTRY_CV "CV" /* CAPE VERDE */
#define COUNTRY_KY "KY" /* CAYMAN ISLANDS */
#define COUNTRY_CF "CF" /* CENTRAL AFRICAN REPUBLIC */
#define COUNTRY_TD "TD" /* CHAD */
#define COUNTRY_CL "CL" /* CHILE */
#define COUNTRY_CN "CN" /* CHINA */
#define COUNTRY_CX "CX" /* CHRISTMAS ISLAND */
#define COUNTRY_CC "CC" /* COCOS (KEELING) ISLANDS */
#define COUNTRY_CO "CO" /* COLOMBIA */
#define COUNTRY_KM "KM" /* COMOROS */
#define COUNTRY_CG "CG" /* CONGO */
#define COUNTRY_CK "CK" /* COOK ISLANDS */
#define COUNTRY_CR "CR" /* COSTA RICA */
#define COUNTRY_CI "CI" /* COTE D'IVOIRE */
#define COUNTRY_HR "HR" /* CROATIA (local name: Hrvatska) */
#define COUNTRY_CU "CU" /* CUBA */
#define COUNTRY_CY "CY" /* CYPRUS */
#define COUNTRY_CZ "CZ" /* CZECH REPUBLIC */
#define COUNTRY_DK "DK" /* DENMARK */
#define COUNTRY_DJ "DJ" /* DJIBOUTI */
#define COUNTRY_DM "DM" /* DOMINICA */
#define COUNTRY_DO "DO" /* DOMINICAN REPUBLIC */
#define COUNTRY_TP "TP" /* EAST TIMOR */
#define COUNTRY_EC "EC" /* ECUADOR */
#define COUNTRY_EG "EG" /* EGYPT */
#define COUNTRY_SV "SV" /* EL SALVADOR */
#define COUNTRY_GQ "GQ" /* EQUATORIAL GUINEA */
#define COUNTRY_ER "ER" /* ERITREA */
#define COUNTRY_EE "EE" /* ESTONIA */
#define COUNTRY_ET "ET" /* ETHIOPIA */
#define COUNTRY_FK "FK" /* FALKLAND ISLANDS (MALVINAS) */
#define COUNTRY_FO "FO" /* FAROE ISLANDS */
#define COUNTRY_FJ "FJ" /* FIJI */
#define COUNTRY_FI "FI" /* FINLAND */
#define COUNTRY_FR "FR" /* FRANCE */
#define COUNTRY_FX "FX" /* FRANCE, METROPOLITAN */
#define COUNTRY_GF "GF" /* FRENCH GUIANA */
#define COUNTRY_PF "PF" /* FRENCH POLYNESIA */
#define COUNTRY_TF "TF" /* FRENCH SOUTHERN TERRITORIES */
#define COUNTRY_GA "GA" /* GABON */
#define COUNTRY_GM "GM" /* GAMBIA */
#define COUNTRY_GE "GE" /* GEORGIA */
#define COUNTRY_DE "DE" /* GERMANY */
#define COUNTRY_GH "GH" /* GHANA */
#define COUNTRY_GI "GI" /* GIBRALTAR */
#define COUNTRY_GR "GR" /* GREECE */
#define COUNTRY_GL "GL" /* GREENLAND */
#define COUNTRY_GD "GD" /* GRENADA */
#define COUNTRY_GP "GP" /* GUADELOUPE */
#define COUNTRY_GU "GU" /* GUAM */
#define COUNTRY_GT "GT" /* GUATEMALA */
#define COUNTRY_GN "GN" /* GUINEA */
#define COUNTRY_GW "GW" /* GUINEA-BISSAU */
#define COUNTRY_GY "GY" /* GUYANA */
#define COUNTRY_HT "HT" /* HAITI */
#define COUNTRY_HM "HM" /* HEARD AND MC DONALD ISLANDS */
#define COUNTRY_HN "HN" /* HONDURAS */
#define COUNTRY_HK "HK" /* HONG KONG */
#define COUNTRY_HU "HU" /* HUNGARY */
#define COUNTRY_IS "IS" /* ICELAND */
#define COUNTRY_IN "IN" /* INDIA */
#define COUNTRY_ID "ID" /* INDONESIA */
#define COUNTRY_IR "IR" /* IRAN (ISLAMIC REPUBLIC OF) */
#define COUNTRY_IQ "IQ" /* IRAQ */
#define COUNTRY_IE "IE" /* IRELAND */
#define COUNTRY_IL "IL" /* ISRAEL */
#define COUNTRY_IT "IT" /* ITALY */
#define COUNTRY_JM "JM" /* JAMAICA */
#define COUNTRY_JP "JP" /* JAPAN */
#define COUNTRY_JO "JO" /* JORDAN */
#define COUNTRY_KZ "KZ" /* KAZAKHSTAN */
#define COUNTRY_KE "KE" /* KENYA */
#define COUNTRY_KI "KI" /* KIRIBATI */
#define COUNTRY_KP "KP" /* KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF */
#define COUNTRY_KR "KR" /* KOREA, REPUBLIC OF */
#define COUNTRY_KW "KW" /* KUWAIT */
#define COUNTRY_KG "KG" /* KYRGYZSTAN */
#define COUNTRY_LA "LA" /* LAO PEOPLE'S DEMOCRATIC REPUBLIC */
#define COUNTRY_LV "LV" /* LATVIA */
#define COUNTRY_LB "LB" /* LEBANON */
#define COUNTRY_LS "LS" /* LESOTHO */
#define COUNTRY_LR "LR" /* LIBERIA */
#define COUNTRY_LY "LY" /* LIBYAN ARAB JAMAHIRIYA */
#define COUNTRY_LI "LI" /* LIECHTENSTEIN */
#define COUNTRY_LT "LT" /* LITHUANIA */
#define COUNTRY_LU "LU" /* LUXEMBOURG */
#define COUNTRY_MO "MO" /* MACAU */
#define COUNTRY_MK "MK" /* MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF */
#define COUNTRY_MG "MG" /* MADAGASCAR */
#define COUNTRY_MW "MW" /* MALAWI */
#define COUNTRY_MY "MY" /* MALAYSIA */
#define COUNTRY_MV "MV" /* MALDIVES */
#define COUNTRY_ML "ML" /* MALI */
#define COUNTRY_MT "MT" /* MALTA */
#define COUNTRY_MH "MH" /* MARSHALL ISLANDS */
#define COUNTRY_MQ "MQ" /* MARTINIQUE */
#define COUNTRY_MR "MR" /* MAURITANIA */
#define COUNTRY_MU "MU" /* MAURITIUS */
#define COUNTRY_YT "YT" /* MAYOTTE */
#define COUNTRY_MX "MX" /* MEXICO */
#define COUNTRY_FM "FM" /* MICRONESIA, FEDERATED STATES OF */
#define COUNTRY_MD "MD" /* MOLDOVA, REPUBLIC OF */
#define COUNTRY_MC "MC" /* MONACO */
#define COUNTRY_MN "MN" /* MONGOLIA */
#define COUNTRY_MS "MS" /* MONTSERRAT */
#define COUNTRY_MA "MA" /* MOROCCO */
#define COUNTRY_MZ "MZ" /* MOZAMBIQUE */
#define COUNTRY_MM "MM" /* MYANMAR */
#define COUNTRY_NA "NA" /* NAMIBIA */
#define COUNTRY_NR "NR" /* NAURU */
#define COUNTRY_NP "NP" /* NEPAL */
#define COUNTRY_NL "NL" /* NETHERLANDS */
#define COUNTRY_AN "AN" /* NETHERLANDS ANTILLES */
#define COUNTRY_NC "NC" /* NEW CALEDONIA */
#define COUNTRY_NZ "NZ" /* NEW ZEALAND */
#define COUNTRY_NI "NI" /* NICARAGUA */
#define COUNTRY_NE "NE" /* NIGER */
#define COUNTRY_NG "NG" /* NIGERIA */
#define COUNTRY_NU "NU" /* NIUE */
#define COUNTRY_NF "NF" /* NORFOLK ISLAND */
#define COUNTRY_MP "MP" /* NORTHERN MARIANA ISLANDS */
#define COUNTRY_NO "NO" /* NORWAY */
#define COUNTRY_OM "OM" /* OMAN */
#define COUNTRY_PK "PK" /* PAKISTAN */
#define COUNTRY_PW "PW" /* PALAU */
#define COUNTRY_PA "PA" /* PANAMA */
#define COUNTRY_PG "PG" /* PAPUA NEW GUINEA */
#define COUNTRY_PY "PY" /* PARAGUAY */
#define COUNTRY_PE "PE" /* PERU */
#define COUNTRY_PH "PH" /* PHILIPPINES */
#define COUNTRY_PN "PN" /* PITCAIRN */
#define COUNTRY_PL "PL" /* POLAND */
#define COUNTRY_PT "PT" /* PORTUGAL */
#define COUNTRY_PR "PR" /* PUERTO RICO */
#define COUNTRY_QA "QA" /* QATAR */
#define COUNTRY_RE "RE" /* REUNION */
#define COUNTRY_RO "RO" /* ROMANIA */
#define COUNTRY_RU "RU" /* RUSSIAN FEDERATION */
#define COUNTRY_RW "RW" /* RWANDA */
#define COUNTRY_KN "KN" /* SAINT KITTS AND NEVIS */
#define COUNTRY_LC "LC" /* SAINT LUCIA */
#define COUNTRY_VC "VC" /* SAINT VINCENT AND THE GRENADINES */
#define COUNTRY_WS "WS" /* SAMOA */
#define COUNTRY_SM "SM" /* SAN MARINO */
#define COUNTRY_ST "ST" /* SAO TOME AND PRINCIPE */
#define COUNTRY_SA "SA" /* SAUDI ARABIA */
#define COUNTRY_SN "SN" /* SENEGAL */
#define COUNTRY_SC "SC" /* SEYCHELLES */
#define COUNTRY_SL "SL" /* SIERRA LEONE */
#define COUNTRY_SG "SG" /* SINGAPORE */
#define COUNTRY_SK "SK" /* SLOVAKIA (Slovak Republic) */
#define COUNTRY_SI "SI" /* SLOVENIA */
#define COUNTRY_SB "SB" /* SOLOMON ISLANDS */
#define COUNTRY_SO "SO" /* SOMALIA */
#define COUNTRY_ZA "ZA" /* SOUTH AFRICA */
#define COUNTRY_ES "ES" /* SPAIN */
#define COUNTRY_LK "LK" /* SRI LANKA */
#define COUNTRY_SH "SH" /* ST. HELENA */
#define COUNTRY_PM "PM" /* ST. PIERRE AND MIQUELON */
#define COUNTRY_SD "SD" /* SUDAN */
#define COUNTRY_SR "SR" /* SURINAME */
#define COUNTRY_SJ "SJ" /* SVALBARD AND JAN MAYEN ISLANDS */
#define COUNTRY_SZ "SZ" /* SWAZILAND */
#define COUNTRY_SE "SE" /* SWEDEN */
#define COUNTRY_CH "CH" /* SWITZERLAND */
#define COUNTRY_SY "SY" /* SYRIAN ARAB REPUBLIC */
#define COUNTRY_TW "TW" /* TAIWAN, PROVINCE OF CHINA */
#define COUNTRY_TJ "TJ" /* TAJIKISTAN */
#define COUNTRY_TZ "TZ" /* TANZANIA, UNITED REPUBLIC OF */
#define COUNTRY_TH "TH" /* THAILAND */
#define COUNTRY_TG "TG" /* TOGO */
#define COUNTRY_TK "TK" /* TOKELAU */
#define COUNTRY_TO "TO" /* TONGA */
#define COUNTRY_TT "TT" /* TRINIDAD AND TOBAGO */
#define COUNTRY_TN "TN" /* TUNISIA */
#define COUNTRY_TR "TR" /* TURKEY */
#define COUNTRY_TM "TM" /* TURKMENISTAN */
#define COUNTRY_TC "TC" /* TURKS AND CAICOS ISLANDS */
#define COUNTRY_TV "TV" /* TUVALU */
#define COUNTRY_UG "UG" /* UGANDA */
#define COUNTRY_UA "UA" /* UKRAINE */
#define COUNTRY_AE "AE" /* UNITED ARAB EMIRATES */
#define COUNTRY_GB "GB" /* UNITED KINGDOM */
#define COUNTRY_US "US" /* UNITED STATES */
#define COUNTRY_UM "UM" /* UNITED STATES MINOR OUTLYING ISLANDS */
#define COUNTRY_UY "UY" /* URUGUAY */
#define COUNTRY_UZ "UZ" /* UZBEKISTAN */
#define COUNTRY_VU "VU" /* VANUATU */
#define COUNTRY_VA "VA" /* VATICAN CITY STATE (HOLY SEE) */
#define COUNTRY_VE "VE" /* VENEZUELA */
#define COUNTRY_VN "VN" /* VIET NAM */
#define COUNTRY_VG "VG" /* VIRGIN ISLANDS (BRITISH) */
#define COUNTRY_VI "VI" /* VIRGIN ISLANDS (U.S.) */
#define COUNTRY_WF "WF" /* WALLIS AND FUTUNA ISLANDS */
#define COUNTRY_EH "EH" /* WESTERN SAHARA */
#define COUNTRY_YE "YE" /* YEMEN */
#define COUNTRY_YU "YU" /* YUGOSLAVIA */
#define COUNTRY_ZR "ZR" /* ZAIRE */
#define COUNTRY_ZM "ZM" /* ZAMBIA */
#define COUNTRY_ZW "ZW" /* ZIMBABWE */
// Коды языков
#define LANG_AA "aa" /* Afar */
#define LANG_AB "ab" /* Abkhazian */
#define LANG_AF "af" /* Afrikaans */
#define LANG_AM "am" /* Amharic */
#define LANG_AR "ar" /* Arabic */
#define LANG_AS "as" /* Assamese */
#define LANG_AY "ay" /* Aymara */
#define LANG_AZ "az" /* Azerbaijani */
#define LANG_BA "ba" /* Bashkir */
#define LANG_BE "be" /* Byelorussian */
#define LANG_BG "bg" /* Bulgarian */
#define LANG_BH "bh" /* Bihari */
#define LANG_BI "bi" /* Bislama */
#define LANG_BN "bn" /* Bengali Bangla */
#define LANG_BO "bo" /* Tibetan */
#define LANG_BR "br" /* Breton */
#define LANG_CA "ca" /* Catalan */
#define LANG_CO "co" /* Corsican */
#define LANG_CS "cs" /* Czech */
#define LANG_CY "cy" /* Welsh */
#define LANG_DA "da" /* Danish */
#define LANG_DE "de" /* German */
#define LANG_DZ "dz" /* Bhutani */
#define LANG_EL "el" /* Greek */
#define LANG_EN "en" /* English */
#define LANG_EO "eo" /* Esperanto */
#define LANG_ES "es" /* Spanish */
#define LANG_ET "et" /* Estonian */
#define LANG_EU "eu" /* Basque */
#define LANG_FA "fa" /* Persian */
#define LANG_FI "fi" /* Finnish */
#define LANG_FJ "fj" /* Fiji */
#define LANG_FO "fo" /* Faeroese */
#define LANG_FR "fr" /* French */
#define LANG_FY "fy" /* Frisian */
#define LANG_GA "ga" /* Irish */
#define LANG_GD "gd" /* Scots Gaelic */
#define LANG_GL "gl" /* Galician */
#define LANG_GN "gn" /* Guarani */
#define LANG_GU "gu" /* Gujarati */
#define LANG_HA "ha" /* Hausa */
#define LANG_HI "hi" /* Hindi */
#define LANG_HR "hr" /* Croatian */
#define LANG_HU "hu" /* Hungarian */
#define LANG_HY "hy" /* Armenian */
#define LANG_IA "ia" /* Interlingua */
#define LANG_IE "ie" /* Interlingue */
#define LANG_IK "ik" /* Inupiak */
#define LANG_IN "in" /* Indonesian */
#define LANG_IS "is" /* Icelandic */
#define LANG_IT "it" /* Italian */
#define LANG_IW "iw" /* Hebrew */
#define LANG_JA "ja" /* Japanese */
#define LANG_JI "ji" /* Yiddish */
#define LANG_JW "jw" /* Javanese */
#define LANG_KA "ka" /* Georgian */
#define LANG_KK "kk" /* Kazakh */
#define LANG_KL "kl" /* Greenlandic */
#define LANG_KM "km" /* Cambodian */
#define LANG_KN "kn" /* Kannada */
#define LANG_KO "ko" /* Korean */
#define LANG_KS "ks" /* Kashmiri */
#define LANG_KU "ku" /* Kurdish */
#define LANG_KY "ky" /* Kirghiz */
#define LANG_LA "la" /* Latin */
#define LANG_LN "ln" /* Lingala */
#define LANG_LO "lo" /* Laothian */
#define LANG_LT "lt" /* Lithuanian */
#define LANG_LV "lv" /* Latvian,Lettish */
#define LANG_MG "mg" /* Malagasy */
#define LANG_MI "mi" /* Maori */
#define LANG_MK "mk" /* Macedonian */
#define LANG_ML "ml" /* Malayalam */
#define LANG_MN "mn" /* Mongolian */
#define LANG_MO "mo" /* Moldavian */
#define LANG_MR "mr" /* Marathi */
#define LANG_MS "ms" /* Malay */
#define LANG_MT "mt" /* Maltese */
#define LANG_MY "my" /* Burmese */
#define LANG_NA "na" /* Nauru */
#define LANG_NE "ne" /* Nepali */
#define LANG_NL "nl" /* Dutch */
#define LANG_NO "no" /* Norwegian */
#define LANG_OC "oc" /* Occitan */
#define LANG_OM "om" /* (Afan)Oromo */
#define LANG_OR "or" /* Oriya */
#define LANG_PA "pa" /* Punjabi */
#define LANG_PL "pl" /* Polish */
#define LANG_PS "ps" /* Pashto,Pushto */
#define LANG_PT "pt" /* Portuguese */
#define LANG_QU "qu" /* Quechua */
#define LANG_RM "rm" /* Rhaeto-Romance */
#define LANG_RN "rn" /* Kirundi */
#define LANG_RO "ro" /* Romanian */
#define LANG_RU "ru" /* Russian */
#define LANG_RW "rw" /* Kinyarwanda */
#define LANG_SA "sa" /* Sanskrit */
#define LANG_SD "sd" /* Sindhi */
#define LANG_SG "sg" /* Sangro */
#define LANG_SH "sh" /* Serbo-Croatian */
#define LANG_SI "si" /* Singhalese */
#define LANG_SK "sk" /* Slovak */
#define LANG_SL "sl" /* Slovenian */
#define LANG_SM "sm" /* Samoan */
#define LANG_SN "sn" /* Shona */
#define LANG_SO "so" /* Somali */
#define LANG_SQ "sq" /* Albanian */
#define LANG_SR "sr" /* Serbian */
#define LANG_SS "ss" /* Siswati */
#define LANG_ST "st" /* Sesotho */
#define LANG_SU "su" /* Sundanese */
#define LANG_SV "sv" /* Swedish */
#define LANG_SW "sw" /* Swahili */
#define LANG_TA "ta" /* Tamil */
#define LANG_TE "te" /* Tegulu */
#define LANG_TG "tg" /* Tajik */
#define LANG_TH "th" /* Thai */
#define LANG_TI "ti" /* Tigrinya */
#define LANG_TK "tk" /* Turkmen */
#define LANG_TL "tl" /* Tagalog */
#define LANG_TN "tn" /* Setswanato Tonga */
#define LANG_TR "tr" /* Turkish */
#define LANG_TS "ts" /* Tsonga */
#define LANG_TT "tt" /* Tatar */
#define LANG_TW "tw" /* Twi */
#define LANG_UK "uk" /* Ukrainian */
#define LANG_UR "ur" /* Urdu */
#define LANG_UZ "uz" /* Uzbek */
#define LANG_VI "vi" /* Vietnamese */
#define LANG_VO "vo" /* Volapuk */
#define LANG_WO "wo" /* Wolof */
#define LANG_XH "xh" /* Xhosa */
#define LANG_YO "yo" /* Yoruba */
#define LANG_ZH "zh" /* Chinese */
#define LANG_ZU "zu" /* Zulu */
//-----------------------------------------------------------------------------
#endif // _PDF_WRITER_SRC_CONSTS_H
......@@ -44,6 +44,7 @@ namespace PdfWriter
m_pJbig2 = NULL;
memset((void*)m_sTTFontTag, 0x00, 8);
m_pTransparencyGroup = NULL;
m_pFreeTypeLibrary = NULL;
}
CDocument::~CDocument()
{
......@@ -93,27 +94,35 @@ namespace PdfWriter
void CDocument::Close()
{
// Все объекты удаляются внутри CXref
if (m_pXref)
{
delete m_pXref;
m_pXref = NULL;
}
RELEASEOBJECT(m_pXref);
m_pTrailer = NULL;
m_pResources = NULL;
m_pCatalog = NULL;
m_pOutlines = NULL;
m_pPageTree = NULL;
m_pCurPage = NULL;
m_nCurPageNum = 0;
m_bEncrypt = false;
m_pEncryptDict = NULL;
m_pInfo = NULL;
m_unCompressMode = COMP_NONE;
m_pJbig2 = NULL;
m_pTransparencyGroup= NULL;
memset((void*)m_sTTFontTag, 0x00, 8);
m_vExtGrStates.clear();
m_vPages.clear();
m_vExtGrStates.clear();
m_vStrokeAlpha.clear();
m_vFillAlpha.clear();
m_vShadings.clear();
m_vTTFonts.clear();
m_vFreeTypeFonts.clear();
if (m_pFreeTypeLibrary)
{
FT_Done_FreeType(m_pFreeTypeLibrary);
m_pFreeTypeLibrary = NULL;
}
}
bool CDocument::SaveToFile(const std::wstring& wsPath)
{
......@@ -453,6 +462,41 @@ namespace PdfWriter
return m_sTTFontTag;
}
void CDocument::AddFreeTypeFont(CFontCidTrueType* pFont)
{
for (int nIndex = 0, nCount = m_vFreeTypeFonts.size(); nIndex < nCount; nIndex++)
{
if (pFont == m_vFreeTypeFonts.at(nIndex))
{
if (nIndex >= 10)
{
m_vFreeTypeFonts.erase(m_vFreeTypeFonts.begin() + nIndex);
m_vFreeTypeFonts.insert(m_vFreeTypeFonts.begin(), pFont);
}
return;
}
}
m_vFreeTypeFonts.insert(m_vFreeTypeFonts.begin(), pFont);
int nFontsCount = m_vFreeTypeFonts.size();
if (nFontsCount > MAX_OPENED_FT_FACES)
{
for (int nFontIndex = MAX_OPENED_FT_FACES; nFontIndex < nFontsCount; nFontIndex++)
{
CFontCidTrueType* pFont = m_vFreeTypeFonts.at(nFontIndex);
pFont->CloseFontFace();
}
m_vFreeTypeFonts.erase(m_vFreeTypeFonts.begin() + MAX_OPENED_FT_FACES, m_vFreeTypeFonts.end());
}
}
FT_Library CDocument::GetFreeTypeLibrary()
{
if (!m_pFreeTypeLibrary)
FT_Init_FreeType(&m_pFreeTypeLibrary);
return m_pFreeTypeLibrary;
}
CJbig2Global* CDocument::GetJbig2Global()
{
if (m_pJbig2 && m_pJbig2->GetImagesCount() > 4)
......
......@@ -5,6 +5,10 @@
#include <string>
#include "Types.h"
#include "../../DesktopEditor/fontengine/FontManager.h"
#include "../../DesktopEditor/common/File.h"
#include FT_TRUETYPE_TABLES_H
#ifdef CreateFont
#undef CreateFont
#endif
......@@ -79,6 +83,8 @@ namespace PdfWriter
private:
char* GetTTFontTag();
void AddFreeTypeFont(CFontCidTrueType* pFont);
FT_Library GetFreeTypeLibrary();
CExtGrState* FindExtGrState(double dAlphaStroke = -1, double dAlphaFill = -1, EBlendMode eMode = blendmode_Unknown, int nStrokeAdjustment = -1);
void SaveToStream(CStream* pStream);
void PrepareEncryption();
......@@ -124,6 +130,8 @@ namespace PdfWriter
std::vector<CShading*> m_vShadings;
std::vector<TFontInfo> m_vTTFonts;
CDictObject* m_pTransparencyGroup;
std::vector<CFontCidTrueType*> m_vFreeTypeFonts;
FT_Library m_pFreeTypeLibrary;
friend class CFontCidTrueType;
};
......
......@@ -108,29 +108,10 @@ namespace PdfWriter
CreateCIDFont2(pFont);
//-----------------------------------------------------------------------------------------
FT_Init_FreeType(&m_pLibrary);
NSFile::CFileBinary oFile;
oFile.OpenFile(m_wsFontPath, false);
DWORD lFileSize = oFile.SizeFile();
m_pFaceMemory = new FT_Byte[lFileSize];
if (!m_pFaceMemory)
{
FT_Done_FreeType(m_pLibrary);
return;
}
NSFile::CFileBinary::ReadAllBytes(m_wsFontPath, &m_pFaceMemory, lFileSize);
FT_New_Memory_Face(m_pLibrary, m_pFaceMemory, lFileSize, m_unFontIndex, &m_pFace);
if (!m_pFace)
{
FT_Done_FreeType(m_pLibrary);
delete[] m_pFaceMemory;
m_pFace = NULL;
m_pFaceMemory = NULL;
return;
}
m_nGlyphsCount = 0;
m_nSymbolicCmap = -1;
}
CFontCidTrueType::~CFontCidTrueType()
{
......@@ -140,9 +121,6 @@ namespace PdfWriter
if (m_pFace)
FT_Done_Face(m_pFace);
if (m_pLibrary)
FT_Done_FreeType(m_pLibrary);
if (m_pFaceMemory)
delete[] m_pFaceMemory;
}
......@@ -199,7 +177,12 @@ namespace PdfWriter
}
unsigned char* CFontCidTrueType::EncodeString(unsigned int* pUnicodes, unsigned int unLen)
{
if (!OpenFontFace())
return NULL;
unsigned char* pEncodedString = new unsigned char[unLen * 2];
if (!pEncodedString)
return NULL;
// 0x0000..0xFFFF
// Gid .
......@@ -222,6 +205,9 @@ namespace PdfWriter
m_vUnicodes.push_back(unUnicode);
unsigned short ushGID = GetGID(m_pFace, unUnicode);
if (0 == ushGID && -1 != m_nSymbolicCmap)
ushGID = GetGID(m_pFace, unUnicode + 0xF000);
m_vCodeToGid.push_back(ushGID);
//
......@@ -270,7 +256,8 @@ namespace PdfWriter
unsigned char* pGlyphs;
unsigned int unGlyphsCount;
GetWidthsAndGids(&pCodeToGid, &pWidths, &pGlyphs, unGlyphsCount);
if (!GetWidthsAndGids(&pCodeToGid, &pWidths, &pGlyphs, unGlyphsCount))
return;
CStream* pStream = m_pFontFileDict->GetStream();
m_pFontFile->WriteTTF(pStream, NULL, pCodeToGid, m_ushCodesCount, pGlyphs, unGlyphsCount);
......@@ -295,106 +282,60 @@ namespace PdfWriter
pStream->WriteChar((ushGid & 0xFF));
}
RELEASEARRAYOBJECTS(pCodeToGid);
RELEASEARRAYOBJECTS(pWidths);
RELEASEARRAYOBJECTS(pGlyphs);
WriteToUnicode();
}
}
void CFontCidTrueType::GetWidthsAndGids(unsigned short** ppCodeToGid, unsigned int** ppWidths, unsigned char** ppGlyphs, unsigned int& unGlyphsCount)
bool CFontCidTrueType::GetWidthsAndGids(unsigned short** ppCodeToGid, unsigned int** ppWidths, unsigned char** ppGlyphs, unsigned int& unGlyphsCount)
{
FT_Library pLibrary = NULL;
FT_Init_FreeType(&pLibrary);
FT_Face pFace = NULL;
*ppCodeToGid = NULL;
*ppWidths = NULL;
*ppGlyphs = NULL;
unGlyphsCount = 0;
NSFile::CFileBinary oFile;
oFile.OpenFile(m_wsFontPath, false);
DWORD lFileSize = oFile.SizeFile();
FT_Byte* pMemory = new FT_Byte[lFileSize];
if (!pMemory)
{
FT_Done_FreeType(pLibrary);
return;
}
if (!m_nGlyphsCount)
return false;
NSFile::CFileBinary::ReadAllBytes(m_wsFontPath, &pMemory, lFileSize);
unsigned short* pCodeToGID = new unsigned short[m_ushCodesCount];
if (!pCodeToGID)
return false;
FT_New_Memory_Face(pLibrary, pMemory, lFileSize, m_unFontIndex, &pFace);
if (!pFace)
unsigned int* pWidths = new unsigned int[m_ushCodesCount];
if (!pWidths)
{
FT_Done_FreeType(pLibrary);
return;
delete[] pCodeToGID;
return false;
}
memset((void*)pWidths, 0x00, m_ushCodesCount * sizeof(unsigned int));
int nSymbolic = GetSymbolicCmapIndex(pFace);
unsigned short* pCodeToGID = new unsigned short[m_ushCodesCount];
for (unsigned short ushCode = 0; ushCode < m_ushCodesCount; ushCode++)
{
unsigned int unUnicode = m_vUnicodes[ushCode];
pCodeToGID[ushCode] = GetGID(pFace, unUnicode);
if (0 == pCodeToGID[ushCode] && -1 != nSymbolic)
pCodeToGID[ushCode] = GetGID(pFace, unUnicode + 0xF000);
pCodeToGID[ushCode] = m_vCodeToGid.at(ushCode);
pWidths[ushCode] = m_vWidths.at(ushCode);
}
// ,
long lGlyfsCount = pFace->num_glyphs;
unsigned char *pUseGlyf = new unsigned char[lGlyfsCount];
memset((void *)pUseGlyf, 0x00, pFace->num_glyphs * sizeof(unsigned char));
//
unsigned int* pWidths = new unsigned int[m_ushCodesCount];
memset((void*)pWidths, 0x00, m_ushCodesCount * sizeof(unsigned int));
for (unsigned short ushCode = 0; ushCode < m_ushCodesCount; ushCode++)
unsigned char *pGlyphs = new unsigned char[m_nGlyphsCount];
if (!pGlyphs)
{
unsigned short ushGID = pCodeToGID[ushCode];
if ((long)ushGID >= lGlyfsCount)
continue;
//
pUseGlyf[ushGID] = 1;
// (CompositeGlyf), (subglyfs)
if (0 == FT_Load_Glyph(pFace, ushGID, FT_LOAD_NO_SCALE | FT_LOAD_NO_RECURSE))
{
for (int nSubIndex = 0; nSubIndex < pFace->glyph->num_subglyphs; nSubIndex++)
{
FT_Int nSubGID;
FT_UInt unFlags;
FT_Int nArg1;
FT_Int nArg2;
FT_Matrix oMatrix;
FT_Get_SubGlyph_Info(pFace->glyph, nSubIndex, &nSubGID, &unFlags, &nArg1, &nArg2, &oMatrix);
pUseGlyf[nSubGID] = 1;
delete[] pCodeToGID;
delete[] pWidths;
return false;
}
if (0 != pFace->units_per_EM)
pWidths[ushCode] = (unsigned int)pFace->glyph->metrics.horiAdvance * 1000 / pFace->units_per_EM;
else
pWidths[ushCode] = (unsigned int)pFace->glyph->metrics.horiAdvance;
}
memset((void *)pGlyphs, 0x00, m_nGlyphsCount * sizeof(unsigned char));
for (auto oIt : m_mGlyphs)
{
pGlyphs[oIt.first] = 1;
}
// ,
std::string sFontName = m_pDocument->GetTTFontTag() + std::string(pFace->family_name);
if (pFace->style_flags & FT_STYLE_FLAG_ITALIC)
sFontName += "-Italic";
if (pFace->style_flags & FT_STYLE_FLAG_BOLD)
sFontName += "-Bold";
const char* sName = sFontName.c_str();
Add("BaseFont", sName);
m_pFont->Add("BaseFont", sName);
m_pFontDescriptor->Add("FontName", sName);
FT_Done_Face(pFace);
FT_Done_FreeType(pLibrary);
delete[] pMemory;
*ppCodeToGid = pCodeToGID;
*ppWidths = pWidths;
*ppGlyphs = pUseGlyf;
unGlyphsCount = lGlyfsCount;
*ppGlyphs = pGlyphs;
unGlyphsCount = m_nGlyphsCount;
return true;
}
void CFontCidTrueType::WriteToUnicode()
{
......@@ -432,4 +373,47 @@ namespace PdfWriter
pS->WriteStr("endbfchar\n");
m_pToUnicodeStream->WriteStr(c_sToUnicodeFooter);
}
void CFontCidTrueType::CloseFontFace()
{
if (m_pFace)
{
FT_Done_Face(m_pFace);
m_pFace = NULL;
}
RELEASEARRAYOBJECTS(m_pFaceMemory);
}
bool CFontCidTrueType::OpenFontFace()
{
if (m_pFace)
{
m_pDocument->AddFreeTypeFont(this);
return true;
}
m_nGlyphsCount = 0;
m_nSymbolicCmap = -1;
FT_Library pLibrary = m_pDocument->GetFreeTypeLibrary();
if (!pLibrary)
return false;
DWORD dwFileSize;
m_pFaceMemory = NULL;
NSFile::CFileBinary::ReadAllBytes(m_wsFontPath, &m_pFaceMemory, dwFileSize);
if (!m_pFaceMemory)
return false;
FT_New_Memory_Face(pLibrary, m_pFaceMemory, dwFileSize, m_unFontIndex, &m_pFace);
if (!m_pFace)
{
RELEASEARRAYOBJECTS(m_pFaceMemory);
return false;
}
m_pDocument->AddFreeTypeFont(this);
m_nGlyphsCount = m_pFace->num_glyphs;
m_nSymbolicCmap = GetSymbolicCmapIndex(m_pFace);
return true;
}
}
......@@ -33,13 +33,14 @@ namespace PdfWriter
return fontCIDType2;
}
private:
void BeforeWrite();
void GetWidthsAndGids(unsigned short** ppCodeToGid, unsigned int** pWidths, unsigned char** ppGlyphs, unsigned int& unGlyphsCount);
bool GetWidthsAndGids(unsigned short** ppCodeToGid, unsigned int** pWidths, unsigned char** ppGlyphs, unsigned int& unGlyphsCount);
void CreateCIDFont2(CDictObject* pFont);
void WriteToUnicode();
bool OpenFontFace();
void CloseFontFace();
private:
......@@ -61,9 +62,12 @@ namespace PdfWriter
std::vector<unsigned int> m_vWidths;
std::map<unsigned short, bool> m_mGlyphs;
FT_Library m_pLibrary;
FT_Face m_pFace;
FT_Byte* m_pFaceMemory;
int m_nGlyphsCount;
int m_nSymbolicCmap;
friend class CDocument;
};
}
......
......@@ -231,6 +231,8 @@ namespace PdfWriter
else
{
double* pValues = new double[(nCount - 1) * 2];
if (pValues)
{
for (int nIndex = 0; nIndex < nCount - 1; nIndex++)
{
pValues[2 * nIndex + 0] = pColors[nIndex] / 255.0;
......@@ -242,6 +244,7 @@ namespace PdfWriter
delete[] pValues;
}
}
}
void CShading::SetExtend(bool bBegin, bool bEnd)
{
CArrayObject* pExtend = new CArrayObject();
......
......@@ -587,7 +587,7 @@ namespace PdfWriter
unsigned int unRemainBytes = m_nBufferSize - Tell();
if (unRemainBytes < unSize)
{
unsigned int unShrinkSize = max(unSize, 4096);
unsigned int unShrinkSize = max(unSize, STREAM_BUF_SIZ);
Shrink(unShrinkSize);
}
MemCpy(m_pCur, pBuffer, unSize);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment