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