Commit 2470bfd3 authored by Ilya Kirillov's avatar Ilya Kirillov

Fixed bug with caching fonts for different pages. Fixed bug with drawing a text.

parent 3ae52bd2
......@@ -47,6 +47,7 @@
#include "GFont.h"
#include "File.h"
#include "Stream.h"
#include "XRef.h"
namespace PdfReader
{
......@@ -1945,12 +1946,10 @@ namespace PdfReader
}
else
{
// Нет ссылки на данный шрифт, но ссылка нам нужна как идентефикатор, поэтому выбираем некотый уникальный номер
// (поскольку корректное версионное число состоит из 5 цифр, поэтому любое 6-циферное число будет безопасным решением)
oRef.nNum = nIndex;
if (pFontDictRef)
if (pXref)
{
oRef.nGen = 100000 + pFontDictRef->nNum;
oRef.nGen = pXref->GenerateUniqueRefGen();
}
else
{
......
......@@ -69,25 +69,35 @@ namespace PdfReader
}
bool operator <(const Ref& oRight)const
{
return nNum < oRight.nNum;
if (nNum < oRight.nNum)
return true;
else if (nNum == oRight.nNum)
return nGen < oRight.nGen;
else
return false;
}
bool operator >(const Ref& oRight)const
{
return nNum > oRight.nNum;
if (nNum > oRight.nNum)
return true;
else if (nNum == oRight.nNum)
return nGen > oRight.nGen;
else
return false;
}
bool operator <=(const Ref& oRight)const
{
if (*this == oRight)
return true;
return nNum < oRight.nNum;
return (*this < oRight);
}
bool operator >=(const Ref& oRight)const
{
if (*this == oRight)
return true;
return nNum > oRight.nNum;
return (*this > oRight);
}
};
......
......@@ -3003,7 +3003,7 @@ namespace PdfReader
//m_oFont.Size *= dTextScale;
double dOldSize = 10.0;
m_pRenderer->get_FontSize(&dOldSize);
m_pRenderer->put_FontSize(dOldSize * dTextScale);
m_pRenderer->put_FontSize(std::fabs(dOldSize * dTextScale));
pNewTm[0] = pTm[0] * dITextScale;
pNewTm[1] = pTm[1] * dITextScale;
......@@ -3032,22 +3032,24 @@ namespace PdfReader
if (true)
{
double dDet = sqrt(arrMatrix[0] * arrMatrix[3] - arrMatrix[1] * arrMatrix[2]);
arrMatrix[0] /= dDet;
arrMatrix[1] /= dDet;
arrMatrix[2] /= dDet;
arrMatrix[3] /= dDet;
double dNorma = min(sqrt(arrMatrix[0] * arrMatrix[0] + arrMatrix[1] * arrMatrix[1]), sqrt(arrMatrix[2] * arrMatrix[2] + arrMatrix[3] * arrMatrix[3]));
if (dNorma > 0.001)
{
arrMatrix[0] /= dNorma;
arrMatrix[1] /= dNorma;
arrMatrix[2] /= dNorma;
arrMatrix[3] /= dNorma;
double dSize = 1;
m_pRenderer->get_FontSize(&dSize);
m_pRenderer->put_FontSize(dSize * dDet);
m_pRenderer->put_FontSize(dSize * dNorma);
}
}
double dShiftX = 0, dShiftY = 0;
DoTransform(arrMatrix, &dShiftX, &dShiftY, true);
// Здесь мы посылаем координаты текста в пунктах
double dPageHeight = pGState->GetPageHeight();
std::wstring wsUnicodeText;
......
......@@ -241,6 +241,10 @@ namespace PdfReader
m_nPermissionFlags = DefaultPermissionFlags;
m_bOwnerPassword = false;
// Если нет ссылки на данный объект, а ссылка нам нужна как идентефикатор, то выбираем некотый уникальный номер
// (поскольку корректное версионное число состоит из 5 цифр, поэтому любое 6-циферное число будет безопасным решением)
m_unRefGenCounter = 100000;
// Читаем Trailer
m_pStream = pStream;
m_nStart = m_pStream->GetStartPos();
......
......@@ -142,6 +142,10 @@ namespace PdfReader
{
return &m_oTrailerDict;
}
unsigned int GenerateUniqueRefGen()
{
return m_unRefGenCounter++;
}
private:
......@@ -181,6 +185,8 @@ namespace PdfReader
int m_nEncryptVersion; // Версия шифровки
CryptAlgorithm m_eEncryptAlgorithm; // Алгоритм шифрования
unsigned int m_unRefGenCounter; // Специальный счетчик для генерации уникальных ссылок для встроенных объектов
NSCriticalSection::CRITICAL_SECTION m_oCS;
};
}
......
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