From 65d72ae4ec8b712b0be5c8f87f6301d4d59028d0 Mon Sep 17 00:00:00 2001 From: "Ilya.Kirillov" Date: Fri, 15 May 2015 08:55:36 +0000 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= =?UTF-8?q?.=20=D0=92=D1=81=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20?= =?UTF-8?q?=D1=81=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=B2=20UTF8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62550 954022d7-b5bf-4e40-9824-e11837661b57 --- PdfReader/PdfReader.cpp | 10 +- PdfReader/PdfReader.h | 2 +- PdfReader/Resources/Fontd050000l.h | 2 +- PdfReader/Resources/Fontn019003l.h | 2 +- PdfReader/Resources/Fontn019004l.h | 2 +- PdfReader/Resources/Fontn019023l.h | 2 +- PdfReader/Resources/Fontn019024l.h | 2 +- PdfReader/Resources/Fontn021003l.h | 2 +- PdfReader/Resources/Fontn021004l.h | 2 +- PdfReader/Resources/Fontn021023l.h | 2 +- PdfReader/Resources/Fontn021024l.h | 2 +- PdfReader/Resources/Fontn022003l.h | 2 +- PdfReader/Resources/Fontn022004l.h | 2 +- PdfReader/Resources/Fontn022023l.h | 2 +- PdfReader/Resources/Fontn022024l.h | 2 +- PdfReader/Resources/Fonts050000l.h | 2 +- PdfReader/Src/Annot.cpp | 118 +++--- PdfReader/Src/Annot.h | 26 +- PdfReader/Src/Array.cpp | 2 +- PdfReader/Src/Array.h | 12 +- PdfReader/Src/BuiltinFont.h | 2 +- PdfReader/Src/BuiltinFontTables.h | 2 +- PdfReader/Src/CCITT-Tables.h | 16 +- PdfReader/Src/CMap.cpp | 4 +- PdfReader/Src/CMap.h | 18 +- PdfReader/Src/Catalog.cpp | 18 +- PdfReader/Src/Catalog.h | 22 +- PdfReader/Src/CharCodeToUnicode.cpp | 2 +- PdfReader/Src/CharCodeToUnicode.h | 6 +- PdfReader/Src/CharTypes.h | 12 +- PdfReader/Src/Constants.h | 6 +- PdfReader/Src/Decrypt.cpp | 26 +- PdfReader/Src/Decrypt.h | 8 +- PdfReader/Src/Dict.cpp | 2 +- PdfReader/Src/Dict.h | 28 +- PdfReader/Src/EncodingTables.h | 2 +- PdfReader/Src/ErrorConstants.h | 20 +- PdfReader/Src/ExtractImageOutputDev.cpp | 10 +- PdfReader/Src/ExtractImageOutputDev.h | 10 +- PdfReader/Src/File.h | 4 +- PdfReader/Src/FontFileBase.cpp | 2 +- PdfReader/Src/FontFileBase.h | 2 +- PdfReader/Src/FontFileEncodings.h | 2 +- PdfReader/Src/FontFileTrueType.cpp | 70 ++-- PdfReader/Src/FontFileTrueType.h | 34 +- PdfReader/Src/FontFileType1.cpp | 12 +- PdfReader/Src/FontFileType1.h | 2 +- PdfReader/Src/FontFileType1C.cpp | 60 +-- PdfReader/Src/FontFileType1C.h | 28 +- PdfReader/Src/Function.cpp | 28 +- PdfReader/Src/Function.h | 56 +-- PdfReader/Src/GFont.cpp | 168 ++++---- PdfReader/Src/GFont.h | 94 ++--- PdfReader/Src/GState.cpp | 54 +-- PdfReader/Src/GState.h | 284 ++++++------- PdfReader/Src/GlobalParams.cpp | 22 +- PdfReader/Src/GlobalParams.h | 6 +- PdfReader/Src/Graphics.cpp | 254 ++++++------ PdfReader/Src/Graphics.h | 34 +- PdfReader/Src/Hash.cpp | 2 +- PdfReader/Src/Hash.h | 8 +- PdfReader/Src/JArithmeticDecoder.cpp | 2 +- PdfReader/Src/JArithmeticDecoder.h | 14 +- PdfReader/Src/JBIG2Stream.cpp | 12 +- PdfReader/Src/JBIG2Stream.h | 2 +- PdfReader/Src/JPXStream.cpp | 9 +- PdfReader/Src/JPXStream.h | 2 +- PdfReader/Src/Lexer.cpp | 30 +- PdfReader/Src/Lexer.h | 26 +- PdfReader/Src/Link.cpp | 6 +- PdfReader/Src/Link.h | 36 +- PdfReader/Src/List.cpp | 2 +- PdfReader/Src/List.h | 42 +- PdfReader/Src/MemoryUtils.h | 30 +- PdfReader/Src/NameToCharCode.cpp | 6 +- PdfReader/Src/NameToCharCode.h | 2 +- PdfReader/Src/NameToUnicodeTable.h | 2 +- PdfReader/Src/Object.cpp | 2 +- PdfReader/Src/Object.h | 42 +- PdfReader/Src/Outline.cpp | 2 +- PdfReader/Src/Outline.h | 20 +- PdfReader/Src/OutputDevice.cpp | 2 +- PdfReader/Src/OutputDevice.h | 90 ++--- PdfReader/Src/PDFDoc.cpp | 26 +- PdfReader/Src/PDFDoc.h | 68 ++-- PdfReader/Src/PDFDocEncoding.h | 2 +- PdfReader/Src/PDFReader.cpp | 8 - PdfReader/Src/PDFReader.h | 512 ------------------------ PdfReader/Src/PSLexer.cpp | 8 +- PdfReader/Src/PSLexer.h | 10 +- PdfReader/Src/Page.cpp | 12 +- PdfReader/Src/Page.h | 12 +- PdfReader/Src/Parser.cpp | 40 +- PdfReader/Src/Parser.h | 14 +- PdfReader/Src/ReadMe.txt | 68 ---- PdfReader/Src/RendererOutputDev.cpp | 140 +++---- PdfReader/Src/RendererOutputDev.h | 38 +- PdfReader/Src/Resource.h | 31 -- PdfReader/Src/SecurityHandler.cpp | 10 +- PdfReader/Src/SecurityHandler.h | 22 +- PdfReader/Src/Stream.cpp | 162 ++++---- PdfReader/Src/Stream.h | 320 +++++++-------- PdfReader/Src/StringExt.cpp | 6 +- PdfReader/Src/StringExt.h | 72 ++-- PdfReader/Src/UTF8.h | 2 +- PdfReader/Src/UnicodeMap.cpp | 2 +- PdfReader/Src/UnicodeMap.h | 30 +- PdfReader/Src/UnicodeMapTables.h | 2 +- PdfReader/Src/XRef.cpp | 78 ++-- PdfReader/Src/XRef.h | 52 +-- PdfReader/Src/XmlUtils.h | 2 +- PdfReader/Src/version.h | 7 - PdfReader/Types.h | 8 - 113 files changed, 1572 insertions(+), 2211 deletions(-) delete mode 100644 PdfReader/Src/PDFReader.cpp delete mode 100644 PdfReader/Src/PDFReader.h delete mode 100644 PdfReader/Src/ReadMe.txt delete mode 100644 PdfReader/Src/Resource.h delete mode 100644 PdfReader/Src/version.h delete mode 100644 PdfReader/Types.h diff --git a/PdfReader/PdfReader.cpp b/PdfReader/PdfReader.cpp index b3a9cb91e7..01fd8308b5 100644 --- a/PdfReader/PdfReader.cpp +++ b/PdfReader/PdfReader.cpp @@ -1,4 +1,4 @@ -#include "PdfReader.h" +#include "PdfReader.h" #include "../Common/OfficeDefines.h" #include "../DesktopEditor/raster/BgraFrame.h" #include "../DesktopEditor/graphics/GraphicsRenderer.h" @@ -31,7 +31,7 @@ namespace PdfReader m_pAppFonts = pAppFonts; - // + // Создаем менеджер шрифтов с собственным кэшем m_pFontManager = pAppFonts->GenerateFontManager(); CFontsCache* pMeasurerCache = new CFontsCache(); pMeasurerCache->SetStreams(pAppFonts->GetStreams()); @@ -61,8 +61,8 @@ namespace PdfReader } bool CPdfReader::LoadFromFile(const wchar_t* wsSrcPath, const wchar_t* wsOwnerPassword, const wchar_t* wsUserPassword, const wchar_t* wsOptions) { - // TODO: - // FontManager, . + // TODO: Сейчас при загрузке каждой новой картинки мы пересоздаем + // FontManager, потому что сейчас в нем кэш без ограничения. //------------------------------------------------------ RELEASEINTERFACE(m_pFontManager); m_pFontManager = m_pAppFonts->GenerateFontManager(); @@ -162,7 +162,7 @@ namespace PdfReader if (!m_pPDFDocument) return; - const double c_dInch = 25.399; // + const double c_dInch = 25.399; // Миллиметров в дюйме const double c_dXResolution = 154.0; const double c_dYResolution = 154.0; diff --git a/PdfReader/PdfReader.h b/PdfReader/PdfReader.h index 4ec29cddab..2773739369 100644 --- a/PdfReader/PdfReader.h +++ b/PdfReader/PdfReader.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_H +#ifndef _PDF_READER_H #define _PDF_READER_H #include "Src/ErrorConstants.h" diff --git a/PdfReader/Resources/Fontd050000l.h b/PdfReader/Resources/Fontd050000l.h index 02dccf24dd..60669667da 100644 --- a/PdfReader/Resources/Fontd050000l.h +++ b/PdfReader/Resources/Fontd050000l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_d050000l_H +#ifndef _PDF_READER_RESOURCE_FONT_d050000l_H #define _PDF_READER_RESOURCE_FONT_d050000l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn019003l.h b/PdfReader/Resources/Fontn019003l.h index 1430c210c3..279be63e6f 100644 --- a/PdfReader/Resources/Fontn019003l.h +++ b/PdfReader/Resources/Fontn019003l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n019003l_H +#ifndef _PDF_READER_RESOURCE_FONT_n019003l_H #define _PDF_READER_RESOURCE_FONT_n019003l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn019004l.h b/PdfReader/Resources/Fontn019004l.h index bbac4407b0..10a7b981d1 100644 --- a/PdfReader/Resources/Fontn019004l.h +++ b/PdfReader/Resources/Fontn019004l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n019004l_H +#ifndef _PDF_READER_RESOURCE_FONT_n019004l_H #define _PDF_READER_RESOURCE_FONT_n019004l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn019023l.h b/PdfReader/Resources/Fontn019023l.h index f2d62662e8..2bfe182439 100644 --- a/PdfReader/Resources/Fontn019023l.h +++ b/PdfReader/Resources/Fontn019023l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n019023l_H +#ifndef _PDF_READER_RESOURCE_FONT_n019023l_H #define _PDF_READER_RESOURCE_FONT_n019023l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn019024l.h b/PdfReader/Resources/Fontn019024l.h index 8f9d19eeca..98988a5429 100644 --- a/PdfReader/Resources/Fontn019024l.h +++ b/PdfReader/Resources/Fontn019024l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n019024l_H +#ifndef _PDF_READER_RESOURCE_FONT_n019024l_H #define _PDF_READER_RESOURCE_FONT_n019024l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn021003l.h b/PdfReader/Resources/Fontn021003l.h index 9a5bf0e524..2aec36c0a4 100644 --- a/PdfReader/Resources/Fontn021003l.h +++ b/PdfReader/Resources/Fontn021003l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n021003l_H +#ifndef _PDF_READER_RESOURCE_FONT_n021003l_H #define _PDF_READER_RESOURCE_FONT_n021003l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn021004l.h b/PdfReader/Resources/Fontn021004l.h index ce4bf8d22a..b7293db93d 100644 --- a/PdfReader/Resources/Fontn021004l.h +++ b/PdfReader/Resources/Fontn021004l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n021004l_H +#ifndef _PDF_READER_RESOURCE_FONT_n021004l_H #define _PDF_READER_RESOURCE_FONT_n021004l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn021023l.h b/PdfReader/Resources/Fontn021023l.h index 980c1eac2b..8751e04e81 100644 --- a/PdfReader/Resources/Fontn021023l.h +++ b/PdfReader/Resources/Fontn021023l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n021023l_H +#ifndef _PDF_READER_RESOURCE_FONT_n021023l_H #define _PDF_READER_RESOURCE_FONT_n021023l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn021024l.h b/PdfReader/Resources/Fontn021024l.h index 74dfc77897..9dbfa58d31 100644 --- a/PdfReader/Resources/Fontn021024l.h +++ b/PdfReader/Resources/Fontn021024l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n021024l_H +#ifndef _PDF_READER_RESOURCE_FONT_n021024l_H #define _PDF_READER_RESOURCE_FONT_n021024l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn022003l.h b/PdfReader/Resources/Fontn022003l.h index 06d750fa68..8f17fe18a1 100644 --- a/PdfReader/Resources/Fontn022003l.h +++ b/PdfReader/Resources/Fontn022003l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n022003l_H +#ifndef _PDF_READER_RESOURCE_FONT_n022003l_H #define _PDF_READER_RESOURCE_FONT_n022003l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn022004l.h b/PdfReader/Resources/Fontn022004l.h index cedd21e88a..9d1b9c7eba 100644 --- a/PdfReader/Resources/Fontn022004l.h +++ b/PdfReader/Resources/Fontn022004l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n022004l_H +#ifndef _PDF_READER_RESOURCE_FONT_n022004l_H #define _PDF_READER_RESOURCE_FONT_n022004l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn022023l.h b/PdfReader/Resources/Fontn022023l.h index f0e985308c..d2bfa1dbb9 100644 --- a/PdfReader/Resources/Fontn022023l.h +++ b/PdfReader/Resources/Fontn022023l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n022023l_H +#ifndef _PDF_READER_RESOURCE_FONT_n022023l_H #define _PDF_READER_RESOURCE_FONT_n022023l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fontn022024l.h b/PdfReader/Resources/Fontn022024l.h index 41fe96ea06..a2ceae9a70 100644 --- a/PdfReader/Resources/Fontn022024l.h +++ b/PdfReader/Resources/Fontn022024l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_n022024l_H +#ifndef _PDF_READER_RESOURCE_FONT_n022024l_H #define _PDF_READER_RESOURCE_FONT_n022024l_H namespace PdfReader { diff --git a/PdfReader/Resources/Fonts050000l.h b/PdfReader/Resources/Fonts050000l.h index 30a221c93a..37bcd93ab6 100644 --- a/PdfReader/Resources/Fonts050000l.h +++ b/PdfReader/Resources/Fonts050000l.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RESOURCE_FONT_s050000l_H +#ifndef _PDF_READER_RESOURCE_FONT_s050000l_H #define _PDF_READER_RESOURCE_FONT_s050000l_H namespace PdfReader { diff --git a/PdfReader/Src/Annot.cpp b/PdfReader/Src/Annot.cpp index 5e9d9c24ac..801a942e6b 100644 --- a/PdfReader/Src/Annot.cpp +++ b/PdfReader/Src/Annot.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "List.h" @@ -253,7 +253,7 @@ namespace PdfReader oDictItem.Free(); // C (border color) - // TO DO: , 3 , 0, 1, 3, 4 + // TO DO: надо сделать чтение случаев, когда в массике не только 3 элемента, а 0, 1, 3, 4 if (pDict->Search("C", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 3) { Object oTemp; @@ -339,7 +339,7 @@ namespace PdfReader } void Annot::GenerateFieldAppearance(Dict *pField, Dict *pAnnot, Dict *pAcroForm) { - // Annotation Widget + // Тип Annotation должен быть Widget if (m_seType->Compare("Widget")) { return; @@ -359,7 +359,7 @@ namespace PdfReader pMKDict = NULL; } - // (BackGround) + // Рисуем фон (BackGround) Object oDictItem; if (pMKDict) { @@ -371,7 +371,7 @@ namespace PdfReader oDictItem.Free(); } - // + // Считываем тип поля // FT (File Type) Object oFTobject; FieldLookup(pField, "FT", &oFTobject); @@ -388,13 +388,13 @@ namespace PdfReader } oDictItem.Free(); - // + // Рисуем рамку if (pMKDict) { double dWidth = m_pBorderStyle->GetWidth(); if (dWidth > 0) { - // BC (Border Color), , BG + // BC (Border Color), если такого поля нет, тогда используем цвет из BG pMKDict->Search("BC", &oDictItem); if (!(oDictItem.IsArray() && oDictItem.ArrayGetLength() > 0)) { @@ -424,7 +424,7 @@ namespace PdfReader m_seAppBuffer->AppendFormat(" {0:.2f}", pDash[nIndex]); } m_seAppBuffer->Append("] 0 d\n"); - // + // Дальше как в случае не пунктирной линии case annotBorderSolid: case annotBorderUnderlined: m_seAppBuffer->AppendFormat("{0:.2f} w\n", dWidth); @@ -458,7 +458,7 @@ namespace PdfReader m_seAppBuffer->AppendFormat(" {0:.2f}", pDash[nIndex]); } m_seAppBuffer->Append("] 0 d\n"); - // + // Дальше как в случае не пунктирной линии case annotBorderSolid: m_seAppBuffer->AppendFormat("{0:.2f} w\n", dWidth); SetColor(oDictItem.GetArray(), false, 0); @@ -531,7 +531,7 @@ namespace PdfReader } oDictItem.Free(); - // Filed + // Рисуем содержимео Filed if (oFTobject.IsName("Btn")) { StringExt *seCaption = NULL; @@ -547,7 +547,7 @@ namespace PdfReader // Radio button if (nFiledFlags & fieldFlagRadio) { - // Caption, AP + // Акробат не рисует Caption, если нет AP if (FieldLookup(pField, "V", &oDictItem)->IsName()) { Object oAppStream; @@ -586,7 +586,7 @@ namespace PdfReader } else // CheckBox { - // "Yes" - , "off" - . + // "Yes" - для включенного состояние, "off" - для выключенного. if (FieldLookup(pField, "V", &oDictItem)->IsName("Yes")) { if (!seCaption) @@ -604,7 +604,7 @@ namespace PdfReader } else if (oFTobject.IsName("Tx")) { - // + // Строковые значения могут быть юникодными Object oValue; if (FieldLookup(pField, "V", &oValue)->IsString()) { @@ -634,7 +634,7 @@ namespace PdfReader } else if (oFTobject.IsName("Ch")) { - // + // Строковые значения могут быть юникодными int nQuadding = 0; Object oTemp; if (FieldLookup(pField, "Q", &oTemp)->IsInt()) @@ -791,9 +791,9 @@ namespace PdfReader oMKObject.Free(); } - // ; ( - // 1, 3, 4 ). +1, color is , - // -1, , , . + // Устанавливаем цвет для заливки или обводки; цвет здается массиом (в котором должно быть + // 1, 3, или 4 элемента). Если равно +1, цвет color is высветляется, если равно + // -1, цвет затемняется, в противном случае, цвет не меняется. void Annot::SetColor(Array *pArray, bool bFill, int nAdjust) { double arrColor[4]; @@ -848,7 +848,7 @@ namespace PdfReader } } - // Field. + // Рисуем текст или название для Field. void Annot::DrawText(StringExt *seText, StringExt *seDA, GrFontDict *pFontDict, bool bMultiline, int nComb, int nQuadding, bool bTextField, bool bForceZapfDingbats) { CList *pListDA; @@ -856,7 +856,7 @@ namespace PdfReader double dX, dY, dWidth; int i, j, k, nChar; - // Default Appearance string + // Парсим Default Appearance string int nTfPos = -1, nTmPos = -1; if (seDA) @@ -907,7 +907,7 @@ namespace PdfReader } } - // + // Считываем шрифт и размер шрифта GrFont *pFont = NULL; double dFontSize = 0; if (nTfPos >= 0) @@ -942,14 +942,14 @@ namespace PdfReader m_seAppBuffer->Append("q\n"); m_seAppBuffer->Append("BT\n"); - // + // Многострочный текст if (bMultiline) { - // nComb + // Флаги nComb игнорируются в многострочном тексте double dWMax = m_dMaxX - m_dMinX - 2 * dBorderWidth - 4; - // ( ) + // Вычислим размер шрифта (если он не был установлен) if (0 == dFontSize) { for (dFontSize = 20; dFontSize > 1; --dFontSize) @@ -981,8 +981,8 @@ namespace PdfReader } } - // Y - // ( Td) + // Начальная координата Y + // (Каждая новая линий начинается с оператора Td) dY = m_dMaxY - m_dMinY; // Font Matrix @@ -996,7 +996,7 @@ namespace PdfReader seToken->AppendFormat("{0:.2f}", dY); } - // DA-string + // Пишем DA-string if (pListDA) { for (i = 0; i < pListDA->GetLength(); ++i) @@ -1005,7 +1005,7 @@ namespace PdfReader } } - // Font Matrix ( DA-string) + // Пишем Font Matrix (если она не была уже в DA-string) if (nTmPos < 0) { m_seAppBuffer->AppendFormat("1 0 0 1 0 {0:.2f} Tm\n", dY); @@ -1016,7 +1016,7 @@ namespace PdfReader while (i < seText->GetLength()) { GetNextLine(seText, i, pFont, dFontSize, dWMax, &j, &dWidth, &k); - // + // Вычислим начальную позицию текста switch (nQuadding) { case fieldQuadLeft: @@ -1052,19 +1052,19 @@ namespace PdfReader } m_seAppBuffer->Append(") Tj\n"); - // + // Следующая строка i = k; dPrevX = dX; } } - else // + else // Однострочный текст { if (nComb > 0) { dWidth = (m_dMaxX - m_dMinX - 2 * dBorderWidth) / nComb; - // ( ) + // Вычислим размер шрифта (если он не был установлен) if (0 == dFontSize) { dFontSize = m_dMaxY - m_dMinY - 2 * dBorderWidth; @@ -1081,7 +1081,7 @@ namespace PdfReader } } - // + // Вычислим начальную позицию текста switch (nQuadding) { case fieldQuadLeft: @@ -1117,7 +1117,7 @@ namespace PdfReader } } - // Font Matrix ( DA-string) + // Пишем Font Matrix (если она не была уже в DA-string) if (nTmPos < 0) { m_seAppBuffer->AppendFormat("1 0 0 1 {0:.2f} {1:.2f} Tm\n", dX, dY); @@ -1150,9 +1150,9 @@ namespace PdfReader m_seAppBuffer->Append(") Tj\n"); } } - else // (non-comb) + else // обычное форматирование (non-comb) { - // + // Вычислим ширину строки if (pFont && !pFont->IsCIDFont()) { dWidth = 0; @@ -1166,7 +1166,7 @@ namespace PdfReader dWidth = seText->GetLength() * 0.5; } - // ( ) + // Вычислим размер шрифта (если он не был установлен) if (0 == dFontSize) { dFontSize = m_dMaxY - m_dMinY - 2 * dBorderWidth; @@ -1184,7 +1184,7 @@ namespace PdfReader } } - // + // Вычислим начальную позицию текста dWidth *= dFontSize; switch (nQuadding) { @@ -1221,13 +1221,13 @@ namespace PdfReader } } - // Font Matrix ( DA-string) + // Пишем Font Matrix (если она не была уже в DA-string) if (nTmPos < 0) { m_seAppBuffer->AppendFormat("1 0 0 1 {0:.2f} {1:.2f} Tm\n", dX, dY); } - // + // Пишем текст m_seAppBuffer->Append('('); for (i = 0; i < seText->GetLength(); ++i) { @@ -1264,14 +1264,14 @@ namespace PdfReader } } - // Field. + // Рисуем текст или название для Field. void Annot::DrawListBox(StringExt **ppText, bool *pSelection, int nOptionsCount, int nTopIndex, StringExt *seDA, GrFontDict *pFontDict, int nQuadding) { CList *pListDA; StringExt *seToken; int i, j; - // Default appearance string + // Парсим Default appearance string int nTfPos = -1, nTmPos = -1; if (seDA) { @@ -1307,7 +1307,7 @@ namespace PdfReader pListDA = NULL; } - // + // Считываем шрифт и размер шрифта GrFont *pFont = NULL; double dFontSize = 0; if (nTfPos >= 0) @@ -1335,7 +1335,7 @@ namespace PdfReader // Border width double dBorder = m_pBorderStyle->GetWidth(); - // , + // Вычислим размер фонта, если он не был задан double dWidth = 0; if (0 == dFontSize) { @@ -1352,7 +1352,7 @@ namespace PdfReader } else { - // + // грубая оценка dWidth = ppText[i]->GetLength() * 0.5; } if (dWidth > dMaxW) @@ -1377,7 +1377,7 @@ namespace PdfReader } } - // + // Рисуем текст double dY = m_dMaxY - m_dMinY - 1.1 * dFontSize; for (i = nTopIndex; i < nOptionsCount; ++i) @@ -1393,7 +1393,7 @@ namespace PdfReader m_seAppBuffer->Append("BT\n"); - // + // Вычислим ширину строки if (pFont && !pFont->IsCIDFont()) { dWidth = 0; @@ -1404,11 +1404,11 @@ namespace PdfReader } else { - // + // грубая оценка dWidth = ppText[i]->GetLength() * 0.5; } - // + // Вычислим начальную позицию текста double dX = 0; dWidth *= dFontSize; switch (nQuadding) @@ -1445,7 +1445,7 @@ namespace PdfReader } } - // Font Matrix ( DA-string) + // Пишем Font Matrix (если он не был частью DA-string) if (nTmPos < 0) { m_seAppBuffer->AppendFormat("1 0 0 1 {0:.2f} {1:.2f} Tm\n", dX, dY); @@ -1456,7 +1456,7 @@ namespace PdfReader m_seAppBuffer->Append("1 g\n"); } - // + // Пишем текст m_seAppBuffer->Append('('); for (j = 0; j < ppText[i]->GetLength(); ++j) { @@ -1480,7 +1480,7 @@ namespace PdfReader m_seAppBuffer->Append("ET\n"); m_seAppBuffer->Append("Q\n"); - // + // Следующая строка dY -= 1.1 * dFontSize; } @@ -1509,7 +1509,7 @@ namespace PdfReader } else { - // + // грубая оценка dTempWidth = 0.5 * dFontSize; } dWidth += dTempWidth; @@ -1525,13 +1525,13 @@ namespace PdfReader if (j == nStart) { - // , + // Обрабатываем странный случай, когда первый символ слишком широкий для первой строки j = nStart + 1; } } *pEnd = j; - // + // Вычисляем ширину dWidth = 0; for (k = nStart; k < j; ++k) { @@ -1563,12 +1563,12 @@ namespace PdfReader } - // + // Расстояние от центра до контрольных точек кривой Безье // = (4 * (sqrt(2) - 1) / 3) * r #define Kappa 0.55228475 - // . (dX, dY) - , dRad - . - // bFill - ? + // Рисуем окружность с помощью кривых Безье. (dX, dY) - центр, dRad - радиус. + // bFill - будем заливать или обводить? void Annot::DrawCircle(double dX, double dY, double dRad, bool bFill) { m_seAppBuffer->AppendFormat("{0:.2f} {1:.2f} m\n", dX + dRad, dY); @@ -1579,7 +1579,7 @@ namespace PdfReader m_seAppBuffer->Append(bFill ? "f\n" : "s\n"); } - // ( ) . (dX, dY) - , dRad - . + // Рисуем половину окружности (левую верхнюю) с помощью кривых Безье. (dX, dY) - центр, dRad - радиус. void Annot::DrawCircleTopLeft(double dX, double dY, double dRad) { double dRad2 = dRad / sqrt(2.0); @@ -1589,7 +1589,7 @@ namespace PdfReader m_seAppBuffer->Append("S\n"); } - // ( ) . (dX, dY) - , dRad - . + // Рисуем половину окружности (правую нижнюю) с помощью кривых Безье. (dX, dY) - центр, dRad - радиус. void Annot::DrawCircleBottomRight(double dX, double dY, double dRad) { double dRad2 = dRad / sqrt(2.0); diff --git a/PdfReader/Src/Annot.h b/PdfReader/Src/Annot.h index c38ff690ed..90f5e2de5f 100644 --- a/PdfReader/Src/Annot.h +++ b/PdfReader/Src/Annot.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_ANNOT_H +#ifndef _PDF_READER_ANNOT_H #define _PDF_READER_ANNOT_H namespace PdfReader @@ -50,12 +50,12 @@ namespace PdfReader private: - AnnotBorderType m_eType; // - double m_dWidth; // - double *m_pDash; // , - int m_nDashLength; // m_pDash + AnnotBorderType m_eType; // Тип + double m_dWidth; // Ширина рамки + double *m_pDash; // Если линия пунктирная, тогда определяем длину штриха + int m_nDashLength; // Количество элементов в массиве m_pDash double m_dR; // - double m_dG; // + double m_dG; // Цвет double m_dB; // }; @@ -105,14 +105,14 @@ namespace PdfReader private: - XRef *m_pXref; // XRef PDF- - Ref m_oRef; // , Annotation - StringExt *m_seType; // Annotation - Object m_oAppearance; // Form XObject- + XRef *m_pXref; // Таблица XRef для данного PDF-документа + Ref m_oRef; // Ссылка на объект, определяющий данной Annotation + StringExt *m_seType; // Тип Annotation + Object m_oAppearance; // Ссылка на Form XObject-поток StringExt *m_seAppBuffer; double m_dMinX; // - double m_dMinY; // , Annotation + double m_dMinY; // Прямоугольник, ограничивающий данную Annotation double m_dMaxX; // double m_dMaxY; // @@ -154,8 +154,8 @@ namespace PdfReader Annot *FindAnnot(Ref *pRef); private: - Annot **m_ppAnnots; // Annotations - int m_nAnnotsCount; // + Annot **m_ppAnnots; // Список Annotations + int m_nAnnotsCount; // Количество элементов GlobalParams *m_pGlobalParams; }; diff --git a/PdfReader/Src/Array.cpp b/PdfReader/Src/Array.cpp index c450dec5db..46b33d8feb 100644 --- a/PdfReader/Src/Array.cpp +++ b/PdfReader/Src/Array.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "Object.h" diff --git a/PdfReader/Src/Array.h b/PdfReader/Src/Array.h index d3bd3c997b..d037359500 100644 --- a/PdfReader/Src/Array.h +++ b/PdfReader/Src/Array.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_ARRAY_H +#ifndef _PDF_READER_ARRAY_H #define _PDF_READER_ARRAY_H #include "Object.h" @@ -43,12 +43,12 @@ namespace PdfReader private: - XRef *m_pXRef; // Xref PDF - Object *m_arrItems; // - int m_nItemSize; // - int m_nCount; // + XRef *m_pXRef; // Таблица Xref для данного PDF документа + Object *m_arrItems; // Массив элементов + int m_nItemSize; // Размер элемента + int m_nCount; // Чилсо элементов в массиве - int m_nRef; // + int m_nRef; // Счетчик ссылок }; } diff --git a/PdfReader/Src/BuiltinFont.h b/PdfReader/Src/BuiltinFont.h index 65eef161f1..d36e49d1e1 100644 --- a/PdfReader/Src/BuiltinFont.h +++ b/PdfReader/Src/BuiltinFont.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_BUILT_INFONT_H +#ifndef _PDF_READER_BUILT_INFONT_H #define _PDF_READER_BUILT_INFONT_H namespace PdfReader diff --git a/PdfReader/Src/BuiltinFontTables.h b/PdfReader/Src/BuiltinFontTables.h index dc778f262a..e936beabed 100644 --- a/PdfReader/Src/BuiltinFontTables.h +++ b/PdfReader/Src/BuiltinFontTables.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_BUILTIN_FONT_TABLES_H +#ifndef _PDF_READER_BUILTIN_FONT_TABLES_H #define _PDF_READER_BUILTIN_FONT_TABLES_H #include "BuiltinFont.h" diff --git a/PdfReader/Src/CCITT-Tables.h b/PdfReader/Src/CCITT-Tables.h index 6d6b6332f8..3ba32ca311 100644 --- a/PdfReader/Src/CCITT-Tables.h +++ b/PdfReader/Src/CCITT-Tables.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_CCIT_TABLES_H +#ifndef _PDF_READER_CCIT_TABLES_H #define _PDF_READER_CCIT_TABLES_H namespace PdfReader @@ -12,7 +12,7 @@ namespace PdfReader #define ccittEOL -2 //------------------------------------------------------------------------ - // 2D + // 2D коды //------------------------------------------------------------------------ #define Pass_2D 0 @@ -25,7 +25,7 @@ namespace PdfReader #define VertR3_2D 7 #define VertL3_2D 8 - // 1-7 + // коды 1-7 бит static CCITTCode c_arrTable2D[128] = { { -1, -1 }, { -1, -1 }, // 000000x @@ -104,7 +104,7 @@ namespace PdfReader // White run lengths //------------------------------------------------------------------------ - // 11-12 ( 7 0) + // коды 11-12 бит (верхние 7 бит установлены в 0) static CCITTCode c_arrWhiteTable1[32] = { { -1, -1 }, // 00000 @@ -128,7 +128,7 @@ namespace PdfReader { 12, 2560 } // 11111 }; - // 1-9 + // коды 1-9 бит static CCITTCode c_arrWhiteTable2[512] = { { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 0000000xx @@ -324,7 +324,7 @@ namespace PdfReader // Black run lengths //------------------------------------------------------------------------ - // 10-13 ( 6 0) + // коды 10-13 бит (верхние 6 бит установлены в 0) static CCITTCode c_arrBlackTable1[128] = { { -1, -1 }, { -1, -1 }, // 000000000000x @@ -389,7 +389,7 @@ namespace PdfReader { 10, 64 }, { 10, 64 }, { 10, 64 }, { 10, 64 } }; - // 7-12 ( 4 0) + // коды 7-12 быит (верхние 4 бита установлены в 0) static CCITTCode c_arrBlackTable2[192] = { { 8, 13 }, { 8, 13 }, { 8, 13 }, { 8, 13 }, // 00000100xxxx @@ -477,7 +477,7 @@ namespace PdfReader { 7, 12 }, { 7, 12 }, { 7, 12 }, { 7, 12 } }; - // 2-6 + // коды 2-6 бит static CCITTCode c_arrBlackTable3[64] = { { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, // 0000xx diff --git a/PdfReader/Src/CMap.cpp b/PdfReader/Src/CMap.cpp index ce1137843f..02986ca418 100644 --- a/PdfReader/Src/CMap.cpp +++ b/PdfReader/Src/CMap.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -45,7 +45,7 @@ namespace PdfReader { if (pGlobalParams && !(pFile = pGlobalParams->FindCMapFile(seCollection, seCMapName))) { - // Identity CMap. + // Проверяем на Identity CMap. if (!seCMapName->Compare("Identity") || !seCMapName->Compare("Identity-H")) { return new CMap(pGlobalParams, seCollection->Copy(), seCMapName->Copy(), 0); diff --git a/PdfReader/Src/CMap.h b/PdfReader/Src/CMap.h index 95662c51e4..74c43bc629 100644 --- a/PdfReader/Src/CMap.h +++ b/PdfReader/Src/CMap.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_CMAP_H +#ifndef _PDF_READER_CMAP_H #define _PDF_READER_CMAP_H #include "CharTypes.h" @@ -19,27 +19,27 @@ namespace PdfReader { public: - // CMap . - // 1. + // Создаем карту CMap определенную по и . + // Устанавливаем счетчик ссылок на 1. static CMap *Parse(CMapCache *pCache, StringExt *seCollection, StringExt *seCMapName, GlobalParams *pGlobalParams, wchar_t *wsFilePath = NULL); ~CMap(); - // + // Считаем ссылки void AddRef(); void Release(); - // : registry-ordering. + // Название коллекции возвращаем в следующем формате: registry-ordering. StringExt *GetCollection() { return m_seCollection; } - // true, CMap . + // Возвращаем true, если параметры CMap совпадают с заданными и . bool Match(StringExt *seCollection, StringExt *seCMapName); - // CID , , - // . + // Возвращаем CID соответствующий коду символа, который начинается в , + // и содержит байт. CID GetCID(char *sChar, int nLen, int *pnUsed); // Writing mode (0 = horizontal, 1 = vertical). @@ -66,7 +66,7 @@ namespace PdfReader StringExt *m_seCMapName; // int m_nWMode; // writing mode (0=horizontal, 1=vertical) CMapVectorEntry *m_pVector; // vector for first byte (NULL for identity CMap) - int m_nRef; // + int m_nRef; // Счетчик ссылок GlobalParams *m_pGlobalParams; diff --git a/PdfReader/Src/Catalog.cpp b/PdfReader/Src/Catalog.cpp index d8e508c765..78434634ad 100644 --- a/PdfReader/Src/Catalog.cpp +++ b/PdfReader/Src/Catalog.cpp @@ -1,4 +1,4 @@ -#include +#include #include "MemoryUtils.h" #include "Object.h" #include "XRef.h" @@ -39,7 +39,7 @@ namespace PdfReader return; } - // Pages + // Считываем Pages Object oPagesDict; oCatalogDict.DictLookup("Pages", &oPagesDict); @@ -55,10 +55,10 @@ namespace PdfReader return; } - // + // Считываем количество страниц Object oTemp; oPagesDict.DictLookup("Count", &oTemp); - if (!oTemp.IsNum()) // - ( IsNum, IsInt) + if (!oTemp.IsNum()) // почему-то иногда количество страниц пишется как вещественное число(поэтому IsNum, а не IsInt) { // TO DO: Error "Page count in top-level pages object is wrong type" oTemp.Free(); @@ -75,7 +75,7 @@ namespace PdfReader m_nPagesSize = nPagesCount = (int)oTemp.GetNum(); oTemp.Free(); - // + // выделяем место под соответствующее количество страниц m_ppPages = (Page**)MemUtilsMallocArray(m_nPagesSize, sizeof(Page*)); m_pPageRefs = (Ref*)MemUtilsMallocArray(m_nPagesSize, sizeof(Ref)); @@ -105,7 +105,7 @@ namespace PdfReader } oPagesDict.Free(); - // Named destination + // Считываем Named destination oCatalogDict.DictLookup("Dests", &m_oDests); if (oCatalogDict.DictLookup("Names", &oTemp)->IsDict()) @@ -187,7 +187,7 @@ namespace PdfReader m_oMetadata.StreamReset(); int nChar = 0; - // TO DO: xml , + // TO DO: Вообще здесь выводится вся xml как она есть, надо бы ее более детально разобрать while ((nChar = m_oMetadata.StreamGetChar()) != EOF) { seResult->Append(nChar); @@ -244,7 +244,7 @@ namespace PdfReader if (nStart >= m_nPagesSize) { m_nPagesSize += 32; - // + // выделяем дополнительную память m_ppPages = (Page**)MemUtilsReallocArray(m_ppPages, m_nPagesSize, sizeof(Page *)); m_pPageRefs = (Ref*)MemUtilsReallocArray(m_pPageRefs, m_nPagesSize, sizeof(Ref)); @@ -263,7 +263,7 @@ namespace PdfReader } ++nStart; } - else if (oKid.IsDict()) // - /Type + else if (oKid.IsDict()) // иногда почему-то пропускают ключ /Type { if ((nStart = ReadPageTree(oKid.GetDict(), pPageAttrs, nStart, sAlreadyRead)) < 0) { diff --git a/PdfReader/Src/Catalog.h b/PdfReader/Src/Catalog.h index 2495fa8dc5..7934de8bad 100644 --- a/PdfReader/Src/Catalog.h +++ b/PdfReader/Src/Catalog.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_CATALOG_H +#ifndef _PDF_READER_CATALOG_H #define _PDF_READER_CATALOG_H #include "GlobalParams.h" @@ -56,10 +56,10 @@ namespace PdfReader return &m_oStructTreeRoot; } - // , . + // Ищем номер страницы в списке, по ее объектным номерам. int FindPage(int nNum, int nGen); - // Named destination. + // Ищем Named destination. LinkDestination *FindDest(StringExt *seName); Object *GetDests() @@ -89,20 +89,20 @@ namespace PdfReader private: - XRef *m_pXref; // xref PDF - Page **m_ppPages; // - Ref *m_pPageRefs; // - int m_nPagesCount; // - int m_nPagesSize; // ( ) + XRef *m_pXref; // Таблица xref для данного PDF файла + Page **m_ppPages; // Массив страниц + Ref *m_pPageRefs; // Объектные номера всех страниц + int m_nPagesCount; // Число страниц + int m_nPagesSize; // Размер массива страниц(в байтах) Object m_oDests; // Destination dictionary Object m_oNameTree; // Name tree - StringExt *m_seBaseURI; // URI + StringExt *m_seBaseURI; // Для ссылок URI Object m_oMetadata; // Metadata - Object m_oStructTreeRoot; // + Object m_oStructTreeRoot; // Структура страниц Object m_oOutline; // Outline Object m_oAcroForm; // AcroForm - bool m_bValid; // True, atalog - + bool m_bValid; // True, если Сatalog - корретный GlobalParams *m_pGlobalParams; }; diff --git a/PdfReader/Src/CharCodeToUnicode.cpp b/PdfReader/Src/CharCodeToUnicode.cpp index 350307c717..934c566eb2 100644 --- a/PdfReader/Src/CharCodeToUnicode.cpp +++ b/PdfReader/Src/CharCodeToUnicode.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "File.h" diff --git a/PdfReader/Src/CharCodeToUnicode.h b/PdfReader/Src/CharCodeToUnicode.h index 1e0ff8115b..26647fe686 100644 --- a/PdfReader/Src/CharCodeToUnicode.h +++ b/PdfReader/Src/CharCodeToUnicode.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_CHARCODE_TO_UNICODE_H +#ifndef _PDF_READER_CHARCODE_TO_UNICODE_H #define _PDF_READER_CHARCODE_TO_UNICODE_H #include "CharTypes.h" @@ -27,11 +27,11 @@ namespace PdfReader ~CharCodeToUnicode(); - // + // —читаем ссылки void AddRef(); void Release(); - // + // —равниваем по данному тэгу bool Match(StringExt *seTag); void SetMapping(CharCode nCode, Unicode *pUnicode, int nLen); diff --git a/PdfReader/Src/CharTypes.h b/PdfReader/Src/CharTypes.h index 268075b55b..51a90b8a7a 100644 --- a/PdfReader/Src/CharTypes.h +++ b/PdfReader/Src/CharTypes.h @@ -1,17 +1,17 @@ -#ifndef _PDF_READER_CHARTYPES_H +#ifndef _PDF_READER_CHARTYPES_H #define _PDF_READER_CHARTYPES_H namespace PdfReader { - // Unicode-. + // Unicode-символы. typedef unsigned int Unicode; - // CID. + // ƒл¤ элементов CID. typedef unsigned int CID; - // , : - // - 8- - // - 16- CID + // ќбщий тип, рассчитан наодин из следюущих вариантов: + // - 8-битные символы + // - 16-битный CID // - Unicode typedef unsigned int CharCode; } diff --git a/PdfReader/Src/Constants.h b/PdfReader/Src/Constants.h index e3a2e5666d..fe4a7ed226 100644 --- a/PdfReader/Src/Constants.h +++ b/PdfReader/Src/Constants.h @@ -1,11 +1,11 @@ -#ifndef _PDF_READER_CONSTANTS_H +#ifndef _PDF_READER_CONSTANTS_H #define _PDF_READER_CONSTANTS_H namespace PdfReader { //------------------------------------------------------------------------------------------------------------------------------- - // PDF + // Поддерживаемая версия PDF файла #define SupportedPDFVersionStr "1.7" #define SupportedPDFVersionNum 1.7 @@ -13,7 +13,7 @@ namespace PdfReader // Paper size //------------------------------------------------------------------------------------------------------------------------------- - // ( (72dpi)) + // Стандартные размеры страницы (в пикселях (72dpi)) #ifndef A4_PAPER #define DefaultPaperWidth 595 // ISO A4 (210x297 mm) #define DefaultPaperHeight 842 diff --git a/PdfReader/Src/Decrypt.cpp b/PdfReader/Src/Decrypt.cpp index 202a613c6b..2e67a55f75 100644 --- a/PdfReader/Src/Decrypt.cpp +++ b/PdfReader/Src/Decrypt.cpp @@ -1,4 +1,4 @@ -#include +#include #include "MemoryUtils.h" #include "Decrypt.h" @@ -25,7 +25,7 @@ namespace PdfReader bool Decrypt::MakeFileKey(int nEncVersion, int nEncRevision, int nKeyLength, StringExt *seOwnerKey, StringExt *seUserKey, int nPermissions, StringExt *seFileID, StringExt *seOwnerPassword, StringExt *seUserPassword, unsigned char *sFileKey, bool bEncryptMetadata, bool *pbOwnerPasswordValid) { - // , , + // Попытаемся, используя пароль владельца, сгенерировать пользовательский пароль *pbOwnerPasswordValid = false; if (seOwnerPassword) { @@ -89,7 +89,7 @@ namespace PdfReader delete seUserPassword2; } - // + // Попытаемся использовать пользовательский пароль return MakeFileKey2(nEncVersion, nEncRevision, nKeyLength, seOwnerKey, seUserKey, nPermissions, seFileID, seUserPassword, sFileKey, bEncryptMetadata); } @@ -430,7 +430,7 @@ namespace PdfReader static unsigned int c_arrRCon[11] = { - 0x00000000, // + 0x00000000, // не используется 0x01000000, 0x02000000, 0x04000000, @@ -567,7 +567,7 @@ namespace PdfReader static void AESKeyExpansion(DecryptAESState *pState, unsigned char *sObjectKey, int nObjectKeyLen) { - //, nObjectKeyLen == 16 + //Предполагается, что nObjectKeyLen == 16 for (int nIndex = 0; nIndex < 4; ++nIndex) { @@ -590,7 +590,7 @@ namespace PdfReader static void AESDecryptBlock(DecryptAESState *pState, unsigned char *sIn, bool bLast) { - // + // Начальное состояние for (int nChar = 0; nChar < 4; ++nChar) { pState->sState[nChar + 0] = sIn[4 * nChar + 0]; @@ -625,7 +625,7 @@ namespace PdfReader pState->sBuffer[4 * nChar + 3] = pState->sState[nChar + 12] ^ pState->sCBC[4 * nChar + 3]; } - // CBC + // сохраняем блок с следующий CBC for (int nIndex = 0; nIndex < 16; ++nIndex) { pState->sCBC[nIndex] = sIn[nIndex]; @@ -680,11 +680,11 @@ namespace PdfReader unsigned long a, b, c, d, aa, bb, cc, dd; int i, j, k; - // 64x64 + // Вычислим количество блоков 64x64 // ( nMessageLen + pad byte (0x80) + 8 bytes for length ) int nBlocksCount = (nMessageLen + 1 + 8 + 63) / 64; - // a, b, c, d + // Инициализируем a, b, c, d a = 0x67452301; b = 0xefcdab89; c = 0x98badcfe; @@ -693,7 +693,7 @@ namespace PdfReader k = 0; for (i = 0; i < nBlocksCount; ++i) { - // + // Считываем один блок for (j = 0; j < 16 && k < nMessageLen - 3; ++j, k += 4) x[j] = (((((sMessage[k + 3] << 8) + sMessage[k + 2]) << 8) + sMessage[k + 1]) << 8) + sMessage[k]; if (i == nBlocksCount - 1) @@ -712,7 +712,7 @@ namespace PdfReader x[14] = nMessageLen << 3; } - // a, b, c, d + // Сохраняем a, b, c, d aa = a; bb = b; cc = c; @@ -790,14 +790,14 @@ namespace PdfReader c = MD5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb); b = MD5Round4(b, c, d, a, x[9], 21, 0xeb86d391); - // a, b, c, d + // Увеличиваем a, b, c, d a += aa; b += bb; c += cc; d += dd; } - // sDigest + // Разбиваем sDigest на байты sDigest[0] = (unsigned char)(a & 0xff); sDigest[1] = (unsigned char)((a >>= 8) & 0xff); sDigest[2] = (unsigned char)((a >>= 8) & 0xff); diff --git a/PdfReader/Src/Decrypt.h b/PdfReader/Src/Decrypt.h index 2db06f7995..0ee64ae3fd 100644 --- a/PdfReader/Src/Decrypt.h +++ b/PdfReader/Src/Decrypt.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_DECRYPT_H +#ifndef _PDF_READER_DECRYPT_H #define _PDF_READER_DECRYPT_H #include "StringExt.h" @@ -15,9 +15,9 @@ namespace PdfReader { public: - // FileKey. 16 . - // true, - . = true, . - // - NULL, . + // Строим FileKey. Параметр должен иметь место как минимум под 16 байт. Проверяем и + // и возвращаем true, если какой-нибудь корректен. Пишем = true, если был правильный. + // Один какой-нибудь или оба пароля могут быть NULL, что мы будем понимать как пустую строку. static bool MakeFileKey(int nEncVersion, int nEncRevision, int nKeyLength, StringExt *seOwnerKey, StringExt *seUserKey, int nPermissions, StringExt *seFileID, StringExt *seOwnerPassword, StringExt *seUserPassword, unsigned char *sFileKey, bool bEncryptMetadata, bool *pbOwnerPasswordValid); private: diff --git a/PdfReader/Src/Dict.cpp b/PdfReader/Src/Dict.cpp index f1e0d8d228..a25fbd0d60 100644 --- a/PdfReader/Src/Dict.cpp +++ b/PdfReader/Src/Dict.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "Object.h" diff --git a/PdfReader/Src/Dict.h b/PdfReader/Src/Dict.h index fc4195eb5a..6efc8843f2 100644 --- a/PdfReader/Src/Dict.h +++ b/PdfReader/Src/Dict.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_DICT_H +#ifndef _PDF_READER_DICT_H #define _PDF_READER_DICT_H #include "Object.h" @@ -22,7 +22,7 @@ namespace PdfReader ~Dict(); - // . + // Счетчик ссылок. int AddRef() { return ++m_nRef; @@ -38,15 +38,15 @@ namespace PdfReader return m_nEntriesCount; } - // . . + // Добавляем элемент в словарь. При этом имя не копируется. void AddItem(char *sKey, Object *pValue); - // sType. + // Проверяем тип обэекта по имени sType. bool CheckType(char *sType); - // . . + // Ищем элемент словаря. Возвращается указатель на объект. Object *Search(char *sKey, Object *pObject); - // . . + // Ищем элемент словаря. Возвращается копия объекта. Object *SearchAndCopy(char *sKey, Object *pObject); @@ -54,9 +54,9 @@ namespace PdfReader Object *GetValue(int nIndex, Object *pObj); Object *GetValueCopy(int nIndex, Object *pObj); - // Xref. - // : Trailer Xref, - // . + // Устанавливаем указатель на таблицу Xref. Данная функция используется + // только в одном случае: словарь Trailer читается до таблицы Xref, поэтому + // для данного словаря этот указатель нужно устанавливать. void SetXRef(XRef *pXref) { m_pXref = pXref; @@ -68,12 +68,12 @@ namespace PdfReader private: - XRef *m_pXref; // Xref PDF - DictEntry *m_arrEntries; // - int m_nEntriesSize; // - int m_nEntriesCount; // + XRef *m_pXref; // таблица Xref текущего PDF файла + DictEntry *m_arrEntries; // Соержимое словаря + int m_nEntriesSize; // размер элемента в словаре + int m_nEntriesCount; // количество элементов в словаре - int m_nRef; // + int m_nRef; // Счетчик ссылок }; } diff --git a/PdfReader/Src/EncodingTables.h b/PdfReader/Src/EncodingTables.h index cb234419cc..cbdd6abe3b 100644 --- a/PdfReader/Src/EncodingTables.h +++ b/PdfReader/Src/EncodingTables.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_ENCODING_TABLES_H +#ifndef _PDF_READER_ENCODING_TABLES_H #define _PDF_READER_ENCODING_TABLES_H namespace PdfReader diff --git a/PdfReader/Src/ErrorConstants.h b/PdfReader/Src/ErrorConstants.h index 587c41a1b4..e127f69c9b 100644 --- a/PdfReader/Src/ErrorConstants.h +++ b/PdfReader/Src/ErrorConstants.h @@ -1,21 +1,21 @@ -#ifndef _PDF_READER_ERROR_CONSTANTS_H +#ifndef _PDF_READER_ERROR_CONSTANTS_H #define _PDF_READER_ERROR_CONSTANTS_H namespace PdfReader { typedef enum { - errorNone = 0, // - errorOpenFile = 1, // PDF + errorNone = 0, // Нет ошибок + errorOpenFile = 1, // Ошибка при открытии PDF файла errorBadCatalog = 2, // couldn't read the page catalog - errorDamaged = 3, // PDF - errorEncrypted = 4, // , + errorDamaged = 3, // PDF файл был поврежден и его невозможно восстановить + errorEncrypted = 4, // Файл зашифрован, авторизация не пройдена errorHighlightFile = 5, // nonexistent or invalid highlight file - errorBadPrinter = 6, // - errorPrinting = 7, // - errorPermission = 8, // - errorBadPageNum = 9, // - errorFileIO = 10 // / + errorBadPrinter = 6, // плохой принтер + errorPrinting = 7, // ошибка во время печати + errorPermission = 8, // Ошибка связанная с ограничениями наложенными на файл + errorBadPageNum = 9, // Неверное количество страниц + errorFileIO = 10 // Ошибка при чтении/записи } EError; } diff --git a/PdfReader/Src/ExtractImageOutputDev.cpp b/PdfReader/Src/ExtractImageOutputDev.cpp index ad38a34e97..736cc7a84e 100644 --- a/PdfReader/Src/ExtractImageOutputDev.cpp +++ b/PdfReader/Src/ExtractImageOutputDev.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -113,7 +113,7 @@ namespace PdfReader pStream = ((DCTStream *)pStream)->GetRawStream(); pStream->Reset(); - // + // Копируем поток в файл int nChar = 0; while ((nChar = pStream->GetChar()) != EOF) fputc(nChar, pFile); @@ -190,7 +190,7 @@ namespace PdfReader pStream->Reset(); - // + // Копируем поток в файл int nSize = nHeight * ((nWidth + 7) / 8); unsigned char *pBuffer = new unsigned char[nSize]; @@ -248,7 +248,7 @@ namespace PdfReader pStream = ((DCTStream *)pStream)->GetRawStream(); pStream->Reset(); - // + // Копируем поток в файл int nChar = 0; while ((nChar = pStream->GetChar()) != EOF) fputc(nChar, pFile); @@ -323,7 +323,7 @@ namespace PdfReader pStream->Reset(); - // + // Копируем поток в файл int nSize = nHeight * ((nWidth + 7) / 8); unsigned char *pBuffer = new unsigned char[nSize]; diff --git a/PdfReader/Src/ExtractImageOutputDev.h b/PdfReader/Src/ExtractImageOutputDev.h index 44c0edf41b..92c65ad969 100644 --- a/PdfReader/Src/ExtractImageOutputDev.h +++ b/PdfReader/Src/ExtractImageOutputDev.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_EXTRACT_IMAGE_OUTPUTDEV_H +#ifndef _PDF_READER_EXTRACT_IMAGE_OUTPUTDEV_H #define _PDF_READER_EXTRACT_IMAGE_OUTPUTDEV_H #include @@ -36,7 +36,7 @@ namespace PdfReader } - // . + // Информация об устройстве. virtual bool UpSideDown() { return false; @@ -52,7 +52,7 @@ namespace PdfReader // - int ExtractImageOutputDev::GetImagesCount() + int GetImagesCount() { return m_nImageCount; } @@ -62,8 +62,8 @@ namespace PdfReader char *m_sFilePrefix; // char *m_sFileName; // bool m_bDumpJPEG; // - int m_nImageCount; // - bool m_bCountImages; // + int m_nImageCount; // Текущее количество изображений + bool m_bCountImages; // Считаем картинки bool m_bValid; }; diff --git a/PdfReader/Src/File.h b/PdfReader/Src/File.h index eb2ed2ec6b..0c2b6d6cc3 100644 --- a/PdfReader/Src/File.h +++ b/PdfReader/Src/File.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FILE_H +#ifndef _PDF_READER_FILE_H #define _PDF_READER_FILE_H #include @@ -13,7 +13,7 @@ namespace PdfReader { static void SpitPathExt(std::wstring& wsFullPath, std::wstring* pwsFilePath, std::wstring* pwsExt) { - // '.' , + // »щем '.' начина¤ с конца пути, и раздел¤ем путь на расширение и остальную часть unsigned int nPos = wsFullPath.find_last_of(L"."); *pwsFilePath = wsFullPath.substr(0, nPos); *pwsExt = wsFullPath.substr(nPos + 1); diff --git a/PdfReader/Src/FontFileBase.cpp b/PdfReader/Src/FontFileBase.cpp index 5a884ac688..4c87d4de42 100644 --- a/PdfReader/Src/FontFileBase.cpp +++ b/PdfReader/Src/FontFileBase.cpp @@ -1,4 +1,4 @@ -#include +#include #include "MemoryUtils.h" #include "FontFileBase.h" #include "../../DesktopEditor/common/File.h" diff --git a/PdfReader/Src/FontFileBase.h b/PdfReader/Src/FontFileBase.h index b875c4608c..19360f2429 100644 --- a/PdfReader/Src/FontFileBase.h +++ b/PdfReader/Src/FontFileBase.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FONT_FILE_BASE_H +#ifndef _PDF_READER_FONT_FILE_BASE_H #define _PDF_READER_FONT_FILE_BASE_H namespace PdfReader diff --git a/PdfReader/Src/FontFileEncodings.h b/PdfReader/Src/FontFileEncodings.h index fae9b50be0..f3274ddabb 100644 --- a/PdfReader/Src/FontFileEncodings.h +++ b/PdfReader/Src/FontFileEncodings.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FONT_FILE_ENCODINGS_H +#ifndef _PDF_READER_FONT_FILE_ENCODINGS_H #define _PDF_READER_FONT_FILE_ENCODINGS_H namespace PdfReader diff --git a/PdfReader/Src/FontFileTrueType.cpp b/PdfReader/Src/FontFileTrueType.cpp index 3643a165bc..86b3c03088 100644 --- a/PdfReader/Src/FontFileTrueType.cpp +++ b/PdfReader/Src/FontFileTrueType.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "StringExt.h" @@ -9,16 +9,16 @@ namespace PdfReader { // - // + // Терминология // ----------- // - // character code = , + // character code = номер, используемый как элемент текстовой строки // - // character name = glyph name = + // character name = glyph name = имя определенного символа фонта // - // glyph index = GID = ( - // ), - // + // glyph index = GID = позиция (в предела некоторой внутренней таблицы + // в фонте), где приведены инструкции как рисовать + // данный символ // // Type 1 fonts // ------------ @@ -135,8 +135,8 @@ namespace PdfReader struct T42Table { - char *sTag; // 4- - bool bRequired; // TrueType? + char *sTag; // 4-байтовое название + bool bRequired; // Требуется ли по спецификации TrueType? }; // TrueType tables to be embedded in Type 42 fonts. @@ -164,8 +164,8 @@ namespace PdfReader //------------------------------------------------------------------------ - // , Apple - // TrueType . + // Названия символов в стандартном порядке, который использует Apple для + // своих TrueType фонтов. static char *c_arrAppleGlyphNames[258] = { ".notdef", "null", "CR", "space", @@ -446,7 +446,7 @@ namespace PdfReader if (m_bOpenTypeCFF) return; - // + // пишем заголовок bool bSuccess = true; seBuffer = StringExt::Format("%!PS-TrueTypeFont-{0:2g}\n", (double)GetS32BE(0, &bSuccess) / 65536.0); (*pOutputFunc)(pOutputStream, seBuffer->GetBuffer(), seBuffer->GetLength()); @@ -463,12 +463,12 @@ namespace PdfReader delete seBuffer; (*pOutputFunc)(pOutputStream, "/PaintType 0 def\n", 17); - // + // записываем содержимое библиотеки шрифта ConvertEncoding(ppEncoding, pOutputFunc, pOutputStream); ConvertCharStrings(ppEncoding, pCodeToGID, pOutputFunc, pOutputStream); ConvertSfnts(pOutputFunc, pOutputStream, NULL, false); - // + // закончили запись библиотеки (*pOutputFunc)(pOutputStream, "FontName currentdict end definefont pop\n", 40); } @@ -1423,7 +1423,7 @@ namespace PdfReader void CFontFileTrueType::ConvertEncoding(char **ppEncoding, FontFileOutputFunc pOutputFunc, void *pOutputStream) { - // Type42 + // конвертация кодировки в тип Type42 char *sName; StringExt *seBuffer; @@ -1470,9 +1470,9 @@ namespace PdfReader return; } - // glyph : - // 1. ppEncoding - // 2. pnCodeToGID glyph + // Ставим в соответствие названию символа glyph индекс: + // 1. Используем ppEncoding для отображения имени символа в его номер + // 2. Используем pnCodeToGID для отображения номера символа в glyph индекс int nGlyphIndex = 0; for (int nIndex = 255; nIndex >= 0; --nIndex) { @@ -1576,7 +1576,7 @@ namespace PdfReader } } - // 'loca' + // Создаем новую таблицу 'loca' pLocaData = (unsigned char *)MemUtilsMallocArray(m_nGlyphs + 1, (m_nLocaFormat ? 4 : 2)); for (int nIndex = 0; nIndex <= m_nGlyphs; ++nIndex) { @@ -1595,7 +1595,7 @@ namespace PdfReader } } - // + // считаем число таблиц nNewTables = 0; for (int nIndex = 0; nIndex < nT42Tables; ++nIndex) { @@ -1746,19 +1746,19 @@ namespace PdfReader nPos += 16; } - // checksum + // вычисляем checksum и сохраняем ее в заголовке таблицы nChecksum = ComputeTableChecksum(arrTableDir, 12 + nNewTables * 16); for (int nIndex = 0; nIndex < nNewTables; ++nIndex) { nChecksum += arrNewTables[nIndex].unChecksum; } - nChecksum = 0xb1b0afba - nChecksum; // TrueType + nChecksum = 0xb1b0afba - nChecksum; // по спецификации TrueType pHeadData[8] = (unsigned char)(nChecksum >> 24); pHeadData[9] = (unsigned char)(nChecksum >> 16); pHeadData[10] = (unsigned char)(nChecksum >> 8); pHeadData[11] = (unsigned char)nChecksum; - // sfnts + // начинаем писать массив sfnts if (seName) { (*pOutputFunc)(pOutputStream, "/", 1); @@ -1772,7 +1772,7 @@ namespace PdfReader DumpString(arrTableDir, 12 + nNewTables * 16, pOutputFunc, pOutputStream); - // + // пишем таблицы for (int nIndex = 0; nIndex < nNewTables; ++nIndex) { if (t42HeadTable == nIndex) @@ -1797,8 +1797,8 @@ namespace PdfReader } else { - // nLength == 0 , , - // + // nLength == 0 означает, что таблица не найдена, а ошибка уже была выдана + // во время конструирования таблицы if ((nLength = arrNewTables[nIndex].nLen) > 0) { if ((nJ = SeekTable(t42Tables[nIndex].sTag)) >= 0 && CheckRegion(m_pTables[nJ].nOffset, m_pTables[nJ].nLen)) @@ -1818,7 +1818,7 @@ namespace PdfReader } } - // sfnts + // закончили писать массив sfnts (*pOutputFunc)(pOutputStream, "] def\n", 6); MemUtilsFree(pLocaData); @@ -1856,7 +1856,7 @@ namespace PdfReader (*pOutputFunc)(pOutputStream, "00", 2); } } - // , Adobe Type 42 + // Добавляем дополнительный нулевой байт, по спецификации Adobe Type 42 (*pOutputFunc)(pOutputStream, "00>\n", 4); } @@ -1895,7 +1895,7 @@ namespace PdfReader m_bSuccess = true; - // (TTC) + // Проверяем является ли данный файл (TTC) unsigned int usTopTag = GetU32BE(0, &m_bSuccess); if (!m_bSuccess) return; @@ -1909,12 +1909,12 @@ namespace PdfReader 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); @@ -1939,14 +1939,14 @@ namespace PdfReader 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; @@ -1987,7 +1987,7 @@ namespace PdfReader if (!m_bSuccess) return; - // loca + // Проверяем корректность таблицы loca if (!m_bOpenTypeCFF) { nIndex = SeekTable("loca"); @@ -2014,7 +2014,7 @@ namespace PdfReader return; } - // post + // Читаем таблицу post ReadPostTable(); } diff --git a/PdfReader/Src/FontFileTrueType.h b/PdfReader/Src/FontFileTrueType.h index 4dfc00eba2..bc5a7dc6a8 100644 --- a/PdfReader/Src/FontFileTrueType.h +++ b/PdfReader/Src/FontFileTrueType.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FONT_FILE_TRUETYPE_H +#ifndef _PDF_READER_FONT_FILE_TRUETYPE_H #define _PDF_READER_FONT_FILE_TRUETYPE_H #include "FontFileBase.h" @@ -18,16 +18,16 @@ namespace PdfReader { public: - // TTF . + // Создаем объект TTF из буфера. static CFontFileTrueType *LoadFromBuffer(char *sBuffer, int lenA); - // TTF . + // Создаем объект TTF из файла. static CFontFileTrueType *LoadFromFile(wchar_t *wsFileName); virtual ~CFontFileTrueType(); - // true, OpenType CFF. - // false, TrueType ( OpenType TrueType). + // true, если данный OpenType фонт содержите данные формата CFF. + // false,если это TrueType фонт ( или OpenType фонт с данными в формате TrueType). bool IsOpenTypeCFF() { return m_bOpenTypeCFF; @@ -41,25 +41,25 @@ namespace PdfReader int FindCmap(int nPlatform, int nEncoding); - // GID, CMap. + // Возвращает GID, соответствующий символу в ной CMap. unsigned short MapCodeToGID(int nCMapIndex, int nChar); - // GID, post. 0, - // , post . + // Возвращает GID, соответствующий в таблице post. Возвращает 0, + // если символа с таким именем не нашли, или таблицы post нет. int MapNameToGID(char *sName); - // CIDs GIDs, - // CIDs *. CID ( OpenType CFF ) + // Возвращает карту CIDs в GIDs, и возваращет количество элементов + // CIDs в *. Только для CID фонтов( OpenType CFF ) unsigned short *GetCIDToGIDMap(int *pnCIDs); - // ( - // True Type): + // Лицензионные ограничения на включение фонта( в соответствие со + // спецификацией True Type): - // * 4: OS/2 - // * 3: - // * 2: - // * 1: - // * 0: + // * 4: таблицы OS/2 не найдена или некорректна + // * 3: разрешено устанавливать + // * 2: разрешено редактировать + // * 1: разрешено просматривать и печатать + // * 0: ограничено лицензией int GetEmbeddingRestrictions(); // Convert to a Type 42 font, suitable for embedding in a PostScript diff --git a/PdfReader/Src/FontFileType1.cpp b/PdfReader/Src/FontFileType1.cpp index 91eb0eeb05..8c5cacc75d 100644 --- a/PdfReader/Src/FontFileType1.cpp +++ b/PdfReader/Src/FontFileType1.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "FontFileEncodings.h" @@ -70,17 +70,17 @@ namespace PdfReader char sBuffer[512]; char *sLine, *sLine2, *sCurChar; - // /Encoding + // копируем все до строчки /Encoding for (sLine = (char *)m_sFile; sLine && strncmp(sLine, "/Encoding", 9); sLine = GetNextLine(sLine)); if (!sLine) { - // , + // не нашли кодировку, тогда копируем целиком фонт файл (*pOutputFunc)(pOutputStream, (char *)m_sFile, m_nLen); return; } (*pOutputFunc)(pOutputStream, (char *)m_sFile, sLine - (char *)m_sFile); - // + // пишем новую кодировку (*pOutputFunc)(pOutputStream, "/Encoding 256 array\n", 20); (*pOutputFunc)(pOutputStream, "0 1 255 {1 index exch /.notdef put} for\n", 40); for (int nIndex = 0; nIndex < 256; ++nIndex) @@ -111,7 +111,7 @@ namespace PdfReader } } - // /Encoding, + // У некоторых фонтов две записи /Encoding, поэтому проверяем наличие второй записи if (sLine) { int nIndex; @@ -138,7 +138,7 @@ namespace PdfReader } } - // + // копируем все после кодировки if (sLine) { (*pOutputFunc)(pOutputStream, sLine, ((char *)m_sFile + m_nLen) - sLine); diff --git a/PdfReader/Src/FontFileType1.h b/PdfReader/Src/FontFileType1.h index 955780ae13..74a6e5306d 100644 --- a/PdfReader/Src/FontFileType1.h +++ b/PdfReader/Src/FontFileType1.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FONT_FILE_TYPE1_H +#ifndef _PDF_READER_FONT_FILE_TYPE1_H #define _PDF_READER_FONT_FILE_TYPE1_H #include "FontFileBase.h" diff --git a/PdfReader/Src/FontFileType1C.cpp b/PdfReader/Src/FontFileType1C.cpp index f577e76c27..be4621c3ed 100644 --- a/PdfReader/Src/FontFileType1C.cpp +++ b/PdfReader/Src/FontFileType1C.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include "MemoryUtils.h" @@ -146,8 +146,8 @@ namespace PdfReader (*pOutputFunc)(pOutputStream, sBuf, strlen(sBuf)); } (*pOutputFunc)(pOutputStream, "\n", 1); - // 12 : 9 + - // Private CharStrings ( eexec ) FID. + // Для словаря нужно место для 12 полей: следующие 9 + + // Private и CharStrings (в eexec секции) и FID. (*pOutputFunc)(pOutputStream, "12 dict begin\n", 14); (*pOutputFunc)(pOutputStream, "/FontInfo 10 dict dup begin\n", 28); if (m_oTopDict.nVersionSID != 0) @@ -241,7 +241,7 @@ namespace PdfReader delete seBuffer; } - // + // Запись кодировки (*pOutputFunc)(pOutputStream, "/Encoding ", 10); if (!ppNewEncoding && m_arrEncoding == c_arrsFontFileType1ExpertEncoding) { @@ -265,7 +265,7 @@ namespace PdfReader } (*pOutputFunc)(pOutputStream, "currentdict end\n", 16); - // (eexec) + // Бинарная секция (eexec) Type1CEexecBuf oEexecBuffer; (*pOutputFunc)(pOutputStream, "currentfile eexec\n", 18); oEexecBuffer.pOutputFunc = pOutputFunc; @@ -460,7 +460,7 @@ namespace PdfReader bool bSuccess = true; int nGID = 0, i, j, k; - // CID CID->GID + // Вычислим количество CID и построим отображение CID->GID int nCIDsCount = 0; for (i = 0; i < m_nGlyphsCount; ++i) { @@ -504,7 +504,7 @@ namespace PdfReader } charStringOffsets[nCIDsCount] = charStrings->GetLength(); - // nNeedBytes = , charstring offsets + // Вычислим nNeedBytes = количество байт, необходимых для charstring offsets int nNeedBytes = 0; i = (nCIDsCount + 1) * 5 + charStrings->GetLength(); if (i < 0x100) @@ -524,7 +524,7 @@ namespace PdfReader nNeedBytes = 4; } - // Font Dictionary + // Начинаем запись Font Dictionary (*pOutputFunc)(pOutputStream, "/CIDInit /ProcSet findresource begin\n", 37); (*pOutputFunc)(pOutputStream, "20 dict begin\n", 14); (*pOutputFunc)(pOutputStream, "/CIDFontName /", 14); @@ -828,7 +828,7 @@ namespace PdfReader int nCurFD = 0; - // CID CID->GID + // Вычислим количество CID и построим отображение CID->GID int nCIDsCount = 0; for (int nIndex = 0; nIndex < m_nGlyphsCount; ++nIndex) { @@ -847,10 +847,10 @@ namespace PdfReader arrCIDMap[m_pnCharset[nIndex]] = nIndex; } - // Type 1 + // Запись Type 1 фонта for (i = 0; i < nCIDsCount; i += 256) { - // CID = 0, .. ".notdef" + // Игнорируем CID = 0, т.е. ".notdef" nCurFD = 0; for (j = ((i == 0) ? 1 : 0); j < 256 && i + j < nCIDsCount; ++j) { @@ -861,7 +861,7 @@ namespace PdfReader } } - // Font Dictionary ( ) + // Font Dictionary (незашифрованная часть) (*pOutputFunc)(pOutputStream, "16 dict begin\n", 14); (*pOutputFunc)(pOutputStream, "/FontName /", 11); (*pOutputFunc)(pOutputStream, sPSName, strlen(sPSName)); @@ -1366,10 +1366,10 @@ namespace PdfReader { // TO DO: error "Too few args to Type 2 callsubr" } - // + // не очищаем стек break; case 0x000b: // return - // + // не очищаем стек break; case 0x000e: // endchar / seac if (m_bFirstOperator) @@ -1403,7 +1403,7 @@ namespace PdfReader m_nOperatorsCount = 0; break; case 0x000f: // (obsolete) - // , + // Данная операция игнорируется, но нам нужна ширина символа if (m_bFirstOperator) { ConvertGlyphWidth(m_nOperatorsCount > 0, seCharBuffer, pDict); @@ -1416,7 +1416,7 @@ namespace PdfReader m_nOperatorsCount = 0; break; case 0x0012: // hstemhm - // + // Данная операция игнорируется if (m_bFirstOperator) { ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); @@ -1430,7 +1430,7 @@ namespace PdfReader m_nOperatorsCount = 0; break; case 0x0013: // hintmask - // + // Данная операция игнорируется if (m_bFirstOperator) { ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); @@ -1448,7 +1448,7 @@ namespace PdfReader m_nOperatorsCount = 0; break; case 0x0014: // cntrmask - // + // Данная операция игнорируется if (m_bFirstOperator) { ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); @@ -1505,7 +1505,7 @@ namespace PdfReader m_nOperatorsCount = 0; break; case 0x0017: // vstemhm - // + // Данная операция игнорируется if (m_bFirstOperator) { ConvertGlyphWidth(m_nOperatorsCount & 1, seCharBuffer, pDict); @@ -1642,7 +1642,7 @@ namespace PdfReader { // TO DO: error "Too few args to Type 2 callgsubr" } - // + // не очищаем стек break; case 0x001e: // vhcurveto if (m_nOperatorsCount < 4 || !(m_nOperatorsCount % 4 == 0 || (m_nOperatorsCount - 1) % 4 == 0)) @@ -1743,7 +1743,7 @@ namespace PdfReader m_bOpenPath = true; break; case 0x0c00: // dotsection (should be Type 1 only?) - // + // игнорируем m_nOperatorsCount = 0; break; case 0x0c03: // and @@ -2009,7 +2009,7 @@ namespace PdfReader void CFontFileType1C::EexecWriteCharString(Type1CEexecBuf *pEexecBuffer, unsigned char *sBuffer, int nLen) { - // Eexec + // Eexec шифрование for (int nIndex = 0; nIndex < nLen; ++nIndex) { unsigned nCurChar = sBuffer[nIndex] ^ (pEexecBuffer->unEncryptionKey >> 8); @@ -2039,7 +2039,7 @@ namespace PdfReader m_bSuccessParsed = true; - // Type 1C + // некоторые программы включают фонты Type 1C в пробелами в начале if (m_nLen > 0 && m_sFile[0] != '\x01') { ++m_sFile; @@ -2056,7 +2056,7 @@ namespace PdfReader m_nGsubrBias = (m_oGsubrIndex.nCount < 1240) ? 107 : (m_oGsubrIndex.nCount < 33900) ? 1131 : 32768; - // + // считываем первое имя фонта GetIndexVal(&m_oNameIndex, 0, &oIndexVal, &m_bSuccessParsed); if (!m_bSuccessParsed) @@ -2064,7 +2064,7 @@ namespace PdfReader m_seName = new StringExt((char *)&m_sFile[oIndexVal.nPos], oIndexVal.nLen); - // + // Считываем самый верхний словарь для первого фонта ReadTopDict(); if (m_oTopDict.nFirstOperator == 0x0c1e) @@ -2237,8 +2237,8 @@ namespace PdfReader } } - // (CID Font Dict (FD)). private dict, - // private dict. FontMatrix. + // Читаем словарь шрифта (CID Font Dict (FD)). Отсюда вытаскиваем указатель на private dict, + // и читаем private dict. Также вытаксиваем FontMatrix. void CFontFileType1C::ReadFD(int nOffset, int nLength, Type1CPrivateDict *pDict) { double arrdFontMatrix[6]; @@ -2780,7 +2780,7 @@ namespace PdfReader return nPos; } - // delta-encoded ints + // Конвертируем delta-encoded массив операторов в массив ints int CFontFileType1C::GetDeltaIntArray(int *pArray, int nMaxLen) { int nCount = 0; @@ -2798,7 +2798,7 @@ namespace PdfReader return nCount; } - // delta-encoded doubles + // Конвертируем delta-encoded массив операторов в массив doubles int CFontFileType1C::GetDeltaDoubleArray(double *pArray, int nMaxLen) { int nCount = 0; @@ -2822,7 +2822,7 @@ namespace PdfReader pIndex->nCount = GetU16BE(nPos, bSuccess); if (0 == pIndex->nCount) { - // , length + // возможны пустые индексы, они содержат только поле length pIndex->nOffsetSize = 0; pIndex->nStartPos = pIndex->nEndPos = nPos + 2; } diff --git a/PdfReader/Src/FontFileType1C.h b/PdfReader/Src/FontFileType1C.h index 0f76a13c28..a6bb7305c0 100644 --- a/PdfReader/Src/FontFileType1C.h +++ b/PdfReader/Src/FontFileType1C.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FONT_FILE_TYPE1C_H +#ifndef _PDF_READER_FONT_FILE_TYPE1C_H #define _PDF_READER_FONT_FILE_TYPE1C_H #include "FontFileBase.h" @@ -11,17 +11,17 @@ namespace PdfReader struct Type1CIndex { - int nPos; // - int nCount; // + int nPos; // Позиция в файле от начала файла + int nCount; // Количество вхождений int nOffsetSize; // Offset size - int nStartPos; // index data - 1 - int nEndPos; // Type1CIndex + int nStartPos; // Начальная позиция index data - 1 + int nEndPos; // Позиция следующего байта после Type1CIndex }; struct Type1CIndexVal { - int nPos; // - int nLen; // + int nPos; // Позиция в файле от начала файла + int nLen; // Длина в байтах }; struct Type1CTopDict @@ -43,7 +43,7 @@ namespace PdfReader int nPaintType; int nCharStringType; double arrdFontMatrix[6]; - bool bHasFontMatrix; // CID FD, + bool bHasFontMatrix; // В CID фонтах возможно матрица фонта лежит в FD, а не в верхнем словаре int nUniqueID; double arrdFontBBox[4]; double dStrokeWidth; @@ -118,9 +118,9 @@ namespace PdfReader { FontFileOutputFunc pOutputFunc; void *pOutputStream; - bool bASKII; // ASCII ? + bool bASKII; // ASCII кодировка? unsigned short unEncryptionKey; // eexec encryption key - int nLine; // eexec-, + int nLine; // количество eexec-символов, оставшихся на текущей строке }; //------------------------------------------------------------------------ @@ -140,8 +140,8 @@ namespace PdfReader char *GetName(); - // , 256 ( - // NULL). 8- . + // Возвращаем кодировку, как массив 256 имен (некоторые могут быть + // NULL). Используется только для 8-битных фонтов. char **GetEncoding(); unsigned short *GetCIDToGIDMap(int *arrCIDs); @@ -211,9 +211,9 @@ namespace PdfReader Type1COperator m_arrOperators[49]; int m_nOperatorsCount; - int m_nHints; // + int m_nHints; // для текущего символа bool m_bFirstOperator; - bool m_bOpenPath; // true, + bool m_bOpenPath; // true, если есть незакрытый пат }; } diff --git a/PdfReader/Src/Function.cpp b/PdfReader/Src/Function.cpp index b5b8428fda..7893b181ae 100644 --- a/PdfReader/Src/Function.cpp +++ b/PdfReader/Src/Function.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -26,7 +26,7 @@ namespace PdfReader { Dict *pDict; - // , , + // Функция задается либо как словарь, либо поток, либо как тождественная функция if (pFuncObject->IsStream()) { pDict = pFuncObject->StreamGetDict(); @@ -89,7 +89,7 @@ namespace PdfReader bool Function::Initialize(Dict *pDict) { Object oArray; - // Domain ( ) + // Domain (Всегда должен присутствовать) if (!pDict->Search("Domain", &oArray)->IsArray()) { // TO DO: Error "Function is missing domain" @@ -130,7 +130,7 @@ namespace PdfReader } oArray.Free(); - // Range ( ) + // Range (Этого поля может и не быть) m_bHasRange = false; m_nOutputDim = 0; if (pDict->Search("Range", &oArray)->IsArray()) @@ -179,7 +179,7 @@ namespace PdfReader IdentityFunction::IdentityFunction() { - // + // Заполняем произвольными значениями m_nInputDim = funcMaxInputs; m_nOutputDim = funcMaxOutputs; @@ -199,7 +199,7 @@ namespace PdfReader { for (int nIndex = 0; nIndex < funcMaxOutputs; ++nIndex) { - pOutput[nIndex] = pInput[nIndex]; // :) + pOutput[nIndex] = pInput[nIndex]; // тождественная же функция :) } } @@ -278,7 +278,7 @@ namespace PdfReader double dSampleMult = 1.0 / (pow(2.0, (double)nSampleBits) - 1); oArray.Free(); - // TO DO: Order, Transform + // TO DO: Сделать чтение поля Order, и реализовать функцию Transform // Encode if (pDict->Search("Encode", &oArray)->IsArray() && oArray.ArrayGetLength() == 2 * m_nInputDim) @@ -748,7 +748,7 @@ namespace PdfReader { if (m_arrBounds[nIndex] == m_arrBounds[nIndex + 1]) { - // 0, nIndex + // Чтобы избежать деление на 0, в данном случае функция с номером nIndex не будет использоваться m_arrScale[nIndex] = 0; } else @@ -878,8 +878,8 @@ namespace PdfReader psOperationReturn }; - // . , - // PSOperations + // Список идет в алфавитном порядке. Номер элемента здесь, соответствует + // операции в перечисляемом типе PSOperations char *c_sPSOperationNames[] = { "abs", @@ -935,14 +935,14 @@ namespace PdfReader psBlock }; - // , 'if'/'ifelse' . + // В потоке, операторы 'if'/'ifelse' занимают три слота. // // +---------------------------------+ // | psOperator: If / Ifelse | // +---------------------------------+ - // | psBlock: = | + // | psBlock: указатель = | // +---------------------------------+ - // | psBlock: = | + // | psBlock: указатель = | // +---------------------------------+ // | if | // | ... | @@ -954,7 +954,7 @@ namespace PdfReader // +---------------------------------+ // | ... | // - // = 'if', , + // Если оператор = 'if', указатель все задан, но не используется struct PSObject { diff --git a/PdfReader/Src/Function.h b/PdfReader/Src/Function.h index b477517fef..7f9102ce9d 100644 --- a/PdfReader/Src/Function.h +++ b/PdfReader/Src/Function.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_FUNCTION_H +#ifndef _PDF_READER_FUNCTION_H #define _PDF_READER_FUNCTION_H #include "Object.h" @@ -28,12 +28,12 @@ namespace PdfReader static Function *Parse(Object *pFuncObject); - // Domain Range + // Заполняем Domain и Range bool Initialize(Dict *pDict); virtual Function *Copy() = 0; - // + // Типы функций // -1 : identity // 0 : sampled // 2 : exponential @@ -71,7 +71,7 @@ namespace PdfReader return m_bHasRange; } - // , . pInput - , pOutput - . + // Собственно, работа самой функции. pInput - набор входящих параметров, pOutput - выходящие значения. virtual void Transform(double *pInput, double *pOutput) = 0; virtual bool IsValid() = 0; @@ -81,9 +81,9 @@ namespace PdfReader int m_nInputDim; // Function: R^(InputDim) -> R^(OutputDim) int m_nOutputDim; // - double m_arrDomain[funcMaxInputs][2]; // - double m_arrRange[funcMaxOutputs][2]; // - bool m_bHasRange; // Domain , Range + double m_arrDomain[funcMaxInputs][2]; // Минимум и максимум для каждой входящей переменной + double m_arrRange[funcMaxOutputs][2]; // Минимум и максимум для каждого выходящего параметра + bool m_bHasRange; // Domain должен быть задан всегда, а Range может отсутствовать }; //------------------------------------------------------------------------ @@ -117,13 +117,13 @@ namespace PdfReader // SampledFunction (Type0 Function) //------------------------------------------------------------------------ - // . - // , - // , - // Order, 1 - , - // 3 - . + // На самом деле это аппроксимационная функция. Здесь должны быть заданы + // точки и значения функции в данных точках, и тогда данная функция + // воспринимается как аппромаксионная функция по заданным значениям, причем + // аппрокимация зависит от поля Order, 1 - линейная интерполяция, + // 3 - интерполяция. - // . + // Пока реализована только линейная интерполяция. class SampledFunction : public Function { public: @@ -176,14 +176,14 @@ namespace PdfReader private: - int m_arrSize[funcMaxInputs]; // , - double m_arrEncoder[funcMaxInputs][2]; // Domain encoder - double m_arrDecoder[funcMaxOutputs][2]; // Range decoder + int m_arrSize[funcMaxInputs]; // Количество различных значений, которые может принимать данный параметр + double m_arrEncoder[funcMaxInputs][2]; // Минимум и максимум для Domain encoder + double m_arrDecoder[funcMaxOutputs][2]; // Минимум и максимум для Range decoder double m_arrInputMult[funcMaxInputs]; // int m_arrIndexMult[funcMaxInputs]; // - double *m_pSamples; // - int m_nSamplesCount; // - double *m_pBuffer; // + double *m_pSamples; // Собственно сами значения + int m_nSamplesCount; // Количество заданных значений + double *m_pBuffer; // Буфер для функции преобразования bool m_bValid; }; @@ -242,11 +242,11 @@ namespace PdfReader // StitchingFunction //------------------------------------------------------------------------ - // . m_arrBounds - // . Domain0 < Bounds0 < Bounds1 < ... < Bounds(K - 2) < Domain1. - // i- [ Bounds(i - 1), Bounds(i) ), - // Bounds(-1) = Domain0, Bound(k-1) = Domain1 ( , - // m_arrBounds ). + // Кусочная функция. В массиве m_arrBounds задаются точки деления исходного + // отрезка. Domain0 < Bounds0 < Bounds1 < ... < Bounds(K - 2) < Domain1. + // i-ая функция задана на полуинтервале [ Bounds(i - 1), Bounds(i) ), + // где Bounds(-1) = Domain0, Bound(k-1) = Domain1 (услованая запись, в массиве + // m_arrBounds эти значения не входят). class StitchingFunction : public Function { public: @@ -294,10 +294,10 @@ namespace PdfReader private: - int m_nCount; // - Function **m_ppFuncs; // - double *m_arrBounds; // - double *m_arrEncode; // + int m_nCount; // количество функций + Function **m_ppFuncs; // сами функции + double *m_arrBounds; // Границы областей определения функций + double *m_arrEncode; // Границы множств значений функций double *m_arrScale; bool m_bValid; diff --git a/PdfReader/Src/GFont.cpp b/PdfReader/Src/GFont.cpp index d565c230bd..90bb85a74a 100644 --- a/PdfReader/Src/GFont.cpp +++ b/PdfReader/Src/GFont.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -25,10 +25,10 @@ namespace PdfReader char *sProperName; }; - // PDF 14 (Type1) FontDescriptor, - // 14 PDF. - // "implementation note 44 in the PDF 1.4 spec", - // . + // PDF поддерживает 14 стандартных фонтов(Type1) без указаниях ширин и FontDescriptor, + // поэтому мы состовляем карту отображающую стандартные фонты в 14 основных фонтов PDF. + // Эта таблица составлена на основе "implementation note 44 in the PDF 1.4 spec", с + // небольшими добавками. static StandardFontMapEntry c_sStandardFontMap[] = { { "Arial", "Helvetica" }, @@ -90,7 +90,7 @@ namespace PdfReader GrFont *GrFont::MakeFont(XRef *pXref, char *sTag, Ref oID, Dict *pFontDict, GlobalParams *pGlobalParams) { - // + // Считываем название шрифта StringExt *seName = NULL; Object oTemp; @@ -101,7 +101,7 @@ namespace PdfReader } oTemp.Free(); - // + // Тип шрифта GrFont *pFont = NULL; pFontDict->Search("Subtype", &oTemp); if (oTemp.IsName("Type1") || oTemp.IsName("MMType1")) @@ -194,7 +194,7 @@ namespace PdfReader } oDictItem.Free(); - // FontFile + // Ищем внедренный FontFile if (oFontDescriptor.DictLookupAndCopy("FontFile", &oDictItem)->IsRef()) { m_oEmbFontFileRef = oDictItem.GetRef(); @@ -308,7 +308,7 @@ namespace PdfReader if (oDictItem.IsNum()) { dTemp = 0.001 * oDictItem.GetNum(); - // Ascent Descent 0 + // Некоторые неправильнае шрифты устанавливают Ascent и Descent равными 0 if (dTemp != 0) { m_dAscent = dTemp; @@ -321,12 +321,12 @@ namespace PdfReader if (oDictItem.IsNum()) { dTemp = 0.001 * oDictItem.GetNum(); - // Ascent Descent 0 + // Некоторые неправильнае шрифты устанавливают Ascent и Descent равными 0 if (dTemp != 0) { m_dDescent = dTemp; } - // Descent + // Descent должно быть отрицательным значением if (m_dDescent > 0) { m_dDescent = -m_dDescent; @@ -500,7 +500,7 @@ namespace PdfReader int nFirst = 0; int nLast = sizeof(c_sStandardFontMap) / sizeof(StandardFontMapEntry); - // + // Поиск методом деления отрезка пополам while (nLast - nFirst > 1) { int nMiddle = (nFirst + nLast) / 2; @@ -520,7 +520,7 @@ namespace PdfReader delete seName2; } - // 14 + // Смотрим является ли наш фонт одним из 14 стандартных BuiltinFont *pBuiltinFont = NULL; if (m_seName) { @@ -534,7 +534,7 @@ namespace PdfReader } } - // Ascent/Descent/BBox + // Выставляем стандартные значения для Ascent/Descent/BBox if (pBuiltinFont) { m_dAscent = 0.001 * pBuiltinFont->nAscent; @@ -551,10 +551,10 @@ namespace PdfReader m_arrFontBBox[0] = m_arrFontBBox[1] = m_arrFontBBox[2] = m_arrFontBBox[3] = 0; } - // FontDescriptor + // Считываем данные из FontDescriptor ReadFontDescriptor(pXref, pFontDict); - // Ascent/Descent/BBox + // Для стандартных фонтов выставляем стандартные значения Ascent/Descent/BBox if (pBuiltinFont && m_oEmbFontFileRef.nNum < 0) { m_dAscent = 0.001 * pBuiltinFont->nAscent; @@ -565,7 +565,7 @@ namespace PdfReader m_arrFontBBox[3] = 0.001 * pBuiltinFont->arrBBox[3]; } - // FontFile + // Ищем внешний FontFile FindExternalFontFile(pBuiltinFont ? true : false); // FontMatrix @@ -587,7 +587,7 @@ namespace PdfReader } oDictItem.Free(); - // , Type 3 + // Считываем данные, характерные для шрифта Type 3 if (m_eType == fontType3) { if (pFontDict->Search("FontBBox", &oDictItem)->IsArray()) @@ -616,19 +616,19 @@ namespace PdfReader } } - //----- Encoding ----- + //----- Строим Encoding ----- - // Encodings BaseEncoding, - // ( ): + // Encodings начинается с BaseEncoding, которую мы можем найти в + // (в порядке приоритета): // 1. pFontDict.Encoding or pFontDict.Encoding.BaseEncoding // - MacRoman / MacExpert / WinAnsi / Standard - // 2. FontFile - // 3. ( ): + // 2. Во внедренном или внешнем FontFile + // 3. Стандартные значения(если до этого не нашли): // - Builtin --> Builtin encoding // - TrueType --> WinAnsiEncoding - // - --> StandardEncoding + // - Остальные --> StandardEncoding - // BaseEncoding pFontDict + // Ищем BaseEncoding в pFontDict m_bHasEncoding = false; m_bUsesMacRomanEncoding = false; char **ppBaseEncoding = NULL; @@ -674,7 +674,7 @@ namespace PdfReader ppBaseEncoding = c_arrWinAnsiEncoding; } - // BaseEncoding FontFile( Type1) + // Ищем BaseEncoding в FontFile(только для Type1) CFontFileType1 *pFFT1 = NULL; CFontFileType1C *pFFT1C = NULL; char *sBuffer = NULL; @@ -741,7 +741,7 @@ namespace PdfReader MemUtilsFree(sBuffer); } - // BaseEncoding + // Стандартные значения BaseEncoding if (!ppBaseEncoding) { if (pBuiltinFont && m_oEmbFontFileRef.nNum < 0) @@ -769,8 +769,8 @@ namespace PdfReader } } - // Type 1C Font Files , T1C->T1, - // StandardEncoding + // Некоторые Type 1C Font Files имею пустые кодировки, что может навредить конвертации T1C->T1, + // поэтому мы заполняем все пустые места из StandardEncoding if (m_eType == fontType1C && (L"" != m_wsExternalFontFilePath || m_oEmbFontFileRef.nNum >= 0) && bBaseEncodingFromFontFile) { for (int nIndex = 0; nIndex < 256; ++nIndex) @@ -835,7 +835,7 @@ namespace PdfReader //----- build the mapping to Unicode ----- - // 1: Name-to-Unicode + // Шаг 1: Используем соответствие Name-to-Unicode bool bMissing = false, bHex = false; char *sCharName; Unicode arrToUnicode[256]; @@ -845,9 +845,9 @@ namespace PdfReader { if (m_pGlobalParams && !(arrToUnicode[nCode] = m_pGlobalParams->MapNameToUnicode(sCharName)) && strcmp(sCharName, ".notdef")) { - // Name-to-Unicode table, - // Name. ( 'Axx', 'xx', 'A' - - // 'xx' - + // Если данного символа не было в таблице Name-to-Unicode table, проверяем + // как выглядит Name. ( либо 'Axx', либо 'xx', где 'A' - произвольная буква + // и 'xx' - два шестнадцатиричных числа if ((strlen(sCharName) == 3 && isalpha(sCharName[0]) && isxdigit(sCharName[1]) && isxdigit(sCharName[2]) && ((sCharName[1] >= 'a' && sCharName[1] <= 'f') || @@ -874,9 +874,9 @@ namespace PdfReader } } - // 2: , - // 'Axx', 'xx', 'Ann', 'ABnn' 'nn', 'A' 'B' - , - // 'xx' - , 'nn' - 2-4 + // Шаг 2: Заполняем пропущенные символы, ищем имена одного из видов + // 'Axx', 'xx', 'Ann', 'ABnn' или 'nn', где 'A' и 'B' - любые буквы, + // 'xx' - два шестнадцатиричных числа, и 'nn' - 2-4 десятичных числа if (bMissing && m_pGlobalParams && m_pGlobalParams->GetMapNumericCharNames()) { for (int nCode = 0; nCode < 256; ++nCode) @@ -912,7 +912,7 @@ namespace PdfReader } } } - else if (bMissing && m_pGlobalParams && m_pGlobalParams->GetMapUnknownCharNames()) // 'mapUnknownCharNames' + else if (bMissing && m_pGlobalParams && m_pGlobalParams->GetMapUnknownCharNames()) // Если установлен флаг 'mapUnknownCharNames' { for (int nCode = 0; nCode < 256; ++nCode) { @@ -928,7 +928,7 @@ namespace PdfReader // ToUnicode CMap ReadToUnicodeCMap(pFontDict, 8, m_pCharToUnicode); - // Unicode-to-Unicode + // Ищем Unicode-to-Unicode CharCodeToUnicode *pUnicodeToUnicode, *pCharToUnicode; if (m_seName && m_pGlobalParams && (pUnicodeToUnicode = m_pGlobalParams->GetUnicodeToUnicode(m_seName))) { @@ -963,7 +963,7 @@ namespace PdfReader m_arrWidths[nCode] = m_dMissingWidth * 0.001; } - // pFontDict, + // Используем шириные из pFontDict, если они там заданы pFontDict->Search("FirstChar", &oDictItem); int nFirstChar = oDictItem.IsInt() ? oDictItem.GetInt() : 0; oDictItem.Free(); @@ -1005,9 +1005,9 @@ namespace PdfReader oTemp.Free(); } } - else if (pBuiltinFont) // Built-in + else if (pBuiltinFont) // Используем ширины из Built-in шрифта { - // PDF- 32 .notdef( ) + // Некорректные PDF-файлы кодируют символ с номером 32 как .notdef(хотя это пробел) unsigned short unWidth = 0; if (BuiltinFontGetWidth(pBuiltinFont, "space", &unWidth)) { @@ -1021,7 +1021,7 @@ namespace PdfReader } } } - else // - + else // Ширины не заданы - заполняем стандартными значениями { int nIndex = 0; if (IsFixedWidth()) @@ -1046,7 +1046,7 @@ namespace PdfReader } pBuiltinFont = c_arrBuiltinFontSubset[nIndex]; - // PDF- 32 .notdef( ) + // Некорректные PDF-файлы кодируют символ с номером 32 как .notdef(хотя это пробел) unsigned short unWidth = 0; if (BuiltinFontGetWidth(pBuiltinFont, "space", &unWidth)) { @@ -1110,32 +1110,32 @@ namespace PdfReader pMap[nIndex] = 0; } - // 1. PDF : - // 1a. PDF MacRomanEncoding - // TrueType- Macintosh Roman CMap, , - // . - // 1b. TrueType- Microsoft Unicode CMap - // non-Microsoft Unicode CMap, , - // , . - // 1c. PDF- - Symbolic TrueType- - // Microsoft Symbol CMap, , - // ( 0xf000). - // 1d. TrueType- Macintosh Roman CMap, - // 1a. - // 2. PDF- PDF- - Symbolic: - // 2a. TrueType- Macintosh Roman CMap, - // , ( + // 1. Если в PDF задана кодировка: + // 1a. Если в PDF шрифте определна кодировка MacRomanEncoding и + // TrueType-шрифт имеет Macintosh Roman CMap, используем его, + // и получем обатно по именам коды символов. + // 1b. Если TrueType-шрифт имеет Microsoft Unicode CMap или + // non-Microsoft Unicode CMap, используем его, и используем + // юникодные номера, а не коды символов. + // 1c. Если PDF-шрифт - Symbolic и TrueType-шрифт имеет + // Microsoft Symbol CMap, используем его, и используем сами + // коды символов (возможно со сдвигом 0xf000). + // 1d. Если TrueType-шрифт имеет Macintosh Roman CMap, используем + // его как и в случае 1a. + // 2. Если PDF-шрифт не имеет кодировки или PDF-шрифт - Symbolic: + // 2a. Если TrueType-шрифт имеет Macintosh Roman CMap, используем + // его, и используем сами коды символов (возможно со сдвигом // 0xf000). - // 2b. TrueType- Microsoft Symbol CMap, - // , ( + // 2b. Если TrueType-шрифт имеет Microsoft Symbol CMap, используем + // его, и используем сами коды символов (возможно со сдвигом // 0xf000). - // 3. , - // CMap. ( ) + // 3. Если не один из этих случаев не применим, тогда используем первый + // CMap. (но такого не должно происходить) - // TO DO: , , - // . , - // . + // TO DO: Возможна ситуация, когда одинаковых кодировок несколько, и в они содерржат + // разные символы. В таких случаях надо бы делать общую кодировку, а не считывать + // одну конкретную. int nUnicodeCmap = -1, nMacRomanCmap = -1, nMSSymbolCmap = -1; int nCmapPlatform = 0, nCmapEncoding = 0; @@ -1351,10 +1351,10 @@ namespace PdfReader ReadFontDescriptor(pXref, pDescendantDict); - // FontFile + // Ищем внешний FontFile FindExternalFontFile(false); - // + // Кодировка // Char collection if (!pDescendantDict->Search("CIDSystemInfo", &oDictItem)->IsDict()) @@ -1388,10 +1388,10 @@ namespace PdfReader if (!(m_pCharToUnicode = ReadToUnicodeCMap(pFontDict, 16, NULL))) { - // "Adobe-Identity" "Adobe-UCS" collections idToUnicode + // "Adobe-Identity" и "Adobe-UCS" collections не имеют файлов СidToUnicode if (seCollection->Compare("Adobe-Identity") && seCollection->Compare("Adobe-UCS")) { - // cidToUnicode, + // Ищем файлы cidToUnicode, данные извне if (m_pGlobalParams && !(m_pCharToUnicode = m_pGlobalParams->GetCIDToUnicode(seCollection))) { // TO DO: Error "Unknown character collection" @@ -1399,7 +1399,7 @@ namespace PdfReader } } - // Unicode-to-Unicode + // Ищем Unicode-to-Unicode CharCodeToUnicode *pUnicodeToUnicode = NULL; if (m_seName && m_pGlobalParams && (pUnicodeToUnicode = m_pGlobalParams->GetUnicodeToUnicode(m_seName))) { @@ -1426,7 +1426,7 @@ namespace PdfReader } } - // (.. CMap) + // Кодировка (т.е. CMap) pFontDict->Search("Encoding", &oDictItem); if (oDictItem.IsName()) @@ -1527,7 +1527,7 @@ namespace PdfReader if (seCollection) delete seCollection; - // CIDToGIDMap ( -TrueType) + // CIDToGIDMap (для внедренных шрифтов-TrueType) if (m_eType == fontCIDType2) { pDescendantDict->Search("CIDToGIDMap", &oDictItem); @@ -1555,16 +1555,16 @@ namespace PdfReader oDictItem.Free(); } - // + // Метрики - // + // Стандартное значение ширин if (pDescendantDict->Search("DW", &oDictItem)->IsInt()) { m_oWidths.dDefaultWidth = oDictItem.GetInt() * 0.001; } oDictItem.Free(); - // + // Исключения if (pDescendantDict->Search("W", &oDictItem)->IsArray()) { int nExceptionsSize = 0; @@ -1576,7 +1576,7 @@ namespace PdfReader oDictItem.ArrayGet(nCounter + 1, &oSecond); if (oFirst.IsInt() && oSecond.IsInt() && nCounter + 2 < oDictItem.ArrayGetLength()) { - // : C_first C_last W + // формат: C_first C_last W Object oWidth; if (oDictItem.ArrayGet(nCounter + 2, &oWidth)->IsNum()) { @@ -1599,7 +1599,7 @@ namespace PdfReader } else if (oFirst.IsInt() && oSecond.IsArray()) { - // : c [ w1 w2 wn ] + // Формат: c [ w1 w2 … wn ] if (m_oWidths.nExceptionsCount + oSecond.ArrayGetLength() > nExceptionsSize) { nExceptionsSize = (m_oWidths.nExceptionsCount + oSecond.ArrayGetLength() + 15) & ~15; @@ -1637,7 +1637,7 @@ namespace PdfReader } oDictItem.Free(); - // + // Стандартные метрики по вертикали if (pDescendantDict->Search("DW2", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() == 2) { Object oTemp; @@ -1655,7 +1655,7 @@ namespace PdfReader } oDictItem.Free(); - // + // Исключения if (pDescendantDict->Search("W2", &oDictItem)->IsArray()) { int nExceptionsSize = 0; @@ -1667,7 +1667,7 @@ namespace PdfReader oDictItem.ArrayGet(nCounter + 1, &oSecond); if (oFirst.IsInt() && oSecond.IsInt() && nCounter + 4 < oDictItem.ArrayGetLength()) { - // : _first _last W11y V1x V1y + // Формат: С_first С_last W11y V1x V1y Object oHeight, oVx, oVy; if (oDictItem.ArrayGet(nCounter + 2, &oHeight)->IsNum() && oDictItem.ArrayGet(nCounter + 3, &oVx)->IsNum() && oDictItem.ArrayGet(nCounter + 4, &oVy)->IsNum()) { @@ -1705,7 +1705,7 @@ namespace PdfReader Object oHeight, oVx, oVy; if (oSecond.ArrayGet(nArrayIndex, &oHeight)->IsNum() && oSecond.ArrayGet(nArrayIndex + 1, &oVx)->IsNum() && oSecond.ArrayGet(nArrayIndex + 2, &oVy)->IsNum()) { - // TO DO: !!! -> nExceptionsVCount nExceptionsCount + // TO DO: Здесь было исправлено!!! неправильные индексы передавались -> вместо nExceptionsVCount передавались nExceptionsCount m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].nFirst = nCurFirst; m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].nLast = nCurFirst; m_oWidths.pExceptionsV[m_oWidths.nExceptionsVCount].dHeight = oHeight.GetNum() * 0.001; @@ -1775,7 +1775,7 @@ namespace PdfReader } *punCode = (CharCode)(nCID = m_pCMap->GetCID(sText, nLen, &nCount)); - // + // Временно *uLen = nCount; if (1 == nCount) @@ -1915,8 +1915,8 @@ namespace PdfReader } else { - // , , - // ( 5 , 6- ) + // Нет ссылки на данный шрифт, но ссылка нам нужна как идентефикатор, поэтому выбираем некотый уникальный номер + // (поскольку корректное версионное число состоит из 5 цифр, поэтому любое 6-циферное число будет безопасным решением) oRef.nNum = nIndex; if (pFontDictRef) { diff --git a/PdfReader/Src/GFont.h b/PdfReader/Src/GFont.h index e56170e622..4864ddba0b 100644 --- a/PdfReader/Src/GFont.h +++ b/PdfReader/Src/GFont.h @@ -1,4 +1,4 @@ -#ifndef _PDFREADER_GFONT_H +#ifndef _PDFREADER_GFONT_H #define _PDFREADER_GFONT_H #include "StringExt.h" @@ -42,29 +42,29 @@ namespace PdfReader struct GrFontCIDWidthException { - CID nFirst; // + CID nFirst; // Данная запись применяется к CID nLast; // CID: ... - double dWidth; // + double dWidth; // Новая ширина символов }; struct GrFontCIDWidthExceptionV { - CID nFirst; // + CID nFirst; // Данная запись применяется к CID nLast; // CID: ... - double dHeight; // - double dVx; // V: origin0->origin1 - double dVy; // . 40 PDF 1.7 + double dHeight; // Новая высота символов + double dVx; // Координаты вектора V: origin0->origin1 + double dVy; // См. фигуру 40 в спецификации PDF 1.7 }; struct GrFontCIDWidths { - double dDefaultWidth; // - double dDefaultHeight; // - double dDefaultV; // V - GrFontCIDWidthException *pExceptions; // - int nExceptionsCount; // - GrFontCIDWidthExceptionV*pExceptionsV; // - int nExceptionsVCount; // + double dDefaultWidth; // Стандартное значение ширины символа + double dDefaultHeight; // Стандартное значение высоты символа + double dDefaultV; // Стандартное значение вектора V + GrFontCIDWidthException *pExceptions; // Исключения для горизонтальных метрик + int nExceptionsCount; // Число исключений + GrFontCIDWidthExceptionV*pExceptionsV; // Исключения для вертикальных метрик + int nExceptionsVCount; // Число исключений }; //------------------------------------------------------------------------ @@ -126,7 +126,7 @@ namespace PdfReader return false; } - // . + // Внедренные фонты. bool GetEmbeddedFontFileRef(Ref *pEmbRef) { *pEmbRef = m_oEmbFontFileRef; @@ -188,20 +188,20 @@ namespace PdfReader return m_dDescent; } - // 0 = , 1 = + // 0 = пишем по горизонтали, 1 = по вертикали virtual int GetWMode() { return 0; } - // FontFile . + // Считываем внешний или включенный FontFile в буфер. char *ReadExternalFontFile(int *pnLength); char *ReadEmbeddedFontFile(XRef *pXref, int *pnLegth); - // , - // , , - // (w0 w1, . PDF 1.7 40) (, ), V - // (. 40) (, ). punCode. + // Считываем следующий символ из строки длины байт, возвращем + // код символа , его юникодное значение , вектор замещения + // (w0 или w1, см. спецификацию PDF 1.7 фигура 40) (, ), и вектор V + // (см. фигуру 40) (, ). Возвращаем количество байт необходимых для punCode. virtual int GetNextChar(char *sText, int nLen, CharCode *punCode, Unicode *punUnicode, int uSize, int *uLen, double *pdDx, double *pdDy, double *pdVx, double *pdVy) = 0; protected: @@ -212,19 +212,19 @@ namespace PdfReader protected: - StringExt* m_seTag; // pdf- - Ref m_oID; // - ( ) - StringExt* m_seName; // - StringExt* m_seOriginalName; // - GrFontType m_eType; // - int m_nFlags; // FontDescriptor - StringExt* m_seEmbeddedFontName; // PDF (.. FontFile) - Ref m_oEmbFontFileRef; // (pdf-) FontFile - std::wstring m_wsExternalFontFilePath; // FontFile(.. font file PDF) + StringExt* m_seTag; // Тэг pdf-шрифта + Ref m_oID; // Ссылка на объект-шрифт (используем в качестве уникального идентефикатора) + StringExt* m_seName; // Название шрифта + StringExt* m_seOriginalName; // Первоначальное название шрифта + GrFontType m_eType; // Тип шрифта + int m_nFlags; // Флаги в FontDescriptor + StringExt* m_seEmbeddedFontName; // Название включенного в PDF шрифта(т.е. шрифт идет вместе с FontFile) + Ref m_oEmbFontFileRef; // Ссылка(pdf-ссылка) на FontFile для включенного шрифта + std::wstring m_wsExternalFontFilePath; // Путь в FontFile(т.е. font file не в самом PDF) - double m_arrFontMatrix[6]; // ( Type 3) - double m_arrFontBBox[4]; // ( Type 3) - double m_dMissingWidth; // + double m_arrFontMatrix[6]; // Матрица преобразования координат символа в координаты текста (только для Type 3) + double m_arrFontBBox[4]; // Наименьший прямоугольник задающий границы всех символов (только для Type 3) + double m_dMissingWidth; // Стандартное значение ширины для пропущенных символов double m_dAscent; // Ascent double m_dDescent; // Descent @@ -273,24 +273,24 @@ namespace PdfReader { return m_arrWidths[unChar]; } - // TrueType + // Только для TrueType unsigned short *GetCodeToGIDMap(CFontFileTrueType *pTTF); - // Type 3 + // Следующие три функции используются только для Type 3 Dict *GetCharProcs(); Object *GetCharProc(int nCode, Object *pProc); Dict *GetResources(); private: - char *m_ppEncoding[256]; // ( har code --> har name) - bool m_arrEncFree[256]; // : true, - CharCodeToUnicode *m_pCharToUnicode; // har code --> Unicode - bool m_bHasEncoding; // ? - bool m_bUsesMacRomanEncoding; // MacRomanEncoding? - double m_arrWidths[256]; // - Object m_oCharProcs; // Type 3, CharProcs - Object m_oResources; // Type 3, Resources + char *m_ppEncoding[256]; // Кодировка( Сhar code --> Сhar name) + bool m_arrEncFree[256]; // Булевские значения для имени каждого символа: true, если под строку выделяли память + CharCodeToUnicode *m_pCharToUnicode; // Сhar code --> Unicode + bool m_bHasEncoding; // Имеется ли кодировка вообще? + bool m_bUsesMacRomanEncoding; // Кодировка MacRomanEncoding? + double m_arrWidths[256]; // Ширины символов + Object m_oCharProcs; // Специфично только для Type 3, словарь CharProcs + Object m_oResources; // Специфично только для Type 3, словарь Resources }; //------------------------------------------------------------------------ @@ -316,10 +316,10 @@ namespace PdfReader CharCodeToUnicode *GetToUnicode(); - // ollection name (-). + // Сollection name (-). StringExt *GetCollection(); - // CID-to-GID. = fontCIDType2. + // CID-to-GID. Используется только если тип = fontCIDType2. unsigned short *GetCIDToGID() { return m_pCidToGID; @@ -368,8 +368,8 @@ namespace PdfReader private: - GrFont **m_ppFonts; // - int m_nFontsCount; // + GrFont **m_ppFonts; // Список шрифтов + int m_nFontsCount; // Количество шрифтов GlobalParams *m_pGlobalParams; }; } diff --git a/PdfReader/Src/GState.cpp b/PdfReader/Src/GState.cpp index c75462b718..3cfae0a8e3 100644 --- a/PdfReader/Src/GState.cpp +++ b/PdfReader/Src/GState.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "Object.h" @@ -668,7 +668,7 @@ namespace PdfReader // GrLabColorSpace //------------------------------------------------------------------------------------------------------------------------------- - // LMN, 4.10 + // Это обратная матрица к матрице LMN, данной в примере 4.10 в спецификации // PostScript Language Reference, Third Edition. static double c_arrLMNReverse[3][3] = { @@ -831,7 +831,7 @@ namespace PdfReader } dZ *= m_dWhiteZ; - // XYZ -> RGB ( ) + // XYZ -> RGB ( учитывая гамма коррекцию ) double dR = c_arrLMNReverse[0][0] * dX + c_arrLMNReverse[0][1] * dY + c_arrLMNReverse[0][2] * dZ; double dG = c_arrLMNReverse[1][0] * dX + c_arrLMNReverse[1][1] * dY + c_arrLMNReverse[1][2] * dZ; double dB = c_arrLMNReverse[2][0] * dX + c_arrLMNReverse[2][1] * dY + c_arrLMNReverse[2][2] * dZ; @@ -1056,8 +1056,8 @@ namespace PdfReader m_pAlternate->GetDefaultRanges(pDecodeLow, pDecodeRange, nMaxImagePixelValue); #if 0 - // , PDF Range - // ICCBased. + // Так должно работать, но некоторые PDF фалй не содержат корректных данных в полях Range + // в словаре ICCBased. for ( int nIndex = 0; nIndex < m_nComponentsCount; ++nIndex ) { @@ -1095,7 +1095,7 @@ namespace PdfReader GrColorSpace *GrIndexedColorSpace::Parse(Array *pArray) { - // [ /Indexed base hival lookup ] - 4 + // [ /Indexed base hival lookup ] - массив из 4 элементов должен быть if (pArray->GetCount() != 4) { // TO DO: Error "Bad Indexed color space" @@ -1123,7 +1123,7 @@ namespace PdfReader } int nHival = oArrayItem.GetInt(); - if (nHival < 0 || nHival > 255) // PDF hival [0,255] + if (nHival < 0 || nHival > 255) // По спецификации PDF значение hival должно лежать в отрезке [0,255] { // TO DO: Error "Bad Indexed color space (invalid hival value)" if (pBase) @@ -1264,7 +1264,7 @@ namespace PdfReader GrColorSpace *GrSeparationColorSpace::Parse(Array *pArray) { - // [ /Separation name alternateSpace tintTransform ] - 4 + // [ /Separation name alternateSpace tintTransform ] - должен быть массив из 4 элементов if (pArray->GetCount() != 4) { // TO DO: Error "Bad Separation color space" @@ -1398,7 +1398,7 @@ namespace PdfReader { StringExt *arrseNames[GrColorMaxComps]; - // : + // Запись о данном цветом пространстве должны быть одной из следующих двух: // [ /DeviceN names alternateSpace tintTransform ] // [ /DeviceN names alternateSpace tintTransform attributes ] @@ -1605,7 +1605,7 @@ namespace PdfReader void GrPatternColorSpace::GetDefaultColor(GrColor *pColor) { - // + // не используется } //============================================================================================================================== @@ -1830,7 +1830,7 @@ namespace PdfReader } oDictItem.Free(); - // TO DO: ExtGState + // TO DO: Надо сделать чтение поля ExtGState return new GrShadingPattern(pShading, arrMatrix); } @@ -1978,7 +1978,7 @@ namespace PdfReader return NULL; } - // TO DO: AntiAlias + // TO DO: Добавить чтение поля AntiAlias return pShading; } @@ -2047,7 +2047,7 @@ namespace PdfReader } oDictItem.Free(); - // TO DO: AntiAlias + // TO DO: Добавить чтение поля AntiAlias return true; } @@ -2116,7 +2116,7 @@ namespace PdfReader Object oTemp; dMinX = oDictItem.ArrayGet(0, &oTemp)->GetNum(); oTemp.Free(); - // TO DO: ( ) + // TO DO: Проверить здесь чтение(было не по спецификации) dMaxX = oDictItem.ArrayGet(1, &oTemp)->GetNum(); oTemp.Free(); dMinY = oDictItem.ArrayGet(2, &oTemp)->GetNum(); @@ -2733,7 +2733,7 @@ namespace PdfReader oDictItem.Free(); } - // [ XminXmax YminYmax C1,minC1,max ... Cn,minCn,max ], 6 + // [ Xmin Xmax Ymin Ymax C1,min C1,max ... Cn,min Cn,max ], поэтому как минимум массив должен быть из 6 элементов double dXMin, dXMax, dYMin, dYMax; double arrCMin[GrColorMaxComps], arrCMax[GrColorMaxComps]; double dXMul, dYMul; @@ -2813,7 +2813,7 @@ namespace PdfReader } oDictItem.Free(); - // ( ) + // Дальше читаем данные из потока(набор вершин) int nVerticesCount = 0, nTrianglesCount = 0; GrGouraudVertex *pVertices = NULL; int(*pTriangles)[3] = NULL; @@ -2827,7 +2827,7 @@ namespace PdfReader while (1) { - if (nType == 4) // 5 + if (nType == 4) // В типе 5 нет флага вначале { if (!pBitBuffer->GetBits(nBitsPerFlag, &unFlag)) { @@ -3098,7 +3098,7 @@ namespace PdfReader double arrCMul[GrColorMaxComps]; int nComponentsCount = 0; - // [ XminXmax YminYmax C1,minC1,max ... Cn,minCn,max ], 6 + // [ Xmin Xmax Ymin Ymax C1,min C1,max ... Cn,min Cn,max ], поэтому как минимум массив должен быть из 6 элементов if (pDict->Search("Decode", &oDictItem)->IsArray() && oDictItem.ArrayGetLength() >= 6) { Object oTemp; @@ -3546,16 +3546,16 @@ namespace PdfReader return; } - // , , (), - // . - // Indexed and Separation( ): - // , . + // Строим таблицу поиска, в которой будут храниться, предварительно вычисленные(декодированные), + // значения какждой компоненты. + // Оптимизация для цветовых пространств Indexed and Separation(имеющих одну компоненту): + // в таблице будет хранится значения цвета, а не значения компонент. m_pColorSpace2 = NULL; m_nComponentsCount2 = 0; double arrX[GrColorMaxComps], arrY[GrColorMaxComps]; if (m_pColorSpace->GetMode() == csIndexed) { - // , nHival != nMaxPixelIndex + // Возможно, что nHival != nMaxPixelIndex GrIndexedColorSpace *pIndexedCS = (GrIndexedColorSpace *)m_pColorSpace; m_pColorSpace2 = pIndexedCS->GetBase(); int nHival = pIndexedCS->GetHival(); @@ -4389,7 +4389,7 @@ namespace PdfReader double arrInvCTM[6]; double dXMin, dYMin, dXMax, dYMax; - // CTM + // Обратная матрица для матрицы CTM double dDet = 1 / (m_arrCTM[0] * m_arrCTM[3] - m_arrCTM[1] * m_arrCTM[2]); arrInvCTM[0] = m_arrCTM[3] * dDet; arrInvCTM[1] = -m_arrCTM[1] * dDet; @@ -4698,7 +4698,7 @@ namespace PdfReader } } - // + // Учитываем толщину линии double dT0 = fabs(m_arrCTM[0]); double dT1 = fabs(m_arrCTM[2]); if (dT0 > dT1) @@ -4711,7 +4711,7 @@ namespace PdfReader dXMin -= 0.5 * m_dLineWidth * dT1; dXMax += 0.5 * m_dLineWidth * dT1; } - // TO DO: !!!! , m_arrCTM[1] + // TO DO: Проверит здесь!!!! Сдается, что нужно m_arrCTM[1] поставить dT0 = fabs(m_arrCTM[0]); dT1 = fabs(m_arrCTM[3]); if (dT0 > dT1) @@ -4773,7 +4773,7 @@ namespace PdfReader { pOldState = m_pNext; - // / q/Q + // Следующие значения не сохраняются/восстанавливаются с помощью операций q/Q pOldState->m_pPath = m_pPath; pOldState->m_dCurX = m_dCurX; pOldState->m_dCurY = m_dCurY; diff --git a/PdfReader/Src/GState.h b/PdfReader/Src/GState.h index f7004372dd..d3efcdd68d 100644 --- a/PdfReader/Src/GState.h +++ b/PdfReader/Src/GState.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_GSTATE_H +#ifndef _PDF_READER_GSTATE_H #define _PDF_READER_GSTATE_H #include "../../DesktopEditor/common/Types.h" @@ -61,7 +61,7 @@ namespace PdfReader // (nByte / 255) << 16 = (0.0000000100000001... * nByte) << 16 // = ((nByte << 8) + (nByte) + (nByte >> 8) + ...) << 16 // = (nByte << 8) + (nByte) + (nByte >> 7) - // [ ] + // [для округления] return (GrColorComp)((nByte << 8) + nByte + (nByte >> 7)); } @@ -110,8 +110,8 @@ namespace PdfReader // GrColorSpace //------------------------------------------------------------------------------------------------------------------------------- - // GrColorSpaceModes GrColorSpaceModeNames, - // GState.cpp . + // Константы GrColorSpaceModes и массив GrColorSpaceModeNames, определенный + // в GState.cpp должны совпадать. enum GrColorSpaceMode { csDeviceGray, @@ -138,30 +138,30 @@ namespace PdfReader static GrColorSpace *Parse(Object *pColorSpaceObject); - // -> Gray, RGB, CMYK. + // Конвертируем в -> Gray, RGB, или CMYK. virtual void GetGray(GrColor *pColor, GrGray *pGray) = 0; virtual void GetRGB(GrColor *pColor, GrRGB *pRGB) = 0; virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK) = 0; - // . + // Количество компонент. virtual int GetComponentsCount() = 0; - // . + // Получаем стандартное значение цвета в данном цветовом пространстве. virtual void GetDefaultColor(GrColor *pColor) = 0; - // , nMaxImagePixelValue - . + // Стандартные границчные значения для каждой компоненты пикселя, где nMaxImagePixelValue - максимальное значение пикселя. virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); - // True, . + // True, если в данном цветовом пространстве на странице ничего не нарисовано. virtual bool IsNonMarking() { return false; } - // . + // Число различных цветовых пространств. static int GetColorSpaceModesCount(); - // . + // Имя соответствующего цветового пространства. static char *GetColorSpaceModeName(int nIndex); DWORD GetDwordColor(GrColor *pColor) @@ -234,7 +234,7 @@ namespace PdfReader } virtual void GetDefaultColor(GrColor *pColor); - // , CalGray. + // Возвращаем значения, специфичные пространству CalGray. double GetWhiteX() { return m_dWhiteX; @@ -335,7 +335,7 @@ namespace PdfReader } virtual void GetDefaultColor(GrColor *pColor); - // , CalRBG. + // Возвращаем значения, специфичные пространству CalRBG. double GetWhiteX() { return m_dWhiteX; @@ -391,7 +391,7 @@ namespace PdfReader double m_dGammaG; // Gamma double m_dGammaB; // - double m_arrdMatrix[9]; // : ABC -> XYZ + double m_arrdMatrix[9]; // Матрица преобразования: ABC -> XYZ }; //------------------------------------------------------------------------------------------------------------------------------- @@ -453,7 +453,7 @@ namespace PdfReader virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); - // , Lab. + // Возвращаем значения, специфичные пространству Lab. double GetWhiteX() { return m_dWhiteX; @@ -506,12 +506,12 @@ namespace PdfReader double m_dBlackZ; // double m_dMinA; // - double m_dMaxA; // + double m_dMaxA; // Границы для компонент А и В double m_dMinB; // double m_dMaxB; // double m_dMultR; // - double m_dMultG; // + double m_dMultG; // Дополнительные сомножители double m_dMultB; // }; @@ -546,7 +546,7 @@ namespace PdfReader virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); - // , Lab. + // Возвращаем значения, специфичные пространству Lab. GrColorSpace *GetAlternate() { return m_pAlternate; @@ -554,10 +554,10 @@ namespace PdfReader private: - int m_nComponentsCount; // (1, 3, or 4) - GrColorSpace *m_pAlternate; // - double m_arrdRangeMin[4]; // - double m_arrdRangeMax[4]; // + int m_nComponentsCount; // Число компонент цвета (1, 3, or 4) + GrColorSpace *m_pAlternate; // Альтернативное цветовое пространство + double m_arrdRangeMin[4]; // Минимальные значения для каждой компоненты + double m_arrdRangeMax[4]; // Максимальные значения для каждой компоненты Ref m_oICCProfileStream; // ICC }; @@ -591,7 +591,7 @@ namespace PdfReader virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue); - // , Indexed. + // Возвращаем значения, специфичные пространству Indexed. GrColorSpace *GetBase() { return m_pBase; @@ -611,9 +611,9 @@ namespace PdfReader private: - GrColorSpace *m_pBase; // + GrColorSpace *m_pBase; // Базовое цветовое пространство int m_nHival; // Hival = max valid index value - unsigned char *m_pLookup; // + unsigned char *m_pLookup; // Таблица цветов }; //------------------------------------------------------------------------------------------------------------------------------- @@ -649,7 +649,7 @@ namespace PdfReader return m_bNonMarking; } - // , Separation. + // Возвращаем значения, специфичные пространству Separation. StringExt *GetName() { return m_seName; @@ -666,10 +666,10 @@ namespace PdfReader private: StringExt *m_seName; // Color space family name - GrColorSpace *m_pAlternateSpace; // - Function *m_pFunction; // tintTransform ( ) + GrColorSpace *m_pAlternateSpace; // Альтернативное цветовое пространство + Function *m_pFunction; // tintTransform ( функция преобразования в альтернативное пространство) - bool m_bNonMarking; // , + bool m_bNonMarking; // Будет ли видимой графика, использующая данное цветовое пространство }; //------------------------------------------------------------------------------------------------------------------------------- @@ -706,7 +706,7 @@ namespace PdfReader return m_bNonMarking; } - // , DeviceN. + // Возвращаем значения, специфичные пространству DeviceN. StringExt *GetColorantName(int nIndex) { return m_arrseNames[nIndex]; @@ -722,12 +722,12 @@ namespace PdfReader private: - int m_nComponentsCount; // - StringExt *m_arrseNames[GrColorMaxComps]; // "Name" - GrColorSpace *m_pAlternateSpace; // - Function *m_pFunction; // tintTransform ( ) + int m_nComponentsCount; // Число компонент + StringExt *m_arrseNames[GrColorMaxComps]; // Объекты типа "Name" определяющие каждую цветовую компоненту + GrColorSpace *m_pAlternateSpace; // Альтернативное цветовое пространство + Function *m_pFunction; // tintTransform ( функция преобразования в альтернативное пространство) - bool m_bNonMarking; // , + bool m_bNonMarking; // Будет ли видимой графика, использующая данное цветовое пространство }; //------------------------------------------------------------------------------------------------------------------------------- @@ -759,7 +759,7 @@ namespace PdfReader } virtual void GetDefaultColor(GrColor *pColor); - // , Pattern. + // Возвращаем значения, специфичные пространству Pattern. GrColorSpace *GetUnder() { return m_pUnder; @@ -767,7 +767,7 @@ namespace PdfReader private: - GrColorSpace *m_pUnder; // ( Patterns) + GrColorSpace *m_pUnder; // Цветовое пространство подкладки (для не цветовых Patterns) }; //------------------------------------------------------------------------------------------------------------------------------- @@ -886,7 +886,7 @@ namespace PdfReader private: - GrShading *m_pShading; // Shading + GrShading *m_pShading; // Сам объект Shading double m_arrMatrix[6]; // Pattern matrix }; @@ -940,16 +940,16 @@ namespace PdfReader protected: - int m_nType; // - GrColorSpace *m_pColorSpace; // , - GrColor m_oBackground; // , - bool m_bHasBackground; // ? + int m_nType; // Тип + GrColorSpace *m_pColorSpace; // Цветовое пространство, в котором рисуем + GrColor m_oBackground; // Цвет подкладки, если она есть + bool m_bHasBackground; // Есть ли подкладка? double m_dXMin; // double m_dYMin; // BBox double m_dXMax; // double m_dYMax; // - bool m_bHasBBox; // BBox? + bool m_bHasBBox; // Задан ли BBox? }; //------------------------------------------------------------------------------------------------------------------------------- @@ -996,7 +996,7 @@ namespace PdfReader double m_dDomainMaxX; // double m_dDomainMaxY; // - double m_arrMatrix[6]; // , Domain, Shading + double m_arrMatrix[6]; // Матрица преобразования и пространства, определенного Domain, в текущее пространство Shading Function *m_arrFunctions[GrColorMaxComps]; int m_nFunctionsCount; }; @@ -1052,19 +1052,19 @@ namespace PdfReader private: - double m_dAxisX0; // + double m_dAxisX0; // Начальная точка вектора double m_dAxisY0; // - double m_dAxisX1; // + double m_dAxisX1; // Конечная точка вектора double m_dAxisY1; // - double m_dT0; // t( ) + double m_dT0; // Пределы параметра t(параметризация оси) double m_dT1; Function *m_arrFunctions[GrColorMaxComps]; int m_nFunctionsCount; - bool m_bExtendStart; // - bool m_bExtendEnd; // + bool m_bExtendStart; // Продолжать ли за начальную точку оси + bool m_bExtendEnd; // Продолжать ли за конечную точку оси }; //------------------------------------------------------------------------------------------------------------------------------- // GrRadialShading @@ -1119,20 +1119,20 @@ namespace PdfReader private: - double m_dFirstX; // + double m_dFirstX; // Координаты центра первой окружности double m_dFirstY; // - double m_dFirstRad; // - double m_dSecondX; // + double m_dFirstRad; // Радиус первой окружности + double m_dSecondX; // Координаты центра второй окружности double m_dSecondY; // - double m_dSecondRad; // + double m_dSecondRad; // Радиус второй окружности - double m_dT0; // t + double m_dT0; // Границы параметра t double m_dT1; // Function *m_arrFunctions[GrColorMaxComps]; int m_nFunctionsCount; - bool m_bExtendFirst; // - bool m_bExtendSecond; // + bool m_bExtendFirst; // Продолжать ли рисовать за первый круг + bool m_bExtendSecond; // Продолжать ли рисовать за второй круг }; //------------------------------------------------------------------------------------------------------------------------------- @@ -1141,9 +1141,9 @@ namespace PdfReader struct GrGouraudVertex { - double dX; // + double dX; // Координаты вершины double dY; // - GrColor oColor; // + GrColor oColor; // Цвет }; class GrGouraudTriangleShading : public GrShading @@ -1166,12 +1166,12 @@ namespace PdfReader private: - GrGouraudVertex *m_arrVertexs; // - int m_nVertexsCount; // - int(*m_arrTriangles)[3]; // ( ) - int m_nTrianglesCount; // - Function *m_ppFunctions[GrColorMaxComps]; // - int m_nFunctionsCount; // + GrGouraudVertex *m_arrVertexs; // Массив всех вершин + int m_nVertexsCount; // Количество вершин + int(*m_arrTriangles)[3]; // Массив треугольников(треугольник определяется по номерам вершин) + int m_nTrianglesCount; // Количество треугольников + Function *m_ppFunctions[GrColorMaxComps]; // Функции + int m_nFunctionsCount; // Количество функций }; //------------------------------------------------------------------------------------------------------------------------------- @@ -1209,10 +1209,10 @@ namespace PdfReader private: - GrPatch *m_pPatches; // - int m_nPatchesCount; // - Function *m_ppFunctions[GrColorMaxComps]; // - int m_nFunctionsCount; // + GrPatch *m_pPatches; // Массив частей + int m_nPatchesCount; // Количество частей + Function *m_ppFunctions[GrColorMaxComps]; // Массив функций + int m_nFunctionsCount; // Количество функций }; //------------------------------------------------------------------------------------------------------------------------------- @@ -1271,14 +1271,14 @@ namespace PdfReader private: - GrColorSpace *m_pColorSpace; // + GrColorSpace *m_pColorSpace; // Цветовое пространство изображения int m_nBitsPerComponent; // bits per component - int m_nComponentsCount; // - GrColorSpace *m_pColorSpace2; // - int m_nComponentsCount2; // ( ) + int m_nComponentsCount; // Число цветовых компонент в пикселе + GrColorSpace *m_pColorSpace2; // Второе цветовое пространство + int m_nComponentsCount2; // Число цветовых компонент в пикселе(во втором пространстве) GrColorComp *m_ppLookup[GrColorMaxComps]; // lookup table - double m_arrDecodeLow[GrColorMaxComps]; // - double m_arrDecodeRange[GrColorMaxComps]; // (Max - min) + double m_arrDecodeLow[GrColorMaxComps]; // Минимальные значения для каждой компоненты + double m_arrDecodeRange[GrColorMaxComps]; // Значения (Max - min) для каждой компоненты bool m_bSuccess; }; @@ -1339,7 +1339,7 @@ namespace PdfReader } - // (, ) subpath. + // Добавляем сдвиг (, ) к каждой точке subpath. void Offset(double dDx, double dDy); void Transform(double *pMatrix); @@ -1364,13 +1364,13 @@ namespace PdfReader private: - double *m_pX; // supath + double *m_pX; // Координаты точек в supath double *m_pY; // - bool *m_pbCurve; // m_bCurve[i] = true => i - - int m_nPointsCount; // - int m_nSize; // m_pX/m_pY - bool m_bClosed; // path? + bool *m_pbCurve; // Если m_bCurve[i] = true => точка i - контрольная точка для кривой Безье + int m_nPointsCount; // Количество точек + int m_nSize; // Размер массивов m_pX/m_pY + bool m_bClosed; // Закрыт ли path? }; class GrPath @@ -1386,13 +1386,13 @@ namespace PdfReader return new GrPath(m_bJustStarted, m_dFirstX, m_dFirstY, m_ppSubpaths, m_nSubpathsCount, m_nSize); } - // ? + // Есть ли текущая точка? bool IsCurPoint() { return m_nSubpathsCount > 0 || m_bJustStarted; } - // path, .. subpath? + // Пустой ли path, т.е. есть ли в нем хотя бы один subpath? bool IsPathNonEmpty() { return m_nSubpathsCount > 0; @@ -1423,7 +1423,7 @@ namespace PdfReader void Close(); void Append(GrPath *pPath); - // (, ) path. + // Добавляем сдвиг (, ) к каждой точке path. void Offset(double dDx, double dDy); bool IsEqual(GrPath *pPath) @@ -1445,12 +1445,12 @@ namespace PdfReader GrPath(bool bJustStarted, double dFirstX, double dFirstY, GrSubpath **ppSubpaths, int nSubpathsCount, int nSize); private: - bool m_bJustStarted; // True, subpath - double m_dFirstX; // subpath + bool m_bJustStarted; // True, если новый subpath был только что начат + double m_dFirstX; // Координаты первой точки нового subpath double m_dFirstY; // - GrSubpath **m_ppSubpaths; // subpaths - int m_nSubpathsCount; // subpaths - int m_nSize; // m_ppSubpaths + GrSubpath **m_ppSubpaths; // Список subpaths + int m_nSubpathsCount; // Количетсво subpaths + int m_nSize; // Размер массива m_ppSubpaths }; @@ -1686,7 +1686,7 @@ namespace PdfReader // GrClip //------------------------------------------------------------------------------------------------------------------------------- -#define GrClipEOFlag 0x01 // Even-odd +#define GrClipEOFlag 0x01 // Используем правило Even-odd class GrClip { @@ -1703,13 +1703,13 @@ namespace PdfReader void ResetToRect(double dX0, double dY0, double dX1, double dY1); - // Clip . + // Пересекаем Clip с заданным прямоугольником. void ClipToRect(double dX0, double dY0, double dX1, double dY1); - // Clip . + // Пересекаем Clip с . void ClipToPath(GrPath *pPath, double *pMatrix, bool bEO); - // + // Пересекаем с текстом void ClipToText(std::wstring wsFontName, std::wstring wsFontPath, double dFontSize, int nFontStyle, double *pMatrix, std::wstring wsText, double dX, double dY, double dWidth, double dHeight, double dBaseLineOffset) { if (!m_pTextClip) @@ -2127,18 +2127,18 @@ namespace PdfReader { return m_pClip; } - // ? + // Есть ли текущая точка? bool IsCurPoint() { return m_pPath->IsCurPoint(); } - // path? + // Есть ли непустой path? bool IsPathNonEmpty() { return m_pPath->IsPathNonEmpty(); } - // . + // Различные преобразования координат. void Transform(double dSrcX, double dSrcY, double *pdResX, double *pdResY) { *pdResX = m_arrCTM[0] * dSrcX + m_arrCTM[2] * dSrcY + m_arrCTM[4]; @@ -2289,7 +2289,7 @@ namespace PdfReader void Clip(); void ClipToStrokePath(); - // . + // Текст. void TextSetPos(double dX, double dY) { m_dTextLineX = dX; @@ -2304,7 +2304,7 @@ namespace PdfReader void TextShift(double dShiftX, double dShiftY); void Shift(double dShidtX, double dShiftY); - // . + // Работа со стеком. GrState *Save(); GrState *Restore(); bool HasSaves() @@ -2321,72 +2321,72 @@ namespace PdfReader private: - double m_dHorDPI; // - double m_dVerDPI; // - double m_arrCTM[6]; // + double m_dHorDPI; // Разрешение по горизонтали + double m_dVerDPI; // Разрешение по вертикали + double m_arrCTM[6]; // Матрица преобразования координат - double m_dPageLeft; // - double m_dPageBottom; // + double m_dPageLeft; // Координаты левого нижнего угла и + double m_dPageBottom; // правого верхнего в пользовательстких координатах double m_dPageRight; // double m_dPageTop; // - double m_dPageWidth; // (.. m_dHorDPI) - double m_dPageHeight; // (.. m_dVerDPI) + double m_dPageWidth; // Ширина страницы в пикселях(т.е. с учетом разрешения m_dHorDPI) + double m_dPageHeight; // Высота страницы в пикселях(т.е. с учетом разрешения m_dVerDPI) - int m_nRotate; // + int m_nRotate; // Угол поворота страницы - GrColorSpace *m_pFillColorSpace; // - GrColorSpace *m_pStrokeColorSpace;// - GrColor m_oFillColor; // - GrColor m_oStrokeColor; // - GrPattern *m_pFillPattern; // , - GrPattern *m_pStrokePattern; // , + GrColorSpace *m_pFillColorSpace; // Цветовое пространство для заливки + GrColorSpace *m_pStrokeColorSpace;// Цветовое пространство для обводки + GrColor m_oFillColor; // Цвет для заливки + GrColor m_oStrokeColor; // Цвет для обводки + GrPattern *m_pFillPattern; // Указатель на объект, определяющий заливку + GrPattern *m_pStrokePattern; // Указатель на объект, определяющий обводку - GraphicsBlendMode m_eBlendMode; // Blend mode ( ) + GraphicsBlendMode m_eBlendMode; // Blend mode (для прозрачности) - double m_dFillOpacity; // - double m_dStrokeOpacity; // + double m_dFillOpacity; // Прозрачность заливки + double m_dStrokeOpacity; // Прозрачность обводки - bool m_bFillOverprint; // ? - bool m_bStrokeOverprint; // ? - Function *m_ppTransfer[4]; // . : - // NULL = ; - // NULL = ; - // 4 NULL = R,G,B,gray - + bool m_bFillOverprint; // Заливаем поверх всего? + bool m_bStrokeOverprint; // Обводим поверх всего? + Function *m_ppTransfer[4]; // Функция переноса. Варианты входных параметров: + // все NULL = тождествнная функция; + // последние три NULL = одномерная функция; + // все 4 не NULL = R,G,B,gray -функция - double m_dLineWidth; // - double *m_pLineDash; // , - int m_nLineDashSize; // m_pLineDash + double m_dLineWidth; // Толщина линии + double *m_pLineDash; // Параметры, если линия пунктирная + int m_nLineDashSize; // Размер массива m_pLineDash double m_dLineDashStart;// int m_nFlatness; // Flatness Tolerance - int m_nLineJoin; // - int m_nLineCap; // + int m_nLineJoin; // Тип соединения линий + int m_nLineCap; // Тип оконачния линий double m_dMiterLimit; // Miter limit - bool m_bStrokeAdjust; // True, + bool m_bStrokeAdjust; // True, автоматически обводить - GrFont *m_pFont; // - double m_dFontSize; // - double m_arrTextMatrix[6]; // - double m_dCharSpace; // - double m_dWordSpace; // - double m_dHorizScaling; // - double m_dLeading; // - double m_nRise; // / baseline - int m_nRenderMode; // + GrFont *m_pFont; // Шрифт + double m_dFontSize; // Размер шрифта + double m_arrTextMatrix[6]; // Матрица координатных преобразований текста + double m_dCharSpace; // Расстояние между символами + double m_dWordSpace; // Расстояние между словами + double m_dHorizScaling; // Горизонтальное растяжение текста + double m_dLeading; // Расстояние между строками + double m_nRise; // Поднятие/опускание текста относительно baseline + int m_nRenderMode; // Способ рисования букв - GrPath *m_pPath; // Path - double m_dCurX; // - double m_dCurY; // ( ) - double m_dTextLineX; // , - double m_dTextLineY; // ( ) + GrPath *m_pPath; // Массив графических Path + double m_dCurX; // Координаты текущей точки + double m_dCurY; // (в пользовательских координатах) + double m_dTextLineX; // Координаты начальной точки, начиная с которой пишется текст + double m_dTextLineY; // (в текстовых координатах) GrClip *m_pClip; double m_dClipXMin; // - double m_dClipYMin; // clip region + double m_dClipYMin; // Границы для clip region double m_dClipXMax; // double m_dClipYMax; // - GrState *m_pNext; // GrState + GrState *m_pNext; // Следующий GrState в стэке }; } #endif // _PDF_READER_GSTATE_H diff --git a/PdfReader/Src/GlobalParams.cpp b/PdfReader/Src/GlobalParams.cpp index 4a7718f7a5..9feead3513 100644 --- a/PdfReader/Src/GlobalParams.cpp +++ b/PdfReader/Src/GlobalParams.cpp @@ -1,10 +1,8 @@ -#include +#include #include #include #include -#include "Resource.h" - #include "MemoryUtils.h" #include "StringExt.h" #include "Constants.h" @@ -72,8 +70,8 @@ namespace PdfReader //------------------------------------------------------------------------------------------------------------------------------- GlobalParams::GlobalParams() : m_pFontManager(NULL) { - // , - // ( , , 'space') + // Просматриваем кодировку в обратном порядке, чтобы присвоить символу наименьше возможный номер + // (если у символа их несколько, например, как у 'space') m_pMacRomanReverseMap = new NameToCharCode(); for (int nIndex = 255; nIndex >= 0; --nIndex) { @@ -83,7 +81,7 @@ namespace PdfReader } } - // m_pNameToUnicode + // Инициализируем талицу m_pNameToUnicode m_pNameToUnicode = new NameToCharCode(); for (int nIndex = 0; c_arrNameToUnicodeTable[nIndex].sName; ++nIndex) { @@ -128,12 +126,12 @@ namespace PdfReader } CharCodeToUnicode* GlobalParams::GetUnicodeToUnicode(StringExt* seFontName) { - // TODO: Unicode to Unicode + // TODO: Как только будем хранить отдельную папку с файлами Unicode to Unicode реализовать тут return NULL; } CharCodeToUnicode* GlobalParams::GetCIDToUnicode(StringExt* seCollection) { - // TODO: Cid to Unicode + // TODO: Как только будем хранить отдельную папку с файлами Cid to Unicode реализовать тут return NULL; } Unicode GlobalParams::MapNameToUnicode(char* sCharName) @@ -146,7 +144,7 @@ namespace PdfReader } FILE* GlobalParams::FindToUnicodeFile(StringExt* seName) { - // TODO: ToUnicode + // TODO: Как только будем хранить отдельную папку с файлами ToUnicode реализовать тут return NULL; } FILE* GlobalParams::FindCMapFile(StringExt* seCollection, StringExt* seCMapName) @@ -163,7 +161,7 @@ namespace PdfReader } FILE* GlobalParams::GetUnicodeMapFile(StringExt* seEncodingName) { - // UnicodeMap + // Как только будем работать с папкой UnicodeMap реализовать тут return NULL; } std::wstring& GlobalParams::GetTempFolder() @@ -176,7 +174,7 @@ namespace PdfReader { m_wsTempDirectory = wsTempFolder; - // 14 + // В темповую директорию скидываем 14 стандартных шрифтов for (int nIndex = 0; nIndex < 14; nIndex++) { std::wstring wsFontPath; @@ -197,7 +195,7 @@ namespace PdfReader } std::wstring GlobalParams::FindFontFile(StringExt* seFontName, wchar_t** pwsExts) { - // TODO: + // TODO: Возможно стоит перенести сюда подбор шрифтов return L""; } void GlobalParams::SetCMapFolder(const wchar_t* wsCMapDir) diff --git a/PdfReader/Src/GlobalParams.h b/PdfReader/Src/GlobalParams.h index b62d4a7ca7..d2beda7199 100644 --- a/PdfReader/Src/GlobalParams.h +++ b/PdfReader/Src/GlobalParams.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_GLOBAL_PARAMS_H +#ifndef _PDF_READER_GLOBAL_PARAMS_H #define _PDF_READER_GLOBAL_PARAMS_H #include @@ -62,11 +62,11 @@ namespace PdfReader NameToCharCode* m_pNameToUnicode; // Char name -> Unicode CMapCache* m_pCMapCache; - std::wstring m_wsCMapDirectory; // CMap + std::wstring m_wsCMapDirectory; // ѕуть к папке с CMap файлами std::wstring m_wsTempDirectory; CFontManager* m_pFontManager; - std::wstring m_arrBuiltinFontsPath[14]; // 14 + std::wstring m_arrBuiltinFontsPath[14]; // ѕути к стандартным 14 шрифтам }; } diff --git a/PdfReader/Src/Graphics.cpp b/PdfReader/Src/Graphics.cpp index 38c6e95c8d..ad987f4a00 100644 --- a/PdfReader/Src/Graphics.cpp +++ b/PdfReader/Src/Graphics.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -20,7 +20,7 @@ #include "Annot.h" #include "Graphics.h" -// +// Под виндой переопределяется #ifdef GetObject #undef GetObject #endif @@ -30,7 +30,7 @@ #endif //------------------------------------------------------------------------------------------------------------------------------- -// +// Константы //------------------------------------------------------------------------------------------------------------------------------- #define functionMaxDepth 6 @@ -54,7 +54,7 @@ #define patchColorDelta (DoubleToColor(1 / 256.0)) //------------------------------------------------------------------------------------------------------------------------------- -// +// Таблица графических операторов //------------------------------------------------------------------------------------------------------------------------------- #ifdef WIN32 // this works around a bug in the VC7 compiler @@ -543,9 +543,9 @@ namespace PdfReader if (m_pOut && m_pOut->IsStopped()) break; - if (oTemp.IsCommand()) // , + if (oTemp.IsCommand()) // Если получили команду, тогда выполняем ее { - // + // Тут распечатываются посланные команды #ifdef _DEBUG if (m_pDumpFile) @@ -568,14 +568,14 @@ namespace PdfReader arrArguments[nIndex].Free(); nArgumentsCount = 0; - // + // Производим переодические обновления того что выводим if (++m_nUpdateLevel >= 20000) { m_pOut->Dump(); m_nUpdateLevel = 0; } - // + // Проверяем отмену if (m_pAbortCheckCallBack) { if (m_nUpdateLevel - nLastAbortCheck > 10) @@ -588,11 +588,11 @@ namespace PdfReader } } } - else if (nArgumentsCount < maxArgs) // + else if (nArgumentsCount < maxArgs) // Считываем аргумент { arrArguments[nArgumentsCount++] = oTemp; } - else // , - + else // Аргументов слишком много, значит что-то неправильно { // TO DO: Error "Too many args in content stream" #ifdef _DEBUG @@ -607,7 +607,7 @@ namespace PdfReader oTemp.Free(); } - // + // Считываем следующий объект m_pParser->GetObject(&oTemp); } oTemp.Free(); @@ -643,19 +643,19 @@ namespace PdfReader void Graphics::ExecuteOperator(Object *pCommand, Object arrArguments[], int nArgumentsCount) { Operator *pOperator = NULL; - // + // Ищем оператор char* sName = pCommand->GetCommand(); if (!(pOperator = FindOperator(sName))) { - if (m_nIgnoreUndef == 0) // BX + if (m_nIgnoreUndef == 0) // Проверяем наличие незакрытого оператора BX { // TO DO: Error "Unknown operator" } return; } - // + // Проверяем количество аргументов Object *pArguments = arrArguments; if (pOperator->nArgumentsCount >= 0) { @@ -668,7 +668,7 @@ namespace PdfReader { // TO DO: Error "Too many args in operator" - // + // Используем последние значения в качесте аргументов pArguments += nArgumentsCount - pOperator->nArgumentsCount; nArgumentsCount = pOperator->nArgumentsCount; } @@ -682,7 +682,7 @@ namespace PdfReader } } - // + // Проверяем типы аргументов for (int nIndex = 0; nIndex < nArgumentsCount; ++nIndex) { if (!CheckArgumentType(&pArguments[nIndex], pOperator->arrArguments[nIndex])) @@ -692,7 +692,7 @@ namespace PdfReader } } - // + // Выполняем сам оператор (this->*pOperator->pFunction)(pArguments, nArgumentsCount); } Operator *Graphics::FindOperator(char *sName) @@ -834,7 +834,7 @@ namespace PdfReader return; } - // + // Прозрачность Object oDictItem; // BM (blend mode) if (!oDict.DictLookup("BM", &oDictItem)->IsNull()) @@ -899,7 +899,7 @@ namespace PdfReader oDictItem.Free(); // TR2/TR (transfer function) - // TR2 + // приоритетной является TR2 Function *ppFunctions[4]; if (oDict.DictLookup("TR2", &oDictItem)->IsNull()) { @@ -926,7 +926,7 @@ namespace PdfReader break; } } - if (4 == nIndex) // + if (4 == nIndex) // нормально ли все функции прочитались { m_pGState->SetTransfer(ppFunctions); m_pOut->UpdateTransfer(m_pGState); @@ -1070,7 +1070,7 @@ namespace PdfReader //------------------------------------------------------------------------------------------------------------------------------- void Graphics::MakeSoftMask(Object *pStream, bool bAlpha, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, Function *pTransferFunction, GrColor *pBackDropColor) { - // + // Проверяем на чрезмерную рекурсию if (m_nFormDepth > 20) { return; @@ -1130,7 +1130,7 @@ namespace PdfReader pDict->Search("Resources", &oDictItem); Dict *pResourcesDict = (oDictItem.IsDict() ? oDictItem.GetDict() : (Dict *)NULL); - // + // Рисуем ++m_nFormDepth; DoForm(pStream, pResourcesDict, arrMatrix, arrBBox, true, true, pBlendingColorSpace, bIsolated, bKnockout, bAlpha, pTransferFunction, pBackDropColor); --m_nFormDepth; @@ -1774,7 +1774,7 @@ namespace PdfReader return; } - // GState + // Сохраняем текущий GState GrPath *pSavedPath = m_pGState->GetPath()->Copy(); SaveGState(); @@ -1798,7 +1798,7 @@ namespace PdfReader m_pGState->ClearPath(); } - // + // Устанавливаем цветовое пространство m_pGState->SetFillColorSpace(pShading->GetColorSpace()->Copy()); m_pOut->UpdateFillColorSpace(m_pGState); @@ -1810,7 +1810,7 @@ namespace PdfReader m_pOut->StartShadedFill(m_pGState); - // , Shading + // Выполняем закраску, в зависимости от типа Shading switch (pShading->GetType()) { case 1: @@ -1839,7 +1839,7 @@ namespace PdfReader m_pOut->SetVectorAntialias(true); } - // GState + // Восстанавливаем GState RestoreGState(); m_pGState->SetPath(pSavedPath); @@ -1849,7 +1849,7 @@ namespace PdfReader //------------------------------------------------------------------------------------------------------------------------------- void Graphics::DoPatternFill(bool bEOFill) { - // Patterns, PDF + // Пропускаем объект Patterns, если мы выводим только текст из PDF if (!m_pOut->NeedNonText()) { return; @@ -1876,7 +1876,7 @@ namespace PdfReader void Graphics::DoPatternStroke() { - // Patterns, PDF + // Пропускаем объект Patterns, если мы выводим только текст из PDF if (!m_pOut->NeedNonText()) { return; @@ -1906,7 +1906,7 @@ namespace PdfReader // Color space GrPatternColorSpace *pPatternCS = (GrPatternColorSpace *)(bStroke ? m_pGState->GetStrokeColorSpace() : m_pGState->GetFillColorSpace()); - // (Pattern space) -> (Current space) + // Строим матрицу преобразования (Pattern space) -> (Current space) double *pCTM = m_pGState->GetCTM(); double *pBaseMatrix = m_arrBaseMatrix; double *pTilingMatrix = pPattern->GetMatrix(); @@ -1936,7 +1936,7 @@ namespace PdfReader pMatrix[4] = pTempMatrix[4] * pInvCTM[0] + pTempMatrix[5] * pInvCTM[2] + pInvCTM[4]; pMatrix[5] = pTempMatrix[4] * pInvCTM[1] + pTempMatrix[5] * pInvCTM[3] + pInvCTM[5]; - // (Device space) -> (Pattern space) + // Строим матрицу преобразования (Device space) -> (Pattern space) double pInvTemp[6]; dDet = 1 / (pTempMatrix[0] * pTempMatrix[3] - pTempMatrix[1] * pTempMatrix[2]); pInvTemp[0] = pTempMatrix[3] * dDet; @@ -1946,12 +1946,12 @@ namespace PdfReader pInvTemp[4] = (pTempMatrix[2] * pTempMatrix[5] - pTempMatrix[3] * pTempMatrix[4]) * dDet; pInvTemp[5] = (pTempMatrix[1] * pTempMatrix[4] - pTempMatrix[0] * pTempMatrix[5]) * dDet; - // GState + // Сохраняем текущий GState GrPath *pSavedPath = m_pGState->GetPath()->Copy(); SaveGState(); - // ( Tiling patterns); - // ( , ) + // Устанавливаем цветовое пространство для подкладки (для не цветовых Tiling patterns); + // Устанавливаем разлиные параметры (цвет обводки, толщина линии) GrColorSpace *pColorSpace = NULL; if (pPattern->GetPaintType() == 2 && (pColorSpace = pPatternCS->GetUnder())) { @@ -2125,7 +2125,7 @@ namespace PdfReader { if (m_pOut->IsStopped()) { - // GState + // Восстанавливаем GState RestoreGState(); m_pGState->SetPath(pSavedPath); return; @@ -2147,7 +2147,7 @@ namespace PdfReader m_pOut->EndTilingFill(); - // GState + // Восстанавливаем GState RestoreGState(); m_pGState->SetPath(pSavedPath); } @@ -2156,7 +2156,7 @@ namespace PdfReader { GrShading *pShading = pPattern->GetShading(); - // GState + // Сохраняем текущий GState GrPath *pSavedPath = m_pGState->GetPath()->Copy(); SaveGState(); @@ -2213,11 +2213,11 @@ namespace PdfReader } } - // + // Устанавливаем цветовое пространство m_pGState->SetFillColorSpace(pShading->GetColorSpace()->Copy()); m_pOut->UpdateFillColorSpace(m_pGState); - // + // Задний фон if (pShading->GetHasBackground()) { m_pGState->SetFillColor(pShading->GetBackground()); @@ -2226,7 +2226,7 @@ namespace PdfReader } m_pGState->ClearPath(); - // (Pattern space) -> (Current space) + // Строим матрицу преобразования (Pattern space) -> (Current space) double *pCTM = m_pGState->GetCTM(); double *pBaseMatrix = m_arrBaseMatrix; double *pPatternMatrix = pPattern->GetMatrix(); @@ -2257,7 +2257,7 @@ namespace PdfReader pMatrix[4] = pTempMatrix[4] * pInvCTM[0] + pTempMatrix[5] * pInvCTM[2] + pInvCTM[4]; pMatrix[5] = pTempMatrix[4] * pInvCTM[1] + pTempMatrix[5] * pInvCTM[3] + pInvCTM[5]; - // + // Устанавливаем новую матрицу m_pGState->ConcatCTM(pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], pMatrix[4], pMatrix[5]); m_pOut->UpdateCTM(m_pGState, pMatrix[0], pMatrix[1], pMatrix[2], pMatrix[3], pMatrix[4], pMatrix[5]); @@ -2269,7 +2269,7 @@ namespace PdfReader m_pOut->StartShadedFill(m_pGState); - // , Shading + // Выполняем закраску, в зависимости от типа Shading switch (pShading->GetType()) { case 1: @@ -2298,21 +2298,21 @@ namespace PdfReader m_pOut->SetVectorAntialias(true); } - // GState + // Восстанавливаем GState RestoreGState(); m_pGState->SetPath(pSavedPath); } void Graphics::DoFunctionShadingFill(GrFunctionShading *pShading) { - // OuputDevice Shading + // Сначала предоставляем возможность OuputDevice самому сделать Shading if (m_pOut->UseFunctionalShadedFills() && m_pOut->FunctionShadedFill(m_pGState, pShading)) { return; } - // Output Device ShadingType, - // GrPath. + // Если Output Device не поддерживает данный ShadingType, тогда делаем его сами + // с помощью GrPath. double dMinX, dMinY, dMaxX, dMaxY; GrColor arrColors[4]; @@ -2331,7 +2331,7 @@ namespace PdfReader int nComponentsCount = pShading->GetColorSpace()->GetComponentsCount(); - // + // Сравниваем цвета в углах int nColorIndex = 0; for (nColorIndex = 0; nColorIndex < 4; ++nColorIndex) { @@ -2352,19 +2352,19 @@ namespace PdfReader double dCenterX = 0.5 * (dMinX + dMaxX); double dCenterY = 0.5 * (dMinY + dMaxY); - // ( ) - // . , - // , 4 . + // Угловые вершины прямоугольников достаточно близки (или мы достигли предела количетсву иттераций) + // Заливаем прямоугольник. Даже если изначально вершины близки проводим одну иттерацию деления, чтобы + // случая, когда все 4 вершины имеют одинаковый цвет. if ((nColorIndex == 4 && nDepth > 0) || nDepth == functionMaxDepth) { - // + // Используем цвет центра прямоугольника GrColor oFillColor; pShading->GetColor(dCenterX, dCenterY, &oFillColor); m_pGState->SetFillColor(&oFillColor); m_pOut->UpdateFillColor(m_pGState); double *pMatrix = pShading->GetMatrix(); - // + // Заливка прямоугольника m_pGState->MoveTo(dMinX * pMatrix[0] + dMinY * pMatrix[2] + pMatrix[4], dMinX * pMatrix[1] + dMinY * pMatrix[3] + pMatrix[5]); m_pGState->LineTo(dMaxX * pMatrix[0] + dMinY * pMatrix[2] + pMatrix[4], dMaxX * pMatrix[1] + dMinY * pMatrix[3] + pMatrix[5]); m_pGState->LineTo(dMaxX * pMatrix[0] + dMaxY * pMatrix[2] + pMatrix[4], dMaxX * pMatrix[1] + dMaxY * pMatrix[3] + pMatrix[5]); @@ -2373,7 +2373,7 @@ namespace PdfReader m_pOut->Fill(m_pGState); m_pGState->ClearPath(); } - else // 4 , + else // 4 угловые вершины не достаточно близки, делим дальше на прямоугольники { // pColors[0] oColorCT pColors[2] @@ -2397,28 +2397,28 @@ namespace PdfReader pShading->GetColor(dCenterX, dMaxY, &oColorCB); pShading->GetColor(dCenterX, dCenterY, &oColorCC); - // + // Верхний левый прямоугольник arrSubColors[0] = pColors[0]; arrSubColors[1] = oColorLC; arrSubColors[2] = oColorCT; arrSubColors[3] = oColorCC; DoFunctionShadingFill(pShading, dMinX, dMinY, dCenterX, dCenterY, arrSubColors, nDepth + 1); - // + // Левый нижний прямоугольник arrSubColors[0] = oColorLC; arrSubColors[1] = pColors[1]; arrSubColors[2] = oColorCC; arrSubColors[3] = oColorCB; DoFunctionShadingFill(pShading, dMinX, dCenterY, dCenterX, dMaxY, arrSubColors, nDepth + 1); - // + // Правый верхний прямоугольник arrSubColors[0] = oColorCT; arrSubColors[1] = oColorCC; arrSubColors[2] = pColors[2]; arrSubColors[3] = oColorRC; DoFunctionShadingFill(pShading, dCenterX, dMinY, dMaxX, dCenterY, arrSubColors, nDepth + 1); - // + // Правый нижний прямоугольник arrSubColors[0] = oColorCC; arrSubColors[1] = oColorCB; arrSubColors[2] = oColorRC; @@ -2431,7 +2431,7 @@ namespace PdfReader { int nJ, nK, nKK; - // OuputDevice Shading + // Сначала предоставляем возможность OuputDevice самому сделать Shading if (m_pOut->UseAxialShadedFills() && m_pOut->AxialShadedFill(m_pGState, pShading)) { return; @@ -2441,7 +2441,7 @@ namespace PdfReader double dMinX, dMinY, dMaxX, dMaxY; m_pGState->GetUserClipBBox(&dMinX, &dMinY, &dMaxX, &dMaxY); - // T + // Вычисляем макимальное и минимальное значения параметра T double dTmin, dTmax; double dX0, dY0, dX1, dY1; pShading->GetCoords(&dX0, &dY0, &dX1, &dY1); @@ -2494,34 +2494,34 @@ namespace PdfReader } } - // T + // Считываем пределы параметра T double dT0 = pShading->GetDomain0(); double dT1 = pShading->GetDomain1(); - // (Tx, Ty) , , : + // Для каждой точки (Tx, Ty) оси, рассмотрим линию ,проходяющую через данную точку перпендикулярно оси: // // x(s) = Tx + s * -dDy --> s = (x - Tx) / -dDy // y(s) = Ty + s * dDx --> s = (y - Ty) / dDx // - // ( Bbox). - // 4 : + // Рассмотрим точки пересечения данной линии с внешним ректом(в котором все рисуем Bbox). В общем случае + // мы имеем 4 точки пересечения: // // s0 = (dMinX - Tx) / -dDy // s1 = (dMaxX - Tx) / -dDy // s2 = (dMinY - Ty) / dDx // s3 = (dMaxY - Ty) / dDx // - // s. + // нас интересуют два средних значения s. // - // , dDx = 0, s0 s1; , dDy = 0, s2 s3. + // В случае, когда dDx = 0, возьмем s0 и s1; в случае, когда dDy = 0, возьмем s2 и s3. // - // , , . + // Далее каждый полигон, который мы будем заполнять будет ограничен двумя такими линиями, перпендикулярными оси. // - // , - // . . + // Делим ось таким образом до тех пор, пока разница цветов между двумя соседними линиями не станет достаточно + // малой. Далее кажды отдельный полигон закрашиваем одним цветом. - // , , - // . + // Делаем как минимум одну такую иттерацию, чтобы избежать проблем в случае, когда оба конца оси имеют + // одинаковый цвет. int nComponentsCount = pShading->GetColorSpace()->GetComponentsCount(); double arrTa[axialMaxSplits + 1]; @@ -2532,7 +2532,7 @@ namespace PdfReader arrNext[axialMaxSplits / 2] = axialMaxSplits; arrTa[axialMaxSplits] = dTmax; - // t = dTmin + // Вычисляем значение цвета при t = dTmin double dTt = 0; if (dTmin < 0) { @@ -2549,8 +2549,8 @@ namespace PdfReader GrColor oColor0, oColor1; pShading->GetColor(dTt, &oColor0); - // , , t = dTmin; - // t = dTmin. + // Вычисляем координаты точки, лежаще на оси, при значении параметра t = dTmin; + // после этого вычисляем координаты точек пересечения для линии при t = dTmin. double dTx = dX0 + dTmin * dDx; double dTy = dY0 + dTmin * dDy; double arrS[4]; @@ -2617,7 +2617,7 @@ namespace PdfReader if (m_pOut->IsStopped()) return; - // + // Делим пока разница цветов не станет достаточной маленькой или пока мы не достигнем предела количеству иттераций nJ = arrNext[nSplitsCount]; while (nJ > nSplitsCount + 1) { @@ -2655,14 +2655,14 @@ namespace PdfReader nJ = nK; } - // + // Используем среднее значение цвета for (nK = 0; nK < nComponentsCount; ++nK) { oColor0.arrComp[nK] = (oColor0.arrComp[nK] + oColor1.arrComp[nK]) / 2; } - // , , t; - // t. + // Вычисляем координаты точки, лежаще на оси, при данном значении параметра t; + // после этого вычисляем координаты точек пересечения для линии данном t. dTx = dX0 + arrTa[nJ] * dDx; dTy = dY0 + arrTa[nJ] * dDy; if (bDxZero && bDyZero) @@ -2719,11 +2719,11 @@ namespace PdfReader double dEndX1 = dTx - dSmax * dDy; double dEndY1 = dTy + dSmax * dDx; - // + // Устанавливаем цвет m_pGState->SetFillColor(&oColor0); m_pOut->UpdateFillColor(m_pGState); - // + // Закрашиваем m_pGState->MoveTo(dStartX0, dStartY0); m_pGState->LineTo(dEndX0, dEndY0); m_pGState->LineTo(dEndX1, dEndY1); @@ -2732,7 +2732,7 @@ namespace PdfReader m_pOut->Fill(m_pGState); m_pGState->ClearPath(); - // + // Начальные значения для следующего полигона dStartX0 = dStartX1; dStartY0 = dStartY1; dEndX0 = dEndX1; @@ -2744,13 +2744,13 @@ namespace PdfReader void Graphics::DoRadialShadingFill(GrRadialShading *pShading) { - // OuputDevice Shading + // Сначала предоставляем возможность OuputDevice самому сделать Shading if (m_pOut->UseRadialShadedFills() && m_pOut->RadialShadedFill(m_pGState, pShading)) { return; } - // Output Device ShadingType, - // GrPath. + // Если Output Device не поддерживает данный ShadingType, тогда делаем его сами + // с помощью GrPath. double dFirstX, dFirstY, dFirstRad, dSecondX, dSecondY, dSecondRad; pShading->GetCoords(&dFirstX, &dFirstY, &dFirstRad, &dSecondX, &dSecondY, &dSecondRad); @@ -2758,8 +2758,8 @@ namespace PdfReader double dT1 = pShading->GetDomain1(); int nComponentsCount = pShading->GetColorSpace()->GetComponentsCount(); - // , r(s) = 0; ; - // + // Вычисляем точку, в которой r(s) = 0; проверяме вложенность окружностей; и + // вычисляем углы тангенциальных линий bool bEnclosed = false; double dTheta = 0, dAlpha = 0;; double dZeroS = 0; @@ -2862,7 +2862,7 @@ namespace PdfReader } } - // dZeroS + // Проверяем относительно dZeroS if (dFirstRad < dSecondRad) { if (dSmin < dZeroS) @@ -2928,7 +2928,7 @@ namespace PdfReader } } - // A - , B - + // Везде далее A - первая окружность, B - вторая int nIndexA = 0; double dSA = dSmin; double dTA = dT0 + dSA * (dT1 - dT0); @@ -3006,12 +3006,12 @@ namespace PdfReader } } - // + // Вычислим центр и радиус окружности double dXB = dFirstX + dSB * (dSecondX - dFirstX); double dYB = dFirstY + dSB * (dSecondY - dFirstY); double dRadB = dFirstRad + dSB * (dSecondRad - dFirstRad); - // + // Используем среднее значение цвета двух окружностей for (nCounter = 0; nCounter < nComponentsCount; ++nCounter) { oColorA.arrComp[nCounter] = (oColorA.arrComp[nCounter] + oColorB.arrComp[nCounter]) / 2; @@ -3022,7 +3022,7 @@ namespace PdfReader if (bEnclosed) { - // Path ( ) + // Строим Path для первой окружности (против часовой) m_pGState->MoveTo(dXA + dRadA, dYA); for (nCounter = 1; nCounter < nStepsCount; ++nCounter) { @@ -3031,7 +3031,7 @@ namespace PdfReader } m_pGState->ClosePath(); - // Path ( ) + // Строим Path для второй окружности (по часовой) m_pGState->MoveTo(dXB + dRadB, dYB); for (nCounter = 1; nCounter < nStepsCount; ++nCounter) { @@ -3044,7 +3044,7 @@ namespace PdfReader else { - // subpath ( ) + // Строим первый subpath (по часовой) m_pGState->MoveTo(dXA + dRadA * cos(dAlpha + dTheta + 0.5 * M_PI), dYA + dRadA * sin(dAlpha + dTheta + 0.5 * M_PI)); for (nCounter = 0; nCounter < nStepsCount; ++nCounter) { @@ -3058,7 +3058,7 @@ namespace PdfReader } m_pGState->ClosePath(); - // subpath ( ) + // Строим второй subpath (против часовой) m_pGState->MoveTo(dXA + dRadA * cos(dAlpha + dTheta + 0.5 * M_PI), dYA + dRadA * sin(dAlpha + dTheta + 0.5 * M_PI)); for (nCounter = 0; nCounter < nStepsCount; ++nCounter) { @@ -3073,11 +3073,11 @@ namespace PdfReader m_pGState->ClosePath(); } - // + // Закрашиваем m_pOut->Fill(m_pGState); m_pGState->ClearPath(); - // + // Начальные данные для следующего шага nIndexA = nIndexB; dSA = dSB; dTA = dTB; @@ -3087,10 +3087,10 @@ namespace PdfReader oColorA = oColorB; } - // + // Если выставлены флаги продолжать рисовать за пределами двух окружностей if (bEnclosed) { - // + // Продолжаем за меньшую окружность if ((pShading->GetExtendFirst() && dFirstRad <= dSecondRad) || (pShading->GetExtendSecond() && dSecondRad < dFirstRad)) { if (dFirstRad <= dSecondRad) @@ -3121,7 +3121,7 @@ namespace PdfReader m_pGState->ClearPath(); } - // + // Продолжаем за большую окружность if ((pShading->GetExtendFirst() && dFirstRad > dSecondRad) || (pShading->GetExtendSecond() && dSecondRad >= dFirstRad)) { if (dFirstRad > dSecondRad) @@ -3220,7 +3220,7 @@ namespace PdfReader void Graphics::DoPatchMeshShadingFill(GrPatchMeshShading *pShading) { - // + // Устанавливаем цветовое пространство m_pGState->SetStrokeColorSpace(pShading->GetColorSpace()->Copy()); m_pOut->UpdateStrokeColorSpace(m_pGState); @@ -3687,7 +3687,7 @@ namespace PdfReader m_pOut->BeginString(m_pGState, seString); } - // Type 3 + // Обработка шрифта Type 3 if (pFont->GetType() == fontType3 && m_pOut->InterpretType3Chars()) { double *pMatrix = m_pGState->GetCTM(); @@ -3738,7 +3738,7 @@ namespace PdfReader m_pGState->Transform(dCurX + dRiseX, dCurY + dRiseY, &x, &y); SaveGState(); m_pGState->SetCTM(pNewCTM[0], pNewCTM[1], pNewCTM[2], pNewCTM[3], x, y); - // CTM concat ( ) + //Значения CTM concat здесь неправильные (но они никогда не используются) m_pOut->UpdateCTM(m_pGState, 1, 0, 0, 1, 0, 0); if (!m_pOut->BeginType3Char(m_pGState, dCurX + dRiseX, dCurY + dRiseY, tdx, tdy, nCode, arrUnicode, uLen)) { @@ -3765,8 +3765,8 @@ namespace PdfReader oCharProc.Free(); } RestoreGState(); - // RestoreGState() , - // + // Поскольку функция RestoreGState() не восстанавливает текущей позиции, + // поэтому нам нужно сохранять и восстанавливать ее самим dCurX += tdx; dCurY += tdy; m_pGState->MoveTo(dCurX, dCurY); @@ -3915,7 +3915,7 @@ namespace PdfReader Object oLevel; oXObject.StreamGetDict()->Search("Level1", &oLevel); m_pOut->PSXObject(oXObject.GetStream(), oLevel.IsStream() ? oLevel.GetStream() : (Stream *)NULL); - // + // Добавленно oLevel.Free(); } else if (oSub.IsName()) @@ -3939,7 +3939,7 @@ namespace PdfReader void Graphics::DoImage(Object *pRef, Stream *pStream, bool bInlineImage) { - // + // Считываем информацию из потока int nBitsPerComponent = 0; StreamColorSpaceMode eCSMode = streamCSNone; pStream->GetImageParams(&nBitsPerComponent, &eCSMode); @@ -3979,7 +3979,7 @@ namespace PdfReader int nHeight = oDictItem.GetInt(); oDictItem.Free(); - // : ? + // Проверяем: может быть это маска? pDict->Search("ImageMask", &oDictItem); if (oDictItem.IsNull()) { @@ -4027,7 +4027,7 @@ namespace PdfReader if (bMask) { - // nBitsPerComponent 1 + // У маски это значение nBitsPerComponent должно быть 1 if (nBitsPerComponent != 1) { // TO DO: Error "Bad image parameters" @@ -4056,7 +4056,7 @@ namespace PdfReader } oDictItem.Free(); - // + // Рисуем маску m_pOut->DrawImageMask(m_pGState, pRef, pStream, nWidth, nHeight, bInvert, bInlineImage); } else @@ -4144,7 +4144,7 @@ namespace PdfReader { if (bInlineImage) { - // oMask, oSMask + // Тут наверное нужно освободить память oMask, oSMask // TO DO: Error "Bad image parameters" return; } @@ -4342,7 +4342,7 @@ namespace PdfReader bHaveExplicitMask = true; } - // + // Рисуем if (bHaveSoftMask) { m_pOut->DrawSoftMaskedImage(m_pGState, pRef, pStream, nWidth, nHeight, pColorMap, pMaskStream, nMaskWidth, nMaskHeight, pMaskColorMap); @@ -4377,7 +4377,7 @@ namespace PdfReader { double arrMatrix[6], arrBBox[4]; - // + // Проверяем глубину рекурсии if (m_nFormDepth > 20) { return; @@ -4469,7 +4469,7 @@ namespace PdfReader } oDictItem.Free(); - // + // Рисуем ++m_nFormDepth; DoForm(pStream, pResourcesDict, arrMatrix, arrBBox, bTranspGroup, false, pBlendingColorSpace, bIsolated, bKnockout); --m_nFormDepth; @@ -4483,16 +4483,16 @@ namespace PdfReader void Graphics::DoForm(Object *pStream, Dict *pResourcesDict, double *pMatrix, double *pBBox, bool bTranspGroup, bool bSMask, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bAlpha, Function *pTransferFunctions, GrColor *pBackdropColor) { - // + // Записываем текущую директорию ресурсов в стек PushResources(pResourcesDict); - // GState + // Сохраняем текущий GState SaveGState(); - // Path( - ) + // Очищаем Path(если там что-то было) m_pGState->ClearPath(); - // + // Сохраняем текущий парсер Parser *pOldParser = m_pParser; // CTM @@ -4546,7 +4546,7 @@ namespace PdfReader m_arrBaseMatrix[nIndex] = m_pGState->GetCTM()[nIndex]; } - // + // Рисуем саму форму Display(pStream, false); if (bSMask || bTranspGroup) @@ -4560,7 +4560,7 @@ namespace PdfReader } - // + // Восстанавливаем начальные данные m_pParser = pOldParser; RestoreGState(); PopResources(); @@ -4590,7 +4590,7 @@ namespace PdfReader { DoImage(NULL, pStream, true); - // EI + // Ищем оператор EI int nChar1 = pStream->GetUndecodedStream()->GetChar(); int nChar2 = pStream->GetUndecodedStream()->GetChar(); @@ -4713,15 +4713,15 @@ namespace PdfReader } //------------------------------------------------------------------------------------------------------------------------------- - // + // Дополнительные функции //------------------------------------------------------------------------------------------------------------------------------- void Graphics::DrawAnnotation(Object *pStream, AnnotBorderStyle *pBorderStyle, double dMinX, double dMinY, double dMaxX, double dMaxY) { double dX, dY; - // Annotation BBox - // : (BBox * BaseMatrix) * InvCTM + // Преобразовываем Annotation BBox из стандартного пользовательского пространства в + // текущее пользовательское пространство: (BBox * BaseMatrix) * InvCTM double *pCTM = m_pGState->GetCTM(); double dDet = 1 / (pCTM[0] * pCTM[3] - pCTM[1] * pCTM[2]); double arrInvCTM[6]; @@ -4818,11 +4818,11 @@ namespace PdfReader dFormY1 = dY; } - // Annotation BBox + // Растягиваем до размеров Annotation BBox double dScaleX, dScaleY; if (dFormX1 == dFormX0) { - // + // Такого не должно быть dScaleX = 1; } else @@ -4831,7 +4831,7 @@ namespace PdfReader } if (dFormY1 == dFormY0) { - // + // Такого не должно быть dScaleY = 1; } else @@ -4851,13 +4851,13 @@ namespace PdfReader pDict->Search("Resources", &oResources); Dict *pResourcesDict = oResources.IsDict() ? oResources.GetDict() : (Dict *)NULL; - // + // Рисуем DoForm(pStream, pResourcesDict, arrMatrix, arrBBox); oResources.Free(); } - // + // Рисуем рамку if (pBorderStyle && pBorderStyle->GetWidth() > 0) { if (m_pGState->GetStrokeColorSpace()->GetMode() != csDeviceRGB) @@ -4910,7 +4910,7 @@ namespace PdfReader } } //------------------------------------------------------------------------------------------------------------------------------- - // GState ResourcesDict + // Работаем со стеками GState и ResourcesDict //------------------------------------------------------------------------------------------------------------------------------- void Graphics::SaveGState() { diff --git a/PdfReader/Src/Graphics.h b/PdfReader/Src/Graphics.h index 1434de990f..9f72b86be4 100644 --- a/PdfReader/Src/Graphics.h +++ b/PdfReader/Src/Graphics.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_GRAPHICS_H +#ifndef _PDF_READER_GRAPHICS_H #define _PDF_READER_GRAPHICS_H #include "GlobalParams.h" @@ -49,9 +49,9 @@ namespace PdfReader argString, // String argName, // Name argArray, // Array - argProps, // Properties (Dictionary Name) + argProps, // Properties (Dictionary или Name) argSCN, // scn/SCN - argNone // , + argNone // используется, чтобы избежать пустых полей при инициализации }; #define maxArgs 33 @@ -115,19 +115,19 @@ namespace PdfReader ~Graphics(); - // pObject, : pObject . + // Инициализируем Парсер по pObject, предварительно проводим проверку: Является ли pObject потоком или массивом потоков. void Display(Object *pObject, bool bTopLevel = true); - // annotation + // Рисуем annotation void DrawAnnotation(Object *pStream, AnnotBorderStyle *pBorderStyle, double dMinX, double dMinY, double dMaxX, double dMaxY); - // GState. + // Сохраняем GState. void SaveGState(); - // GState. + // Восстанавливаем предыдущий GState. void RestoreGState(); - // GState. + // Считываем текущий GState. GrState *GetGState() { return m_pGState; @@ -263,28 +263,28 @@ namespace PdfReader private: - XRef *m_pXref; // Xref PDF - + XRef *m_pXref; // Таблица Xref для данного PDF - документа OutputDev *m_pOut; // Output device bool m_bSubPage; // Sub-page object? GrResources *m_pResources; // Resources int m_nUpdateLevel; - GrState *m_pGState; // GState - bool m_bFontChanged; // True, + GrState *m_pGState; // Текущий GState + bool m_bFontChanged; // True, если шрифт или текстовая матрица изменились GrClipType m_eClip; // Clip type - int m_nIgnoreUndef; // BX/EX - double m_arrBaseMatrix[6]; // Page/Form/Pattern + int m_nIgnoreUndef; // Текущий уровень вложенности для BX/EX + double m_arrBaseMatrix[6]; // Стандартная матрица для последних объектов Page/Form/Pattern int m_nFormDepth; - Parser *m_pParser; // + Parser *m_pParser; // Парсер для содержимого страницы - bool(*m_pAbortCheckCallBack)(void *pData); // + bool(*m_pAbortCheckCallBack)(void *pData); // Проверка на отмену void *m_pAbortCheckData; - static Operator OperatorsTable[]; // + static Operator OperatorsTable[]; // Таблица графических операторов #ifdef _DEBUG - FILE *m_pDumpFile; // , PDF + FILE *m_pDumpFile; // Файл для распечатки команд, записанных в PDF #endif GlobalParams *m_pGlobalParams; diff --git a/PdfReader/Src/Hash.cpp b/PdfReader/Src/Hash.cpp index 65a6ea0d00..e038f34a5a 100644 --- a/PdfReader/Src/Hash.cpp +++ b/PdfReader/Src/Hash.cpp @@ -1,4 +1,4 @@ -#include "MemoryUtils.h" +#include "MemoryUtils.h" #include "StringExt.h" #include "Hash.h" diff --git a/PdfReader/Src/Hash.h b/PdfReader/Src/Hash.h index 700a744ad8..a8f977c9e7 100644 --- a/PdfReader/Src/Hash.h +++ b/PdfReader/Src/Hash.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_HASH_H +#ifndef _PDF_READER_HASH_H #define _PDF_READER_HASH_H namespace PdfReader @@ -58,9 +58,9 @@ namespace PdfReader private: - bool m_bDeleteKeys; // ? set if key strings should be deleted - int m_nBucketsCount; // - int m_nLength; // + bool m_bDeleteKeys; // Будем ли удалять имена? set if key strings should be deleted + int m_nBucketsCount; // Количество наборов + int m_nLength; // Количество вхождений THashBucket **m_ppTable; }; diff --git a/PdfReader/Src/JArithmeticDecoder.cpp b/PdfReader/Src/JArithmeticDecoder.cpp index 4785e94966..71cbed064b 100644 --- a/PdfReader/Src/JArithmeticDecoder.cpp +++ b/PdfReader/Src/JArithmeticDecoder.cpp @@ -1,4 +1,4 @@ -#include "Object.h" +#include "Object.h" #include "Stream.h" #include "JArithmeticDecoder.h" diff --git a/PdfReader/Src/JArithmeticDecoder.h b/PdfReader/Src/JArithmeticDecoder.h index b71d06a622..7052b21704 100644 --- a/PdfReader/Src/JArithmeticDecoder.h +++ b/PdfReader/Src/JArithmeticDecoder.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_JARITHMETICDECODER_H +#ifndef _PDF_READER_JARITHMETICDECODER_H #define _PDF_READER_JARITHMETICDECODER_H namespace PdfReader @@ -56,20 +56,20 @@ namespace PdfReader m_bLimitStream = true; } - // . INITDEC. + // Начинаем декодировать новый поток. Заполняем буффер и запускаем INITDEC. void Start(); - // . , INITDEC. ( JPEG 2000, - // .) + // Заново декодируем прервынный поток. Заново заполняем буффер, но не запускаем INITDEC. (Используется в потоках JPEG 2000, где + // данные могут быть разделены на блоки.) void Restart(int nDataSize); - // . + // Читаем оставшиеся данные в потоке. void Cleanup(); - // . + // Декодируем один бит. int DecodeBit(unsigned int unContext, JArithmeticDecoderStats *pStats); - // . + // Декодируем один байт. int DecodeByte(unsigned int unContext, JArithmeticDecoderStats *pStats); bool DecodeInt(int *pnValue, JArithmeticDecoderStats *pStats); diff --git a/PdfReader/Src/JBIG2Stream.cpp b/PdfReader/Src/JBIG2Stream.cpp index 9eacaadd6b..319af0d4d5 100644 --- a/PdfReader/Src/JBIG2Stream.cpp +++ b/PdfReader/Src/JBIG2Stream.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "List.h" #include "JArithmeticDecoder.h" @@ -3617,7 +3617,7 @@ namespace PdfReader } m_pPageBitmap = new JBIG2Bitmap(0, m_unPageW, m_unPageH); - // + // Очищаем картинку if (m_unPageDefPixel) { m_pPageBitmap->ClearToOne(); @@ -3632,7 +3632,7 @@ namespace PdfReader void JBIG2Stream::ReadEndOfStripeSegment(unsigned int unLength) { - // + // Пропускаем данный сегмент for (unsigned int unIndex = 0; unIndex < unLength; ++unIndex) { m_pCurStream->GetChar(); @@ -3641,7 +3641,7 @@ namespace PdfReader void JBIG2Stream::ReadProfilesSegment(unsigned int unLength) { - // + // Пропускаем данный сегмент for (unsigned int unIndex = 0; unIndex < unLength; ++unIndex) { m_pCurStream->GetChar(); @@ -3707,7 +3707,7 @@ namespace PdfReader pHuffTable[unIndex].unRangeLen = jbig2HuffmanEOT; m_pHuffDecoder->BuildTable(pHuffTable, unIndex); - // + // Создаем и сохраняем новый сегмент таблицы m_pSegments->Append(new JBIG2CodeTable(unSegNum, pHuffTable)); return; @@ -3715,7 +3715,7 @@ namespace PdfReader void JBIG2Stream::ReadExtensionSegment(unsigned int unLength) { - // + // Пропускаем данный сегмент for (unsigned int unIndex = 0; unIndex < unLength; ++unIndex) { m_pCurStream->GetChar(); diff --git a/PdfReader/Src/JBIG2Stream.h b/PdfReader/Src/JBIG2Stream.h index a3552e0e56..243986c2f0 100644 --- a/PdfReader/Src/JBIG2Stream.h +++ b/PdfReader/Src/JBIG2Stream.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_JBIG2STREAM_H +#ifndef _PDF_READER_JBIG2STREAM_H #define _PDF_READER_JBIG2STREAM_H #include "Object.h" diff --git a/PdfReader/Src/JPXStream.cpp b/PdfReader/Src/JPXStream.cpp index 0de54ecab5..ac0abe998b 100644 --- a/PdfReader/Src/JPXStream.cpp +++ b/PdfReader/Src/JPXStream.cpp @@ -1,4 +1,4 @@ -#include "MemoryUtils.h" +#include "MemoryUtils.h" #include "JPXStream.h" #include "File.h" @@ -28,12 +28,12 @@ namespace PdfReader { m_pStream->Reset(); - // + // »нициализаци¤ m_lCurPos = 0; m_lBufferSize = 0; m_pSourceBuffer = NULL; - // , + // —оздаем темповый файл, в который сбрасываем картинку FILE *pTempFile = NULL; std::wstring wsTempFile = L""; @@ -79,9 +79,6 @@ namespace PdfReader return; } - - oFrame.SaveFile(L"D://Test Files//test.jp2", _CXIMAGE_FORMAT_JP2); - int nHeight = oFrame.get_Height(); int nWidth = oFrame.get_Width(); int nStride = oFrame.get_Stride(); diff --git a/PdfReader/Src/JPXStream.h b/PdfReader/Src/JPXStream.h index 3262cbdcdc..8c04a09325 100644 --- a/PdfReader/Src/JPXStream.h +++ b/PdfReader/Src/JPXStream.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_JPXSTREAM_H +#ifndef _PDF_READER_JPXSTREAM_H #define _PDF_READER_JPXSTREAM_H #include "Object.h" diff --git a/PdfReader/Src/Lexer.cpp b/PdfReader/Src/Lexer.cpp index 7617bcb88f..d17f65224a 100644 --- a/PdfReader/Src/Lexer.cpp +++ b/PdfReader/Src/Lexer.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -6,8 +6,8 @@ namespace PdfReader { - // '1' - . '1' '2' , - // . + // '1' - означает пробел. '1' или '2' означает, что данным символом заканчивается + // имя или команда. static char c_sSpecialChars[256] = { @@ -49,7 +49,7 @@ namespace PdfReader Lexer::Lexer(XRef *pXref, Object *pObject) { - // , pObject , + // Предполагаем, что в pObject либо поток, либо массив потоков Object oTemp; if (pObject->IsStream()) @@ -123,7 +123,7 @@ namespace PdfReader StringExt *seString; int nCount = 0, nHexCharLen = 0; - // + // Пропускаем комментарии и пробелы bool bComment = false; while (1) { @@ -146,11 +146,11 @@ namespace PdfReader } } - // + // начинаем чтение объекта switch (nChar) { - // + // Число case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '-': case '.': @@ -198,8 +198,8 @@ namespace PdfReader nChar = LookChar(); if (nChar == '-') { - // , - // (Adobe ) + // игнорируем знаки минус, появляющиеся по середине числа + // (Adobe игнорирует такие ситуации) // TO DO: Error "Badly formatted number" GetChar(); @@ -218,11 +218,11 @@ namespace PdfReader pObject->InitReal(dFloat); break; - // + // Строка case '(': pCurPointer = m_sTempBuffer; nCount = 0; - nBracketCount = 1; // + nBracketCount = 1; // счетчик собок bDone = false; seString = NULL; do { @@ -328,7 +328,7 @@ namespace PdfReader seString->Append(m_sTempBuffer, nCount); pObject->InitString(seString); break; - // + // Имя case '/': pCurPointer = m_sTempBuffer; nCount = 0; @@ -386,7 +386,7 @@ namespace PdfReader pObject->InitName(m_sTempBuffer); break; - // + // Массив case '[': case ']': m_sTempBuffer[0] = nChar; @@ -394,7 +394,7 @@ namespace PdfReader pObject->InitCommand(m_sTempBuffer); break; - // Hex Dictionary + // Hex или Dictionary case '<': nChar = LookChar(); @@ -490,7 +490,7 @@ namespace PdfReader pObject->InitError(); break; - // Command ( , 'obj' 'stream') + // Command (это просто какое нибудь зарезервированное слово, например 'obj' или 'stream') default: pCurPointer = m_sTempBuffer; *pCurPointer++ = nChar; diff --git a/PdfReader/Src/Lexer.h b/PdfReader/Src/Lexer.h index 6522bae36d..b156496209 100644 --- a/PdfReader/Src/Lexer.h +++ b/PdfReader/Src/Lexer.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_LEXER_H +#ifndef _PDF_READER_LEXER_H #define _PDF_READER_LEXER_H #include "Object.h" @@ -18,21 +18,21 @@ namespace PdfReader { public: - // . . + // Конструктор для одного потока. Удаляем этот поток в деструкторе. Lexer(XRef *pXref, Stream *pStream); - // . + // Конструкор для одного потока или массива потоков. Lexer(XRef *pXref, Object *pObject); ~Lexer(); - // . + // Считваем следующий объект из потока. Object *GetObject(Object *obj); - // . + // Переходим к началу новой строки. void SkipToNextLine(); - // . + // Переходим к следующему символу. void SkipChar() { GetChar(); @@ -44,8 +44,8 @@ namespace PdfReader return m_oCurStream.IsNone() ? (Stream *)NULL : m_oCurStream.GetStream(); } - // . , - // int, unsigned int. + // Текущая позиция. Используется только для сообщений об ошибке, поэтому + // возвращаемое значение типа int, а не unsigned int. int GetPos() { return m_oCurStream.IsNone() ? -1 : (int)m_oCurStream.StreamGetPos(); @@ -58,7 +58,7 @@ namespace PdfReader m_oCurStream.StreamSetPos(unPos, nDir); } - // nChar . + // Проверяем является ли nChar пробелом. static bool IsSpace(int nChar); private: @@ -68,10 +68,10 @@ namespace PdfReader private: - Array *m_pStreams; // - int m_nCurStreamIndex; // - Object m_oCurStream; // - bool m_bFreeArray; // ? + Array *m_pStreams; // Массив потоков + int m_nCurStreamIndex; // Номер текущего потока + Object m_oCurStream; // Текущий поток + bool m_bFreeArray; // Должны ли мы в данном классе осовбождать массив потоков? char m_sTempBuffer[TokenBufferSize]; // Buffer }; } diff --git a/PdfReader/Src/Link.cpp b/PdfReader/Src/Link.cpp index e7861f7f2a..dd4cafc9ff 100644 --- a/PdfReader/Src/Link.cpp +++ b/PdfReader/Src/Link.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "StringExt.h" @@ -35,7 +35,7 @@ namespace PdfReader return NULL; } - // S ( Action) + // S (тип Action) Object oType; pObject->DictLookup("S", &oType); @@ -136,7 +136,7 @@ namespace PdfReader if (seName) { - // , + // Производим преобразования, связанные с формой записи путей // "//...." --> "\...." // "/x/...." --> "x:\...." diff --git a/PdfReader/Src/Link.h b/PdfReader/Src/Link.h index 78ab2129af..b6ff56523a 100644 --- a/PdfReader/Src/Link.h +++ b/PdfReader/Src/Link.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_LINK_H +#ifndef _PDF_READER_LINK_H #define _PDF_READER_LINK_H #include "Object.h" @@ -16,8 +16,8 @@ namespace PdfReader enum LinkActionType { actionGoTo, // Go to destination - actionGoToR, // Go to destination - actionLaunch, // ( ) + actionGoToR, // Go to destination в новом файле + actionLaunch, // Запускаем приложение (или открываем документ) actionURI, // URI actionNamed, // Named actionMovie, // Movie @@ -30,19 +30,19 @@ namespace PdfReader virtual ~LinkAction() {} - // LinkAction? + // Нормально ли создался объект LinkAction? virtual bool CheckValidate() = 0; - // LinkAction. + // Тип LinkAction. virtual LinkActionType GetType() = 0; - // Destination ( ction) Name, String Array. + // Парсим Destination (старый вариант Аction) Name, String или Array. static LinkAction *ParseDestination(Object *pObject); - // Action dictionary. + // Парсим Action dictionary. static LinkAction *ParseAction(Object *pObject, StringExt *seBaseURI = NULL); - // File specification. + // Достаем название файла для File specification. static StringExt *GetFileSpecName(Object *pFileSpecObject); }; @@ -134,23 +134,23 @@ namespace PdfReader private: - LinkDestinationType m_eType; // - bool m_bPageIsRef; // ? + LinkDestinationType m_eType; // Тип + bool m_bPageIsRef; // Страница задана ссылкой или номером? union { - Ref m_oPageRef; // - int m_nPageNum; // + Ref m_oPageRef; // Ссылка на страницу + int m_nPageNum; // Относительный номер страницы }; double m_dLeft; // - double m_dBottom; // + double m_dBottom; // Позиция double m_dRight; // double m_dTop; // double m_dZoom; // Zoom - bool m_bChangeLeft; // destXYZ. - bool m_bChangeTop; // , + bool m_bChangeLeft; // Для destXYZ. В данном случае может измениться + bool m_bChangeTop; // как позиция, так и зуммирование bool m_bChangeZoom; // bool m_bValidate; // @@ -425,7 +425,7 @@ namespace PdfReader return m_bValid; } - // + // Попала ли точка в рект bool InRect(double dX, double dY) { return m_dLeft <= dX && dX <= m_dRight && m_dBottom <= dY && dY <= m_dTop; @@ -477,10 +477,10 @@ namespace PdfReader } - // (dX, dY) Link, Action. + // Если точка (dX, dY) попадает в Link, тогда возвращаем соответствующий Action. LinkAction *Find(double dX, double dY); - // Link. + // Проверяем попадает ли точка в Link. bool OnLink(double dX, double dY); private: diff --git a/PdfReader/Src/List.cpp b/PdfReader/Src/List.cpp index 4e69e7586f..3567a191c1 100644 --- a/PdfReader/Src/List.cpp +++ b/PdfReader/Src/List.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "List.h" diff --git a/PdfReader/Src/List.h b/PdfReader/Src/List.h index 6b8ef97360..1871c50862 100644 --- a/PdfReader/Src/List.h +++ b/PdfReader/Src/List.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_LIST_H +#ifndef _PDF_READER_LIST_H #define _PDF_READER_LIST_H namespace PdfReader @@ -12,13 +12,13 @@ namespace PdfReader public: - // . + // Создаем пустой список. CList(); - // . + // Создаем пустой список с с выделенной памятью под элементов. CList(int nSize); - // . + // Деструктор. ~CList(); int GetLength() @@ -26,8 +26,8 @@ namespace PdfReader return m_nCount; } - // . - // 0 <= nIndex < m_nCount, NULL. + // Возвращает Ый элемент. + // Если 0 <= nIndex < m_nCount, возвращает NULL. void *GetByIndex(int nIndex) { if (nIndex < 0 || nIndex >= m_nCount) @@ -35,27 +35,27 @@ namespace PdfReader return m_ppData[nIndex]; } - // . + // Добавляем элемент в окнец списка. void Append(void *pItem); - // . + // Добавляем другой список в конец данного. void Append(CList *pList); - // . - // !(0 <= nIndex <= m_nCount), . + // Вставляем элемент на место . + // Если !(0 <= nIndex <= m_nCount), ничего не делаем. void Insert(int nIndex, void *pItem); - // . - // !(0 <= nIndex <= m_nCount), . + // Удаляем из списка и возвращаем ссылку на элемент. + // Если !(0 <= nIndex <= m_nCount), ничего не делаем. void *Delete(int nIndex); - // , - // . + // Сортируем список, в соответствии с данной функцией + // сранвения. void Sort(int(*CompareFunc)(const void *pItem1, const void *pItem2)); - // m_nIncreament > 0, - // m_nIncreament . m_nIncreament <= 0, - // . + // Если m_nIncreament > 0, тогда при расширении списка ровно + // m_nIncreament элементов будет добавляться. Если m_nIncreament <= 0, + // тогда список будем удваивать при расширении. void SetAllocationIncreament(int nIncreament) { m_nIncreament = nIncreament; @@ -68,10 +68,10 @@ namespace PdfReader private: - void **m_ppData; // - int m_nItemSize; // - int m_nCount; // - int m_nIncreament; // + void **m_ppData; // список элементов + int m_nItemSize; // размер данных в массиве + int m_nCount; // количестов элементов в списке + int m_nIncreament; // на сколько будем увеличивать список }; #define DeleteCList(list, T) \ diff --git a/PdfReader/Src/MemoryUtils.h b/PdfReader/Src/MemoryUtils.h index 431101a255..53734fd693 100644 --- a/PdfReader/Src/MemoryUtils.h +++ b/PdfReader/Src/MemoryUtils.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_MEMORY_UTILS_H +#ifndef _PDF_READER_MEMORY_UTILS_H #define _PDF_READER_MEMORY_UTILS_H #include @@ -8,7 +8,7 @@ namespace PdfReader { //------------------------------------------------------------------------ - // malloc, . + // Аналогично malloc, но с обработкой ошибок. static void *MemUtilsMalloc(int nSize) { void *pResult; @@ -18,14 +18,14 @@ namespace PdfReader if (!(pResult = malloc(nSize))) { - // TO DO: + // TO DO: Выдать ошибку выделения памяти } return pResult; } - // realloc, . - // NULL, malloc realloc. + // Тоже что и realloc, но с обработкой ошибок. + // Если NULL, вызывается функция malloc вместо realloc. static void *MemUtilsRealloc(void *pData, int nSize) { void *pResult; @@ -42,17 +42,17 @@ namespace PdfReader pResult = malloc(nSize); if (!pResult) { - // TO DO: + // TO DO: Выдать ошибку выделения памяти } return pResult; } - // , MemUtilsMalloc and MemUtilsRelloc, t - // . - // nObjectsCount * nObjectSize . - // , - // int. + // Тоже самое, что и MemUtilsMalloc and MemUtilsRelloc, толькоt + // учитывает количество элементов и размер элемента. В результате + // выделяется память размером nObjectsCount * nObjectSize байт. + // Кроме того присутствует обработка ошибок и проверка того, чтобы + // суммарный размер не превышал предел для int. static void *MemUtilsMallocArray(int nObjectsCount, int nObjectSize) { if (0 == nObjectsCount) @@ -61,12 +61,12 @@ namespace PdfReader int nSize = nObjectsCount * nObjectSize; if (nObjectSize <= 0 || nObjectsCount < 0 || nObjectsCount >= INT_MAX / nObjectSize) { - // TO DO: + // TO DO: Выдать ошибку выделения памяти } return MemUtilsMalloc(nSize); } - // free, NULL-. + // Тоже что и free, но проверяет и игнорирует NULL-указатели. static void MemUtilsFree(void *pData) { if (pData) @@ -85,12 +85,12 @@ namespace PdfReader if (nObjectSize <= 0 || nObjectsCount < 0 || nObjectsCount >= INT_MAX / nObjectSize) { - // TO DO: + // TO DO: Выдать ошибку выделения памяти } return MemUtilsRealloc(pData, nSize); } - // . + // Выделяем память и копируем туда строку. static char *CopyString(char *sString) { char *sResult = (char *)MemUtilsMalloc(strlen(sString) + 1); diff --git a/PdfReader/Src/NameToCharCode.cpp b/PdfReader/Src/NameToCharCode.cpp index 456f5fedba..34e7c7bd21 100644 --- a/PdfReader/Src/NameToCharCode.cpp +++ b/PdfReader/Src/NameToCharCode.cpp @@ -1,4 +1,4 @@ -#include +#include #include "MemoryUtils.h" #include "NameToCharCode.h" @@ -38,7 +38,7 @@ namespace PdfReader void NameToCharCode::Add(char *sName, CharCode nCode) { - // , + // Увеличиваем таблицу, в случае необходимости if (m_nLen >= m_nSize / 2) { int nOldSize = m_nSize; @@ -67,7 +67,7 @@ namespace PdfReader MemUtilsFree(pOldTable); } - // + // Добавляем новое имя int nHash = Hash(sName); while (m_pTable[nHash].sName && strcmp(m_pTable[nHash].sName, sName)) { diff --git a/PdfReader/Src/NameToCharCode.h b/PdfReader/Src/NameToCharCode.h index b1c822076c..d60dc5909e 100644 --- a/PdfReader/Src/NameToCharCode.h +++ b/PdfReader/Src/NameToCharCode.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_NAME_TO_CHAR_CODE_H +#ifndef _PDF_READER_NAME_TO_CHAR_CODE_H #define _PDF_READER_NAME_TO_CHAR_CODE_H #include "CharTypes.h" diff --git a/PdfReader/Src/NameToUnicodeTable.h b/PdfReader/Src/NameToUnicodeTable.h index 4f6c466ca8..73f21e8c98 100644 --- a/PdfReader/Src/NameToUnicodeTable.h +++ b/PdfReader/Src/NameToUnicodeTable.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_NAME_TO_UNICODE_TABLE +#ifndef _PDF_READER_NAME_TO_UNICODE_TABLE #define _PDF_READER_NAME_TO_UNICODE_TABLE namespace PdfReader diff --git a/PdfReader/Src/Object.cpp b/PdfReader/Src/Object.cpp index 5d23ec8c4b..d5637c58f7 100644 --- a/PdfReader/Src/Object.cpp +++ b/PdfReader/Src/Object.cpp @@ -1,4 +1,4 @@ -#include +#include #include "Object.h" #include "Array.h" #include "Dict.h" diff --git a/PdfReader/Src/Object.h b/PdfReader/Src/Object.h index 5a289fb185..d3fd5345b2 100644 --- a/PdfReader/Src/Object.h +++ b/PdfReader/Src/Object.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_OBJECT_H +#ifndef _PDF_READER_OBJECT_H #define _PDF_READER_OBJECT_H #include @@ -24,8 +24,8 @@ namespace PdfReader struct Ref { - int nNum; // - int nGen; // (generation number) + int nNum; // Номер объекта + int nGen; // Номер версии объекта(generation number) public: @@ -61,12 +61,12 @@ namespace PdfReader }; //------------------------------------------------------------------------ - // + // Типы объектов //------------------------------------------------------------------------ enum ObjType { - // + // Простые объекты objBool, // boolean objInt, // integer objReal, // real @@ -74,13 +74,13 @@ namespace PdfReader objName, // name objNull, // null - // + // составные объекты objArray, // array objDict, // dictionary objStream, // stream objRef, // indirect reference - // + // специальные объекты objCommand, // command name objError, // error return from Lexer objEOF, // end of file return from Lexer @@ -167,16 +167,16 @@ namespace PdfReader } - // . + // Копируем объект. Object *Copy(Object *pObject); - // - , , . + // Если объект - сслка, тогда получаес объект по ссылку, в противном случае копируем данный объект. Object *Fetch(XRef *pXref, Object *pObject); // void Free(); - // . + // Проверка тип объекта. ObjType GetType() { return m_eType; @@ -242,7 +242,7 @@ namespace PdfReader return (m_eType == objNone); } - // . + // Сепциальные проверки. bool IsName(char *sName) { return (m_eType == objName && !strcmp(m_uName, sName)); @@ -253,8 +253,8 @@ namespace PdfReader { return (m_eType == objCommand && !strcmp(m_uCommand, sCommand)); } - // , . - // .. . + // В следующих функциях предполагается, что тип объекта корректный. + // Т.е. соответствует типу запрашиваемого значения. bool GetBool() { return m_uBool; @@ -336,25 +336,25 @@ namespace PdfReader void StreamSetPos(unsigned int unPos, int nDirection = 0); Dict *StreamGetDict(); - // + // Для записи char *GetTypeName(); void Print(FILE *pFile = stdout); private: - ObjType m_eType; // + ObjType m_eType; // тип объекта union { bool m_uBool; // boolean int m_uInt; // integer double m_uReal; // real StringExt *m_uStringExt; // StringExt - char *m_uName; // - Array *m_uArray; // - Dict *m_uDict; // - Stream *m_uStream; // - Ref m_uRef; // - char *m_uCommand; // + char *m_uName; // имя + Array *m_uArray; // массив + Dict *m_uDict; // словарь + Stream *m_uStream; // поток + Ref m_uRef; // ссылка + char *m_uCommand; // команда }; }; } diff --git a/PdfReader/Src/Outline.cpp b/PdfReader/Src/Outline.cpp index b3b9f8ce52..a8e073ac05 100644 --- a/PdfReader/Src/Outline.cpp +++ b/PdfReader/Src/Outline.cpp @@ -1,4 +1,4 @@ -#include "MemoryUtils.h" +#include "MemoryUtils.h" #include "StringExt.h" #include "List.h" #include "Link.h" diff --git a/PdfReader/Src/Outline.h b/PdfReader/Src/Outline.h index 58d9a44e27..a3c097e8c8 100644 --- a/PdfReader/Src/Outline.h +++ b/PdfReader/Src/Outline.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_OUTLINE_H +#ifndef _PDF_READER_OUTLINE_H #define _PDF_READER_OUTLINE_H #include "Object.h" @@ -29,7 +29,7 @@ namespace PdfReader private: - CList *m_pItems; // NULL, Outline + CList *m_pItems; // NULL, если у документа нет Outline // [OutlineItem] }; @@ -76,17 +76,17 @@ namespace PdfReader private: - XRef *m_pXref; // Xref PDF- - Unicode *m_pTitle; // - int m_nTitleLen; // + XRef *m_pXref; // Таблица Xref данного PDF-документа + Unicode *m_pTitle; // Название данной закладки + int m_nTitleLen; // Длина названия LinkAction *m_pAction; // LinkAction - Object m_oFirstRef; // (Ref) First - Object m_oLastRef; // (Ref) Last - Object m_oNextRef; // (Ref) Next + Object m_oFirstRef; // Ссылка(Ref) на First + Object m_oLastRef; // Ссылка(Ref) на Last + Object m_oNextRef; // Ссылка(Ref) на Next - bool m_bOpen; // - CList *m_pKids; // NULL, [OutlineItem] + bool m_bOpen; // Будет ли вкладка открытой при открытии документа + CList *m_pKids; // NULL, если данный пункт не открыт [OutlineItem] }; } diff --git a/PdfReader/Src/OutputDevice.cpp b/PdfReader/Src/OutputDevice.cpp index 498077df3a..9f97c39c0b 100644 --- a/PdfReader/Src/OutputDevice.cpp +++ b/PdfReader/Src/OutputDevice.cpp @@ -1,4 +1,4 @@ -#include +#include #include "Object.h" #include "Stream.h" #include "GState.h" diff --git a/PdfReader/Src/OutputDevice.h b/PdfReader/Src/OutputDevice.h index 5d8ea50329..6668ec7ac2 100644 --- a/PdfReader/Src/OutputDevice.h +++ b/PdfReader/Src/OutputDevice.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_OUTPUT_DEVICE_H +#ifndef _PDF_READER_OUTPUT_DEVICE_H #define _PDF_READER_OUTPUT_DEVICE_H #include "CharTypes.h" @@ -34,113 +34,113 @@ namespace PdfReader virtual ~OutputDev() {} - //------ + //------ Информация о выходном устройстве - // True, (0,0) . + // True, если точка с координатой (0,0) находится в левом верхнем углу. virtual bool UpSideDown() = 0; - // DrawChar() DrawString()? + // Вывод текста с помощью функции DrawChar() или DrawString()? virtual bool UseDrawChar() = 0; - // TilingPatternFill? , - // TilingPatternFill - // . + // Поддерживает ли данное устройство TilingPatternFill? Если нет, тогда + // TilingPatternFill будет рисоваться с помощью комбинации более простых + // графических примитивов. virtual bool UseTilingPatternFill() { return false; } - // SimpleTilingPatternFill? , - // TilingPatternFill - // . + // Поддерживает ли данное устройство SimpleTilingPatternFill? Если нет, тогда + // TilingPatternFill будет рисоваться с помощью комбинации более простых + // графических примитивов. virtual bool UseSimpleTilingPatternFill() { return false; } - // FunctionShadedFill? , - // Shaded fills . + // Поддерживает ли данное устройство FunctionShadedFill? Если нет, тогда данные + // Shaded fills будут заменены комбинацией более простых графических примитивов. virtual bool UseFunctionalShadedFills() { return false; } - // AxialShadedFill? , - // Shaded fills . + // Поддерживает ли данное устройство AxialShadedFill? Если нет, тогда данные + // Shaded fills будут заменены комбинацией более простых графических примитивов. virtual bool UseAxialShadedFills() { return false; } - // RadialShadedFill? , - // Shaded fills . + // Поддерживает ли данное устройство RadialShadedFill? Если нет, тогда данные + // Shaded fills будут заменены комбинацией более простых графических примитивов. virtual bool UseRadialShadedFills() { return false; } - // DrawForm()? + // Поддерживается ли DrawForm()? virtual bool UseDrawForm() { return false; } - // ClipToPath Clip, EoClip, ClipToPathStroke + // Используем команду ClipToPath для клипа или команды Clip, EoClip, ClipToPathStroke virtual bool UseClipTo() { return false; } - // BeginType3Char/EndType3Char? - // Type3 - // DrawChar/DrawString. + // Использует ли данное устройство методы BeginType3Char/EndType3Char? + // В противном случае тект в шрифте Type3 будет выводится с помощью + // функций DrawChar/DrawString. virtual bool InterpretType3Chars() = 0; - // - ? + // Поддерживается ли данным устройством что-нибудь кроме текста? virtual bool NeedNonText() { return true; } - // Path + // Поддерживается ли данным устройствой одновременные обводка и заливка Path virtual bool UseFillAndStroke() { return false; } - // + // В каком виде мы используем группу прозрачных объектов virtual bool UseSimpleTransparentGroup() { return false; } - //------ + //------ Информация о выходном устройстве - // . + // Устанавливаем стандартную матрицу преобразований. virtual void SetDefaultCTM(double *pCTM); - // , . - // False, . , OutputDev - // , , - // False. + // Проверяем, должна ли мы показывать данную часть страницы. Если возращаемое + // значение False, показ страницы прерывается. Как правило, OutputDev будет + // использовать дополнительные средства, чтобы показать страницу, прежде чем + // вернет значение False. virtual bool CheckPageSlice(Page *pPage, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool bPrinting, Catalog *pCatalog, bool(*pAbortCheckCallBack)(void *pData) = NULL, void *pAbortCheckData = NULL) { return true; } - // . + // Новая страница. virtual void StartPage(int nPageNum, GrState *pGState) {} - // . + // Конец страницы. virtual void EndPage() {} - // . + // Вывод содержимого страницы. virtual void Dump() {} - // + // Остановка вывода virtual bool IsStopped() { return false; } - //----- ( ) + //----- Системы координат (пользовательские и устройства) - // + // Конвертации virtual void ConvertDeviceToUser(double dDevX, double dDevY, double *pdUserX, double *pdUserY); virtual void ConvertUserToDevice(double dUserX, double dUserY, int *pnDevX, int *pnDevY); @@ -157,7 +157,7 @@ namespace PdfReader virtual void SaveGState(GrState *pGState) {} virtual void RestoreGState(GrState *pGState) {} - //----- GState + //----- Изменение параметров в GState virtual void UpdateAll(GrState *pGState); virtual void UpdateCTM(GrState *pGState, double dM11, double dM12, double dM21, double dM22, double dM31, double dM32) {} virtual void UpdateLineDash(GrState *pGState) {} @@ -178,7 +178,7 @@ namespace PdfReader virtual void UpdateStrokeOverprint(GrState *pGState) {} virtual void UpdateTransfer(GrState *pGState) {} - //----- + //----- Изменение текстовых параметров virtual void UpdateFont(GrState *pGState) {} virtual void UpdateTextMatrix(GrState *pGState) {} virtual void UpdateCharSpace(GrState *pGState) {} @@ -189,7 +189,7 @@ namespace PdfReader virtual void UpdateTextPos(GrState *pGState) {} virtual void UpdateTextShift(GrState *pGState, double dShift) {} - //----- Path + //----- Рисование Path virtual void Stroke(GrState *pGState) {} virtual void Fill(GrState *pGState) {} virtual void EoFill(GrState *pGState) {} @@ -226,7 +226,7 @@ namespace PdfReader virtual void ClipToStrokePath(GrState *pGState) {} virtual void ClipToPath(GrState *pGState, GrPath *pPath, double *pMatrix, bool bEO) {} - //----- + //----- Вывод текста virtual void BeginStringOperator(GrState *pGState) {} virtual void EndStringOperator(GrState *pGState) {} virtual void BeginString(GrState *pGState, StringExt *seString) {} @@ -238,7 +238,7 @@ namespace PdfReader virtual void BegintTextObject(GrState *pGState){} virtual void EndTextObject(GrState *pGState) {} - //----- + //----- Вывод картинок virtual void DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage); virtual void DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pnMaskColors, bool bInlineImage); virtual void DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert); @@ -250,7 +250,7 @@ namespace PdfReader virtual void OpiEnd (GrState *pGState, Dict *pOpiDict); #endif - //----- Type 3 - + //----- Операторы Type 3 - шрифтов virtual void Type3D0(GrState *pGState, double dWx, double dWy) {} virtual void Type3D1(GrState *pGState, double dWx, double dWy, double dLLx, double dLLy, double dURx, double dURy) {} @@ -260,7 +260,7 @@ namespace PdfReader //----- PostScript XObjects virtual void PSXObject(Stream *pPSStream, Stream *pLevel1Stream) {} - //----- Transparency groups SMasks + //----- Transparency groups и SMasks virtual void BeginTransparencyGroup(GrState *pGState, double *pBBox, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bForSoftMask) {} virtual void EndTransparencyGroup(GrState *pGState) {} virtual void PaintTransparencyGroup(GrState *pGState, double *pBBox) {} @@ -278,8 +278,8 @@ namespace PdfReader private: - double m_arrDefaultCTM[6]; // - double m_arrDefaultInvCTM[6]; // + double m_arrDefaultCTM[6]; // Матрица преобразования по умолчанию + double m_arrDefaultInvCTM[6]; // Обратная матрица protected: diff --git a/PdfReader/Src/PDFDoc.cpp b/PdfReader/Src/PDFDoc.cpp index 411953403d..98d43947ae 100644 --- a/PdfReader/Src/PDFDoc.cpp +++ b/PdfReader/Src/PDFDoc.cpp @@ -1,4 +1,4 @@ -#include "../../DesktopEditor/common/File.h" +#include "../../DesktopEditor/common/File.h" #include #include @@ -21,7 +21,7 @@ #include "Outline.h" #include "PDFDoc.h" -#define HeaderSearchSize 1024 // , '%PDF' +#define HeaderSearchSize 1024 // Максимальное количество байт для считывания с начала файла, в которых мы ищем запись '%PDF' namespace PdfReader { @@ -53,11 +53,11 @@ namespace PdfReader if (!m_pFileBuffer) { - // , + // Не смогли выделить память под весь файл, тогда работаем непосредственно с самим файлом m_pFileBuffer = NULL; m_pFile = oFile.GetFileNative(); - // + // Создаем поток Object oTemp; oTemp.InitNull(); m_pStream = new FileStream(m_pFile, 0, false, 0, &oTemp); @@ -88,7 +88,7 @@ namespace PdfReader return; } - // + // Создаем поток Object oTemp; oTemp.InitNull(); m_pStream = new MemoryStream((char*)m_pFileBuffer, 0, lFileSize, &oTemp); @@ -103,10 +103,10 @@ namespace PdfReader { m_pStream->Reset(); - // PDF + // Проверяем заголовок PDF файла CheckHeader(); - // Xref + // Считываем таблицу Xref m_pXref = new XRef(m_pStream); if (!m_pXref->CheckValidate()) { @@ -115,14 +115,14 @@ namespace PdfReader return false; } - // + // Проверяем зашифрован ли документ if (!CheckEncryption(seOwnerPassword, seUserPassword)) { m_eErrorCode = errorEncrypted; return false; } - // Catalog + // Считываем объект Catalog m_pCatalog = new Catalog(m_pGlobalParams, m_pXref); if (!m_pCatalog->CheckValidation()) { @@ -131,7 +131,7 @@ namespace PdfReader return false; } - // Outline + // Считываем объект Outline m_pOutline = new Outline(m_pCatalog->GetOutline(), m_pXref); return true; @@ -221,13 +221,13 @@ namespace PdfReader { if (pSecurityHandler->CheckEncryption(ownerPassword, userPassword)) { - // + // Авторизация пройдена m_pXref->SetEncryption(pSecurityHandler->GetPermissionFlags(), pSecurityHandler->GetOwnerPasswordValid(), pSecurityHandler->GetFileKey(), pSecurityHandler->GetFileKeyLength(), pSecurityHandler->GetEncodingVersion(), pSecurityHandler->GetEncodingAlgorithm()); bResult = true; } else { - // + // Авторизация не пройдена bResult = false; } delete pSecurityHandler; @@ -239,7 +239,7 @@ namespace PdfReader } else { - // PDF + // Данный PDF файл не зашифрован bResult = true; } oEncypt.Free(); diff --git a/PdfReader/Src/PDFDoc.h b/PdfReader/Src/PDFDoc.h index ae6ba52c17..4e2debb82b 100644 --- a/PdfReader/Src/PDFDoc.h +++ b/PdfReader/Src/PDFDoc.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_PDF_DOC_H +#ifndef _PDF_READER_PDF_DOC_H #define _PDF_READER_PDF_DOC_H #include @@ -27,49 +27,49 @@ namespace PdfReader PDFDoc(GlobalParams *pGlobalParams, const wchar_t* wsFileName, StringExt *seOwnerPassword = NULL, StringExt *seUserPassword = NULL); ~PDFDoc(); - // PDF ? + // Нормально ли открылся PDF файл? bool CheckValidation() { return m_bValid; } - // , PDF . + // Получаем код ошибки, если PDF файл не открылся. EError GetErrorCode() { return m_eErrorCode; } - // . + // Считываем имя файла. std::wstring GetFileName() { return m_wsFileName; } - // Xref. + // Считываем таблицу Xref. XRef *GetXRef() { return m_pXref; } - // atalog. + // Считываем объект Сatalog. Catalog *GetCatalog() { return m_pCatalog; } - // . + // Считываем поток. BaseStream *GetBaseStream() { return m_pStream; } - // C . + // Cчитываем параметры страницы. double GetPageMediaWidth(int nPageIndex) { return m_pCatalog->GetPage(nPageIndex)->GetMediaWidth(); @@ -92,63 +92,63 @@ namespace PdfReader } - // . + // Считываем количество страниц. int GetPagesCount() { return m_pCatalog->GetPagesCount(); } - // Catalog. + // Возвращаем содержимое потока метаданных объекта Catalog. StringExt *ReadMetadata() { return m_pCatalog->ReadMetadata(); } - // StructureTreeRoot. + // Возвращаем объект StructureTreeRoot. Object *GetStructTreeRoot() { return m_pCatalog->GetStructTreeRoot(); } - // pOut. + // Выводим данную страницу на устройство pOut. void DisplayPage(OutputDev *pOut, int nPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, bool(*pAbortCheckCbk)(void *pData) = NULL, void *pAbortCheckCbkData = NULL); - // . + // Выводим сразу несколько страниц. void DisplayPages(OutputDev *pOut, int nFirstPageIndex, int nLastPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, bool(*pAbortCheckCbk)(void *pData) = NULL, void *pAbortCheckCbkData = NULL); - // . + // Выводим часть страницы. void DisplayPageSlice(OutputDev *pOut, int nPageIndex, double dHorDPI, double dVerDPI, int nRotate, bool bUseMediaBox, bool bCrop, bool bPrinting, int nSliceX, int nSliceY, int nSliceW, int nSliceH, bool(*pAbortCheckCbk)(void *pData) = NULL, void *pAbortCheckCbkData = NULL); - // . 0, . + // Ищем страницу по ее объектным номерам. Возвращаем 0, если страница не найдена. int FindPage(int nNum, int nGen) { return m_pCatalog->FindPage(nNum, nGen); } - // Links . + // Возвращаем Links для текущей страницы. Links *GetLinks(int nPageIndex); - // Destination . Link destination NULL, Destination. + // Ищем Destination по имени. Возвращаем Link destination или NULL, если не объект Destination. LinkDestination *FindDest(StringExt *seName) { return m_pCatalog->FindDest(seName); } - // Links . + // Обрабатываем Links для данной страницы. void ProcessLinks(OutputDev *pOut, int nPageIndex); - // utline. + // Возвращаем объект Оutline. Outline *GetOutline() { return m_pOutline; } - // ? + // Зашифрован ли файл? bool IsEncrypted() { return m_pXref->CheckEncrypted(); } - // . + // Проверяем различные ограничения. bool CheckPrint(bool bIgnoreOwnerPassword = false) { return m_pXref->CheckPrint(bIgnoreOwnerPassword); @@ -166,9 +166,9 @@ namespace PdfReader return m_pXref->CheckAddNotes(bIgnoreOwnerPassword); } - // PDF (. Linearized PDF) + // Данный PDF файл является линеаризированным (см. Linearized PDF) bool IsLinearized(); - // Info. + // Воозвращаем объек Info. Object *GetDocInfo(Object *pObject) { return m_pXref->GetDocInfo(pObject); @@ -178,7 +178,7 @@ namespace PdfReader return m_pXref->GetDocInfoCopy(pObject); } - // PDF . + // Возвращаем версию PDF файла. double GetPDFVersion() { return m_dPDFVersion; @@ -192,18 +192,18 @@ namespace PdfReader private: - std::wstring m_wsFileName; // . - FILE* m_pFile; // - unsigned char* m_pFileBuffer; // + std::wstring m_wsFileName; // Имя исходного файла. + FILE* m_pFile; // Указатель на файловый поток + unsigned char* m_pFileBuffer; // Буфер для файла - BaseStream* m_pStream; // , - double m_dPDFVersion; // PDF (1.1 - 1.7) - XRef* m_pXref; // Xref - Catalog* m_pCatalog; // Catalog - Outline* m_pOutline; // Outline () + BaseStream* m_pStream; // Поток, в который считан весь файл + double m_dPDFVersion; // Верисия PDF файла (1.1 - 1.7) + XRef* m_pXref; // Таблица Xref + Catalog* m_pCatalog; // Указатель на объект Catalog + Outline* m_pOutline; // Указатель на Outline (меню) - bool m_bValid; // PDF - EError m_eErrorCode; // + bool m_bValid; // Нормально ли открылся PDF файл + EError m_eErrorCode; // Код ошибки GlobalParams* m_pGlobalParams; }; diff --git a/PdfReader/Src/PDFDocEncoding.h b/PdfReader/Src/PDFDocEncoding.h index ffee11c10d..1dcfb5b03b 100644 --- a/PdfReader/Src/PDFDocEncoding.h +++ b/PdfReader/Src/PDFDocEncoding.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_PDF_DOC_ENCODING_H +#ifndef _PDF_READER_PDF_DOC_ENCODING_H #define _PDF_READER_PDF_DOC_ENCODING_H #include "CharTypes.h" diff --git a/PdfReader/Src/PDFReader.cpp b/PdfReader/Src/PDFReader.cpp deleted file mode 100644 index 22da6ea8c3..0000000000 --- a/PdfReader/Src/PDFReader.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// PDFReader.cpp : Implementation of CPDFReader - -#include "stdafx.h" -#include "PDFReader.h" - - -// CPDFReader - diff --git a/PdfReader/Src/PDFReader.h b/PdfReader/Src/PDFReader.h deleted file mode 100644 index a0cbd8cd10..0000000000 --- a/PdfReader/Src/PDFReader.h +++ /dev/null @@ -1,512 +0,0 @@ -// PDFReader.h : Declaration of the CPDFReader - -#pragma once -#include "resource.h" // main symbols - -#include "../../Common/OfficeFileErrorDescription.h" -#include "../../Common/OfficeDefines.h" - -#include "PDFDoc.h" -#include "GlobalParams.h" -#include "ErrorConstants.h" -#include "ExtractImageOutputDev.h" -#include "RendererOutputDev.h" - -#include "ImageOutputDev.h" -#include "SBitmap.h" - -//#define AVSGraphics AVSOfficeEditor -//#define _IAVSDocumentPainterEvents _IAVSOfficeViewerEvents -//#define IAVSDocumentPainter IAVSOfficeViewer -//#define IAVSDocumentRenderer IAVSCommandsRenderer -//#define _IAVSDocumentRendererEvents _IAVSCommandsRendererEvents -//#define CAVSDocumentPainter CAVSOfficeViewer - -#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA) -#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms." -#endif - - -//#define _MEMORY_DEBUG -#ifdef _MEMORY_DEBUG - -#define _CRTDBG_MAP_ALLOC -#include -#include - -#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) - -#define new DEBUG_NEW - -#endif - -// IPDFReader -[ - object, - uuid("908EA939-E01D-47E0-B182-625826C2D7B1"), - dual, helpstring("IPDFReader Interface"), - pointer_default(unique) -] -__interface IPDFReader : IDispatch -{ - - [id(10)] HRESULT LoadPDF([in]BSTR bsSrcPath, [in]BSTR bsOwnerPassword = NULL, [in]BSTR bsUserPassword = NULL, [in]BSTR bsOptions = NULL); - [id(11)] HRESULT Close(); - - [id(100)] HRESULT GetPagesCount([out, retval]int *pnCount); - [id(101)] HRESULT GetPDFVersion([out, retval]double *pdVersion); - [id(102)] HRESULT GetPDFPermissions([out, retval]int *pnPermissions); - [id(103)] HRESULT GetPDFInfo([out, retval]BSTR *pbsInfo); - [id(104)] HRESULT SetTempFolder([in] BSTR bsTempFolder); - [id(105)] HRESULT GetTempFolder([out, retval] BSTR *pbsTempFolder); - - [id(200)] HRESULT ExtractImages([in]BSTR bsDstPath, [in]BSTR bsPrefix); - [id(201)] HRESULT DisplayPage([in]int nPageIndex, [in]BSTR bsPath, [in]BSTR bsXmlOptions, [out]double *pdWidth, [out]double *pdHeight, [in]BOOL *pbBreak); - [id(202)] HRESULT DisplayAllPages([in]BSTR bsPath, [out]BSTR *pbsDstXml, [in]BSTR bsXmlOption, [in]BOOL *pbBreak); - [id(203)] HRESULT DisplayPage2([in]IUnknown *punkRenderer, [in]int nPageIndex, [in]BSTR bsPath, [in]BSTR bsXmlOptions, [out]double *pdWidth, [out]double *pdHeight, [in]BOOL *pbBreak); - - [id(300)] HRESULT GetCommandRenderer([out, retval] IUnknown** ppRenderer); - [id(301)] HRESULT SetCommandRenderer([in] IUnknown* pRenderer); - - [id(10001)] HRESULT SetAdditionalParam([in] BSTR ParamName, [in] VARIANT ParamValue); - [id(10002)] HRESULT GetAdditionalParam([in] BSTR ParamName, [out] VARIANT * ParamValue); -}; - - - -// CPDFReader - -[ - coclass, - default(IPDFReader), - threading(apartment), - vi_progid("AVSOfficePDFReader.PDFReader"), - progid("AVSOfficePDFReader.PDFReader.1"), - version(1.0), - uuid("A329E783-2E52-4C96-A032-ADD2A5DADD0D"), - helpstring("PDFReader Class") -] -class ATL_NO_VTABLE CPDFReader : - public IPDFReader -{ -private: - - PDFDoc *m_pPDFDocument; - GlobalParams *m_pGlobalParams; - AVSGraphics::IASCRenderer *m_piDocumentRenderer; - CStringW m_sTempFolder; - CFontList m_oFontList; - - -public: - CPDFReader(): m_piDocumentRenderer(NULL) - { - } - - - - DECLARE_PROTECT_FINAL_CONSTRUCT() - - HRESULT FinalConstruct() - { -#ifdef _MEMORY_DEBUG - _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); - _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_WNDW ); -#endif - - m_sTempFolder = _T(""); - m_pPDFDocument = NULL; - m_oFontList.Clear(); - - m_pGlobalParams = new GlobalParams( "" ); - m_pGlobalParams->SetCMapsDir(); - - return S_OK; - } - - void FinalRelease() - { - m_oFontList.Clear(); - - if ( m_pPDFDocument ) - delete m_pPDFDocument; - - if ( m_pGlobalParams ) - { - delete m_pGlobalParams; - m_pGlobalParams = NULL; - } - - - RELEASEINTERFACE( m_piDocumentRenderer ); - } - -public: - - STDMETHOD(LoadPDF)(BSTR bsSrcPath, BSTR bsOwnerPassword, BSTR bsUserPassword, BSTR bsOptions) - { - USES_CONVERSION; - - if ( m_pPDFDocument ) - delete m_pPDFDocument; - - StringExt *seOwner = NULL, *seUser = NULL; - //char *sSrcPath = W2A(bsSrcPath); - char *sOwnerPassword = W2A(bsOwnerPassword); - char *sUserPassword = W2A(bsUserPassword); - if ( sOwnerPassword ) - seOwner = new StringExt( sOwnerPassword ); - if ( sUserPassword ) - seUser = new StringExt( sUserPassword ); - - CString sOptions( bsOptions ); - - m_pPDFDocument = new PDFDoc( m_pGlobalParams, CString( bsSrcPath ), seOwner, seUser ); - if ( !m_pPDFDocument || !m_pPDFDocument->CheckValidation() ) - { - // , , ( 1GB) - // MapViewOfFile - if ( m_pPDFDocument ) - delete m_pPDFDocument; - - m_pPDFDocument = new PDFDoc( m_pGlobalParams, bsSrcPath, CString( bsSrcPath ).GetLength(), seOwner, seUser ); - } - - m_oFontList.Clear(); - - if ( sOptions != _T("CheckPassword") ) - { - if ( _T("DontDeleteTempFolder") != sOptions ) - { - m_pGlobalParams->CreateTempFolder( bsSrcPath, m_sTempFolder ); - m_pGlobalParams->SetupBaseFonts( _T("C:\\Windows\\Fonts") ); - } - } - - if ( seUser ) - delete seUser; - if ( seOwner ) - delete seOwner; - - int nErrorCode = 0; - if ( m_pPDFDocument && ( nErrorCode = m_pPDFDocument->GetErrorCode() ) == ErrorNone ) - return S_OK; - else - { - switch( nErrorCode ) - { - case ErrorOpenFile: - return AVS_OFFICEPDFREADER_ERROR_OPEN_PDF; - case ErrorBadCatalog: - return AVS_OFFICEPDFREADER_ERROR_BAD_CATALOG; - case ErrorDamaged: - return AVS_OFFICEPDFREADER_ERROR_DAMAGED_PDF; - case ErrorEncrypted: - return AVS_OFFICEPDFREADER_ERROR_ENCRYPTED_PDF; - default: - return AVS_OFFICEPDFREADER_ERROR_OPEN_PDF; - } - } - } - STDMETHOD(Close)() - { - if ( m_pPDFDocument ) - { - //if ( m_pGlobalParams ) - // m_pGlobalParams->DeleteTempFolder(); - - delete m_pPDFDocument; - m_pPDFDocument = NULL; - } - - return S_OK; - } - STDMETHOD(GetPagesCount)(int *pnCount) - { - if ( !m_pPDFDocument ) - { - *pnCount = 0; - return S_OK; - } - *pnCount = m_pPDFDocument->GetPagesCount(); - return S_OK; - } - STDMETHOD(GetPDFVersion)(double *pdVersion) - { - if ( !m_pPDFDocument ) - { - *pdVersion = 0; - return S_OK; - } - *pdVersion = m_pPDFDocument->GetPDFVersion(); - return S_OK; - } - STDMETHOD(GetPDFPermissions)(int *pnPermissions) - { - if ( !m_pPDFDocument ) - { - *pnPermissions = 0; - return S_FALSE; - } - - *pnPermissions = 0; - - if ( m_pPDFDocument->CheckPrint() ) - *pnPermissions += PERMISSION_PRINT; - if ( m_pPDFDocument->CheckCopy() ) - *pnPermissions += PERMISSION_COPY; - if ( m_pPDFDocument->CheckChange() ) - *pnPermissions += PERMISSION_CHANGE; - - - return S_OK; - } - STDMETHOD(GetPDFInfo)(BSTR *pbsInfo) - { - return S_OK; - } - STDMETHOD(SetTempFolder)(BSTR bsTempFolder) - { - m_sTempFolder = CStringW( bsTempFolder ); - return S_OK; - } - STDMETHOD(GetTempFolder)(BSTR *pbsTempFolder) - { - if ( m_pGlobalParams ) - { - *pbsTempFolder = ::SysAllocString( (OLECHAR*)m_pGlobalParams->GetTempFolder() ); - } - return S_OK; - } - STDMETHOD(ExtractImages)(BSTR bsDstPath, BSTR bsPrefix) - { - CStringA sPath(bsDstPath); - - ExtractImageOutputDev *pOutputDev = new ExtractImageOutputDev( m_pGlobalParams, sPath.GetBuffer(), TRUE ); - - if ( !pOutputDev ) - { - return AVS_OFFICEPDFREADER_ERROR_NOT_ENOUGH_MEMORY; - } - - for ( int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++ ) - { - m_pPDFDocument->DisplayPage( pOutputDev, nIndex, 72, 72, 0, FALSE, FALSE, FALSE ); - } - - delete pOutputDev; - - return S_OK; - } - - STDMETHOD(DisplayPage)(int nPageIndex, BSTR bsPath, BSTR bsXmlOptions, double *pdWidth, double *pdHeight, BOOL *pbBreak) - { - const double c_dInch = 25.399; // - const double c_dXResolution = 154.0; - const double c_dYResolution = 154.0; - - double dKoefX = c_dInch / c_dXResolution; - double dKoefY = c_dInch / c_dYResolution; - - USES_CONVERSION; - if ( !m_pPDFDocument ) - return S_OK; - - int nMode = 0; // 0 - , 1 - Renderer - CString sXmlOptions( bsXmlOptions ); - - if ( _T("") == sXmlOptions ) - nMode = 0; - else - nMode = 1; - - if ( 0 == nMode ) - { - *pdWidth = PDFCoordsToMM( m_pPDFDocument->GetPageCropWidth( nPageIndex ) ); - *pdHeight = PDFCoordsToMM( m_pPDFDocument->GetPageCropHeight( nPageIndex ) ); - } - else if ( 1 == nMode ) - { - //#ifdef _DEBUG - if ( m_piDocumentRenderer ) - { - IASCRenderer *pRenderer = NULL; - m_piDocumentRenderer->QueryInterface( __uuidof(AVSGraphics::IASCRenderer), (void**)&pRenderer ); - - RendererOutputDev oRendererOut( m_pGlobalParams, pRenderer, &m_oFontList ); - oRendererOut.NewPDF( m_pPDFDocument->GetXRef() ); - oRendererOut.SetBreak( pbBreak ); - m_pPDFDocument->DisplayPage( &oRendererOut, nPageIndex, 72.0, 72.0, 0 , FALSE, TRUE, FALSE ); - - RELEASEINTERFACE( pRenderer ); - } - //#else - - //SColor pPaperColor; - //pPaperColor[0] = pPaperColor[1] = pPaperColor[2] = 0xff; - //SImageOutputDev *pSImage = new SImageOutputDev( m_pGlobalParams, colorModeRGB8, 1, FALSE, pPaperColor ); - //pSImage->NewPDF( m_pPDFDocument->GetXRef() ); - //char pFile[512]; - //m_pPDFDocument->DisplayPage( pSImage, nPageIndex, c_dXResolution, c_dYResolution, 0, FALSE, TRUE, FALSE ); - - //pSImage->GetBitmap()->WriteJPGFile( _T("C:\\1\\"), m_pGlobalParams->GetTempFolder() ); - - //*pdHeight = (float)pSImage->GetBitmapHeight() * dKoefX; - //*pdWidth = (float)pSImage->GetBitmapWidth() * dKoefY; - - //delete pSImage; - //#endif - } - return S_OK; - } - STDMETHOD(DisplayAllPages)(BSTR bsPath, BSTR *pbsDstXml, BSTR bsXmlOptions, BOOL *pbBreak) - { - //if ( !m_pPDFDocument ) - // return S_OK; - - //SColor pPaperColor; - //pPaperColor[0] = pPaperColor[1] = pPaperColor[2] = 0xff; - //SImageOutputDev *pSImage = new SImageOutputDev( m_pGlobalParams, colorModeRGB8, 1, FALSE, pPaperColor ); - //pSImage->NewPDF( m_pPDFDocument->GetXRef() ); - //wchar_t wsFile[512]; - //for( int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++ ) - //{ - // m_pPDFDocument->DisplayPage( pSImage, nIndex, 72, 72, 0, FALSE, TRUE, FALSE ); - // CStringW wsPath( bsPath ); - // _swprintf( wsFile, _T("\\%06d.jpeg"), nIndex ); - // wsPath += wsFile; - // pSImage->GetBitmap()->WriteJPGFile( wsPath.GetBuffer(), m_pGlobalParams->GetTempFolder() ); - //} - //delete pSImage; - return S_OK; - } - STDMETHOD(DisplayPage2)(IUnknown *punkRenderer, int nPageIndex, BSTR bsPath, BSTR bsXmlOptions, double *pdWidth, double *pdHeight, BOOL *pbBreak) - { - const double c_dInch = 25.399; // - const double c_dXResolution = 154.0; - const double c_dYResolution = 154.0; - - double dKoefX = c_dInch / c_dXResolution; - double dKoefY = c_dInch / c_dYResolution; - - USES_CONVERSION; - if ( !m_pPDFDocument ) - return S_OK; - - int nMode = 0; // 0 - , 1 - Renderer - CString sXmlOptions( bsXmlOptions ); - - if ( _T("") == sXmlOptions ) - nMode = 0; - else - nMode = 1; - - if ( 0 == nMode ) - { - int nRotate = m_pPDFDocument->GetPageRotate( nPageIndex ); - - while ( nRotate >= 360 ) - nRotate -= 360; - - while ( nRotate < 0 ) - nRotate += 360; - - if ( 0 != nRotate && 180 != nRotate ) - { - *pdHeight = PDFCoordsToMM( m_pPDFDocument->GetPageCropWidth( nPageIndex ) ); - *pdWidth = PDFCoordsToMM( m_pPDFDocument->GetPageCropHeight( nPageIndex ) ); - } - else - { - *pdWidth = PDFCoordsToMM( m_pPDFDocument->GetPageCropWidth( nPageIndex ) ); - *pdHeight = PDFCoordsToMM( m_pPDFDocument->GetPageCropHeight( nPageIndex ) ); - } - } - else if ( 1 == nMode ) - { - //#ifdef _DEBUG - if ( punkRenderer ) - { - IASCRenderer *pRenderer = NULL; - punkRenderer->QueryInterface( __uuidof(AVSGraphics::IASCRenderer), (void**)&pRenderer ); - - RendererOutputDev oRendererOut( m_pGlobalParams, pRenderer, &m_oFontList ); - oRendererOut.NewPDF( m_pPDFDocument->GetXRef() ); - oRendererOut.SetBreak( pbBreak ); - m_pPDFDocument->DisplayPage( &oRendererOut, nPageIndex, 72.0, 72.0, 0 , FALSE, TRUE, FALSE ); - - RELEASEINTERFACE( pRenderer ); - } - //#else - - //SColor pPaperColor; - //pPaperColor[0] = pPaperColor[1] = pPaperColor[2] = 0xff; - //SImageOutputDev *pSImage = new SImageOutputDev( m_pGlobalParams, colorModeRGB8, 1, FALSE, pPaperColor ); - //pSImage->NewPDF( m_pPDFDocument->GetXRef() ); - //char pFile[512]; - //m_pPDFDocument->DisplayPage( pSImage, nPageIndex, c_dXResolution, c_dYResolution, 0, FALSE, TRUE, FALSE ); - - //pSImage->GetBitmap()->WriteJPGFile( _T("C:\\1\\out.jpg"), m_pGlobalParams->GetTempFolder() ); - - //*pdHeight = (float)pSImage->GetBitmapHeight() * dKoefX; - //*pdWidth = (float)pSImage->GetBitmapWidth() * dKoefY; - - //delete pSImage; - //#endif - } - return S_OK; - } - STDMETHOD(GetCommandRenderer)(IUnknown** ppRenderer) - { - if( NULL == ppRenderer ) - return S_FALSE; - (*ppRenderer) = NULL; - if( NULL == m_piDocumentRenderer ) - return S_OK; - return m_piDocumentRenderer->QueryInterface(__uuidof(AVSGraphics::IASCRenderer), (void**)&ppRenderer); - } - STDMETHOD(SetCommandRenderer)(IUnknown* pRenderer) - { - RELEASEINTERFACE( m_piDocumentRenderer ); - if( NULL != pRenderer ) - pRenderer->QueryInterface(__uuidof( AVSGraphics::IASCRenderer), (void**)&m_piDocumentRenderer); - return S_OK; - } - - STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue) - { - return S_OK; - } - STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT * ParamValue) - { - if ( NULL == ParamValue ) - return S_FALSE; - - CString sParamName; - sParamName = ParamName; - - if ( _T("ImagesCount") == sParamName ) - { - //ExtractImageOutputDev *pOutputDev = new ExtractImageOutputDev( m_pGlobalParams, NULL, TRUE, TRUE ); - - //if ( !pOutputDev ) - //{ - // return AVS_OFFICEPDFREADER_ERROR_NOT_ENOUGH_MEMORY; - //} - - //for ( int nIndex = 1; nIndex <= m_pPDFDocument->GetPagesCount(); nIndex++ ) - //{ - // m_pPDFDocument->DisplayPage( pOutputDev, nIndex, 72, 72, 0, FALSE, FALSE, FALSE ); - //} - - //(*ParamValue).vt = VT_I8; - //(*ParamValue).llVal = pOutputDev->GetImagesCount(); - - //delete pOutputDev; - } - - return S_OK; - } - -}; - diff --git a/PdfReader/Src/PSLexer.cpp b/PdfReader/Src/PSLexer.cpp index 9fb9f319fc..89cc41d82d 100644 --- a/PdfReader/Src/PSLexer.cpp +++ b/PdfReader/Src/PSLexer.cpp @@ -1,11 +1,11 @@ -#include +#include #include #include "PSLexer.h" namespace PdfReader { - // '1' - . '1' '2' , - // . + // '1' - означает пробел. '1' или '2' означает, что данным символом заканчивается + // имя или команда. static char c_sSpecialChars[256] = { @@ -46,7 +46,7 @@ namespace PdfReader { int nChar = 0; - // + // Пропускаем пробелы и комментарии bool bComment = false; while (1) { diff --git a/PdfReader/Src/PSLexer.h b/PdfReader/Src/PSLexer.h index 6f309afc36..779c7f381e 100644 --- a/PdfReader/Src/PSLexer.h +++ b/PdfReader/Src/PSLexer.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_PS_LEXER_H +#ifndef _PDF_READER_PS_LEXER_H #define _PDF_READER_PS_LEXER_H namespace PdfReader @@ -10,9 +10,9 @@ namespace PdfReader PSLexer(int(*GetCharFunc)(void *), void *pData); ~PSLexer(); - // Lexer::GetObject. PS PDF . - // "<>", "()" - . - // "[]" . + // Некоторый аналог функции Lexer::GetObject. Но для чтения PS вставок в PDF файле. + // Здесь читаются данные заключенные между скобок "<>", "()" или какая-нибудь команда. + // Данные в квадратных скобках "[]" не читаются. bool GetToken(char *sBuffer, int nSize, int *pnLength); private: @@ -22,7 +22,7 @@ namespace PdfReader private: - int(*GetCharFunction)(void *); // + int(*GetCharFunction)(void *); // Указатель на функцию для считывания символа void *m_pData; int m_nCharBuffer; }; diff --git a/PdfReader/Src/Page.cpp b/PdfReader/Src/Page.cpp index 8f8376ed96..81ddcd222b 100644 --- a/PdfReader/Src/Page.cpp +++ b/PdfReader/Src/Page.cpp @@ -1,4 +1,4 @@ -#include +#include #include "GlobalParams.h" #include "Object.h" #include "Array.h" @@ -63,7 +63,7 @@ namespace PdfReader { Object obj1; - if (pAttrs) // + if (pAttrs) // Предыдущие настройки { m_oMediaBox = pAttrs->m_oMediaBox; m_pCropBox = pAttrs->m_pCropBox; @@ -71,7 +71,7 @@ namespace PdfReader m_nRotate = pAttrs->m_nRotate; pAttrs->m_oResources.Copy(&m_oResources); } - else // + else // Настройки по умолчанию { m_oMediaBox.m_dLeft = 0; m_oMediaBox.m_dBottom = 0; @@ -97,7 +97,7 @@ namespace PdfReader m_pCropBox = m_oMediaBox; } - // + // Остальные m_oBleedBox = m_pCropBox; ReadBox(pDict, "BleedBox", &m_oBleedBox); @@ -107,13 +107,13 @@ namespace PdfReader m_oArtBox = m_pCropBox; ReadBox(pDict, "ArtBox", &m_oArtBox); - // m_oMediaBox + // Подгоняем размеры под m_oMediaBox m_pCropBox.ClipTo(&m_oMediaBox); m_oBleedBox.ClipTo(&m_oMediaBox); m_oTrimBox.ClipTo(&m_oMediaBox); m_oArtBox.ClipTo(&m_oMediaBox); - // + // Поворот Object oTemp; pDict->Search("Rotate", &oTemp); if (oTemp.IsInt()) diff --git a/PdfReader/Src/Page.h b/PdfReader/Src/Page.h index c08591fd26..92eff68a6f 100644 --- a/PdfReader/Src/Page.h +++ b/PdfReader/Src/Page.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_PAGE_H +#ifndef _PDF_READER_PAGE_H #define _PDF_READER_PAGE_H #include "Object.h" @@ -51,8 +51,8 @@ namespace PdfReader { public: - // PageAttrs - // pAttrs, ( pAttrs = + // Строим новый объект PageAttrs либо с начальными настройками из + // pAttrs, либо со стандартными начальными настройками(если pAttrs = // NULL). PageAttrs(PageAttrs *pAttrs, Dict *pDict); @@ -263,11 +263,11 @@ namespace PdfReader private: - XRef *m_pXref; // xref PDF - int m_nNumber; // + XRef *m_pXref; // Таблица xref для данного PDF документа + int m_nNumber; // Номер страницы PageAttrs *m_pAttrs; // Page attributes Object m_oAnnots; // Annotations - Object m_oContents; // + Object m_oContents; // Содержимое страницы Object m_oContents2; bool m_bValid; // diff --git a/PdfReader/Src/Parser.cpp b/PdfReader/Src/Parser.cpp index e23c49df63..dbdc7ff7ae 100644 --- a/PdfReader/Src/Parser.cpp +++ b/PdfReader/Src/Parser.cpp @@ -1,4 +1,4 @@ -#include +#include #include "Object.h" #include "Array.h" #include "Dict.h" @@ -31,7 +31,7 @@ namespace PdfReader Object oTemp; int nNum = 0; - // Inline image data + // Обновляем буффер после Inline image data if (m_nInlineImage == 2) { m_oBuffer1.Free(); @@ -41,7 +41,7 @@ namespace PdfReader m_nInlineImage = 0; } - // + // Массив if (m_oBuffer1.IsCommand("[")) { Shift(); @@ -54,7 +54,7 @@ namespace PdfReader } Shift(); } - else if (m_oBuffer1.IsCommand("<<")) // Dictionary Stream + else if (m_oBuffer1.IsCommand("<<")) // Dictionary или Stream { Shift(); pObject->InitDict(m_pXref); @@ -81,7 +81,7 @@ namespace PdfReader { // TO DO: Error "End of file inside dictionary" } - // Stream Objects Stream Objects + // Объекты Stream Objects не допустимы внутри потока или объекта типа Stream Objects if (m_bAllowStreams && m_oBuffer2.IsCommand("stream")) { if ((pStream = CreateStream(pObject, sDecryptKey, eEncryptAlgorithm, nKeyLength, nObjectNum, nObjectGen))) @@ -99,7 +99,7 @@ namespace PdfReader Shift(); } } - else if (m_oBuffer1.IsInt()) // , + else if (m_oBuffer1.IsInt()) // Либо ссылка, либо число { nNum = m_oBuffer1.GetInt(); Shift(); @@ -114,7 +114,7 @@ namespace PdfReader pObject->InitInt(nNum); } } - else if (m_oBuffer1.IsString() && sDecryptKey) // + else if (m_oBuffer1.IsString() && sDecryptKey) // строка { StringExt *seTemp = m_oBuffer1.GetString(); StringExt *seRes = new StringExt(); @@ -130,7 +130,7 @@ namespace PdfReader pObject->InitString(seRes); Shift(); } - else // + else // простой объект { m_oBuffer1.Copy(pObject); Shift(); @@ -147,7 +147,7 @@ namespace PdfReader m_pLexer->SkipToNextLine(); unsigned int unPos = m_pLexer->GetPos(); - // + // Считываем длину pDict->DictLookup("Length", &oTemp); if (oTemp.IsInt()) { @@ -168,19 +168,19 @@ namespace PdfReader nLength = unEndPos - unPos; m_pLexer->SetPos(unPos); - // + // Оставим на всякий случай заглушку if (nLength <= 0) nLength = 5000; } - // , + // Меняем длину, если файл поврежден if (m_pXref && m_pXref->GetStreamEnd(unPos, &unEndPos)) { nLength = unEndPos - unPos; } - // PDF, - // + // В сильно повержденных файлах PDF, выставляем конец потока сразу + // после его начала if (!m_pLexer->GetStream()) { return NULL; @@ -188,10 +188,10 @@ namespace PdfReader BaseStream *pBaseStream = m_pLexer->GetStream()->GetBaseStream(); - // + // Пропускаем данный потока m_pLexer->SetPos(unPos + nLength); - // 'endstream' + // Проверяем 'endstream' Shift(); // '>>' Shift(); // 'endstream' if (m_oBuffer1.IsCommand("endstream")) @@ -202,7 +202,7 @@ namespace PdfReader { // TO DO : Error "Missing 'endstream'" - // : + // Заплатка для поврежденных файлов: nLength += 5000; } @@ -230,19 +230,19 @@ namespace PdfReader } else { - // , 'ID' , - // + // В поврежденном потоке, если 'ID' появляется в середине потока, + // нужно сбросить параметры m_nInlineImage = 0; } } else if (m_oBuffer2.IsCommand("ID")) { - m_pLexer->SkipChar(); // 'ID' + m_pLexer->SkipChar(); // пропускаем символ после команды 'ID' m_nInlineImage = 1; } m_oBuffer1.Free(); m_oBuffer1 = m_oBuffer2; - if (m_nInlineImage > 0) // Inline Image + if (m_nInlineImage > 0) // не буфферизируем данные Inline Image m_oBuffer2.InitNull(); else m_pLexer->GetObject(&m_oBuffer2); diff --git a/PdfReader/Src/Parser.h b/PdfReader/Src/Parser.h index 740bc1dd27..2aaeaee600 100644 --- a/PdfReader/Src/Parser.h +++ b/PdfReader/Src/Parser.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_PARSER_H +#ifndef _PDF_READER_PARSER_H #define _PDF_READER_PARSER_H #include "Lexer.h" @@ -17,7 +17,7 @@ namespace PdfReader ~Parser(); - // . + // Считываем следующий объект из потока. Object *GetObject(Object *pObject, unsigned char *sDecryptKey = NULL, CryptAlgorithm eEncryptAlgorithm = cryptRC4, int nKeyLength = 0, int nObjectNum = 0, int nObjectGen = 0); Stream *GetStream() @@ -37,12 +37,12 @@ namespace PdfReader private: - XRef *m_pXref; // Xref the xref table for this PDF file - Lexer *m_pLexer; // - bool m_bAllowStreams; // Stream Objects? - Object m_oBuffer1; // + XRef *m_pXref; // Таблица Xref для даннthe xref table for this PDF file + Lexer *m_pLexer; // Входящий поток + bool m_bAllowStreams; // Будем ли парсить Stream Objects? + Object m_oBuffer1; // Два следующих объекта Object m_oBuffer2; // - int m_nInlineImage; // , Inline Image + int m_nInlineImage; // Устанавливаем, когда сталкиваемся с Inline Image }; } diff --git a/PdfReader/Src/ReadMe.txt b/PdfReader/Src/ReadMe.txt deleted file mode 100644 index 9613509777..0000000000 --- a/PdfReader/Src/ReadMe.txt +++ /dev/null @@ -1,68 +0,0 @@ -======================================================================== - ACTIVE TEMPLATE LIBRARY : AVSOfficePDFReader Project Overview -======================================================================== - -AppWizard has created this AVSOfficePDFReader project for you to use as the starting point for -writing your Dynamic Link Library (DLL). - -This project is implemented with Visual C++ attributes. - -This file contains a summary of what you will find in each of the files that -make up your project. - -AVSOfficePDFReader.vcproj - This is the main project file for VC++ projects generated using an Application Wizard. - It contains information about the version of Visual C++ that generated the file, and - information about the platforms, configurations, and project features selected with the - Application Wizard. - -_AVSOfficePDFReader.idl - This file will be generated by the compiler when the project is built. It will contain the IDL - definitions of the type library, the interfaces and co-classes defined in your project. - This file will be processed by the MIDL compiler to generate: - C++ interface definitions and GUID declarations (_AVSOfficePDFReader.h) - GUID definitions (_AVSOfficePDFReader_i.c) - A type library (_AVSOfficePDFReader.tlb) - Marshaling code (_AVSOfficePDFReader_p.c and dlldata.c) - -AVSOfficePDFReader.cpp - This file contains the object map and the implementation of your DLL's exports. - -AVSOfficePDFReader.rc - This is a listing of all of the Microsoft Windows resources that the - program uses. - -AVSOfficePDFReader.def - This module-definition file provides the linker with information about the exports - required by your DLL. It contains exports for: - DllGetClassObject - DllCanUnloadNow - GetProxyDllInfo - DllRegisterServer - DllUnregisterServer - -///////////////////////////////////////////////////////////////////////////// -Other standard files: - -StdAfx.h, StdAfx.cpp - These files are used to build a precompiled header (PCH) file - named AVSOfficePDFReader.pch and a precompiled types file named StdAfx.obj. - -Resource.h - This is the standard header file that defines resource IDs. - -///////////////////////////////////////////////////////////////////////////// -Proxy/stub DLL project and module definition file: - -AVSOfficePDFReaderps.vcproj - This file is the project file for building a proxy/stub DLL if necessary. - The IDL file in the main project must contain at least one interface and you must - first compile the IDL file before building the proxy/stub DLL. This process generates - dlldata.c, AVSOfficePDFReader_i.c and AVSOfficePDFReader_p.c which are required - to build the proxy/stub DLL. - -AVSOfficePDFReaderps.def - This module definition file provides the linker with information about the exports - required by the proxy/stub. - -///////////////////////////////////////////////////////////////////////////// diff --git a/PdfReader/Src/RendererOutputDev.cpp b/PdfReader/Src/RendererOutputDev.cpp index 6245393165..d37b3bd1c5 100644 --- a/PdfReader/Src/RendererOutputDev.cpp +++ b/PdfReader/Src/RendererOutputDev.cpp @@ -1,4 +1,4 @@ -#include "GState.h" +#include "GState.h" #include "GFont.h" #include "File.h" #include "CMap.h" @@ -16,10 +16,10 @@ #include "../../DesktopEditor/common/Array.h" #include "../../DesktopEditor/graphics/BaseThread.h" -// TODO: 1. - (Axial Radial) +// TODO: 1. Реализовать по-нормальному градиентные заливки (Axial и Radial) // 2. m_pRenderer->SetAdditionalParam(L"TilingHtmlPattern", oWriter.GetXmlString()); -// 3. GlobalParams->FindFontFile -// 4. +// 3. Подбор шрифтов необходимо перенести в GlobalParams->FindFontFile +// 4. В идентефикацию шрифта к путю добавить номер шрифта в файле namespace PdfReader { @@ -192,7 +192,7 @@ namespace PdfReader if (bResult) { - // , , + // Шрифт нашелся, но пока им пользоваться нельзя, потому что он загружается в параллельном потоке while (!pEntry->bAvailable) NSThreads::Sleep(10); } @@ -209,7 +209,7 @@ namespace PdfReader if (bResult) { - // , , + // Шрифт нашелся, но пока им пользоваться нельзя, потому что он загружается в параллельном потоке while (!(*ppEntry)->bAvailable) NSThreads::Sleep(10); } @@ -226,7 +226,7 @@ namespace PdfReader } TFontEntry* CFontList::Add(Ref oRef, std::wstring wsFileName, unsigned short *pCodeToGID, unsigned short *pCodeToUnicode, unsigned int unLenGID, unsigned int unLenUnicode) { - // Find2, + // Данная функция приходит только из Find2, поэтому проверять есть ли данный шрифт уже не надо CTemporaryCS* pCS = new CTemporaryCS(&m_oCS); TFontEntry *pNewEntry = new TFontEntry; @@ -311,7 +311,7 @@ namespace PdfReader m_pTransparentGroupSoftMask = NULL; //m_oFontList.LoadFromFile( m_pGlobalParams->GetTempFolder() ); - //// + //// Тестовый пример //m_pRenderer->NewPage(); //m_pRenderer->BeginCommand( c_nPageType ); @@ -410,7 +410,7 @@ namespace PdfReader m_pRenderer->NewPage(); m_pRenderer->BeginCommand(c_nPageType); - // + // Переводим пункты в миллиметры double dPageHeight = PDFCoordsToMM(pGState->GetPageHeight()); double dPageWidth = PDFCoordsToMM(pGState->GetPageWidth()); @@ -553,7 +553,7 @@ namespace PdfReader } void RendererOutputDev::UpdateFont(GrState *pGState) { - // + // Проверяем наличие списка со шрифтами if (NULL == m_pFontList) return; @@ -570,7 +570,7 @@ namespace PdfReader if (!m_pFontList->Find2((*pFont->GetID()), &pEntry)) { GrFontType eFontType = pFont->GetType(); - if (fontType3 == eFontType) // FontType3 + if (fontType3 == eFontType) // FontType3 обрабатывается отдельной командой { pEntry->bAvailable = true; return; @@ -578,9 +578,9 @@ namespace PdfReader std::wstring wsTempFileName = L""; Ref oEmbRef; - // 1. , . - // 2. , , . - // 3. . + // 1. Если шрифт внедренный, тогда скидываем его в темповый файл. + // 2. Если шрифт лежит вне пдф, а в самом пдф есть ссылка на него, тогда используем эту ссылку. + // 3. В противном случае подбираем шрифт. if (pFont->GetEmbeddedFontFileRef(&oEmbRef)) { std::wstring wsExt; @@ -614,7 +614,7 @@ namespace PdfReader oReferenceObject.Free(); if (!oStreamObject.IsStream()) { - // + // Внедренный шрифт неправильно записан oStreamObject.Free(); fclose(pTempFile); @@ -635,7 +635,7 @@ namespace PdfReader fclose(pTempFile); wsFileName = wsTempFileName; - // Type1 Afm + // Для шрифтов типа Type1 нужно дописать Afm файл с метриками if (fontType1 == pFont->GetType() || fontType1C == pFont->GetType() || fontType1COT == pFont->GetType()) { std::wstring wsSplitFileName, wsSplitFileExt; @@ -824,7 +824,7 @@ namespace PdfReader } } - // , + // Загрузим сам файл со шрифтом, чтобы точно определить его тип if (!m_pFontManager->LoadFontFromFile(wsFileName, 0, 10, 72, 72)) { pEntry->bAvailable = true; @@ -874,8 +874,8 @@ namespace PdfReader } else if (L"" == (wsFileName = pFont->GetExternalFontFilePath())) { - // TODO: , 14 , - // . + // TODO: Сначала тут мы должны проверить, если ищется один из 14 стандартных шрифтов, + // тогда мы должны вернуть путь к стандартному шрифту. CFontInfo* pFontInfo = NULL; if (m_pFontManager) @@ -986,13 +986,13 @@ namespace PdfReader wsFileName = pFontInfo->m_wsFontPath; eFontType = pFont->IsCIDFont() ? fontCIDType2 : fontTrueType; } - else // , + else // В крайнем случае, в данном шрифте просто не пишем ничего { pEntry->bAvailable = true; return; } - // . ( PDF) + // Записываем файл с кодировкой. (Специально для перезаписи в PDF) if (c_nPDFWriter == m_lRendererType) { std::wstring wsExt; @@ -1016,7 +1016,7 @@ namespace PdfReader } fclose(pTempFile); - // , , + // Копируем файл, для создания уникального имени, чтобы связать с файлом с кодировкой if (NSFile::CFileBinary::Copy(wsFileName, wsTempFileName)) { wsFileName = wsTempFileName; @@ -1045,14 +1045,14 @@ namespace PdfReader { Dict *pFontDict = oFontObject.GetDict(); - int nEncodingType = -1; // Encoding + int nEncodingType = -1; // Объекта Encoding нет int nBaseEncoding = -1; Object oDictItem; pFontDict->Search("Encoding", &oDictItem); if (oDictItem.IsDict()) { - nEncodingType = 1; // Encoding - + nEncodingType = 1; // Encoding - идет отдельным объектом Object oTemp; oDictItem.DictLookup("BaseEncoding", &oTemp); @@ -1123,7 +1123,7 @@ namespace PdfReader } else { - // TODO: + // TODO: Неправильный тип записи } oTemp.Free(); } @@ -1141,7 +1141,7 @@ namespace PdfReader } } - // + // Здесь мы грузим кодировки unsigned short *pCodeToGID = NULL, *pCodeToUnicode = NULL; int nLen = 0; CFontFileTrueType *pTTFontFile = NULL; @@ -1201,7 +1201,7 @@ namespace PdfReader case fontCIDType0: case fontCIDType0C: { - // TODO: , + // TODO: Проверить, почему получение данной кодировки было отключено //if ((pT1CFontFile = CFontFileType1C::LoadFromFile((wchar_t*)wsFileName.c_str()))) //{ // pCodeToGID = pT1CFontFile->GetCIDToGIDMap(&nLen); @@ -1244,13 +1244,13 @@ namespace PdfReader nLen = 0; if (L"" != wsFileName) { - // CID-to-GID + // Создаем карту CID-to-GID CharCodeToUnicode *pCodeToUnicode = NULL; if ((pCodeToUnicode = ((GrCIDFont *)pFont)->GetToUnicode())) { if ((pTTFontFile = CFontFileTrueType::LoadFromFile((wchar_t*)wsFileName.c_str()))) { - // Unicode Cmap + // Ищем Unicode Cmap CArray arrCMapIndex; for (int nCMapIndex = 0; nCMapIndex < pTTFontFile->GetCmapsCount(); ++nCMapIndex) { @@ -1319,7 +1319,7 @@ namespace PdfReader } default: { - // + // Такого не должно произойти if (L"" != wsTempFileName) NSFile::CFileBinary::Remove(wsTempFileName); @@ -1327,7 +1327,7 @@ namespace PdfReader } } - // Code -> Unicode + // Составляем таблицу Code -> Unicode int nToUnicodeLen = 0; if (pFont->IsCIDFont()) { @@ -1376,7 +1376,7 @@ namespace PdfReader } } - // ( PDF) + // Записываем файл с настройками шрифта (Специально для перезаписи в PDF) if (L"" != wsFileName && c_nPDFWriter == m_lRendererType) { std::wstring wsSplitFileName, wsSplitFileExt; @@ -1386,7 +1386,7 @@ namespace PdfReader GrFontType eFontType = pFont->GetType(); if (fontType1 == eFontType || fontType1C == eFontType || fontType1COT == eFontType || fontTrueType == eFontType || fontTrueTypeOT == eFontType) { - // + // Запись информации для простых шрифтов CXmlWriter oXmlWriter; Ref *pRef = pFont->GetID(); @@ -1399,14 +1399,14 @@ namespace PdfReader { Dict *pFontDict = oFontObject.GetDict(); - int nEncodingType = -1; // Encoding + int nEncodingType = -1; // Объекта Encoding нет int nBaseEncoding = -1; Object oDictItem; pFontDict->Search("Encoding", &oDictItem); if (oDictItem.IsDict()) { - nEncodingType = 1; // Encoding - + nEncodingType = 1; // Encoding - идет отдельным объектом Object oTemp; oDictItem.DictLookup("BaseEncoding", &oTemp); @@ -1764,7 +1764,7 @@ namespace PdfReader } else if (fontCIDType0 == eFontType || fontCIDType0C == eFontType || fontCIDType0COT == eFontType || fontCIDType2 == eFontType || fontCIDType2OT == eFontType) { - // CMap + // Пишем файл с кодировкой CMap std::wstring wsCMapPath = wsSplitFileName + L".cmap"; if (pFont->IsCIDFont()) { @@ -2183,7 +2183,7 @@ namespace PdfReader } oItemFD.Free(); - // TODO: /Style, /Lang, /FD, /CIDSet + // TODO: Тут надо реализовать чтени полей /Style, /Lang, /FD, /CIDSet oXmlWriter.WriteNodeEnd(L"FontDescriptor"); } @@ -2367,7 +2367,7 @@ namespace PdfReader } } - // FontName, + // Обрежем индекс у FontName, если он есть if (wsFontName.length() > 7) { bool bIsIndex = true; @@ -2483,7 +2483,7 @@ namespace PdfReader } bool RendererOutputDev::AxialShadedFill(GrState *pGState, GrAxialShading *pShading) { - // TODO: + // TODO: Реализовать линейный градиент return false; //m_pRenderer->BeginCommand(c_nPDFGradientType); @@ -2538,7 +2538,7 @@ namespace PdfReader //m_pRenderer->SetBrush(bsXml); //::SysFreeString(bsXml); - //// 16 + //// Присылаем 16 цветов //double dT0 = pShading->GetDomain0(); //double dT1 = pShading->GetDomain1(); //GrColor oColor; @@ -2567,7 +2567,7 @@ namespace PdfReader } bool RendererOutputDev::RadialShadedFill(GrState *pGState, GrRadialShading *pShading) { - // TODO: + // TODO: Реализовать радиальный градиент return false; //m_pRenderer->BeginCommand(c_nPDFGradientType); @@ -2630,7 +2630,7 @@ namespace PdfReader //m_pRenderer->SetBrush(bsXml); //::SysFreeString(bsXml); - //// 15 + //// Присылаем 15 цветов //double dT0 = pShading->GetDomain0(); //double dT1 = pShading->GetDomain1(); //GrColor oColor; @@ -2768,7 +2768,7 @@ namespace PdfReader int nRenderMode = pGState->GetRenderMode(); - // Clip + // Обработка Clip if (nRenderMode >= 4) { if (m_pBufferTextClip) @@ -2777,7 +2777,7 @@ namespace PdfReader m_pBufferTextClip = new GrTextClip(); } - // Stroke + // Обработка Stroke if (1 == nRenderMode || 2 == nRenderMode || 5 == nRenderMode || 6 == nRenderMode) { //Painter::CPen oPen; @@ -2798,7 +2798,7 @@ namespace PdfReader int nRenderMode = pGState->GetRenderMode(); - // Clipping Path + // Добавляем в Clipping Path текст if (nRenderMode >= 4) { if (m_pBufferTextClip) @@ -2818,7 +2818,7 @@ namespace PdfReader UpdateFont(pGState); } - // Stroke + // Возвращаем параметры для Stroke if (1 == nRenderMode || 2 == nRenderMode || 5 == nRenderMode || 6 == nRenderMode) { //BSTR bsPen = m_oPen.ToXmlString().AllocSysString(); @@ -2833,18 +2833,18 @@ namespace PdfReader if (m_bTransparentGroup) return; - // + // Проверяем наличие списка со шрифтами if (NULL == m_pFontList) return; - // + // Проверяем наличие текущего шрифта TFontEntry oEntry; if (!m_pFontList->GetFont(pGState->GetFont()->GetID(), &oEntry)) return; int nRendererMode = pGState->GetRenderMode(); - if (3 == nRendererMode) // + if (3 == nRendererMode) // Невидимый текс return; double *pCTM = pGState->GetCTM(); @@ -2883,18 +2883,18 @@ namespace PdfReader if (m_bTransparentGroup) return; - // + // Проверяем наличие списка со шрифтами if (NULL == m_pFontList) return; - // + // Проверяем наличие текущего шрифта TFontEntry oEntry; if (!m_pFontList->GetFont(pGState->GetFont()->GetID(), &oEntry)) return; int nRenderMode = pGState->GetRenderMode(); - if (3 == nRenderMode) // + if (3 == nRenderMode) // Невидимый текст { return; } @@ -2952,7 +2952,7 @@ namespace PdfReader double dShiftX = 0, dShiftY = 0; DoTransform(arrMatrix, &dShiftX, &dShiftY, true); - // + // Здесь мы посылаем координаты текста в пунктах double dPageHeight = pGState->GetPageHeight(); @@ -2966,12 +2966,12 @@ namespace PdfReader { if (pGState->GetFont()->IsCIDFont()) { - // Identity-H Identity-V, , + // Значит кодировка была Identity-H или Identity-V, что означает, что иходные коды и есть юникодные значения wsUnicodeText = (wchar_t(nCode)); } else { - // , , NULL + // Договорились, что если нельзя точно составить юникодные значения, тогда отдаем NULL wsUnicodeText = L""; } } @@ -2997,7 +2997,7 @@ namespace PdfReader int nCurCode = (0 == nCode ? 65534 : nCode); if (pGState->GetFont()->IsCIDFont()) { - // CID Code + // Мы посылаем и сам CID и внутренний Code с его длинной CXmlWriter oWriter; oWriter.WriteNodeBegin(L"PDF-Text", true); oWriter.WriteAttribute(L"cid", nCurCode); @@ -3008,7 +3008,7 @@ namespace PdfReader } else { - // CID Code + // Мы посылаем и сам CID и внутренний Code с его длинной CXmlWriter oWriter; oWriter.WriteNodeBegin(L"PDF-Text", true); oWriter.WriteAttribute(L"code", nCurCode); @@ -3034,7 +3034,7 @@ namespace PdfReader //m_pRenderer->PathCommandText( bsText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/ + dShiftY ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ) ); - // + // Временно //m_pRenderer->PathCommandTextEx( bsText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/ + dShiftY ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ), PDFCoordsToMM( 0 ), 0, bsStringGID ); //m_pRenderer->PathCommandTextEx( bsUnicodeText, bsGIDText, bsSrcCodeText, PDFCoordsToMM( 0 + dShiftX ), PDFCoordsToMM( /*-fabs(pFont->GetFontBBox()[3]) * dTfs*/0 + dShiftY ), PDFCoordsToMM( dDx ), PDFCoordsToMM( dDy ), PDFCoordsToMM( 0 ), 0 ); //----------- @@ -3096,7 +3096,7 @@ namespace PdfReader Aggplus::CImage oImage; oImage.Create(pBufferPtr, nWidth, nHeight, -4 * nWidth); - // pBufferPtr + // Пишем данные в pBufferPtr ImageStream *pImageStream = new ImageStream(pStream, nWidth, 1, 1); pImageStream->Reset(); @@ -3124,7 +3124,7 @@ namespace PdfReader double arrMatrix[6]; double *pCTM = pGState->GetCTM(); - // + // Исходное предобразование // |1 0 0| |pCTM[0] pCTM[1] 0| // arrMattrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| // |0 1 1| |pCTM[4] pCTM[5] 1| @@ -3155,7 +3155,7 @@ namespace PdfReader Aggplus::CImage oImage; oImage.Create(pBufferPtr, nWidth, nHeight, -4 * nWidth); - // pBufferPtr + // Пишем данные в pBufferPtr ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); pImageStream->Reset(); @@ -3182,7 +3182,7 @@ namespace PdfReader double arrMatrix[6]; double *pCTM = pGState->GetCTM(); - // + // Исходное предобразование // |1 0 0| |pCTM[0] pCTM[1] 0| // arrMatrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| // |0 1 1| |pCTM[4] pCTM[5] 1| @@ -3199,8 +3199,8 @@ namespace PdfReader } void RendererOutputDev::DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert) { - // , ( ) - // TO DO: , + // Вообще, размеры маски и самой картинки могут не совпадать (в этом случае мы должны срезайзить до размеров картинки) + // TO DO: Сделать, когда появится файл if (nWidth != nMaskWidth || nHeight != nMaskHeight) DrawImage(pGState, pRef, pStream, nWidth, nHeight, pColorMap, NULL, false); @@ -3217,7 +3217,7 @@ namespace PdfReader Aggplus::CImage oImage; oImage.Create(pBufferPtr, nWidth, nHeight, -4 * nWidth); - // pBufferPtr + // Пишем данные в pBufferPtr ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); ImageStream *pMask = new ImageStream(pMaskStream, nMaskWidth, 1, 1); @@ -3251,7 +3251,7 @@ namespace PdfReader double arrMatrix[6]; double *pCTM = pGState->GetCTM(); - // + // Исходное предобразование // |1 0 0| |pCTM[0] pCTM[1] 0| // arrMatrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| // |0 1 1| |pCTM[4] pCTM[5] 1| @@ -3281,7 +3281,7 @@ namespace PdfReader Aggplus::CImage oImage; oImage.Create(pBufferPtr, nWidth, nHeight, -4 * nWidth); - // pBufferPtr + // Пишем данные в pBufferPtr ImageStream *pImageStream = new ImageStream(pStream, nWidth, pColorMap->GetComponentsCount(), pColorMap->GetBitsPerComponent()); pImageStream->Reset(); @@ -3305,8 +3305,8 @@ namespace PdfReader if (nWidth != nMaskWidth || nHeight != nMaskHeight) { - // TO DO: . - // . + // TO DO: Здесь сделан элементарный вариант масштабирования маски. + // Надо улучшить алгоритм. bool bResize = true; @@ -3398,7 +3398,7 @@ namespace PdfReader double arrMatrix[6]; double *pCTM = pGState->GetCTM(); - // + // Исходное предобразование // |1 0 0| |pCTM[0] pCTM[1] 0| // arrMattrix = |0 -1 0| * |pCTM[2] pCTM[3] 0| // |0 1 1| |pCTM[4] pCTM[5] 1| diff --git a/PdfReader/Src/RendererOutputDev.h b/PdfReader/Src/RendererOutputDev.h index 7ad8f7eeb8..4023413ed8 100644 --- a/PdfReader/Src/RendererOutputDev.h +++ b/PdfReader/Src/RendererOutputDev.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_RENDERER_OUTPUTDEV_H +#ifndef _PDF_READER_RENDERER_OUTPUTDEV_H #define _PDF_READER_RENDERER_OUTPUTDEV_H #include "../../DesktopEditor/graphics/IRenderer.h" @@ -21,14 +21,14 @@ namespace PdfReader //------------------------------------------------------------------------------------------------------------------------------- struct TFontEntry { - Ref oRef; // - - std::wstring wsFilePath; // - std::wstring wsFontName; // , PDF( , ) - unsigned short *pCodeToGID; // - - unsigned short *pCodeToUnicode; // - - unsigned int unLenGID; // + Ref oRef; // Ссылка на объект-шрифт + std::wstring wsFilePath; // Путь к шрифту на диске + std::wstring wsFontName; // Имя шрифта, которое записано в PDF(ветка для случаев, когда имя шрифта в самом шрифте не указано) + unsigned short *pCodeToGID; // Таблица код - номер глифа в шрифте + unsigned short *pCodeToUnicode; // Таблица код - юникодное значение + unsigned int unLenGID; // Количество элементов в таблицах unsigned int unLenUnicode; // - bool bAvailable; // . + bool bAvailable; // Доступен ли шрифт. Сделано для многопотоковости }; @@ -57,7 +57,7 @@ namespace PdfReader } void Add(Ref& oRef, TFontEntry* pFontEntry) { - // + // До вызова данной функции надо проверять есть ли элемент с данным ключом m_oFontMap.insert(std::pair(oRef, pFontEntry)); } @@ -65,7 +65,7 @@ namespace PdfReader typedef std::map CRefFontMap; CRefFontMap m_oFontMap; - NSCriticalSection::CRITICAL_SECTION m_oCS; // + NSCriticalSection::CRITICAL_SECTION m_oCS; // Критическая секция }; //------------------------------------------------------------------------------------------------------------------------------- template @@ -151,7 +151,7 @@ namespace PdfReader //----- Save/Restore GState virtual void SaveGState(GrState *pGState); virtual void RestoreGState(GrState *pGState); - //----- GState + //----- Изменение параметров в GState virtual void UpdateCTM(GrState *pGState, double dMatrix11, double dMatrix12, double dMatrix21, double dMatrix22, double dMatrix31, double dMatrix32); virtual void UpdateLineDash(GrState *pGState); virtual void UpdateFlatness(GrState *pGState); @@ -167,9 +167,9 @@ namespace PdfReader virtual void UpdateStrokeOpacity(GrState *pGState); virtual void UpdateAll(GrState *pGState); virtual void UpdateRender(GrState *pGState); - //----- + //----- Изменение текстовых параметров virtual void UpdateFont(GrState *pGState); - //----- Path + //----- Рисование Path virtual void Stroke(GrState *pGState); virtual void Fill(GrState *pGState); virtual void EoFill(GrState *pGState); @@ -196,7 +196,7 @@ namespace PdfReader virtual void EoClip(GrState *pGState); virtual void ClipToStrokePath(GrState *pGState); virtual void ClipToPath(GrState *pGState, GrPath *pPath, double *pMatrix, bool bEO); - //----- + //----- Вывод текста virtual void BeginStringOperator(GrState *pGState); virtual void EndStringOperator(GrState *pGState); virtual void DrawString(GrState *pGState, StringExt *seString); @@ -205,18 +205,18 @@ namespace PdfReader void EndType3Char(GrState *pGState); void Type3D0(GrState *pGState, double dWx, double dWy); void Type3D1(GrState *pGState, double dWx, double dWy, double dBLx, double dBLy, double dTRx, double dTRy); - //----- + //----- Вывод картинок virtual void DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, bool bInvert, bool bInlineImage); virtual void DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pMaskColors, bool bInlineImg); virtual void DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, bool bMaskInvert); virtual void DrawSoftMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, GrImageColorMap *pMaskColorMap); - //----- Transparency groups SMasks + //----- Transparency groups и SMasks virtual void BeginTransparencyGroup(GrState *pGState, double *pBBox, GrColorSpace *pBlendingColorSpace, bool bIsolated, bool bKnockout, bool bForSoftMask); virtual void EndTransparencyGroup(GrState *pGState); virtual void PaintTransparencyGroup(GrState *pGState, double *pBBox); virtual void SetSoftMask(GrState *pGState, double *pBBox, bool bAlpha, Function *pTransferFunc, GrColor *pBackdropColor); virtual void ClearSoftMask(GrState *pGState); - //----- + //----- Дополнительные функции для данного устройства void NewPDF(XRef *pXref); void SetBreak(bool* pbBreak) { @@ -239,10 +239,10 @@ namespace PdfReader GrTextClip *m_pBufferTextClip; - XRef *m_pXref; // Xref PDF- + XRef *m_pXref; // Таблица Xref для данного PDF-документа CFontList *m_pFontList; - bool *m_pbBreak; // + bool *m_pbBreak; // Внешняя остановка рендерера bool m_bUseAxialShaded; bool m_bUseRadialShaded; diff --git a/PdfReader/Src/Resource.h b/PdfReader/Src/Resource.h deleted file mode 100644 index 8aa4c317fa..0000000000 --- a/PdfReader/Src/Resource.h +++ /dev/null @@ -1,31 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by AVSOfficePDFReader.rc -// -#define IDS_PROJNAME 100 -#define IDR_ASCOFFICEPDFREADER 101 -#define IDR_Symbol 204 -#define IDR_ZapfDingbats 205 -#define IDR_Helvetica 206 -#define IDR_HelveticaBold 207 -#define IDR_HelveticaOblique 208 -#define IDR_HelveticaBoldOblique 209 -#define IDR_TimesRoman 210 -#define IDR_TimesBold 211 -#define IDR_TimesItalic 212 -#define IDR_TimesBoldItalic 213 -#define IDR_Courier 214 -#define IDR_CourierBold 215 -#define IDR_CourierOblique 216 -#define IDR_CourierBoldOblique 217 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 218 -#define _APS_NEXT_COMMAND_VALUE 32769 -#define _APS_NEXT_CONTROL_VALUE 201 -#define _APS_NEXT_SYMED_VALUE 102 -#endif -#endif diff --git a/PdfReader/Src/SecurityHandler.cpp b/PdfReader/Src/SecurityHandler.cpp index 89034c789d..0e3b9b5b09 100644 --- a/PdfReader/Src/SecurityHandler.cpp +++ b/PdfReader/Src/SecurityHandler.cpp @@ -1,4 +1,4 @@ -#include "StringExt.h" +#include "StringExt.h" #include "PDFDoc.h" #include "Decrypt.h" #include "GlobalParams.h" @@ -136,10 +136,10 @@ namespace PdfReader m_nEncryptRevision = oRevision.GetInt(); m_eCryptType = cryptRC4; - // Revision = 2, 40- - PDF- Length + // В случае Revision = 2, ключ должен быть 40-бит - некоторые PDF-генераторы неправильно пишут значение Length if (m_nEncryptRevision == 2 || !oLength.IsInt()) { - m_nFileKeyLength = 5; // 5 = 40- + m_nFileKeyLength = 5; // 5 байт = 40-бит } else { @@ -168,7 +168,7 @@ namespace PdfReader Object oCFLength; if (oCryptCurFilter.DictLookup("Length", &oCFLength)->IsInt()) { - // , oCFLength / 8 + // Согласно спецификации, должно быть oCFLength / 8 m_nFileKeyLength = oCFLength.GetInt(); } oCFLength.Free(); @@ -181,7 +181,7 @@ namespace PdfReader Object oCFLength; if (oCryptCurFilter.DictLookup("Length", &oCFLength)->IsInt()) { - // , oCFLength / 8 + // Согласно спецификации, должно быть oCFLength / 8 m_nFileKeyLength = oCFLength.GetInt(); } oCFLength.Free(); diff --git a/PdfReader/Src/SecurityHandler.h b/PdfReader/Src/SecurityHandler.h index d563f1fcdf..990b622914 100644 --- a/PdfReader/Src/SecurityHandler.h +++ b/PdfReader/Src/SecurityHandler.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_SECURITY_HANDLER_H +#ifndef _PDF_READER_SECURITY_HANDLER_H #define _PDF_READER_SECURITY_HANDLER_H #include "Object.h" @@ -21,26 +21,26 @@ namespace PdfReader SecurityHandler(PDFDoc *pDocument); virtual ~SecurityHandler(); - // . , - // . , ( 3- ). - // : - // True, ( , ) - // False, ( , ). + // Проверяем шифрованный ли документ. Если документ шифрованный, тогда сначала продуем использовать и + // . Если оба пароля не подходят, тогда запрашиваем пароль у пользователя (не более 3-х раз). + // Возвращаемые значения: + // True, если документ может быть открыт( либо он вообще не зашифрован, либо пароль верный) + // False, в противном случае ( документ зашрифован, а пароль неверный). bool CheckEncryption(StringExt *seOwnerPassword, StringExt *seUserPassword); - // "Batch mode", .. . + // Для "Batch mode", т.е. когда пароли заданы и проверяются без пользователя. virtual void *MakeAuthData(StringExt *ownerPassword, StringExt *userPassword) = 0; - // . + // Для запроса пароля от пользователя. virtual void *GetAuthData() = 0; - // MakeAuthData GetAuthData. + // Освобождаем память выделенную функциями MakeAuthData или GetAuthData. virtual void FreeAuthData(void *pAuthData) = 0; - // . + // Пытаемся авторизоваться. virtual bool Authorize(void *pAuthData) = 0; - // . + // Считываем различные параметры. virtual int GetPermissionFlags() = 0; virtual bool GetOwnerPasswordValid()= 0; virtual unsigned char *GetFileKey() = 0; diff --git a/PdfReader/Src/Stream.cpp b/PdfReader/Src/Stream.cpp index 0923d5d5cc..d62265ccc1 100644 --- a/PdfReader/Src/Stream.cpp +++ b/PdfReader/Src/Stream.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -15,12 +15,12 @@ #include "JPXStream.h" #include "JBIG2Stream.h" -//#define USE_ZLIB // Flate Zlib +//#define USE_ZLIB // Для декодирования потоков в Flate используем Zlib или внутренний декодер namespace PdfReader { //--------------------------------------------------------------------------------------------------------------- - // Stream ( ) + // Stream (основной класс) //--------------------------------------------------------------------------------------------------------------- Stream::Stream() @@ -228,7 +228,7 @@ namespace PdfReader bBlackIs1 = oTemp.GetBool(); oTemp.Free(); - // TO DO: "DamagedRowsBeforeError" + // TO DO: Добавить чтение поля "DamagedRowsBeforeError" } pStream = new CCITTFaxStream(pStream, nK, bEndOfLine, bByteAlign, nColumns, nRows, bEndOfBlock, bBlackIs1); } @@ -289,7 +289,7 @@ namespace PdfReader { pParams->DictLookup("JBIG2Globals", &oJBIG2Globals); } - // TO DO: + // TO DO: Сделать данный фильтр pStream = new JBIG2Stream(pStream, &oJBIG2Globals); oJBIG2Globals.Free(); } @@ -530,7 +530,7 @@ namespace PdfReader nCurPredictor = m_nPredictor; } - // , PNG (byte) (prediction) + // Читаем по строке, применяя PNG (byte) фильтрацию(prediction) unsigned char arrTopLeftBuf[GrColorMaxComps * 2 + 1]; memset(arrTopLeftBuf, 0, m_nBytesPerPixel + 1); @@ -582,13 +582,13 @@ namespace PdfReader m_pLineBuffer[nIndex] = nTopLeft + (unsigned char)nChar; break; case 10: // PNG none - default: // No predictor TIFF predictor + default: // No predictor или TIFF predictor m_pLineBuffer[nIndex] = (unsigned char)nChar; break; } } - // TIFF (predictor) + // Применяем TIFF фильтрацию (predictor) unsigned long nInTemp, nOutTemp; if (m_nPredictor == 2) { @@ -1178,7 +1178,7 @@ namespace PdfReader int LZWStream::GetRawChar() { - // GetChar , , m_pPredictor + // Отличие от GetChar в том, что тут мы неиспользуем фильтр, указанный в m_pPredictor if (m_bEOF) { return EOF; @@ -1208,7 +1208,7 @@ namespace PdfReader return false; } - // (eod) + // Проверяем конец кода(eod) и очищаем таблицу кодов start: int nCode = GetCode(); @@ -1465,7 +1465,7 @@ namespace PdfReader m_nCurPosCL = 1; m_nCharBuffer = EOF; - // , 2D + // Пропускам начальные нулевые биты и символы окончания строки, и считываем тэг 2D кодировки while ((nCode1 = LookBits(12)) == 0) { SkipBits(1); @@ -1491,29 +1491,29 @@ namespace PdfReader return EOF; } - // + // Считываем строку bool bError = false; if (m_pCodingLine[m_nCurPosCL] >= m_nColumns) { - // 2D + // 2D кодировка if (m_bNextLine2D) { - // : - // nNewCLPos = (0 <= nNewCLPos <= m_nColumns) - // m_pCodingLine[m_nCurPosCL] = - // (black-to-white, m_nCurPosCL , - // white-to-black, m_nCurPosCL ) - // m_pRefLine[m_nCurPosRL] = , - // , m_nCurPosCL - // : + // Начальное состояние: + // nNewCLPos = Текущая позиция в кодированной строке (0 <= nNewCLPos <= m_nColumns) + // m_pCodingLine[m_nCurPosCL] = Последнее изменение в кодированной строке + // (black-to-white, если m_nCurPosCL четно, + // white-to-black, если m_nCurPosCL нечетно) + // m_pRefLine[m_nCurPosRL] = Следующее изменение в ссылочной строке, противоположного + // цвета, цвету m_nCurPosCL + // В любой момент должно быть верно: // 0 <= m_pCodingLine[m_nCurPosCL] <= nNewCLPos <= m_pRefLine[m_nCurPosRL] <= m_pRefLine[m_nCurPosRL + 1] <= m_nColumns // 0 <= m_nCurPosCL <= m_nColumns + 1 // m_pRefLine[0] = 0 - // m_pRefLine[n] = m_pRefLine[n + 1] = columns -- 1 <= n <= m_nColumns + 1 - // : + // m_pRefLine[n] = m_pRefLine[n + 1] = columns -- для некоторого 1 <= n <= m_nColumns + 1 + // Условие окончания алгоритма: // 0 = m_pCodingLine[0] <= m_pCodingLine[1] < m_pCodingLine[2] < ... < m_pCodingLine[n-1] < m_pCodingLine[n] = m_nColumns, - // <= n <= m_nColumns + 1 + // где <= n <= m_nColumns + 1 int nNewCLPos = 0; for (nIndex = 0; m_pCodingLine[nIndex] < m_nColumns; ++nIndex) @@ -1718,7 +1718,7 @@ namespace PdfReader { // TO DO: Error "CCITTFax row is wrong length " - // + // Выставляем корректную длину while (m_pCodingLine[m_nCurPosCL] > m_nColumns) { --m_nCurPosCL; @@ -1732,7 +1732,7 @@ namespace PdfReader m_nInputBits &= ~7; } - // , + // Проверяем символ конца строки, пропуска нулевые биты bool bEOL = false; if (!m_bEndOfBlock && m_mCurRow == m_nRows - 1) { @@ -1757,14 +1757,14 @@ namespace PdfReader } } - // 2D + // Считываем тэг 2D кодировки if (!m_bEOF && m_nK > 0) { m_bNextLine2D = !LookBits(1); SkipBits(1); } - // (end-of-block marker) + // Проверяем символ конца блока(end-of-block marker) if (m_bEndOfBlock && bEOL) { nCode1 = LookBits(12); @@ -1825,7 +1825,7 @@ namespace PdfReader ++m_mCurRow; } - // + // Считываем один байт int nRet = 0; if (m_nOutputBits >= 8) { @@ -2061,8 +2061,8 @@ namespace PdfReader { return EOF; } - // , , - // . . + // Вблизи конца потока может оказаться, что запрашивается больше бит, чем + // их осталось в потоке. Нужно возратить корректное значение в данном случае. return (m_nInputBuffer << (nCount - m_nInputBits)) & (0xffff >> (16 - nCount)); } m_nInputBuffer = (m_nInputBuffer << 8) + nChar; @@ -2127,7 +2127,7 @@ namespace PdfReader // DCTStream //--------------------------------------------------------------------------------------------------------------- - // (20.12 fixed point format) + // Константы для косинусного преобразования (20.12 fixed point format) #define DCT_Cos_1_16 4017 // cos(pi/16) #define DCT_Sin_1_16 799 // sin(pi/16) #define DCT_Cos_3_16 3406 // cos(3*pi/16) @@ -2138,7 +2138,7 @@ namespace PdfReader #define DCT_Sqrt_2 5793 // sqrt(2) #define DCT_Sqrt_2__2 2896 // sqrt(2) / 2 - // (16.16 fixed point format) + // Константы для преобразования цветов (16.16 fixed point format) #define DCT_CrToR 91881 // 1.4020 #define DCT_CbToG -22553 // -0.3441363 #define DCT_CrToG -46802 // -0.71413636 @@ -2227,7 +2227,7 @@ namespace PdfReader return; } - // MCU + // Вычислим размеры MCU if (m_nComponentsCount == 1) { m_arrCompInfo[0].nXResolution = m_arrCompInfo[0].nYResolution = 1; @@ -2276,7 +2276,7 @@ namespace PdfReader if (m_bProgressive || !m_bInterleaved) { - // + // Выделяем память для всей картинки m_nBufferWidth = ((m_nWidth + m_nMCUWidth - 1) / m_nMCUWidth) * m_nMCUWidth; m_nBufferHeight = ((m_nHeight + m_nMCUHeight - 1) / m_nMCUHeight) * m_nMCUHeight; @@ -2286,17 +2286,17 @@ namespace PdfReader memset(m_ppFrameBuffer[nIndex], 0, m_nBufferWidth * m_nBufferHeight * sizeof(int)); } - // + // Считываем данные картинки do { m_nRestartMarker = 0xd0; Restart(); ReadScan(); } while (ReadHeader()); - // + // Декодируем DecodeImage(); - // + // Обнуляем счетчики m_nCurComponent = 0; m_nX = 0; m_nY = 0; @@ -2304,7 +2304,7 @@ namespace PdfReader } else { - // MCU + // Выделяем память под одну строку для MCU m_nBufferWidth = ((m_nWidth + m_nMCUWidth - 1) / m_nMCUWidth) * m_nMCUWidth; for (int nComp = 0; nComp < m_nComponentsCount; ++nComp) { @@ -2314,7 +2314,7 @@ namespace PdfReader } } - // + // Обнуляем счетчики m_nCurComponent = 0; m_nX = 0; m_nY = 0; @@ -2430,7 +2430,7 @@ namespace PdfReader m_nEOBRun = 0; } - // MCUs JPEG. + // Считываем одну строку из MCUs из соответствующего потока JPEG. bool DCTStream::ReadMCURow() { int arrRawData[64]; @@ -2440,7 +2440,7 @@ namespace PdfReader for (x1 = 0; x1 < m_nWidth; x1 += m_nMCUWidth) { - // restart marker + // Обрабатываем restart marker if (m_nRestartInterval > 0 && m_nRestartCtr == 0) { int nChar = ReadMarker(); @@ -2454,7 +2454,7 @@ namespace PdfReader Restart(); } - // MCU + // Считываем один MCU for (int nComp = 0; nComp < m_nComponentsCount; ++nComp) { int nXRes = m_arrCompInfo[nComp].nXResolution; @@ -2521,7 +2521,7 @@ namespace PdfReader } --m_nRestartCtr; - // + // Преобазуем пространство цветов if (m_nColorTransform) { // YCbCr -> RGB @@ -2543,7 +2543,7 @@ namespace PdfReader } } } - else if (m_nComponentsCount == 4) // YCbCrK -> CMYK (K ) + else if (m_nComponentsCount == 4) // YCbCrK -> CMYK (K оставляем неизменненным) { for (y2 = 0; y2 < m_nMCUHeight; ++y2) { @@ -2566,7 +2566,7 @@ namespace PdfReader return true; } - // progressive interleaved JPEG. + // Только для progressive или не interleaved JPEG. void DCTStream::ReadScan() { int arrData[64]; @@ -2596,7 +2596,7 @@ namespace PdfReader for (x1 = 0; x1 < m_nWidth; x1 += dx1) { - // restart marker + // Обрабатываем restart marker if (m_nRestartInterval > 0 && m_nRestartCtr == 0) { int nChar = ReadMarker(); @@ -2612,7 +2612,7 @@ namespace PdfReader Restart(); } - // MCU + // Считываем один MCU for (nComponent = 0; nComponent < m_nComponentsCount; ++nComponent) { if (!m_oCurScanInfo.arrbComponent[nComponent]) @@ -2744,7 +2744,7 @@ namespace PdfReader { int nRun = 0, nSize = 0, nAmp = 0, nBit = 0; - // DC o + // DC кoэффициенты int nKoef = m_oCurScanInfo.nFirstKoef; if (nKoef == 0) { @@ -2782,7 +2782,7 @@ namespace PdfReader return true; } - // EOB + // Проверяем группу EOB if (m_nEOBRun > 0) { while (nKoef <= m_oCurScanInfo.nLastKoef) @@ -2805,7 +2805,7 @@ namespace PdfReader } int nK = 0; - // AC + // считываем коэффициенты AC while (nKoef <= m_oCurScanInfo.nLastKoef) { int nSymbol = 0; @@ -3002,7 +3002,7 @@ namespace PdfReader } } - // + // Преобразование пространства цветов if (m_nColorTransform) { // YCbCr -> RGB @@ -3027,7 +3027,7 @@ namespace PdfReader } } } - else if (m_nComponentsCount == 4) // YCbCrK -> CMYK (K ) + else if (m_nComponentsCount == 4) // YCbCrK -> CMYK (K оставляем неизмененным) { for (y2 = 0; y2 < m_nMCUHeight; ++y2) { @@ -3059,18 +3059,18 @@ namespace PdfReader int nTemp = 0; int *pCurLine = NULL; - // + // Деквантизация for (int nIndex = 0; nIndex < 64; ++nIndex) { arrDataIn[nIndex] *= pQuantTable[nIndex]; } - // - ( ) + // Обратное синусно-косинусное преобразования (по строкам) for (int nIndex = 0; nIndex < 64; nIndex += 8) { pCurLine = arrDataIn + nIndex; - // , 0 + // Проверяем случай, когда все коэффициенты равны 0 if (pCurLine[1] == 0 && pCurLine[2] == 0 && pCurLine[3] == 0 && pCurLine[4] == 0 && pCurLine[5] == 0 && pCurLine[6] == 0 && pCurLine[7] == 0) { nTemp = (DCT_Sqrt_2 * pCurLine[0] + 512) >> 10; @@ -3085,7 +3085,7 @@ namespace PdfReader continue; } - // 4 ( 128) + // Шаг 4 (Сдвиг на 128) arrBuffer[0] = (DCT_Sqrt_2 * pCurLine[0] + 128) >> 8; arrBuffer[1] = (DCT_Sqrt_2 * pCurLine[4] + 128) >> 8; arrBuffer[2] = pCurLine[2]; @@ -3095,7 +3095,7 @@ namespace PdfReader arrBuffer[5] = pCurLine[3] << 4; arrBuffer[6] = pCurLine[5] << 4; - // 3 + // Шаг 3 nTemp = (arrBuffer[0] - arrBuffer[1] + 1) >> 1; arrBuffer[0] = (arrBuffer[0] + arrBuffer[1] + 1) >> 1; arrBuffer[1] = nTemp; @@ -3109,7 +3109,7 @@ namespace PdfReader arrBuffer[5] = (arrBuffer[7] - arrBuffer[5] + 1) >> 1; arrBuffer[7] = nTemp; - // 2 + // Шаг 2 nTemp = (arrBuffer[0] - arrBuffer[3] + 1) >> 1; arrBuffer[0] = (arrBuffer[0] + arrBuffer[3] + 1) >> 1; arrBuffer[3] = nTemp; @@ -3123,7 +3123,7 @@ namespace PdfReader arrBuffer[5] = (arrBuffer[5] * DCT_Cos_1_16 - arrBuffer[6] * DCT_Sin_1_16 + 2048) >> 12; arrBuffer[6] = nTemp; - // 1 + // Шаг 1 pCurLine[0] = arrBuffer[0] + arrBuffer[7]; pCurLine[7] = arrBuffer[0] - arrBuffer[7]; pCurLine[1] = arrBuffer[1] + arrBuffer[6]; @@ -3134,12 +3134,12 @@ namespace PdfReader pCurLine[4] = arrBuffer[3] - arrBuffer[4]; } - // - ( ) + // Обратное синусно-косинусное преобразования (по столбцам) for (int nIndex = 0; nIndex < 8; ++nIndex) { pCurLine = arrDataIn + nIndex; - // + // проверяем все ли коэффициенты нулевые if (pCurLine[1 * 8] == 0 && pCurLine[2 * 8] == 0 && pCurLine[3 * 8] == 0 && pCurLine[4 * 8] == 0 && pCurLine[5 * 8] == 0 && pCurLine[6 * 8] == 0 && pCurLine[7 * 8] == 0) { nTemp = (DCT_Sqrt_2 * arrDataIn[nIndex + 0] + 8192) >> 14; @@ -3154,7 +3154,7 @@ namespace PdfReader continue; } - // 4 + // Шаг 4 arrBuffer[0] = (DCT_Sqrt_2 * pCurLine[0 * 8] + 2048) >> 12; arrBuffer[1] = (DCT_Sqrt_2 * pCurLine[4 * 8] + 2048) >> 12; arrBuffer[2] = pCurLine[2 * 8]; @@ -3164,7 +3164,7 @@ namespace PdfReader arrBuffer[5] = pCurLine[3 * 8]; arrBuffer[6] = pCurLine[5 * 8]; - // 3 + // Шаг 3 nTemp = (arrBuffer[0] - arrBuffer[1] + 1) >> 1; arrBuffer[0] = (arrBuffer[0] + arrBuffer[1] + 1) >> 1; arrBuffer[1] = nTemp; @@ -3178,7 +3178,7 @@ namespace PdfReader arrBuffer[5] = (arrBuffer[7] - arrBuffer[5] + 1) >> 1; arrBuffer[7] = nTemp; - // 2 + // Шаг 2 nTemp = (arrBuffer[0] - arrBuffer[3] + 1) >> 1; arrBuffer[0] = (arrBuffer[0] + arrBuffer[3] + 1) >> 1; arrBuffer[3] = nTemp; @@ -3192,7 +3192,7 @@ namespace PdfReader arrBuffer[5] = (arrBuffer[5] * DCT_Cos_1_16 - arrBuffer[6] * DCT_Sin_1_16 + 2048) >> 12; arrBuffer[6] = nTemp; - // 1 + // Шаг 1 pCurLine[0 * 8] = arrBuffer[0] + arrBuffer[7]; pCurLine[7 * 8] = arrBuffer[0] - arrBuffer[7]; pCurLine[1 * 8] = arrBuffer[1] + arrBuffer[6]; @@ -3276,7 +3276,7 @@ namespace PdfReader bool DCTStream::ReadHeader() { - // + // Читаем заголовок bool bDoScan = false; while (!bDoScan) { @@ -3341,7 +3341,7 @@ namespace PdfReader // TO DO : Error "Bad DCT header" return false; default: - // : APPn, COM .. + // Пропускам маркеры типа: APPn, COM и т.д. if (nChar >= 0xe0) { int nCount = Read16() - 2; @@ -3450,9 +3450,9 @@ namespace PdfReader for (int nIndex = 0; nIndex < m_oCurScanInfo.nComponentsCount; ++nIndex) { int nID = m_pStream->GetChar(); - // () DCT ID , - // , m_arrCompInfo[i], - // + // некоторые(некорректные) DCT потоки используют свои ID числа много раз, но как минимум + // в потоке компоненты идут по порядку, поэтому мы сначала проверяем m_arrCompInfo[i], чтобы + // решить данную пробему if (nID == m_arrCompInfo[nIndex].nID) { nComp = nIndex; @@ -4598,7 +4598,7 @@ namespace PdfReader m_bEndOfBlock = m_bEOF = true; - // + //читаем заголовок int nCmf = m_pStream->GetChar(); int nFlag = m_pStream->GetChar(); if (nCmf == EOF || nFlag == EOF) @@ -4781,7 +4781,7 @@ namespace PdfReader bool FlateStream::StartBlock() { - // + // Освобождаем таблицы кодов из предыдущего блока if (m_oLiteratCodeTable.pCodes != m_oFixedLiteralCodeTable.pCodes) { MemUtilsFree(m_oLiteratCodeTable.pCodes); @@ -4793,7 +4793,7 @@ namespace PdfReader } m_oDistanceCodeTable.pCodes = NULL; - // + // Считываем заголовок блока int nBlockHeader = GetCodeWord(3); if (nBlockHeader & 1) m_bEOF = true; @@ -5018,10 +5018,10 @@ namespace PdfReader return true; } - // , ( ) + // Конвертируем массив , в таблицу Хаффмана(сортируя по значениям) void FlateStream::ConvertHuffmanCodes(int *pLengths, int nCount, FlateHuffmanTable *pTable) { - // + // Ищем макимальный элемент pTable->nMaxLen = 0; for (int nValue = 0; nValue < nCount; ++nValue) { @@ -5031,18 +5031,18 @@ namespace PdfReader } } - // + // Выделяем место для таблицы int nTableSize = 1 << pTable->nMaxLen; pTable->pCodes = (FlateHuffmanCode *)MemUtilsMallocArray(nTableSize, sizeof(FlateHuffmanCode)); - // + // Очищаем таблицу for (int nIndex = 0; nIndex < nTableSize; ++nIndex) { pTable->pCodes[nIndex].nLength = 0; pTable->pCodes[nIndex].nValue = 0; } - // + // Заполняем таблицу int nLen = 0, nSkip = 0, nCode = 0; for (nLen = 1, nCode = 0, nSkip = 2; nLen <= pTable->nMaxLen; ++nLen, nCode <<= 1, nSkip <<= 1) { @@ -5364,7 +5364,7 @@ namespace PdfReader } // - // FillBuffer, m_sBuffer[] : + // После выполнения функции FillBuffer, m_sBuffer[] выглядит следующим образом: // +-----+--------------+-----------------+-- // + tag | ... data ... | next 0, 1, or 2 | // +-----+--------------+-----------------+-- @@ -5376,7 +5376,7 @@ namespace PdfReader if (m_bEOF) return false; - // + // считываем два байта int nChar1 = 0, nChar2 = 0; if (m_pNextEnd < m_pBufferEnd + 1) { diff --git a/PdfReader/Src/Stream.h b/PdfReader/Src/Stream.h index f0fdfdf37b..7e736d09f4 100644 --- a/PdfReader/Src/Stream.h +++ b/PdfReader/Src/Stream.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_STREAM_H +#ifndef _PDF_READER_STREAM_H #define _PDF_READER_STREAM_H #include @@ -46,7 +46,7 @@ namespace PdfReader }; //------------------------------------------------------------------------ - // Stream ( ) + // Stream (основной класс) //------------------------------------------------------------------------ class Stream @@ -57,7 +57,7 @@ namespace PdfReader virtual ~Stream(); - // . + // Счетчик ссылок. int AddRef() { return ++m_nRef; @@ -67,49 +67,49 @@ namespace PdfReader return --m_nRef; } - // . + // Тип потока. virtual StreamType GetType() = 0; - // ( ). + // Сбрасываем все параметры(к начальным). virtual void Reset() = 0; - // . + // Закрываем поток. virtual void Close(); - // . + // Передвигаемся к следующему символу в потоке. virtual int GetChar() = 0; - // . + // Смотрим на следующий символ в потоке. virtual int LookChar() = 0; - // GetChar Predictor. - // StreamPredictor. + // GetChar буз использования Predictor. + // Используется только в StreamPredictor. virtual int GetRawChar(); - // . + // Следующая строка в потоке. virtual char *GetLine(char *sBuffer, int nSize); - // . + // Текущая позиция в потоке. virtual int GetPos() = 0; - // . nDirection - - // , , - // , . + // Устанавливаем текущую позицию в потоке. Если nDirection - + // отрицательно, тогда позицию отсчитваем от конца потока, а + // если положительно, тогда от начала. virtual void SetPos(unsigned int unPos, int nDirection = 0) = 0; - // PostScript' . + // PostScript'ое название фильтра. virtual StringExt *GetPSFilter(int nPSLevel, char *sIndent); - // ? + // Может ли поток содержать непечатыемые символы? virtual bool IsBinary(bool bLast = true) = 0; virtual BaseStream *GetBaseStream() = 0; - // ( BaseStream - // DecryptStream). + // Поток после последнего декодирования (это может быть BaseStream + // или DecryptStream). virtual Stream *GetUndecodedStream() = 0; - // . + // Словарь связанный с данным потоком. virtual Dict *GetDict() = 0; // Encoding filter? @@ -118,19 +118,19 @@ namespace PdfReader return false; } - // , . + // Получить параметры изображения, определенного содержимым данного потока. virtual void GetImageParams(int *pnBitsPerComponent, StreamColorSpaceMode *peCSMode) { } - // . + // Возвращется следующий поток из стека. virtual Stream *GetNextStream() { return NULL; } - // , . - // . + // Применяем фильтры к данному потоку, описанные в параметрах словаря. + // Возвращается новый поток. Stream *AddFilters(Object *pDict); private: @@ -139,14 +139,14 @@ namespace PdfReader private: - int m_nRef; // + int m_nRef; // счетчик ссылок }; //------------------------------------------------------------------------ // BaseStream // - // . + // Это основной класс для всех потоков и чтения из файла. //------------------------------------------------------------------------ class BaseStream : public Stream @@ -178,7 +178,7 @@ namespace PdfReader return NULL; } - // / . + // Запрашиваем/устанавливаем позицию первого байта в потоке файла. virtual unsigned int GetStartPos() = 0; virtual void SetStartPos(int nDelta) = 0; @@ -190,7 +190,7 @@ namespace PdfReader //------------------------------------------------------------------------ // FilterStream // - // , . + // Это основной класс для всех потоков, к которым примене фильтр. //------------------------------------------------------------------------ class FilterStream : public Stream @@ -235,16 +235,16 @@ namespace PdfReader { public: - // Image object ( - // , Predictor). + // Создаем Image object по картинке с заданными параметрами( тут имеются ввиду + // реальные параметры картинки, а не те что могут прийти в Predictor). ImageStream(Stream *pStream, int nWidth, int nComponents, int nBitsPerComponent); ~ImageStream(); void Reset(); - // . pPixel , - // m_nComponentsPerPixel . + // Считываем следующий пиксел из потока. pPixel должно указывать на место достаточное, + // для хранения как минимум m_nComponentsPerPixel элементов. bool GetPixel(unsigned char *pPixel); unsigned char *GetNextLine(); @@ -253,25 +253,25 @@ namespace PdfReader private: - Stream *m_pStream; // - int m_nWidth; // - int m_nComponentsPerPixel; // - int m_nBitsPerComponent; // - int m_nComponentsPerLine; // - unsigned char *m_pLineBuffer; // - int m_nLinePos; // m_pLineBuffer + Stream *m_pStream; // Основной поток + int m_nWidth; // Количество пикселей в строке + int m_nComponentsPerPixel; // Количество компонент на один пиксел + int m_nBitsPerComponent; // Количество бит в компоненте + int m_nComponentsPerLine; // Количество компонент в одной строке + unsigned char *m_pLineBuffer; // Буффер для одной строки изображения + int m_nLinePos; // Текущая позиция в m_pLineBuffer }; //------------------------------------------------------------------------ - // StreamPredictor (Predictor - ) + // StreamPredictor (Predictor - дополнительный фильтр для картинок) //------------------------------------------------------------------------ class StreamPredictor { public: - // Predictor object. , , - // . + // Создаем Predictor object. Параметры, которые задаются здесь, могут + // не совпадать с реальными параметрами картинки. StreamPredictor(Stream *pStream, int nPredictor, int nWidth, int nComponents, int nBitsPerComponent); ~StreamPredictor(); @@ -291,16 +291,16 @@ namespace PdfReader private: - Stream *m_pStream; // + Stream *m_pStream; // Основной поток int m_nPredictor; // Predictor - int m_nWidth; // - int m_nComponentsPerPixel; // - int m_nBitsPerComponent; // - int m_nComponentsPerLine; // - int m_nBytesPerPixel; // - int m_nBytesPerLine; // - unsigned char *m_pLineBuffer; // - int m_nLinePos; // m_pLineBuffer + int m_nWidth; // Количество пикселей в строке + int m_nComponentsPerPixel; // Количество компонент на один пиксел + int m_nBitsPerComponent; // Количество бит в компоненте + int m_nComponentsPerLine; // Количество компонент в одной строке + int m_nBytesPerPixel; // Количество байт в одном пикселе + int m_nBytesPerLine; // Количество байт в строке + unsigned char *m_pLineBuffer; // Буффер для одной строки изображения + int m_nLinePos; // Текущая позиция в m_pLineBuffer bool m_bSuccess; }; @@ -410,11 +410,11 @@ namespace PdfReader //------------------------------------------------------------------------ // EmbedStream // - // , () - // (Inline images). Base stream -- - // EmbedStream, Base stream - // . , - // FileStream ( MakeSubStream). + // Специальный тип потока, используемый для внутренныих(внедренных) потоков + // (Inline images). Читаем напрямую из Base stream -- после удаления + // EmbedStream, чтение из Base stream будет совершаться для оставшейся части + // потока. Это соверешнно подругому, чем просто создать новый поток + // FileStream (используя MakeSubStream). //------------------------------------------------------------------------ class EmbedStream : public BaseStream @@ -507,7 +507,7 @@ namespace PdfReader private: - int m_arrC[5]; // C B + int m_arrC[5]; // Имена массивов C и B взяты из спецификации int m_arrB[4]; int m_nIndex; int m_nCount; @@ -543,25 +543,25 @@ namespace PdfReader private: - StreamPredictor *m_pPredictor; // Predictor ( ) - int m_nEarlyChange; // LZW - bool m_bEOF; // ? + StreamPredictor *m_pPredictor; // Predictor (еще один дополнительный фильтр) + int m_nEarlyChange; // Параметр и словаря для LZW фильтра + bool m_bEOF; // Конец потока? int m_nInputBuffer; // Input buffer - int m_nInputBits; // + int m_nInputBits; // Количество бит в буффере struct { int nLength; int nHead; unsigned char unTail; - } m_pTable[4097]; // - int m_nNextCode; // - int m_nNextBits; // - int m_nPrevCode; // - int m_nNewChar; // , - unsigned char m_arrCurBuffer[4097]; // - int m_nCurLength; // - int m_nCurPos; // - bool m_bFirst; // + } m_pTable[4097]; // Таблица для декодирования + int m_nNextCode; // Следующий код + int m_nNextBits; // Число бит в следующем коде + int m_nPrevCode; // Предыдущий код в потоке + int m_nNewChar; // Новый символ, который мы добавим в таблицу + unsigned char m_arrCurBuffer[4097]; // Буффер для текущей последовательности + int m_nCurLength; // Длина текущей последовательности + int m_nCurPos; // Позиция в текущей последовательности + bool m_bFirst; // Является ли данный код первым после очищения таблицы }; //------------------------------------------------------------------------ @@ -596,9 +596,9 @@ namespace PdfReader private: - char m_sBuffer[128]; // - char *m_pBufferPointer; // - char *m_pEndOfBuffer; // + char m_sBuffer[128]; // Буфер + char *m_pBufferPointer; // Указатель на следующий символ в буфере + char *m_pEndOfBuffer; // Указатель на конец буфера bool m_bEOF; }; @@ -643,23 +643,23 @@ namespace PdfReader private: - int m_nK; // 'K', - bool m_bEndOfLine; // 'EndOfLine' - bool m_bByteAlign; // 'EncodedByteAlign' - int m_nColumns; // 'Columns' - int m_nRows; // 'Rows' - bool m_bEndOfBlock; // 'EndOfBlock' - bool m_bBlackIs1; // 'BlackIs1' + int m_nK; // Параметр 'K', определяющий тип кодировки + bool m_bEndOfLine; // Параметр 'EndOfLine' + bool m_bByteAlign; // Параметр 'EncodedByteAlign' + int m_nColumns; // Параметр 'Columns' + int m_nRows; // Параметр 'Rows' + bool m_bEndOfBlock; // Параметр 'EndOfBlock' + bool m_bBlackIs1; // Параметр 'BlackIs1' bool m_bEOF; // - bool m_bNextLine2D; // True, 2D - int m_mCurRow; // + bool m_bNextLine2D; // True, если следующая строка использует кодировку 2D + int m_mCurRow; // Текущая строка int m_nInputBuffer; // Input buffer - int m_nInputBits; // Input buffer - short *m_pRefLine; // , - int m_nCurPosRL; // m_pRefLine - short *m_pCodingLine; // , - int m_nCurPosCL; // m_pCodingLine + int m_nInputBits; // Количество бит в Input buffer + short *m_pRefLine; // Ссылочная строка, меняющую элементы + int m_nCurPosRL; // Текущая позиция в m_pRefLine + short *m_pCodingLine; // Кодирующая строка, меняющая элементы + int m_nCurPosCL; // Текущая позиция в m_pCodingLine int m_nOutputBits; // int m_nCharBuffer; // }; @@ -670,31 +670,31 @@ namespace PdfReader struct DCTCompInfo { - int nID; // ID - int nXResolution; // - int nYResolution; // - int nQuantTableNum; // + int nID; // ID данного элемента + int nXResolution; // Разрешение по горизонтали + int nYResolution; // Разрешение по вертикали + int nQuantTableNum; // Номер таблицы квантования int nPrevDC; // }; struct DCTScanInfo { - bool arrbComponent[4]; // arrbComponent[i] = true, i- - int nComponentsCount; // - int arrDCHuffTable[4]; // DC Huffman - int arrACHuffTable[4]; // AC Huffman - int nFirstKoef; // DCT - int nLastKoef; // DCT + bool arrbComponent[4]; // arrbComponent[i] = true, если i-ая компонента включена в даннуб структуру + int nComponentsCount; // количество компонент в данной структуре + int arrDCHuffTable[4]; // номера таблиц DC Huffman + int arrACHuffTable[4]; // номера таблиц AC Huffman + int nFirstKoef; // первый DCT коэффициент + int nLastKoef; // последний DCT коэффициент int nApproxH; int nApproxL; }; struct DCTHuffTable { - unsigned char arrunFirstSymbol[17]; // - unsigned short arrunFirstCode[17]; // - unsigned short arrunCodesCount[17]; // - unsigned char arrunSymbols[256]; // + unsigned char arrunFirstSymbol[17]; // Первый символ в данной группе + unsigned short arrunFirstCode[17]; // Первый код в данной группе + unsigned short arrunCodesCount[17]; // Количество кодов в данной группе + unsigned char arrunSymbols[256]; // Сами символы }; class DCTStream : public FilterStream @@ -745,44 +745,44 @@ namespace PdfReader private: - bool m_bProgressive; // True, progressive - bool m_bInterleaved; // True, interleaved - int m_nWidth; // - int m_nHeight; // - int m_nMCUWidth; // min coding unit(MCU) - int m_nMCUHeight; // min coding unit(MCU) - int m_nBufferWidth; // FrameBuffer - int m_nBufferHeight; // FrameBuffer - DCTCompInfo m_arrCompInfo[4]; // Info - DCTScanInfo m_oCurScanInfo; // Info Scan - int m_nComponentsCount; // - int m_nColorTransform; // : - // -1 = - // 0 = + bool m_bProgressive; // True, если мод progressive + bool m_bInterleaved; // True, если мод interleaved + int m_nWidth; // ширина изображения + int m_nHeight; // высота изображения + int m_nMCUWidth; // ширина min coding unit(MCU) + int m_nMCUHeight; // высота min coding unit(MCU) + int m_nBufferWidth; // ширина FrameBuffer + int m_nBufferHeight; // высота FrameBuffer + DCTCompInfo m_arrCompInfo[4]; // Структура Info для каждой компоненты + DCTScanInfo m_oCurScanInfo; // Структура Info для текущего Scan + int m_nComponentsCount; // Количество компонент изображения + int m_nColorTransform; // Преобразования пространства цветов: + // -1 = непоределено + // 0 = нет преобразования // 1 = YUV/YUVK -> RGB/CMYK - bool m_bJFIFMarker; // True, APP0 JFIF - bool m_bAdobeMarker; // True, APP14 Adobe - int m_nRestartInterval; // MCU - unsigned short m_arrQuantTables[4][64]; // - int m_nQuantTablesCount; // - DCTHuffTable m_arrDCHuffTables[4]; // DC Huffman - DCTHuffTable m_arrACHuffTables[4]; // AC Huffman - int m_nDCHuffTablesCount; // DC Huffman - int m_nACHuffTablesCount; // AC Huffman - unsigned char *m_pppRowBuffer[4][32]; // MCU (non-progressive mode) - int *m_ppFrameBuffer[4]; // (progressive mode) + bool m_bJFIFMarker; // True, если есть маркер APP0 JFIF + bool m_bAdobeMarker; // True, если есть маркер APP14 Adobe + int m_nRestartInterval; // в MCU + unsigned short m_arrQuantTables[4][64]; // Таблицы квантования + int m_nQuantTablesCount; // количество таблицы квантования + DCTHuffTable m_arrDCHuffTables[4]; // Таблицы DC Huffman + DCTHuffTable m_arrACHuffTables[4]; // Таблицы AC Huffman + int m_nDCHuffTablesCount; // Количество таблиц DC Huffman + int m_nACHuffTablesCount; // Количество таблиц AC Huffman + unsigned char *m_pppRowBuffer[4][32]; // Буфер для MCU (non-progressive mode) + int *m_ppFrameBuffer[4]; // Буфер для фрэйма (progressive mode) - int m_nCurComponent; // /MCU + int m_nCurComponent; // Текущие параметры для кртинки/MCU int m_nX; // int m_nY; // int m_nDY; // - int m_nRestartCtr; // MCU + int m_nRestartCtr; // количество оставишхся MCU до рестарта int m_nRestartMarker; // - int m_nEOBRun; // EOB(end-of-block) + int m_nEOBRun; // количество оставшихся EOB(end-of-block) в текущей группе - int m_nInputBuffer; // - int m_nInputBits; // Input buffer + int m_nInputBuffer; // Буфер для кодов разной длины + int m_nInputBits; // Число корректных бит в Input buffer }; @@ -790,7 +790,7 @@ namespace PdfReader // FlateZlibStream //------------------------------------------------------------------------ -#define flateZlibWindow 32768 // +#define flateZlibWindow 32768 // Размер буфера #define flateZlibMask 32767 // (flateZlibWindow - 1) class FlateZlibStream : public FilterStream @@ -816,15 +816,15 @@ namespace PdfReader private: - z_stream m_oZStream; // Zlib + z_stream m_oZStream; // Zlib поток StreamPredictor *m_pPredictor; // Predictor - unsigned int m_nInSize; // - unsigned char m_arrInBuffer[flateZlibWindow]; // - unsigned char m_arrBuffer[flateZlibWindow]; // - int m_nBufferCurPos; // - int m_nRemain; // - bool m_bEndOfBlock; // True, - bool m_bEOF; // True, + unsigned int m_nInSize; // Размер входного буффера + unsigned char m_arrInBuffer[flateZlibWindow]; // Входной буффер + unsigned char m_arrBuffer[flateZlibWindow]; // Буфер для результата декодирования + int m_nBufferCurPos; // Текущая позиция в буфере + int m_nRemain; // Число корректных байт в буфере + bool m_bEndOfBlock; // True, когда достигли конца блока + bool m_bEOF; // True, когда достигли конца потока }; @@ -832,29 +832,29 @@ namespace PdfReader // FlateStream //------------------------------------------------------------------------ -#define flateWindow 32768 // +#define flateWindow 32768 // Размер буфера #define flateMask (flateWindow-1) -#define flateMaxHuffman 15 // Huffman +#define flateMaxHuffman 15 // макимальная длина кода Huffman #define flateMaxCodeLenCodes 19 // max # code length codes #define flateMaxLitCodes 288 // max # literal codes #define flateMaxDistCodes 30 // max # distance codes struct FlateHuffmanCode { - unsigned short nLength; // - unsigned short nValue; // + unsigned short nLength; // длина кода в битах + unsigned short nValue; // значение данного коду }; struct FlateHuffmanTable { - FlateHuffmanCode *pCodes; // - int nMaxLen; // + FlateHuffmanCode *pCodes; // таблица кодов + int nMaxLen; // макимальная длина кода }; struct FlateDecode { - int nExtraBitsCount; // - int nFirst; // + int nExtraBitsCount; // количество дополнительных бит + int nFirst; // первая длина }; class FlateStream : public FilterStream @@ -887,18 +887,18 @@ namespace PdfReader private: StreamPredictor *m_pPredictor; // Predictor - unsigned char m_arrBuffer[flateWindow]; // - int m_nBufferCurPos; // - int m_nRemain; // - int m_nCodeBuffer; // - int m_nCodeSize; // m_nCodeBuffer - int m_arrCodeLengths[flateMaxLitCodes + flateMaxDistCodes]; // ( ) - FlateHuffmanTable m_oLiteratCodeTable; // - FlateHuffmanTable m_oDistanceCodeTable; // - - bool m_bCompressedBlock; // True, - int m_nUncompBlockLen; // - bool m_bEndOfBlock; // True, - bool m_bEOF; // True, + unsigned char m_arrBuffer[flateWindow]; // Буфер для результата декодирования + int m_nBufferCurPos; // Текущая позиция в буфере + int m_nRemain; // Число корректных байт в буфере + int m_nCodeBuffer; // Бефер исходных кодов + int m_nCodeSize; // Число бит в m_nCodeBuffer + int m_arrCodeLengths[flateMaxLitCodes + flateMaxDistCodes]; // Длины кодов(и для самих слов и для расстояний) + FlateHuffmanTable m_oLiteratCodeTable; // Таблица буквенных кодов + FlateHuffmanTable m_oDistanceCodeTable; // Таблица кодов-расстояний + bool m_bCompressedBlock; // True, если читаем сжатый блок + int m_nUncompBlockLen; // Оставшаяся длина несжатого блока + bool m_bEndOfBlock; // True, когда достигли конца блока + bool m_bEOF; // True, когда достигли конца потока static int m_arrCodeLenCodeMap[flateMaxCodeLenCodes]; // static FlateDecode m_arrLengthDecode[flateMaxLitCodes - 257]; // diff --git a/PdfReader/Src/StringExt.cpp b/PdfReader/Src/StringExt.cpp index 1bab0d1c1b..d29ad7c522 100644 --- a/PdfReader/Src/StringExt.cpp +++ b/PdfReader/Src/StringExt.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -276,7 +276,7 @@ namespace PdfReader } else { - // + // –азбираем форматированную строку if (!(*pCur >= '0' && *pCur <= '9')) break; nIndex = *pCur - '0'; @@ -469,7 +469,7 @@ namespace PdfReader nWidth = uArg.iValue; break; } - // , + // ƒобавл¤ем аргумент в нужном формате, с нужным прилеганием if (!bReverseAlign && nLen < nWidth) { for (int nCounter = nLen; nCounter < nWidth; ++nCounter) diff --git a/PdfReader/Src/StringExt.h b/PdfReader/Src/StringExt.h index 7fde31fbf5..da2532fa48 100644 --- a/PdfReader/Src/StringExt.h +++ b/PdfReader/Src/StringExt.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_STRING_EXT_H +#ifndef _PDF_READER_STRING_EXT_H #define _PDF_READER_STRING_EXT_H #include @@ -8,7 +8,7 @@ namespace PdfReader { //--------------------------------------------------------------------------------------- - // WString - BSTR + // WString - аналог BSTR //--------------------------------------------------------------------------------------- typedef wchar_t* WString; @@ -50,7 +50,7 @@ namespace PdfReader //--------------------------------------------------------------------------------------- - // StringExt - CString + // класс StringExt - аналог CString //--------------------------------------------------------------------------------------- class StringExt @@ -58,61 +58,61 @@ namespace PdfReader public: - // . + // Создаем пустую строку. StringExt(); StringExt(std::wstring& wsString); StringExt(const wchar_t* wsString); - // . + // Создаем строку из Сишной строки. StringExt(const char *sString); - // . - // . + // Создаем строку из символов в . Данная строка + // может содержать нулевые символы. StringExt(const char *sString, int nLength); - // , , . + // Создаем строку из символов, начиная с , строки . StringExt(StringExt *seString, int nIndex, int nLength); - // . + // Копируем строку. StringExt(StringExt *seString); StringExt *Copy() { return new StringExt(this); } - // . + // Соединяем две строки. StringExt(StringExt *seString1, StringExt *seString2); - // . + // Переводим целое значение в строку. static StringExt *FromInt(int nValue); - // . printf, - // . : + // Создаем форматированную строку. Функция подобна printf, но без проблем + // с переполнением строки. Формат выглядит следующим образом: // {:[][.]} - // : - // - ( 0). - // -- PS: , - // . - // - , , - // , . - // - - // - : - // d, x, o, b -- (int) , , - // - // ud, ux, uo, ub -- , (uint) - // ld, lx, lo, lb, uld, ulx, ulo, ulb -- long ulong + // где: + // - номер аргумента (нумерация начинается с 0). + // -- PS: сами аргументы должны идти по порядку, а использовать их можно + // многократно и в любом порядке. + // - ширина поля, если она отрицательна, тогда прилежание будет + // сменено на противоположное, а пустые места будут заполнены нулями. + // - количество знаков после запятой + // - тип один из слудющих: + // d, x, o, b -- целое(int) в десятичной, шестнадцатиричной, восьмиричной + // и двоичной системах исчисления + // ud, ux, uo, ub -- тоже самое, только беззнаковое целое(uint) + // ld, lx, lo, lb, uld, ulx, ulo, ulb -- аналогичной long и ulong // f, g -- double // c -- char // s -- string (char *) // t -- StringExt * - // w -- ; - // {{ }}. + // w -- Пробелы; значение аргументы означает количество пробелов + // Для вывода фигурных скобок надо использовать {{ и }}. static StringExt *Format(char *sFormat, ...); static StringExt *FormatV(char *sFormat, va_list sArgList); - // . + // Деструктор. ~StringExt(); int GetLength() @@ -120,7 +120,7 @@ namespace PdfReader return m_nLength; } - // char*. + // Возвращаем строку в виде char*. char *GetBuffer() { return m_sData; @@ -140,33 +140,33 @@ namespace PdfReader m_sData[nIndex] = nChar; } - // . + // Очищаем строку. StringExt *Clear(); - // . + // Добавляем символ или строку. StringExt *Append(char nChar); StringExt *Append(StringExt *seString); StringExt *Append(const char *sString); StringExt *Append(const char *sString, int nLength); - // . + // Добавляем форматированную строку. StringExt *AppendFormat(char *sFormat, ...); StringExt *AppendFormatV(char *sFormat, va_list sArgList); - // . + // Вставляем символ или строку. StringExt *Insert(int nIndex, char nChar); StringExt *Insert(int nIndex, StringExt *seString); StringExt *Insert(int nIndex, const char *sString); StringExt *Insert(int nIndex, const char *sString, int nLength); - // . + // Удаляем один символ или массив символов. StringExt *Delete(int nIndex, int nCount = 1); - // / . + // Делаем в строке все символы большими/маленькими буквами. StringExt *MakeUpper(); StringExt *MakeLower(); - // : -1:< 0:= +1:> + // Сравнение двух строк: -1:< 0:= +1:> int Compare(StringExt *seString); int CompareN(StringExt *seString, int nCount); int Compare(const char *sString); diff --git a/PdfReader/Src/UTF8.h b/PdfReader/Src/UTF8.h index 571dce45c5..0709ddb511 100644 --- a/PdfReader/Src/UTF8.h +++ b/PdfReader/Src/UTF8.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_UTF8_H +#ifndef _PDF_READER_UTF8_H #define _PDF_READER_UTF8_H namespace PdfReader diff --git a/PdfReader/Src/UnicodeMap.cpp b/PdfReader/Src/UnicodeMap.cpp index d0d035e2d3..8c7f78fa03 100644 --- a/PdfReader/Src/UnicodeMap.cpp +++ b/PdfReader/Src/UnicodeMap.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include "MemoryUtils.h" #include "File.h" diff --git a/PdfReader/Src/UnicodeMap.h b/PdfReader/Src/UnicodeMap.h index 190d592a7e..a59a4ed213 100644 --- a/PdfReader/Src/UnicodeMap.h +++ b/PdfReader/Src/UnicodeMap.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_UNICODE_MAP_H +#ifndef _PDF_READER_UNICODE_MAP_H #define _PDF_READER_UNICODE_MAP_H #include "CharTypes.h" @@ -12,18 +12,18 @@ namespace PdfReader enum UnicodeMapType { - unicodeMapUser, // - unicodeMapResident, // - unicodeMapFunc // + unicodeMapUser, // Чтение из файла + unicodeMapResident, // Статический список + unicodeMapFunc // Указатель на функцию }; typedef int(*UnicodeMapFunc)(Unicode nUnicode, char *sBuffer, int nBufferSize); struct UnicodeMapRange { - Unicode nStart; // + Unicode nStart; // Диапазон юникодных символов Unicode nEnd; // - unsigned int unCode; // + unsigned int unCode; // Первый код unsigned int nBytesCount; // }; @@ -37,18 +37,18 @@ namespace PdfReader { public: - // UnicodeMap . 1. + // Создаем UnicodeMap по имени . Устанавливаем счетчик ссылок равный 1. static UnicodeMap *Parse(StringExt *seEncodingName, GlobalParams *pGlobalParams); - // Resident UnicodeMap. + // Создаем Resident UnicodeMap. UnicodeMap(char *sEncodingName, bool bUnicodeOut, UnicodeMapRange *pRanges, int nLen); - // Resident UnicodeMap, . + // Создаем Resident UnicodeMap, который использует функцию вместо диапазона значений. UnicodeMap(char *sEncodingName, bool bUnicodeOut, UnicodeMapFunc pFunction); ~UnicodeMap(); - // + // Счетчик ссылок void AddRef(); void Release(); @@ -63,11 +63,11 @@ namespace PdfReader } - // ? + // Совпадают ли названия кодировок? bool Match(StringExt *seEncodingName); - // . - // . ( \0) . + // Находим образ текущего юникодного значения в кодировке. Заполняем результатом и возвращаем + // количество используемых байт. Никаких строковых разделителей (типа \0) не пишем. int MapUnicode(Unicode nUnicode, char *sBuffer, int nBufferSize); private: @@ -81,8 +81,8 @@ namespace PdfReader bool m_bUnicodeOut; union { - UnicodeMapRange *m_pRanges; // : User, Resident - UnicodeMapFunc m_pFunction; // Func + UnicodeMapRange *m_pRanges; // Для типов: User, Resident + UnicodeMapFunc m_pFunction; // Для типа Func }; int m_nLen; // User, Resident UnicodeMapExt *m_pEMaps; // User diff --git a/PdfReader/Src/UnicodeMapTables.h b/PdfReader/Src/UnicodeMapTables.h index 4a171958a4..4930fd00af 100644 --- a/PdfReader/Src/UnicodeMapTables.h +++ b/PdfReader/Src/UnicodeMapTables.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_UNICODE_MAP_TABLES_H +#ifndef _PDF_READER_UNICODE_MAP_TABLES_H #define _PDF_READER_UNICODE_MAP_TABLES_H namespace PdfReader diff --git a/PdfReader/Src/XRef.cpp b/PdfReader/Src/XRef.cpp index 17615c44a6..8deaff39db 100644 --- a/PdfReader/Src/XRef.cpp +++ b/PdfReader/Src/XRef.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -14,7 +14,7 @@ namespace PdfReader { -#define XrefSearchSize 1024 // , , 'startxref' +#define XrefSearchSize 1024 // Читаем столько байт, начиная с конца файла, чтобы найти 'startxref' //--------------------------------------------------------------------------------------------------------------------------- // Permission bits @@ -47,10 +47,10 @@ namespace PdfReader private: - int m_nObjectStreamNum; // (Stream Objects) - int m_nObjectsCount; // - Object *m_arrObjects; // - int *m_arrObjectsNums; // + int m_nObjectStreamNum; // Порядковый номер объекта(Stream Objects) + int m_nObjectsCount; // Количество объектов в потоке + Object *m_arrObjects; // Список объектов в потоке + int *m_arrObjectsNums; // Порядковые номера объектов в потоке }; @@ -139,7 +139,7 @@ namespace PdfReader while (pStream->GetChar() != EOF); delete pParser; - // + // Сдвигаемся к началу первого объекта for (int nIndex = nFirst; nIndex < arrnOffsets[0]; ++nIndex) { oObjectStream.GetStream()->GetChar(); @@ -210,13 +210,13 @@ namespace PdfReader m_nPermissionFlags = DefaultPermissionFlags; m_bOwnerPassword = false; - // Trailer + // Читаем Trailer m_pStream = pStream; m_nStart = m_pStream->GetStartPos(); unsigned int nPos = GetStartXref(); - // 'startxref', - // xref + // Если возникла проблема при поиске 'startxref', пытаемся восстановить + // таблицу xref if (0 == nPos) { @@ -226,12 +226,12 @@ namespace PdfReader return; } } - else // Xref + else // читаем таблицу Xref { while (ReadXRef(&nPos)); - // 'startxref', - // xref + // Если возникла проблема при поиске 'startxref', пытаемся восстановить + // таблицу xref if (!m_bValidXref) { if (!(m_bValidXref = ConstructXRef())) @@ -261,8 +261,8 @@ namespace PdfReader } } - // Trailer xref, - // + // Теперь устанавливаем в словарь Trailer ссылку на таблиу xref, чтобы мы могли + // по данной таблице находить косвенные объекты m_oTrailerDict.GetDict()->SetXRef(this); } @@ -288,7 +288,7 @@ namespace PdfReader char *pCurChar; int nChar = 0, nPos = 0, nCur = 0; - // xrefSearchSize + // считываем последние xrefSearchSize байт m_pStream->SetPos(XrefSearchSize, -1); for (nPos = 0; nPos < XrefSearchSize; ++nPos) { @@ -300,7 +300,7 @@ namespace PdfReader } sBuffer[nPos] = '\0'; - // startxref + // ищем startxref for (nCur = nPos - 9; nCur >= 0; --nCur) { if (!strncmp(&sBuffer[nCur], "startxref", 9)) @@ -318,8 +318,8 @@ namespace PdfReader return m_unLastXRefOffset; } - // Xref. Trailer - // . + // Считываем одну секцию таблицы Xref. Также считываем соответствующий словарь Trailer + // и возвращаем указатель на предыдущий. bool XRef::ReadXRef(unsigned int *punPos) { Object oObject; @@ -329,13 +329,13 @@ namespace PdfReader Parser *pParser = new Parser(NULL, new Lexer(NULL, m_pStream->MakeSubStream(m_nStart + *punPos, false, 0, &oObject)), true); pParser->GetObject(&oObject); - // xref + // Парсим таблицу xref в старой форме if (oObject.IsCommand("xref")) { oObject.Free(); bResult = ReadXRefTable(pParser, punPos); } - // xref, + // Парсим таблицу xref, когда она записана в виде потока else if (oObject.IsInt()) { oObject.Free(); @@ -384,7 +384,7 @@ namespace PdfReader while (1) { - // + // сначала в секции идут номер первого объекта и количество объектов pParser->GetObject(&oTempObject); if (oTempObject.IsCommand("trailer")) { @@ -434,11 +434,11 @@ namespace PdfReader } for (int nIndex = nFirst; nIndex < nFirst + nCount; ++nIndex) { - // : nnnnnnnnnn ggggg n eol - // nnnnnnnnnn - - // ggggg - Generation number( ) - // n - , - // eol - ( ) + // формат: nnnnnnnnnn ggggg n eol + // nnnnnnnnnn - байтовый сдвиг + // ggggg - Generation number(номер версии объекта) + // n - Ключ, определяющий используется ли объект + // eol - Конец строки(два символа) if (!pParser->GetObject(&oTempObject)->IsInt()) { oTempObject.Free(); @@ -476,9 +476,9 @@ namespace PdfReader if (m_arrEntries[nIndex].unOffset == 0xffffffff) { m_arrEntries[nIndex] = oEntry; - // PDF , Intellectual Property - // Network, : Xref - // 1, 0. + // в PDF файлах, созданных с помощью Intellectual Property + // Network, имеется баг: таблица Xref начинается с объекта + // под номером 1, вместо 0. if (nIndex == 1 && nFirst == 1 && m_arrEntries[1].unOffset == 0 && m_arrEntries[1].nGen == 65535 && m_arrEntries[1].eType == xrefEntryFree) { nIndex = nFirst = 0; @@ -489,7 +489,7 @@ namespace PdfReader } } - // Trailer + // Читаем словарь Trailer if (!pParser->GetObject(&oTempObject)->IsDict()) { oTempObject.Free(); @@ -497,7 +497,7 @@ namespace PdfReader return false; } - // 'Prev' + // Считываем указатель 'Prev' Object oPrev; bool bPrev = false; oTempObject.GetDict()->SearchAndCopy("Prev", &oPrev); @@ -508,7 +508,7 @@ namespace PdfReader } else if (oPrev.IsRef()) { - // "/Prev NNN 0 R" "/Prev NNN" + // Некоторые программы пишут "/Prev NNN 0 R" вместо "/Prev NNN" *punPos = (unsigned int)oPrev.GetRefNum(); bPrev = true; } @@ -518,13 +518,13 @@ namespace PdfReader } oPrev.Free(); - // Trailer + // Сохраняем первый словарь Trailer if (m_oTrailerDict.IsNone()) { oTempObject.Copy(&m_oTrailerDict); } - // 'XRefStm' + // Проверяем есть ли элемент 'XRefStm' if (oTempObject.GetDict()->Search("XRefStm", &oPrev)->IsInt()) { unsigned int unPos2 = (unsigned int)oPrev.GetInt(); @@ -754,7 +754,7 @@ namespace PdfReader return true; } - // Xref . + // Пробуем построить таблицу Xref для поврежденного файла. bool XRef::ConstructXRef() { bool bGetRoot = false; @@ -780,10 +780,10 @@ namespace PdfReader } unsigned char *pCur = (unsigned char*)sBuffer; - // + // Пропускаем пробелы while (*pCur && Lexer::IsSpace(*pCur & 0xff)) ++pCur; - // C Trailer + // Cчитываем словарь Trailer if (!strncmp((char*)pCur, "trailer", 7)) { Object oTemp; @@ -810,7 +810,7 @@ namespace PdfReader oNewTrailerDict.Free(); delete pParser; } - else if (isdigit(*pCur)) // + else if (isdigit(*pCur)) // Ищем объект { int nNum = atoi((char*)pCur); if (nNum > 0) diff --git a/PdfReader/Src/XRef.h b/PdfReader/Src/XRef.h index 40b36d3896..0dc18214da 100644 --- a/PdfReader/Src/XRef.h +++ b/PdfReader/Src/XRef.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_XREF_H +#ifndef _PDF_READER_XREF_H #define _PDF_READER_XREF_H #include "Object.h" @@ -44,7 +44,7 @@ namespace PdfReader return m_bValidXref; } - // CheckValidate false + // Если CheckValidate вернул false EError GetErrorCode() { return m_eErrorCode; @@ -57,7 +57,7 @@ namespace PdfReader return m_bEncrypted; } - // . + // Проверяем ограничения. bool CheckPrint(bool bIgnoreOwnerPassword = false); bool CheckChange(bool bIgnoreOwnerPassword = false); bool CheckCopy(bool bIgnoreOwnerPassword = false); @@ -68,7 +68,7 @@ namespace PdfReader return Fetch(m_nRootNum, m_nRootGen, pObject); } - // . + // Вытаскиваем косвенный объект. Object *Fetch(int nNum, int nGen, Object *pObject); Object *GetDocInfo(Object *pObject); @@ -85,7 +85,7 @@ namespace PdfReader } - // Root (Catalog) + // объект Root (Catalog) int GetRootNum() { return m_nRootNum; @@ -95,8 +95,8 @@ namespace PdfReader return m_nRootGen; } - // . - // false, . + // Получаем конечную позицию в поврежденном файле. + // Возвращаем false, если позиция неизвестна или файл не поврежден. bool GetStreamEnd(unsigned int nStreamStart, unsigned int *pnStreamEnd); int GetSize() @@ -124,31 +124,31 @@ namespace PdfReader private: - BaseStream *m_pStream; // - unsigned int m_nStart; // + BaseStream *m_pStream; // Основной поток + unsigned int m_nStart; // Сдвиг в потоке - XRefEntry *m_arrEntries; // Xref - int m_nEntrySize; // m_arrEntries - int m_nRootNum; // Root (Catalog) - int m_nRootGen; // Root (Catalog) + XRefEntry *m_arrEntries; // Элементы таблицы Xref + int m_nEntrySize; // Размер элемента в списке m_arrEntries + int m_nRootNum; // Номер объекта Root (Catalog) + int m_nRootGen; // Номер версии объекта Root (Catalog) - bool m_bValidXref; // Xref - EError m_eErrorCode; // , m_bValidXref = false + bool m_bValidXref; // Проверяем корректность таблицы Xref + EError m_eErrorCode; // Номер ошибки, если m_bValidXref = false - Object m_oTrailerDict; // Trailer + Object m_oTrailerDict; // Словарь Trailer - unsigned int m_unLastXRefOffset; // Xref - unsigned int *m_punStreamEnds; // - + unsigned int m_unLastXRefOffset; // Сдвиг последней таблицы Xref + unsigned int *m_punStreamEnds; // Позиция конца потока - используется только для поврежденных файлов - int m_nStreamEndsCount; // m_punStreamEnds + int m_nStreamEndsCount; // Количество корректных элементов в m_punStreamEnds ObjectStream *m_pObjectStream; // Object Stream - bool m_bEncrypted; // ? - int m_nPermissionFlags; // - bool m_bOwnerPassword; // - unsigned char m_arrDecryptKey[16]; // - int m_nKeyLength; // - int m_nEncryptVersion; // - CryptAlgorithm m_eEncryptAlgorithm; // + bool m_bEncrypted; // Поток зашифрован или нет? + int m_nPermissionFlags; // Различные ограничения + bool m_bOwnerPassword; // Проверяем правильный ли был введен пароль владельца файла + unsigned char m_arrDecryptKey[16]; // Ключ для расшифровки + int m_nKeyLength; // Размер ключа в байтах + int m_nEncryptVersion; // Версия шифровки + CryptAlgorithm m_eEncryptAlgorithm; // Алгоритм шифрования NSCriticalSection::CRITICAL_SECTION m_oCS; }; diff --git a/PdfReader/Src/XmlUtils.h b/PdfReader/Src/XmlUtils.h index 70f1e5cc3e..22329fb758 100644 --- a/PdfReader/Src/XmlUtils.h +++ b/PdfReader/Src/XmlUtils.h @@ -1,4 +1,4 @@ -#ifndef _PDF_READER_XML_UTILS_H +#ifndef _PDF_READER_XML_UTILS_H #define _PDF_READER_XML_UTILS_H #include diff --git a/PdfReader/Src/version.h b/PdfReader/Src/version.h deleted file mode 100644 index 76c89a17c7..0000000000 --- a/PdfReader/Src/version.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -//1 -//0 -//0 -//75 -#define INTVER 1,0,0,75 -#define STRVER "1,0,0,75\0" diff --git a/PdfReader/Types.h b/PdfReader/Types.h deleted file mode 100644 index cc976bc778..0000000000 --- a/PdfReader/Types.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _PDF_READER_TYPES_H -#define _PDF_READER_TYPES_H - -namespace MetaFile -{ -} - -#endif // _PDF_READER_TYPES_H \ No newline at end of file