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