Commit fe6ed4a3 authored by Oleg.Korshul's avatar Oleg.Korshul Committed by Alexander Trofimov

utf8

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63665 954022d7-b5bf-4e40-9824-e11837661b57
parent 5497206e
#include "OnlineOfficeBinToPdf.h" #include "OnlineOfficeBinToPdf.h"
#include "../DesktopEditor/common/File.h" #include "../DesktopEditor/common/File.h"
#include "../DesktopEditor/common/Directory.h" #include "../DesktopEditor/common/Directory.h"
...@@ -627,7 +627,7 @@ namespace NSOnlineOfficeBinToPdf ...@@ -627,7 +627,7 @@ namespace NSOnlineOfficeBinToPdf
} }
case ctGradientFill: case ctGradientFill:
{ {
// TODO: // TODO: Эта команда не должна приходить
_INT32 gradientType = ReadInt(current, curindex); _INT32 gradientType = ReadInt(current, curindex);
std::wstring sXml, sXmlStop; std::wstring sXml, sXmlStop;
...@@ -674,7 +674,7 @@ namespace NSOnlineOfficeBinToPdf ...@@ -674,7 +674,7 @@ namespace NSOnlineOfficeBinToPdf
} }
case ctGradientFillXML: case ctGradientFillXML:
{ {
// TODO: // TODO: Эта команда не должна приходить
_INT32 gradientType = ReadInt(current, curindex); _INT32 gradientType = ReadInt(current, curindex);
int _sLen = ReadInt(current, curindex); int _sLen = ReadInt(current, curindex);
std::wstring wsTempString = ReadString16(current, curindex, _sLen); std::wstring wsTempString = ReadString16(current, curindex, _sLen);
...@@ -682,7 +682,7 @@ namespace NSOnlineOfficeBinToPdf ...@@ -682,7 +682,7 @@ namespace NSOnlineOfficeBinToPdf
} }
case ctGradientStroke: case ctGradientStroke:
{ {
// TODO: // TODO: Эта команда не должна приходить
_INT32 gradientType = ReadInt(current, curindex); _INT32 gradientType = ReadInt(current, curindex);
if (0 == gradientType) // linearGradient if (0 == gradientType) // linearGradient
{ {
...@@ -725,7 +725,7 @@ namespace NSOnlineOfficeBinToPdf ...@@ -725,7 +725,7 @@ namespace NSOnlineOfficeBinToPdf
} }
case ctGradientStrokeXML: case ctGradientStrokeXML:
{ {
// TODO: // TODO: Эта команда не должна приходить
_INT32 gradientType = ReadInt(current, curindex); _INT32 gradientType = ReadInt(current, curindex);
int _sLen = (int)ReadInt(current, curindex); int _sLen = (int)ReadInt(current, curindex);
std::wstring wsTempString = ReadString16(current, curindex, _sLen); std::wstring wsTempString = ReadString16(current, curindex, _sLen);
......
This diff is collapsed.
#ifndef _PDF_WRITER_PDFRENDERER_H #ifndef _PDF_WRITER_PDFRENDERER_H
#define _PDF_WRITER_PDFRENDERER_H #define _PDF_WRITER_PDFRENDERER_H
#include "../DesktopEditor/graphics/IRenderer.h" #include "../DesktopEditor/graphics/IRenderer.h"
...@@ -41,11 +41,11 @@ public: ...@@ -41,11 +41,11 @@ public:
void SetThemesPlace(const std::wstring& wsThemesPlace); void SetThemesPlace(const std::wstring& wsThemesPlace);
std::wstring GetThemesPlace(); std::wstring GetThemesPlace();
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Тип рендерера
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT get_Type(LONG* lType); virtual HRESULT get_Type(LONG* lType);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Функции для работы со страницей
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT NewPage(); virtual HRESULT NewPage();
virtual HRESULT get_Height(double* dHeight); virtual HRESULT get_Height(double* dHeight);
...@@ -55,7 +55,7 @@ public: ...@@ -55,7 +55,7 @@ public:
virtual HRESULT get_DpiX(double* dDpiX); virtual HRESULT get_DpiX(double* dDpiX);
virtual HRESULT get_DpiY(double* dDpiY); virtual HRESULT get_DpiY(double* dDpiY);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// Pen // Функции для работы с Pen
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT get_PenColor(LONG* lColor); virtual HRESULT get_PenColor(LONG* lColor);
virtual HRESULT put_PenColor(const LONG& lColor); virtual HRESULT put_PenColor(const LONG& lColor);
...@@ -79,7 +79,7 @@ public: ...@@ -79,7 +79,7 @@ public:
virtual HRESULT put_PenMiterLimit(const double& dMiter); virtual HRESULT put_PenMiterLimit(const double& dMiter);
virtual HRESULT PenDashPattern(double* pPattern, LONG lCount); virtual HRESULT PenDashPattern(double* pPattern, LONG lCount);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// Brush // Функции для работы с Brush
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT get_BrushType(LONG* lType); virtual HRESULT get_BrushType(LONG* lType);
virtual HRESULT put_BrushType(const LONG& lType); virtual HRESULT put_BrushType(const LONG& lType);
...@@ -103,7 +103,7 @@ public: ...@@ -103,7 +103,7 @@ public:
virtual HRESULT BrushBounds(const double& dLeft, const double& dTop, const double& dWidth, const double& dHeight); virtual HRESULT BrushBounds(const double& dLeft, const double& dTop, const double& dWidth, const double& dHeight);
virtual HRESULT put_BrushGradientColors(LONG* pColors, double* pPositions, LONG lCount); virtual HRESULT put_BrushGradientColors(LONG* pColors, double* pPositions, LONG lCount);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Функции для работы со шрифтами
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT get_FontName(std::wstring* wsName); virtual HRESULT get_FontName(std::wstring* wsName);
virtual HRESULT put_FontName(const std::wstring& wsName); virtual HRESULT put_FontName(const std::wstring& wsName);
...@@ -120,19 +120,19 @@ public: ...@@ -120,19 +120,19 @@ public:
virtual HRESULT get_FontFaceIndex(int* lFaceIndex); virtual HRESULT get_FontFaceIndex(int* lFaceIndex);
virtual HRESULT put_FontFaceIndex(const int& lFaceIndex); virtual HRESULT put_FontFaceIndex(const int& lFaceIndex);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Функции для вывода текста
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT CommandDrawTextCHAR (const LONG& lUnicode, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT CommandDrawTextCHAR (const LONG& lUnicode, const double& dX, const double& dY, const double& dW, const double& dH);
virtual HRESULT CommandDrawTextExCHAR(const LONG& lUnicode, const LONG& lGid, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT CommandDrawTextExCHAR(const LONG& lUnicode, const LONG& lGid, const double& dX, const double& dY, const double& dW, const double& dH);
virtual HRESULT CommandDrawText (const std::wstring& wsUnicodeText, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT CommandDrawText (const std::wstring& wsUnicodeText, const double& dX, const double& dY, const double& dW, const double& dH);
virtual HRESULT CommandDrawTextEx (const std::wstring& wsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT CommandDrawTextEx (const std::wstring& wsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const double& dX, const double& dY, const double& dW, const double& dH);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Маркеры команд
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT BeginCommand(const DWORD& lType); virtual HRESULT BeginCommand(const DWORD& lType);
virtual HRESULT EndCommand(const DWORD& lType); virtual HRESULT EndCommand(const DWORD& lType);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Функции для работы с патом
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT PathCommandMoveTo(const double& dX, const double& dY); virtual HRESULT PathCommandMoveTo(const double& dX, const double& dY);
virtual HRESULT PathCommandLineTo(const double& dX, const double& dY); virtual HRESULT PathCommandLineTo(const double& dX, const double& dY);
...@@ -150,29 +150,29 @@ public: ...@@ -150,29 +150,29 @@ public:
virtual HRESULT PathCommandText (const std::wstring& wsUnicodeText, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT PathCommandText (const std::wstring& wsUnicodeText, const double& dX, const double& dY, const double& dW, const double& dH);
virtual HRESULT PathCommandTextEx (const std::wstring& wsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT PathCommandTextEx (const std::wstring& wsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const double& dX, const double& dY, const double& dW, const double& dH);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Функции для вывода изображений
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT DrawImage(IGrObject* pImage, const double& dX, const double& dY, const double& dW, const double& dH); virtual HRESULT DrawImage(IGrObject* pImage, const double& dX, const double& dY, const double& dW, const double& dH);
virtual HRESULT DrawImageFromFile(const std::wstring& wsImagePath, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha = 255); virtual HRESULT DrawImageFromFile(const std::wstring& wsImagePath, const double& dX, const double& dY, const double& dW, const double& dH, const BYTE& nAlpha = 255);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Функции для выставления преобразования
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT SetTransform(const double& dM11, const double& dM12, const double& dM21, const double& dM22, const double& dX, const double& dY); virtual HRESULT SetTransform(const double& dM11, const double& dM12, const double& dM21, const double& dM22, const double& dX, const double& dY);
virtual HRESULT GetTransform(double* dM11, double* dM12, double* dM21, double* dM22, double* dX, double* dY); virtual HRESULT GetTransform(double* dM11, double* dM12, double* dM21, double* dM22, double* dX, double* dY);
virtual HRESULT ResetTransform(); virtual HRESULT ResetTransform();
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Тип клипа
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT get_ClipMode(LONG* lMode); virtual HRESULT get_ClipMode(LONG* lMode);
virtual HRESULT put_ClipMode(const LONG& lMode); virtual HRESULT put_ClipMode(const LONG& lMode);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// // Дополнительные функции
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
virtual HRESULT CommandLong(const LONG& lType, const LONG& lCommand); virtual HRESULT CommandLong(const LONG& lType, const LONG& lCommand);
virtual HRESULT CommandDouble(const LONG& lType, const double& dCommand); virtual HRESULT CommandDouble(const LONG& lType, const double& dCommand);
virtual HRESULT CommandString(const LONG& lType, const std::wstring& sCommand); virtual HRESULT CommandString(const LONG& lType, const std::wstring& sCommand);
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
// Pdf // Дополнительные функции Pdf рендерера
//---------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------
HRESULT CommandDrawTextPdf(const std::wstring& bsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const std::wstring& wsSrcCodeText, const double& dX, const double& dY, const double& dW, const double& dH); HRESULT CommandDrawTextPdf(const std::wstring& bsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const std::wstring& wsSrcCodeText, const double& dX, const double& dY, const double& dW, const double& dH);
HRESULT PathCommandTextPdf(const std::wstring& bsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const std::wstring& bsSrcCodeText, const double& dX, const double& dY, const double& dW, const double& dH); HRESULT PathCommandTextPdf(const std::wstring& bsUnicodeText, const unsigned int* pGids, const unsigned int nGidsCount, const std::wstring& bsSrcCodeText, const double& dX, const double& dY, const double& dW, const double& dH);
...@@ -389,7 +389,7 @@ private: ...@@ -389,7 +389,7 @@ private:
} }
else else
{ {
// , pdf- // Избавляемся от нулей, потому что все pdf-ридеры плохо их воспринимают
std::vector<double> vPattern; std::vector<double> vPattern;
for (LONG lIndex = 0; lIndex < lSize; lIndex++) for (LONG lIndex = 0; lIndex < lSize; lIndex++)
{ {
...@@ -580,7 +580,7 @@ private: ...@@ -580,7 +580,7 @@ private:
} }
inline void SetGradientColors(LONG* pColors, double* pPoints, const LONG& lCount) inline void SetGradientColors(LONG* pColors, double* pPoints, const LONG& lCount)
{ {
// , 0 1 . // Мы создаем упорядоченный по возрастанию массив, причем первая и последняя точки должны быть 0 и 1 соответственно.
if (m_pShadingColors) if (m_pShadingColors)
{ {
delete[] m_pShadingColors; delete[] m_pShadingColors;
...@@ -918,7 +918,7 @@ private: ...@@ -918,7 +918,7 @@ private:
TColor* m_pShadingColors; TColor* m_pShadingColors;
double* m_pShadingPoints; double* m_pShadingPoints;
LONG m_lShadingPointsCount; LONG m_lShadingPointsCount;
double m_pShadingPattern[6]; // x0, y0, x1, y1 (2 ), x0, y0, r0, x1, y1, r1 double m_pShadingPattern[6]; // У линейного градиента x0, y0, x1, y1 (2 не используются), у радиального x0, y0, r0, x1, y1, r1
}; };
class CFontState class CFontState
{ {
...@@ -1149,7 +1149,7 @@ private: ...@@ -1149,7 +1149,7 @@ private:
} }
void GetLastPoint(double& dX, double& dY) void GetLastPoint(double& dX, double& dY)
{ {
// TODO: // TODO: Надо грамотно пересчитать
dX = x; dX = x;
dY = y; dY = y;
} }
...@@ -1177,7 +1177,7 @@ private: ...@@ -1177,7 +1177,7 @@ private:
} }
void GetLastPoint(double& dX, double& dY) void GetLastPoint(double& dX, double& dY)
{ {
// TODO: // TODO: Надо грамотно пересчитать
dX = 0; dX = 0;
dY = 0; dY = 0;
} }
...@@ -1429,7 +1429,7 @@ private: ...@@ -1429,7 +1429,7 @@ private:
bool m_bValid; bool m_bValid;
int m_nPagesCount; int m_nPagesCount;
int m_nCounter; // TODO: , int m_nCounter; // TODO: для теста, убрать потом
}; };
#endif // _PDF_WRITER_PDFRENDERER_H #endif // _PDF_WRITER_PDFRENDERER_H
\ No newline at end of file
#include "Font14.h" #include "Font14.h"
namespace PdfWriter namespace PdfWriter
{ {
......
#ifndef _PDF_WRITER_SRC_FONT14_H #ifndef _PDF_WRITER_SRC_FONT14_H
#define _PDF_WRITER_SRC_FONT14_H #define _PDF_WRITER_SRC_FONT14_H
#include "Font.h" #include "Font.h"
......
#include "FontCidTT.h" #include "FontCidTT.h"
#include "Document.h" #include "Document.h"
#include "Streams.h" #include "Streams.h"
#include "Utils.h" #include "Utils.h"
...@@ -65,7 +65,7 @@ namespace PdfWriter ...@@ -65,7 +65,7 @@ namespace PdfWriter
if (NULL == pOs2 || 0xFFFF == pOs2->version) if (NULL == pOs2 || 0xFFFF == pOs2->version)
return -1; return -1;
// 31 // Проверяем установлен ли 31 бит
if (!(pOs2->ulCodePageRange1 & 0x80000000) && !(pOs2->ulCodePageRange1 == 0 && pOs2->ulCodePageRange2 == 0)) if (!(pOs2->ulCodePageRange1 & 0x80000000) && !(pOs2->ulCodePageRange1 == 0 && pOs2->ulCodePageRange2 == 0))
return -1; return -1;
...@@ -138,12 +138,12 @@ namespace PdfWriter ...@@ -138,12 +138,12 @@ namespace PdfWriter
pFont->Add("CIDSystemInfo", pSystemInfo); pFont->Add("CIDSystemInfo", pSystemInfo);
CDictObject* pFontDescriptor = new CDictObject(); CDictObject* pFontDescriptor = new CDictObject();
// FontDescriptor // FontDescriptor обязательно должен идти ссылкой
m_pXref->Add(pFontDescriptor); m_pXref->Add(pFontDescriptor);
pFontDescriptor->Add("Type", "FontDescriptor"); pFontDescriptor->Add("Type", "FontDescriptor");
m_pFontDescriptor = pFontDescriptor; m_pFontDescriptor = pFontDescriptor;
// Symbolic, NonSymbolic // Выставляем бит Symbolic, а бит NonSymbolic убираем
unsigned int nFlags = 0; unsigned int nFlags = 0;
if (!(nFlags & 4)) if (!(nFlags & 4))
UIntChangeBit(nFlags, 2); UIntChangeBit(nFlags, 2);
...@@ -185,9 +185,9 @@ namespace PdfWriter ...@@ -185,9 +185,9 @@ namespace PdfWriter
if (!pEncodedString) if (!pEncodedString)
return NULL; return NULL;
// 0x0000..0xFFFF // Юникодные значения мы кодируем в наши собственные коды последовательно от 0x0000..0xFFFF
// Gid . // для каждого юникодного значения находим соответствующий Gid в шрифте.
// . // Для каждого кода получаем ширину символа.
for (unsigned int unIndex = 0; unIndex < unLen; unIndex++) for (unsigned int unIndex = 0; unIndex < unLen; unIndex++)
{ {
bool bFind = false; bool bFind = false;
...@@ -238,10 +238,10 @@ namespace PdfWriter ...@@ -238,10 +238,10 @@ namespace PdfWriter
m_vCodeToGid.push_back(unGID); m_vCodeToGid.push_back(unGID);
// // Данный символ используется
m_mGlyphs.insert(std::pair<unsigned int, bool>(unGID, true)); m_mGlyphs.insert(std::pair<unsigned int, bool>(unGID, true));
// (CompositeGlyf), (subglyfs) // Если данный символ составной (CompositeGlyf), тогда мы должны учесть все его дочерные символы (subglyfs)
if (0 == FT_Load_Glyph(m_pFace, unGID, FT_LOAD_NO_SCALE | FT_LOAD_NO_RECURSE)) if (0 == FT_Load_Glyph(m_pFace, unGID, FT_LOAD_NO_SCALE | FT_LOAD_NO_RECURSE))
{ {
for (int nSubIndex = 0; nSubIndex < m_pFace->glyph->num_subglyphs; nSubIndex++) for (int nSubIndex = 0; nSubIndex < m_pFace->glyph->num_subglyphs; nSubIndex++)
...@@ -446,7 +446,7 @@ namespace PdfWriter ...@@ -446,7 +446,7 @@ namespace PdfWriter
if (m_bNeedAddFontName) if (m_bNeedAddFontName)
{ {
// , // Дописываем имя шрифта во все необходимые словари, а также заполняем дескриптор
std::string sFontName = m_pDocument->GetTTFontTag() + std::string(m_pFace->family_name); std::string sFontName = m_pDocument->GetTTFontTag() + std::string(m_pFace->family_name);
if (m_pFace->style_flags & FT_STYLE_FLAG_ITALIC) if (m_pFace->style_flags & FT_STYLE_FLAG_ITALIC)
sFontName += "-Italic"; sFontName += "-Italic";
......
#ifndef _PDF_WRITER_SRC_FONTCIDTT_H #ifndef _PDF_WRITER_SRC_FONTCIDTT_H
#define _PDF_WRITER_SRC_FONTCIDTT_H #define _PDF_WRITER_SRC_FONTCIDTT_H
#include "Font.h" #include "Font.h"
...@@ -54,9 +54,9 @@ namespace PdfWriter ...@@ -54,9 +54,9 @@ namespace PdfWriter
CDictObject* m_pFont; CDictObject* m_pFont;
CDictObject* m_pFontDescriptor; CDictObject* m_pFontDescriptor;
unsigned short m_ushCodesCount; // unsigned short m_ushCodesCount; // Количество закодированных символов
std::map<unsigned int, unsigned short> m_mUnicodeToCode; // -> std::map<unsigned int, unsigned short> m_mUnicodeToCode; // Мап Юникод->код символа
std::vector<unsigned int> m_vUnicodes; // -> std::vector<unsigned int> m_vUnicodes; // Обратный мап код символа -> юникод
std::vector<unsigned int> m_vCodeToGid; std::vector<unsigned int> m_vCodeToGid;
std::vector<unsigned int> m_vWidths; std::vector<unsigned int> m_vWidths;
......
#include "FontTTWriter.h" #include "FontTTWriter.h"
#include "../../DesktopEditor/common/File.h" #include "../../DesktopEditor/common/File.h"
#define ttcfTag 0x74746366 #define ttcfTag 0x74746366
...@@ -359,14 +359,14 @@ namespace PdfWriter ...@@ -359,14 +359,14 @@ namespace PdfWriter
unsigned int t; unsigned int t;
int nPos = 0, i, j, k, n; int nPos = 0, i, j, k, n;
// OpenType // Записываем OpenType шрифт не меняя его
if (m_bOpenTypeCFF) if (m_bOpenTypeCFF)
{ {
WriteOTF(pOutputStream, sName, pCodeToGID); WriteOTF(pOutputStream, sName, pCodeToGID);
return; return;
} }
// // Проверяем недостающие таблицы
bool bMissingCmap = (nCmapIndex = SeekTable("cmap")) < 0; bool bMissingCmap = (nCmapIndex = SeekTable("cmap")) < 0;
bool bMissingName = SeekTable("name") < 0; bool bMissingName = SeekTable("name") < 0;
bool bMissingPost = SeekTable("post") < 0; bool bMissingPost = SeekTable("post") < 0;
...@@ -392,8 +392,8 @@ namespace PdfWriter ...@@ -392,8 +392,8 @@ namespace PdfWriter
{ {
bUnsortedLoca = true; bUnsortedLoca = true;
} }
// 12 (nContours, // Описание глифа должны быть как минимум 12 байт (nContours,
// xMin, yMin, xMax, yMax, instructionLength - 2 ); // xMin, yMin, xMax, yMax, instructionLength - каждый по 2 байта);
if (i > 0 && pLocaTable[i].nOrigOffset - pLocaTable[i - 1].nOrigOffset > 0 && pLocaTable[i].nOrigOffset - pLocaTable[i - 1].nOrigOffset < 12) if (i > 0 && pLocaTable[i].nOrigOffset - pLocaTable[i - 1].nOrigOffset > 0 && pLocaTable[i].nOrigOffset - pLocaTable[i - 1].nOrigOffset < 12)
{ {
pLocaTable[i - 1].nOrigOffset = pLocaTable[i].nOrigOffset; pLocaTable[i - 1].nOrigOffset = pLocaTable[i].nOrigOffset;
...@@ -402,7 +402,7 @@ namespace PdfWriter ...@@ -402,7 +402,7 @@ namespace PdfWriter
pLocaTable[i].nIndex = i; pLocaTable[i].nIndex = i;
} }
// // Проверяем наличие нулевых таблиц
nZeroLengthTables = 0; nZeroLengthTables = 0;
for (i = 0; i < m_nTablesCount; ++i) for (i = 0; i < m_nTablesCount; ++i)
{ {
...@@ -410,7 +410,7 @@ namespace PdfWriter ...@@ -410,7 +410,7 @@ namespace PdfWriter
++nZeroLengthTables; ++nZeroLengthTables;
} }
// Cmap // Проверяем длину таблицы Cmap
badCmapLen = false; badCmapLen = false;
nCmapLen = 0; nCmapLen = 0;
if (!bMissingCmap) if (!bMissingCmap)
...@@ -430,12 +430,12 @@ namespace PdfWriter ...@@ -430,12 +430,12 @@ namespace PdfWriter
} }
} }
// , 'hmtx' . // Проверяем, является ли таблица 'hmtx' сокращенной.
i = SeekTable("hhea"); i = SeekTable("hhea");
nHMetrics = GetU16BE(m_pTables[i].nOffset + 34, &bSuccess); nHMetrics = GetU16BE(m_pTables[i].nOffset + 34, &bSuccess);
abbrevHMTX = nHMetrics < m_nGlyphs; abbrevHMTX = nHMetrics < m_nGlyphs;
// , 'cmap' 'name', TTF // Если все впорядке, и нам не надо переписывать таблицы 'cmap' и 'name', тогда пишем файл TTF как он есть
if (!bMissingCmap && !bMissingName && !bMissingPost && !bMissingOS2 && !bUnsortedLoca && !badCmapLen && !abbrevHMTX && nZeroLengthTables == 0 && !sName && !pCodeToGID) if (!bMissingCmap && !bMissingName && !bMissingPost && !bMissingOS2 && !bUnsortedLoca && !badCmapLen && !abbrevHMTX && nZeroLengthTables == 0 && !sName && !pCodeToGID)
{ {
pOutputStream->Write((BYTE *)m_sFile, m_nLen); pOutputStream->Write((BYTE *)m_sFile, m_nLen);
...@@ -443,12 +443,12 @@ namespace PdfWriter ...@@ -443,12 +443,12 @@ namespace PdfWriter
return; return;
} }
// 'loca': // Сортируем таблицу 'loca': некоторые шрифты содержат неупорядоченную
// 'loca'; 'loca' // таблицу 'loca'; а некоторые шрифты с нормальной таблицей 'loca'
// , cmpTrueTypeLocaOffset // содержат пустые элементы в середине таблицы, cmpTrueTypeLocaOffset
// , // использует сдвиги как основной ключ для сортировки, а номера глифов
// ( , // как второй ключ (чтобы элементы в таблице, которые имели одинаковую позицию
// , ) // шли в том же порядке, как и в исходном шрифте)
nGlyphLen = 0; nGlyphLen = 0;
if (bUnsortedLoca || pUseGlyfs) if (bUnsortedLoca || pUseGlyfs)
{ {
...@@ -463,7 +463,7 @@ namespace PdfWriter ...@@ -463,7 +463,7 @@ namespace PdfWriter
for (i = 0; i <= m_nGlyphs; ++i) for (i = 0; i <= m_nGlyphs; ++i)
{ {
// TO DO: , // TO DO: Протестировать тут запись только тех глифов, которые нам нужны
if (pUseGlyfs && lGlyfsCount == m_nGlyphs) if (pUseGlyfs && lGlyfsCount == m_nGlyphs)
{ {
...@@ -495,7 +495,7 @@ namespace PdfWriter ...@@ -495,7 +495,7 @@ namespace PdfWriter
nGlyphLen = nPos; nGlyphLen = nPos;
} }
// 'loca' 'glyf' // Вычисляем чексуммы таблиц 'loca' и 'glyf'
nLocaChecksum = nGlyphChecksum = 0; nLocaChecksum = nGlyphChecksum = 0;
if (bUnsortedLoca || pUseGlyfs) if (bUnsortedLoca || pUseGlyfs)
{ {
...@@ -532,7 +532,7 @@ namespace PdfWriter ...@@ -532,7 +532,7 @@ namespace PdfWriter
} }
} }
// 'name' // Строим новую таблицу 'name'
if (sName) if (sName)
{ {
n = strlen(sName); n = strlen(sName);
...@@ -582,7 +582,7 @@ namespace PdfWriter ...@@ -582,7 +582,7 @@ namespace PdfWriter
arrNewNameTable = NULL; arrNewNameTable = NULL;
} }
// 'cmap' // Строим новую таблицу 'cmap'
if (pCodeToGID) if (pCodeToGID)
{ {
unsigned short ushSubTableLen = 10 + unCodesCount * 2; unsigned short ushSubTableLen = 10 + unCodesCount * 2;
...@@ -592,9 +592,9 @@ namespace PdfWriter ...@@ -592,9 +592,9 @@ namespace PdfWriter
arrNewCmapTable[1] = 0; // arrNewCmapTable[1] = 0; //
arrNewCmapTable[2] = 0; // number of encoding tables = 1 arrNewCmapTable[2] = 0; // number of encoding tables = 1
arrNewCmapTable[3] = 1; // arrNewCmapTable[3] = 1; //
arrNewCmapTable[4] = 0; // platform ID = 1 (MacOS) // arrNewCmapTable[4] = 0; // platform ID = 1 (MacOS) // Эти два поля обязательно должны
arrNewCmapTable[5] = 1; // // , , Adobe arrNewCmapTable[5] = 1; // // иметь таки значения, иначе, Adobe
arrNewCmapTable[6] = 0; // encoding ID = 0 // Acrobat . arrNewCmapTable[6] = 0; // encoding ID = 0 // Acrobat может открыть данный шрифт.
arrNewCmapTable[7] = 0; // // arrNewCmapTable[7] = 0; // //
arrNewCmapTable[8] = 0; // offset of subtable arrNewCmapTable[8] = 0; // offset of subtable
arrNewCmapTable[9] = 0; // arrNewCmapTable[9] = 0; //
...@@ -623,7 +623,7 @@ namespace PdfWriter ...@@ -623,7 +623,7 @@ namespace PdfWriter
arrNewCmapTable = NULL; arrNewCmapTable = NULL;
} }
// 'hmtx' 'hhea' // Генерируем новую таблицу 'hmtx' и обновляем таблицу 'hhea'
if (abbrevHMTX) if (abbrevHMTX)
{ {
i = SeekTable("hhea"); i = SeekTable("hhea");
...@@ -667,13 +667,13 @@ namespace PdfWriter ...@@ -667,13 +667,13 @@ namespace PdfWriter
nNewHHEALen = nNewHMTXLen = 0; nNewHHEALen = nNewHMTXLen = 0;
} }
// : // Создаем список таблиц:
// - // - сохраняем исходные ненулевые таблицы
// - 'cmap', // - переписываем длину таблицы 'cmap', если необходимо
// - // - добавляем недостающие таблицы
// - // - сортируем таблицы по тэгам
// - , 4- // - вычисляем новые позиции таблиц, с учетом 4-байтового выравнивания
// - // - пересчитываем чексуммы таблиц
nNewTables = m_nTablesCount - nZeroLengthTables + (bMissingCmap ? 1 : 0) + (bMissingName ? 1 : 0) + (bMissingPost ? 1 : 0) + (bMissingOS2 ? 1 : 0); nNewTables = m_nTablesCount - nZeroLengthTables + (bMissingCmap ? 1 : 0) + (bMissingName ? 1 : 0) + (bMissingPost ? 1 : 0) + (bMissingOS2 ? 1 : 0);
pNewTables = (TrueTypeTable *)malloc(nNewTables * sizeof(TrueTypeTable)); pNewTables = (TrueTypeTable *)malloc(nNewTables * sizeof(TrueTypeTable));
j = 0; j = 0;
...@@ -817,7 +817,7 @@ namespace PdfWriter ...@@ -817,7 +817,7 @@ namespace PdfWriter
} }
} }
// // Записываем информацию о таблицах в файле
arrTableDir = (char *)malloc(12 + nNewReqTables * 16); arrTableDir = (char *)malloc(12 + nNewReqTables * 16);
arrTableDir[0] = 0x00; // sfnt version arrTableDir[0] = 0x00; // sfnt version
arrTableDir[1] = 0x01; // arrTableDir[1] = 0x01; //
...@@ -860,7 +860,7 @@ namespace PdfWriter ...@@ -860,7 +860,7 @@ namespace PdfWriter
} }
pOutputStream->Write((BYTE*)arrTableDir, 12 + nNewReqTables * 16); pOutputStream->Write((BYTE*)arrTableDir, 12 + nNewReqTables * 16);
// // Вычисляем чексумму файла
nFileChecksum = ComputeTableChecksum((unsigned char *)arrTableDir, 12 + nNewReqTables * 16); nFileChecksum = ComputeTableChecksum((unsigned char *)arrTableDir, 12 + nNewReqTables * 16);
for (i = 0; i < nNewTables; ++i) for (i = 0; i < nNewTables; ++i)
{ {
...@@ -871,7 +871,7 @@ namespace PdfWriter ...@@ -871,7 +871,7 @@ namespace PdfWriter
} }
nFileChecksum = 0xb1b0afba - nFileChecksum; nFileChecksum = 0xb1b0afba - nFileChecksum;
// // Записываем сами таблицы
for (i = 0; i < nNewTables; ++i) for (i = 0; i < nNewTables; ++i)
{ {
if (1 == pUseTable[i]) if (1 == pUseTable[i])
...@@ -995,7 +995,7 @@ namespace PdfWriter ...@@ -995,7 +995,7 @@ namespace PdfWriter
if (!m_bOpenTypeCFF || SeekTable("CFF ") < 0) if (!m_bOpenTypeCFF || SeekTable("CFF ") < 0)
return; return;
// Open Type Font , // Open Type Font записываем так как он есть, не изменяя его
pOutputStream->Write((BYTE*)m_sFile, m_nLen); pOutputStream->Write((BYTE*)m_sFile, m_nLen);
return; return;
...@@ -1054,7 +1054,7 @@ namespace PdfWriter ...@@ -1054,7 +1054,7 @@ namespace PdfWriter
m_bSuccess = true; m_bSuccess = true;
// (TTC) // Проверяем является ли данный файл (TTC)
unsigned int unTopTag = GetU32BE(0, &m_bSuccess); unsigned int unTopTag = GetU32BE(0, &m_bSuccess);
if (!m_bSuccess) if (!m_bSuccess)
return; return;
...@@ -1071,12 +1071,12 @@ namespace PdfWriter ...@@ -1071,12 +1071,12 @@ namespace PdfWriter
else else
nPos = 0; nPos = 0;
// sfnt // Проверяем sfnt версию
int nSfntVersion = GetU32BE(nPos, &m_bSuccess); int nSfntVersion = GetU32BE(nPos, &m_bSuccess);
if (!m_bSuccess) if (!m_bSuccess)
return; return;
// . CCF ? // Проверяем на формат данных. CCF или нет?
m_bOpenTypeCFF = (nSfntVersion == 0x4f54544f); // 'OTTO' m_bOpenTypeCFF = (nSfntVersion == 0x4f54544f); // 'OTTO'
m_nTablesCount = GetU16BE(nPos + 4, &m_bSuccess); m_nTablesCount = GetU16BE(nPos + 4, &m_bSuccess);
...@@ -1101,14 +1101,14 @@ namespace PdfWriter ...@@ -1101,14 +1101,14 @@ namespace PdfWriter
if (!m_bSuccess) if (!m_bSuccess)
return; return;
// TrueType Type 42 // ищем таблицы необходимые как и для TrueType так и для Type 42
if (SeekTable("head") < 0 || SeekTable("hhea") < 0 || SeekTable("maxp") < 0 || SeekTable("hmtx") < 0 || (!m_bOpenTypeCFF && SeekTable("loca") < 0) || (!m_bOpenTypeCFF && SeekTable("glyf") < 0) || (m_bOpenTypeCFF && SeekTable("CFF ") < 0)) if (SeekTable("head") < 0 || SeekTable("hhea") < 0 || SeekTable("maxp") < 0 || SeekTable("hmtx") < 0 || (!m_bOpenTypeCFF && SeekTable("loca") < 0) || (!m_bOpenTypeCFF && SeekTable("glyf") < 0) || (m_bOpenTypeCFF && SeekTable("CFF ") < 0))
{ {
m_bSuccess = false; m_bSuccess = false;
return; return;
} }
// CMaps // читаем таблицы CMaps
if ((nIndex = SeekTable("cmap")) >= 0) if ((nIndex = SeekTable("cmap")) >= 0)
{ {
nPos = m_pTables[nIndex].nOffset + 2; nPos = m_pTables[nIndex].nOffset + 2;
...@@ -1149,7 +1149,7 @@ namespace PdfWriter ...@@ -1149,7 +1149,7 @@ namespace PdfWriter
if (!m_bSuccess) if (!m_bSuccess)
return; return;
// loca // Проверяем корректность таблицы loca
if (!m_bOpenTypeCFF) if (!m_bOpenTypeCFF)
{ {
nIndex = SeekTable("loca"); nIndex = SeekTable("loca");
......
#include "Pattern.h" #include "Pattern.h"
#include "Image.h" #include "Image.h"
#include "Streams.h" #include "Streams.h"
......
#ifndef _PDF_WRITER_SRC_PATTERN_H #ifndef _PDF_WRITER_SRC_PATTERN_H
#define _PDF_WRITER_SRC_PATTERN_H #define _PDF_WRITER_SRC_PATTERN_H
#include "Objects.h" #include "Objects.h"
......
#include "Shading.h" #include "Shading.h"
namespace PdfWriter namespace PdfWriter
{ {
......
#ifndef _PDF_WRITER_SRC_SHADING_H #ifndef _PDF_WRITER_SRC_SHADING_H
#define _PDF_WRITER_SRC_STREAMS_H #define _PDF_WRITER_SRC_STREAMS_H
#include "Objects.h" #include "Objects.h"
...@@ -38,7 +38,7 @@ namespace PdfWriter ...@@ -38,7 +38,7 @@ namespace PdfWriter
private: private:
bool m_bRgb; // Rgb Gray bool m_bRgb; // Rgb или Gray
unsigned char* m_pColors; unsigned char* m_pColors;
double* m_pColorsPoints; double* m_pColorsPoints;
int m_nColorsCount; int m_nColorsCount;
......
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