Index: core/src/fpdfdoc/doc_ap.cpp |
diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp |
index f94a4d60e09d28f3e09577dd010e6866743ee1fc..feedb3298906583d3cc1891ecb94ecc09f5279b8 100644 |
--- a/core/src/fpdfdoc/doc_ap.cpp |
+++ b/core/src/fpdfdoc/doc_ap.cpp |
@@ -8,803 +8,923 @@ |
#include "../../include/fpdfdoc/fpdf_vt.h" |
#include "pdf_vt.h" |
#include "../../include/fpdfdoc/fpdf_ap.h" |
-FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) |
-{ |
- if (!pAnnotDict || pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) { |
- return FALSE; |
- } |
- CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString(); |
- FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff")? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() : 0; |
- if (field_type == "Tx") { |
- return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); |
- } |
- if (field_type == "Ch") { |
- return (flags & (1 << 17)) ? |
- CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict) : |
- CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); |
- } |
- if (field_type == "Btn") { |
- if (!(flags & (1 << 16))) { |
- if (!pAnnotDict->KeyExist("AS")) { |
- if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) { |
- if (pParentDict->KeyExist("AS")) { |
- pAnnotDict->SetAtString("AS", pParentDict->GetString("AS")); |
- } |
- } |
- } |
+FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) { |
+ if (!pAnnotDict || |
+ pAnnotDict->GetConstString("Subtype") != FX_BSTRC("Widget")) { |
+ return FALSE; |
+ } |
+ CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString(); |
+ FX_DWORD flags = FPDF_GetFieldAttr(pAnnotDict, "Ff") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() |
+ : 0; |
+ if (field_type == "Tx") { |
+ return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); |
+ } |
+ if (field_type == "Ch") { |
+ return (flags & (1 << 17)) |
+ ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict) |
+ : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); |
+ } |
+ if (field_type == "Btn") { |
+ if (!(flags & (1 << 16))) { |
+ if (!pAnnotDict->KeyExist("AS")) { |
+ if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDict("Parent")) { |
+ if (pParentDict->KeyExist("AS")) { |
+ pAnnotDict->SetAtString("AS", pParentDict->GetString("AS")); |
+ } |
} |
+ } |
} |
- return FALSE; |
+ } |
+ return FALSE; |
} |
-class CPVT_FontMap : public IPVT_FontMap |
-{ |
-public: |
- CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont, |
- const CFX_ByteString & sDefFontAlias); |
- virtual ~CPVT_FontMap(); |
- CPDF_Font* GetPDFFont(int32_t nFontIndex); |
- CFX_ByteString GetPDFFontAlias(int32_t nFontIndex); |
- static void GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, |
- CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias); |
-private: |
- CPDF_Document* m_pDocument; |
- CPDF_Dictionary* m_pResDict; |
- CPDF_Font* m_pDefFont; |
- CFX_ByteString m_sDefFontAlias; |
- CPDF_Font* m_pSysFont; |
- CFX_ByteString m_sSysFontAlias; |
+class CPVT_FontMap : public IPVT_FontMap { |
+ public: |
+ CPVT_FontMap(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pResDict, |
+ CPDF_Font* pDefFont, |
+ const CFX_ByteString& sDefFontAlias); |
+ virtual ~CPVT_FontMap(); |
+ CPDF_Font* GetPDFFont(int32_t nFontIndex); |
+ CFX_ByteString GetPDFFontAlias(int32_t nFontIndex); |
+ static void GetAnnotSysPDFFont(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pResDict, |
+ CPDF_Font*& pSysFont, |
+ CFX_ByteString& sSysFontAlias); |
+ |
+ private: |
+ CPDF_Document* m_pDocument; |
+ CPDF_Dictionary* m_pResDict; |
+ CPDF_Font* m_pDefFont; |
+ CFX_ByteString m_sDefFontAlias; |
+ CPDF_Font* m_pSysFont; |
+ CFX_ByteString m_sSysFontAlias; |
}; |
-CPVT_FontMap::CPVT_FontMap(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, CPDF_Font * pDefFont, |
- const CFX_ByteString & sDefFontAlias) : |
- m_pDocument(pDoc), |
- m_pResDict(pResDict), |
- m_pDefFont(pDefFont), |
- m_sDefFontAlias(sDefFontAlias), |
- m_pSysFont(NULL), |
- m_sSysFontAlias() |
-{ |
-} |
-CPVT_FontMap::~CPVT_FontMap() |
-{ |
-} |
-extern CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, CPDF_Document* pDocument, CFX_ByteString& csNameTag); |
-void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document * pDoc, CPDF_Dictionary * pResDict, |
- CPDF_Font * & pSysFont, CFX_ByteString & sSysFontAlias) |
-{ |
- if (pDoc && pResDict) { |
- CFX_ByteString sFontAlias; |
- CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm"); |
- if (CPDF_Font * pPDFFont = AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) { |
- if (CPDF_Dictionary * pFontList = pResDict->GetDict("Font")) { |
- if (!pFontList->KeyExist(sSysFontAlias)) { |
- pFontList->SetAtReference(sSysFontAlias, pDoc, pPDFFont->GetFontDict()); |
- } |
- } |
- pSysFont = pPDFFont; |
+CPVT_FontMap::CPVT_FontMap(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pResDict, |
+ CPDF_Font* pDefFont, |
+ const CFX_ByteString& sDefFontAlias) |
+ : m_pDocument(pDoc), |
+ m_pResDict(pResDict), |
+ m_pDefFont(pDefFont), |
+ m_sDefFontAlias(sDefFontAlias), |
+ m_pSysFont(NULL), |
+ m_sSysFontAlias() {} |
+CPVT_FontMap::~CPVT_FontMap() {} |
+extern CPDF_Font* AddNativeInterFormFont(CPDF_Dictionary*& pFormDict, |
+ CPDF_Document* pDocument, |
+ CFX_ByteString& csNameTag); |
+void CPVT_FontMap::GetAnnotSysPDFFont(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pResDict, |
+ CPDF_Font*& pSysFont, |
+ CFX_ByteString& sSysFontAlias) { |
+ if (pDoc && pResDict) { |
+ CFX_ByteString sFontAlias; |
+ CPDF_Dictionary* pFormDict = pDoc->GetRoot()->GetDict("AcroForm"); |
+ if (CPDF_Font* pPDFFont = |
+ AddNativeInterFormFont(pFormDict, pDoc, sSysFontAlias)) { |
+ if (CPDF_Dictionary* pFontList = pResDict->GetDict("Font")) { |
+ if (!pFontList->KeyExist(sSysFontAlias)) { |
+ pFontList->SetAtReference(sSysFontAlias, pDoc, |
+ pPDFFont->GetFontDict()); |
} |
+ } |
+ pSysFont = pPDFFont; |
} |
+ } |
} |
-CPDF_Font* CPVT_FontMap::GetPDFFont(int32_t nFontIndex) |
-{ |
- switch (nFontIndex) { |
- case 0: |
- return m_pDefFont; |
- case 1: |
- if (!m_pSysFont) { |
- GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias); |
- } |
- return m_pSysFont; |
- } |
- return NULL; |
+CPDF_Font* CPVT_FontMap::GetPDFFont(int32_t nFontIndex) { |
+ switch (nFontIndex) { |
+ case 0: |
+ return m_pDefFont; |
+ case 1: |
+ if (!m_pSysFont) { |
+ GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, |
+ m_sSysFontAlias); |
+ } |
+ return m_pSysFont; |
+ } |
+ return NULL; |
} |
-CFX_ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) |
-{ |
- switch (nFontIndex) { |
- case 0: |
- return m_sDefFontAlias; |
- case 1: |
- if (!m_pSysFont) { |
- GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, m_sSysFontAlias); |
- } |
- return m_sSysFontAlias; |
- } |
- return ""; |
+CFX_ByteString CPVT_FontMap::GetPDFFontAlias(int32_t nFontIndex) { |
+ switch (nFontIndex) { |
+ case 0: |
+ return m_sDefFontAlias; |
+ case 1: |
+ if (!m_pSysFont) { |
+ GetAnnotSysPDFFont(m_pDocument, m_pResDict, m_pSysFont, |
+ m_sSysFontAlias); |
+ } |
+ return m_sSysFontAlias; |
+ } |
+ return ""; |
} |
-CPVT_Provider::CPVT_Provider(IPVT_FontMap * pFontMap) : m_pFontMap(pFontMap) |
-{ |
- ASSERT (m_pFontMap != NULL); |
+CPVT_Provider::CPVT_Provider(IPVT_FontMap* pFontMap) : m_pFontMap(pFontMap) { |
+ ASSERT(m_pFontMap != NULL); |
} |
-CPVT_Provider::~CPVT_Provider() |
-{ |
-} |
-int32_t CPVT_Provider::GetCharWidth(int32_t nFontIndex, FX_WORD word, int32_t nWordStyle) |
-{ |
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { |
- FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word); |
- if (charcode != -1) { |
- return pPDFFont->GetCharWidthF(charcode); |
- } |
- } |
- return 0; |
+CPVT_Provider::~CPVT_Provider() {} |
+int32_t CPVT_Provider::GetCharWidth(int32_t nFontIndex, |
+ FX_WORD word, |
+ int32_t nWordStyle) { |
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { |
+ FX_DWORD charcode = pPDFFont->CharCodeFromUnicode(word); |
+ if (charcode != -1) { |
+ return pPDFFont->GetCharWidthF(charcode); |
+ } |
+ } |
+ return 0; |
} |
-int32_t CPVT_Provider::GetTypeAscent(int32_t nFontIndex) |
-{ |
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { |
- return pPDFFont->GetTypeAscent(); |
- } |
- return 0; |
+int32_t CPVT_Provider::GetTypeAscent(int32_t nFontIndex) { |
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { |
+ return pPDFFont->GetTypeAscent(); |
+ } |
+ return 0; |
} |
-int32_t CPVT_Provider::GetTypeDescent(int32_t nFontIndex) |
-{ |
- if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { |
- return pPDFFont->GetTypeDescent(); |
- } |
- return 0; |
+int32_t CPVT_Provider::GetTypeDescent(int32_t nFontIndex) { |
+ if (CPDF_Font* pPDFFont = m_pFontMap->GetPDFFont(nFontIndex)) { |
+ return pPDFFont->GetTypeDescent(); |
+ } |
+ return 0; |
} |
-int32_t CPVT_Provider::GetWordFontIndex(FX_WORD word, int32_t charset, int32_t nFontIndex) |
-{ |
- if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) { |
- if (pDefFont->CharCodeFromUnicode(word) != -1) { |
- return 0; |
- } |
- } |
- if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1)) |
- if (pSysFont->CharCodeFromUnicode(word) != -1) { |
- return 1; |
- } |
- return -1; |
+int32_t CPVT_Provider::GetWordFontIndex(FX_WORD word, |
+ int32_t charset, |
+ int32_t nFontIndex) { |
+ if (CPDF_Font* pDefFont = m_pFontMap->GetPDFFont(0)) { |
+ if (pDefFont->CharCodeFromUnicode(word) != -1) { |
+ return 0; |
+ } |
+ } |
+ if (CPDF_Font* pSysFont = m_pFontMap->GetPDFFont(1)) |
+ if (pSysFont->CharCodeFromUnicode(word) != -1) { |
+ return 1; |
+ } |
+ return -1; |
} |
-FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word) |
-{ |
- if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || word == 0x2D || word == 0x27) { |
- return TRUE; |
- } |
- return FALSE; |
+FX_BOOL CPVT_Provider::IsLatinWord(FX_WORD word) { |
+ if ((word >= 0x61 && word <= 0x7A) || (word >= 0x41 && word <= 0x5A) || |
+ word == 0x2D || word == 0x27) { |
+ return TRUE; |
+ } |
+ return FALSE; |
} |
-int32_t CPVT_Provider::GetDefaultFontIndex() |
-{ |
- return 0; |
+int32_t CPVT_Provider::GetDefaultFontIndex() { |
+ return 0; |
} |
-static CFX_ByteString GetPDFWordString(IPVT_FontMap * pFontMap, int32_t nFontIndex, FX_WORD Word, FX_WORD SubWord) |
-{ |
- CFX_ByteString sWord; |
- if (SubWord > 0) { |
- sWord.Format("%c", SubWord); |
- } else { |
- if (pFontMap) { |
- if (CPDF_Font * pPDFFont = pFontMap->GetPDFFont(nFontIndex)) { |
- if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) { |
- sWord.Format("%c", Word); |
- } else { |
- FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word); |
- if (dwCharCode != -1) { |
- pPDFFont->AppendChar(sWord, dwCharCode); |
- } |
- } |
- } |
+static CFX_ByteString GetPDFWordString(IPVT_FontMap* pFontMap, |
+ int32_t nFontIndex, |
+ FX_WORD Word, |
+ FX_WORD SubWord) { |
+ CFX_ByteString sWord; |
+ if (SubWord > 0) { |
+ sWord.Format("%c", SubWord); |
+ } else { |
+ if (pFontMap) { |
+ if (CPDF_Font* pPDFFont = pFontMap->GetPDFFont(nFontIndex)) { |
+ if (pPDFFont->GetBaseFont().Compare("Symbol") == 0 || |
+ pPDFFont->GetBaseFont().Compare("ZapfDingbats") == 0) { |
+ sWord.Format("%c", Word); |
+ } else { |
+ FX_DWORD dwCharCode = pPDFFont->CharCodeFromUnicode(Word); |
+ if (dwCharCode != -1) { |
+ pPDFFont->AppendChar(sWord, dwCharCode); |
+ } |
} |
+ } |
} |
- return sWord; |
+ } |
+ return sWord; |
} |
-static CFX_ByteString GetWordRenderString(const CFX_ByteString & strWords) |
-{ |
- if (strWords.GetLength() > 0) { |
- return PDF_EncodeString(strWords) + " Tj\n"; |
- } |
- return ""; |
+static CFX_ByteString GetWordRenderString(const CFX_ByteString& strWords) { |
+ if (strWords.GetLength() > 0) { |
+ return PDF_EncodeString(strWords) + " Tj\n"; |
+ } |
+ return ""; |
} |
-static CFX_ByteString GetFontSetString(IPVT_FontMap * pFontMap, int32_t nFontIndex, FX_FLOAT fFontSize) |
-{ |
- CFX_ByteTextBuf sRet; |
- if (pFontMap) { |
- CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); |
- if (sFontAlias.GetLength() > 0 && fFontSize > 0 ) { |
- sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; |
- } |
- } |
- return sRet.GetByteString(); |
+static CFX_ByteString GetFontSetString(IPVT_FontMap* pFontMap, |
+ int32_t nFontIndex, |
+ FX_FLOAT fFontSize) { |
+ CFX_ByteTextBuf sRet; |
+ if (pFontMap) { |
+ CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); |
+ if (sFontAlias.GetLength() > 0 && fFontSize > 0) { |
+ sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; |
+ } |
+ } |
+ return sRet.GetByteString(); |
} |
-static CPVT_Color ParseColor(const CFX_ByteString & str) |
-{ |
- CPDF_SimpleParser syntax(str); |
- syntax.SetPos(0); |
- if (syntax.FindTagParam("g", 1)) { |
- return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord())); |
- } |
- syntax.SetPos(0); |
- if (syntax.FindTagParam("rg", 3)) { |
- FX_FLOAT f1 = FX_atof(syntax.GetWord()); |
- FX_FLOAT f2 = FX_atof(syntax.GetWord()); |
- FX_FLOAT f3 = FX_atof(syntax.GetWord()); |
- return CPVT_Color(CT_RGB, f1, f2, f3); |
- } |
- syntax.SetPos(0); |
- if (syntax.FindTagParam("k", 4)) { |
- FX_FLOAT f1 = FX_atof(syntax.GetWord()); |
- FX_FLOAT f2 = FX_atof(syntax.GetWord()); |
- FX_FLOAT f3 = FX_atof(syntax.GetWord()); |
- FX_FLOAT f4 = FX_atof(syntax.GetWord()); |
- return CPVT_Color(CT_CMYK, f1, f2, f3, f4); |
- } |
- return CPVT_Color(CT_TRANSPARENT); |
+static CPVT_Color ParseColor(const CFX_ByteString& str) { |
+ CPDF_SimpleParser syntax(str); |
+ syntax.SetPos(0); |
+ if (syntax.FindTagParam("g", 1)) { |
+ return CPVT_Color(CT_GRAY, FX_atof(syntax.GetWord())); |
+ } |
+ syntax.SetPos(0); |
+ if (syntax.FindTagParam("rg", 3)) { |
+ FX_FLOAT f1 = FX_atof(syntax.GetWord()); |
+ FX_FLOAT f2 = FX_atof(syntax.GetWord()); |
+ FX_FLOAT f3 = FX_atof(syntax.GetWord()); |
+ return CPVT_Color(CT_RGB, f1, f2, f3); |
+ } |
+ syntax.SetPos(0); |
+ if (syntax.FindTagParam("k", 4)) { |
+ FX_FLOAT f1 = FX_atof(syntax.GetWord()); |
+ FX_FLOAT f2 = FX_atof(syntax.GetWord()); |
+ FX_FLOAT f3 = FX_atof(syntax.GetWord()); |
+ FX_FLOAT f4 = FX_atof(syntax.GetWord()); |
+ return CPVT_Color(CT_CMYK, f1, f2, f3, f4); |
+ } |
+ return CPVT_Color(CT_TRANSPARENT); |
} |
-static CPVT_Color ParseColor(const CPDF_Array & array) |
-{ |
- CPVT_Color rt; |
- switch (array.GetCount()) { |
- case 1: |
- rt = CPVT_Color(CT_GRAY, array.GetFloat(0)); |
- break; |
- case 3: |
- rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2)); |
- break; |
- case 4: |
- rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), array.GetFloat(2), array.GetFloat(3)); |
- break; |
- } |
- return rt; |
+static CPVT_Color ParseColor(const CPDF_Array& array) { |
+ CPVT_Color rt; |
+ switch (array.GetCount()) { |
+ case 1: |
+ rt = CPVT_Color(CT_GRAY, array.GetFloat(0)); |
+ break; |
+ case 3: |
+ rt = CPVT_Color(CT_RGB, array.GetFloat(0), array.GetFloat(1), |
+ array.GetFloat(2)); |
+ break; |
+ case 4: |
+ rt = CPVT_Color(CT_CMYK, array.GetFloat(0), array.GetFloat(1), |
+ array.GetFloat(2), array.GetFloat(3)); |
+ break; |
+ } |
+ return rt; |
} |
-static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict, const int32_t & nWidgetType) |
-{ |
- CPDF_Dictionary* pFormDict = NULL; |
- if (CPDF_Dictionary * pRootDict = pDoc->GetRoot()) { |
- pFormDict = pRootDict->GetDict("AcroForm"); |
- } |
- if (!pFormDict) { |
- return FALSE; |
- } |
- CFX_ByteString DA; |
- if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA")) { |
- DA = pDAObj->GetString(); |
- } |
- if (DA.IsEmpty()) { |
- DA = pFormDict->GetString("DA"); |
- } |
- if (DA.IsEmpty()) { |
- return FALSE; |
- } |
- CPDF_SimpleParser syntax(DA); |
- syntax.FindTagParam("Tf", 2); |
- CFX_ByteString sFontName = syntax.GetWord(); |
- sFontName = PDF_NameDecode(sFontName); |
- if (sFontName.IsEmpty()) { |
- return FALSE; |
- } |
- FX_FLOAT fFontSize = FX_atof(syntax.GetWord()); |
- CPVT_Color crText = ParseColor(DA); |
- FX_BOOL bUseFormRes = FALSE; |
- CPDF_Dictionary * pFontDict = NULL; |
- CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR")); |
- if (pDRDict == NULL) { |
- pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); |
- bUseFormRes = TRUE; |
- } |
- CPDF_Dictionary * pDRFontDict = NULL; |
- if (pDRDict && (pDRFontDict = pDRDict->GetDict("Font"))) { |
+static FX_BOOL GenerateWidgetAP(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pAnnotDict, |
+ const int32_t& nWidgetType) { |
+ CPDF_Dictionary* pFormDict = NULL; |
+ if (CPDF_Dictionary* pRootDict = pDoc->GetRoot()) { |
+ pFormDict = pRootDict->GetDict("AcroForm"); |
+ } |
+ if (!pFormDict) { |
+ return FALSE; |
+ } |
+ CFX_ByteString DA; |
+ if (CPDF_Object* pDAObj = FPDF_GetFieldAttr(pAnnotDict, "DA")) { |
+ DA = pDAObj->GetString(); |
+ } |
+ if (DA.IsEmpty()) { |
+ DA = pFormDict->GetString("DA"); |
+ } |
+ if (DA.IsEmpty()) { |
+ return FALSE; |
+ } |
+ CPDF_SimpleParser syntax(DA); |
+ syntax.FindTagParam("Tf", 2); |
+ CFX_ByteString sFontName = syntax.GetWord(); |
+ sFontName = PDF_NameDecode(sFontName); |
+ if (sFontName.IsEmpty()) { |
+ return FALSE; |
+ } |
+ FX_FLOAT fFontSize = FX_atof(syntax.GetWord()); |
+ CPVT_Color crText = ParseColor(DA); |
+ FX_BOOL bUseFormRes = FALSE; |
+ CPDF_Dictionary* pFontDict = NULL; |
+ CPDF_Dictionary* pDRDict = pAnnotDict->GetDict(FX_BSTRC("DR")); |
+ if (pDRDict == NULL) { |
+ pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); |
+ bUseFormRes = TRUE; |
+ } |
+ CPDF_Dictionary* pDRFontDict = NULL; |
+ if (pDRDict && (pDRFontDict = pDRDict->GetDict("Font"))) { |
+ pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); |
+ if (!pFontDict && !bUseFormRes) { |
+ pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); |
+ pDRFontDict = pDRDict->GetDict("Font"); |
+ if (pDRFontDict) { |
pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); |
- if (!pFontDict && !bUseFormRes) { |
- pDRDict = pFormDict->GetDict(FX_BSTRC("DR")); |
- pDRFontDict = pDRDict->GetDict("Font"); |
- if (pDRFontDict) { |
- pFontDict = pDRFontDict->GetDict(sFontName.Mid(1)); |
- } |
- } |
- } |
- if (!pDRFontDict) { |
- return FALSE; |
- } |
- if (!pFontDict) { |
- pFontDict = CPDF_Dictionary::Create(); |
- if (pFontDict == NULL) { |
- return FALSE; |
- } |
- pFontDict->SetAtName(FX_BSTRC("Type"), "Font"); |
- pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1"); |
- pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica"); |
- pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding"); |
- pDoc->AddIndirectObject(pFontDict); |
- pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict); |
- } |
- CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict); |
- if (!pDefFont) { |
- return FALSE; |
- } |
- CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect"); |
- int32_t nRotate = 0; |
- if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) { |
- nRotate = pMKDict->GetInteger("R"); |
- } |
- CPDF_Rect rcBBox; |
- CPDF_Matrix matrix; |
- switch (nRotate % 360) { |
- case 0: |
- rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom); |
- break; |
- case 90: |
- matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0); |
- rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left); |
- break; |
- case 180: |
- matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom); |
- rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, rcAnnot.top - rcAnnot.bottom); |
- break; |
- case 270: |
- matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom); |
- rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, rcAnnot.right - rcAnnot.left); |
- break; |
- } |
- int32_t nBorderStyle = PBS_SOLID; |
- FX_FLOAT fBorderWidth = 1; |
- CPVT_Dash dsBorder(3, 0, 0); |
- CPVT_Color crLeftTop, crRightBottom; |
- if (CPDF_Dictionary * pBSDict = pAnnotDict->GetDict("BS")) { |
- if (pBSDict->KeyExist("W")) { |
- fBorderWidth = pBSDict->GetNumber("W"); |
- } |
- if (CPDF_Array * pArray = pBSDict->GetArray("D")) { |
- dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), pArray->GetInteger(2)); |
- } |
- switch (pBSDict->GetString("S").GetAt(0)) { |
- case 'S': |
- nBorderStyle = PBS_SOLID; |
- break; |
- case 'D': |
- nBorderStyle = PBS_DASH; |
- break; |
- case 'B': |
- nBorderStyle = PBS_BEVELED; |
- fBorderWidth *= 2; |
- crLeftTop = CPVT_Color(CT_GRAY, 1); |
- crRightBottom = CPVT_Color(CT_GRAY, 0.5); |
- break; |
- case 'I': |
- nBorderStyle = PBS_INSET; |
- fBorderWidth *= 2; |
- crLeftTop = CPVT_Color(CT_GRAY, 0.5); |
- crRightBottom = CPVT_Color(CT_GRAY, 0.75); |
- break; |
- case 'U': |
- nBorderStyle = PBS_UNDERLINED; |
- break; |
- } |
- } |
- CPVT_Color crBorder, crBG; |
- if (CPDF_Dictionary * pMKDict = pAnnotDict->GetDict("MK")) { |
- if (CPDF_Array * pArray = pMKDict->GetArray("BC")) { |
- crBorder = ParseColor(*pArray); |
- } |
- if (CPDF_Array * pArray = pMKDict->GetArray("BG")) { |
- crBG = ParseColor(*pArray); |
- } |
- } |
- CFX_ByteTextBuf sAppStream; |
- CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE); |
- if (sBG.GetLength() > 0) { |
- sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " " |
- << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" << "Q\n"; |
+ } |
} |
- CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(rcBBox, fBorderWidth, |
- crBorder, crLeftTop, crRightBottom, nBorderStyle, dsBorder); |
- if (sBorderStream.GetLength() > 0) { |
- sAppStream << "q\n" << sBorderStream << "Q\n"; |
- } |
- CPDF_Rect rcBody = CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth, |
- rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth); |
- rcBody.Normalize(); |
- CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP"); |
+ } |
+ if (!pDRFontDict) { |
+ return FALSE; |
+ } |
+ if (!pFontDict) { |
+ pFontDict = CPDF_Dictionary::Create(); |
+ if (pFontDict == NULL) { |
+ return FALSE; |
+ } |
+ pFontDict->SetAtName(FX_BSTRC("Type"), "Font"); |
+ pFontDict->SetAtName(FX_BSTRC("Subtype"), "Type1"); |
+ pFontDict->SetAtName(FX_BSTRC("BaseFont"), "Helvetica"); |
+ pFontDict->SetAtName(FX_BSTRC("Encoding"), "WinAnsiEncoding"); |
+ pDoc->AddIndirectObject(pFontDict); |
+ pDRFontDict->SetAtReference(sFontName.Mid(1), pDoc, pFontDict); |
+ } |
+ CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict); |
+ if (!pDefFont) { |
+ return FALSE; |
+ } |
+ CPDF_Rect rcAnnot = pAnnotDict->GetRect("Rect"); |
+ int32_t nRotate = 0; |
+ if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDict("MK")) { |
+ nRotate = pMKDict->GetInteger("R"); |
+ } |
+ CPDF_Rect rcBBox; |
+ CPDF_Matrix matrix; |
+ switch (nRotate % 360) { |
+ case 0: |
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, |
+ rcAnnot.top - rcAnnot.bottom); |
+ break; |
+ case 90: |
+ matrix = CPDF_Matrix(0, 1, -1, 0, rcAnnot.right - rcAnnot.left, 0); |
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, |
+ rcAnnot.right - rcAnnot.left); |
+ break; |
+ case 180: |
+ matrix = CPDF_Matrix(-1, 0, 0, -1, rcAnnot.right - rcAnnot.left, |
+ rcAnnot.top - rcAnnot.bottom); |
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.right - rcAnnot.left, |
+ rcAnnot.top - rcAnnot.bottom); |
+ break; |
+ case 270: |
+ matrix = CPDF_Matrix(0, -1, 1, 0, 0, rcAnnot.top - rcAnnot.bottom); |
+ rcBBox = CPDF_Rect(0, 0, rcAnnot.top - rcAnnot.bottom, |
+ rcAnnot.right - rcAnnot.left); |
+ break; |
+ } |
+ int32_t nBorderStyle = PBS_SOLID; |
+ FX_FLOAT fBorderWidth = 1; |
+ CPVT_Dash dsBorder(3, 0, 0); |
+ CPVT_Color crLeftTop, crRightBottom; |
+ if (CPDF_Dictionary* pBSDict = pAnnotDict->GetDict("BS")) { |
+ if (pBSDict->KeyExist("W")) { |
+ fBorderWidth = pBSDict->GetNumber("W"); |
+ } |
+ if (CPDF_Array* pArray = pBSDict->GetArray("D")) { |
+ dsBorder = CPVT_Dash(pArray->GetInteger(0), pArray->GetInteger(1), |
+ pArray->GetInteger(2)); |
+ } |
+ switch (pBSDict->GetString("S").GetAt(0)) { |
+ case 'S': |
+ nBorderStyle = PBS_SOLID; |
+ break; |
+ case 'D': |
+ nBorderStyle = PBS_DASH; |
+ break; |
+ case 'B': |
+ nBorderStyle = PBS_BEVELED; |
+ fBorderWidth *= 2; |
+ crLeftTop = CPVT_Color(CT_GRAY, 1); |
+ crRightBottom = CPVT_Color(CT_GRAY, 0.5); |
+ break; |
+ case 'I': |
+ nBorderStyle = PBS_INSET; |
+ fBorderWidth *= 2; |
+ crLeftTop = CPVT_Color(CT_GRAY, 0.5); |
+ crRightBottom = CPVT_Color(CT_GRAY, 0.75); |
+ break; |
+ case 'U': |
+ nBorderStyle = PBS_UNDERLINED; |
+ break; |
+ } |
+ } |
+ CPVT_Color crBorder, crBG; |
+ if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDict("MK")) { |
+ if (CPDF_Array* pArray = pMKDict->GetArray("BC")) { |
+ crBorder = ParseColor(*pArray); |
+ } |
+ if (CPDF_Array* pArray = pMKDict->GetArray("BG")) { |
+ crBG = ParseColor(*pArray); |
+ } |
+ } |
+ CFX_ByteTextBuf sAppStream; |
+ CFX_ByteString sBG = CPVT_GenerateAP::GenerateColorAP(crBG, TRUE); |
+ if (sBG.GetLength() > 0) { |
+ sAppStream << "q\n" << sBG << rcBBox.left << " " << rcBBox.bottom << " " |
+ << rcBBox.Width() << " " << rcBBox.Height() << " re f\n" |
+ << "Q\n"; |
+ } |
+ CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP( |
+ rcBBox, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, |
+ dsBorder); |
+ if (sBorderStream.GetLength() > 0) { |
+ sAppStream << "q\n" << sBorderStream << "Q\n"; |
+ } |
+ CPDF_Rect rcBody = |
+ CPDF_Rect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth, |
+ rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth); |
+ rcBody.Normalize(); |
+ CPDF_Dictionary* pAPDict = pAnnotDict->GetDict("AP"); |
+ if (pAPDict == NULL) { |
+ pAPDict = CPDF_Dictionary::Create(); |
if (pAPDict == NULL) { |
- pAPDict = CPDF_Dictionary::Create(); |
- if (pAPDict == NULL) { |
- return FALSE; |
- } |
- pAnnotDict->SetAt("AP", pAPDict); |
+ return FALSE; |
} |
- CPDF_Stream* pNormalStream = pAPDict->GetStream("N"); |
+ pAnnotDict->SetAt("AP", pAPDict); |
+ } |
+ CPDF_Stream* pNormalStream = pAPDict->GetStream("N"); |
+ if (pNormalStream == NULL) { |
+ pNormalStream = CPDF_Stream::Create(NULL, 0, NULL); |
if (pNormalStream == NULL) { |
- pNormalStream = CPDF_Stream::Create(NULL, 0, NULL); |
- if (pNormalStream == NULL) { |
- return FALSE; |
+ return FALSE; |
+ } |
+ int32_t objnum = pDoc->AddIndirectObject(pNormalStream); |
+ pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum); |
+ } |
+ CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); |
+ if (pStreamDict) { |
+ pStreamDict->SetAtMatrix("Matrix", matrix); |
+ pStreamDict->SetAtRect("BBox", rcBBox); |
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); |
+ if (pStreamResList) { |
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font"); |
+ if (!pStreamResFontList) { |
+ pStreamResFontList = CPDF_Dictionary::Create(); |
+ if (pStreamResFontList == NULL) { |
+ return FALSE; |
} |
- int32_t objnum = pDoc->AddIndirectObject(pNormalStream); |
- pAnnotDict->GetDict("AP")->SetAtReference("N", pDoc, objnum); |
- } |
- CPDF_Dictionary * pStreamDict = pNormalStream->GetDict(); |
- if (pStreamDict) { |
- pStreamDict->SetAtMatrix("Matrix", matrix); |
- pStreamDict->SetAtRect("BBox", rcBBox); |
- CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); |
- if (pStreamResList) { |
- CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font"); |
- if (!pStreamResFontList) { |
- pStreamResFontList = CPDF_Dictionary::Create(); |
- if (pStreamResFontList == NULL) { |
- return FALSE; |
- } |
- pStreamResList->SetAt("Font", pStreamResFontList); |
- } |
- if (!pStreamResFontList->KeyExist(sFontName)) { |
- pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); |
- } |
- } else { |
- pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); |
- pStreamResList = pStreamDict->GetDict("Resources"); |
+ pStreamResList->SetAt("Font", pStreamResFontList); |
+ } |
+ if (!pStreamResFontList->KeyExist(sFontName)) { |
+ pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); |
+ } |
+ } else { |
+ pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); |
+ pStreamResList = pStreamDict->GetDict("Resources"); |
+ } |
+ } |
+ switch (nWidgetType) { |
+ case 0: { |
+ CFX_WideString swValue = |
+ FPDF_GetFieldAttr(pAnnotDict, "V") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() |
+ : CFX_WideString(); |
+ int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger() |
+ : 0; |
+ FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() |
+ : 0; |
+ FX_DWORD dwMaxLen = |
+ FPDF_GetFieldAttr(pAnnotDict, "MaxLen") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger() |
+ : 0; |
+ CPVT_FontMap map(pDoc, |
+ pStreamDict ? pStreamDict->GetDict("Resources") : NULL, |
+ pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
+ CPVT_Provider prd(&map); |
+ CPDF_VariableText vt; |
+ vt.SetProvider(&prd); |
+ vt.SetPlateRect(rcBody); |
+ vt.SetAlignment(nAlign); |
+ if (IsFloatZero(fFontSize)) { |
+ vt.SetAutoFontSize(TRUE); |
+ } else { |
+ vt.SetFontSize(fFontSize); |
+ } |
+ FX_BOOL bMultiLine = (dwFlags >> 12) & 1; |
+ if (bMultiLine) { |
+ vt.SetMultiLine(TRUE); |
+ vt.SetAutoReturn(TRUE); |
+ } |
+ FX_WORD subWord = 0; |
+ if ((dwFlags >> 13) & 1) { |
+ subWord = '*'; |
+ vt.SetPasswordChar(subWord); |
+ } |
+ FX_BOOL bCharArray = (dwFlags >> 24) & 1; |
+ if (bCharArray) { |
+ vt.SetCharArray(dwMaxLen); |
+ } else { |
+ vt.SetLimitChar(dwMaxLen); |
+ } |
+ vt.Initialize(); |
+ vt.SetText(swValue.c_str()); |
+ vt.RearrangeAll(); |
+ CPDF_Rect rcContent = vt.GetContentRect(); |
+ CPDF_Point ptOffset(0.0f, 0.0f); |
+ if (!bMultiLine) { |
+ ptOffset = |
+ CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f); |
+ } |
+ CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP( |
+ &map, vt.GetIterator(), ptOffset, !bCharArray, subWord); |
+ if (sBody.GetLength() > 0) { |
+ sAppStream << "/Tx BMC\n" |
+ << "q\n"; |
+ if (rcContent.Width() > rcBody.Width() || |
+ rcContent.Height() > rcBody.Height()) { |
+ sAppStream << rcBody.left << " " << rcBody.bottom << " " |
+ << rcBody.Width() << " " << rcBody.Height() |
+ << " re\nW\nn\n"; |
} |
- } |
- switch (nWidgetType) { |
- case 0: { |
- CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V")? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() : CFX_WideString(); |
- int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")? FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger() : 0; |
- FX_DWORD dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() : 0; |
- FX_DWORD dwMaxLen = FPDF_GetFieldAttr(pAnnotDict, "MaxLen") ? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger() : 0; |
- CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict("Resources") : NULL , pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
- CPVT_Provider prd(&map); |
- CPDF_VariableText vt; |
- vt.SetProvider(&prd); |
- vt.SetPlateRect(rcBody); |
- vt.SetAlignment(nAlign); |
- if (IsFloatZero(fFontSize)) { |
- vt.SetAutoFontSize(TRUE); |
- } else { |
- vt.SetFontSize(fFontSize); |
- } |
- FX_BOOL bMultiLine = (dwFlags >> 12) & 1; |
- if (bMultiLine) { |
- vt.SetMultiLine(TRUE); |
- vt.SetAutoReturn(TRUE); |
- } |
- FX_WORD subWord = 0; |
- if ((dwFlags >> 13) & 1) { |
- subWord = '*'; |
- vt.SetPasswordChar(subWord); |
- } |
- FX_BOOL bCharArray = (dwFlags >> 24) & 1; |
- if (bCharArray) { |
- vt.SetCharArray(dwMaxLen); |
- } else { |
- vt.SetLimitChar(dwMaxLen); |
- } |
- vt.Initialize(); |
- vt.SetText(swValue.c_str()); |
- vt.RearrangeAll(); |
- CPDF_Rect rcContent = vt.GetContentRect(); |
- CPDF_Point ptOffset(0.0f, 0.0f); |
- if (!bMultiLine) { |
- ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcBody.Height()) / 2.0f); |
- } |
- CFX_ByteString sBody = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, !bCharArray, subWord); |
- if (sBody.GetLength() > 0) { |
- sAppStream << "/Tx BMC\n" << "q\n"; |
- if (rcContent.Width() > rcBody.Width() || |
- rcContent.Height() > rcBody.Height()) { |
- sAppStream << rcBody.left << " " << rcBody.bottom << " " |
- << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n"; |
- } |
- sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sBody << "ET\n" << "Q\nEMC\n"; |
- } |
- } |
+ sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) |
+ << sBody << "ET\n" |
+ << "Q\nEMC\n"; |
+ } |
+ } break; |
+ case 1: { |
+ CFX_WideString swValue = |
+ FPDF_GetFieldAttr(pAnnotDict, "V") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() |
+ : CFX_WideString(); |
+ CPVT_FontMap map(pDoc, |
+ pStreamDict ? pStreamDict->GetDict("Resources") : NULL, |
+ pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
+ CPVT_Provider prd(&map); |
+ CPDF_VariableText vt; |
+ vt.SetProvider(&prd); |
+ CPDF_Rect rcButton = rcBody; |
+ rcButton.left = rcButton.right - 13; |
+ rcButton.Normalize(); |
+ CPDF_Rect rcEdit = rcBody; |
+ rcEdit.right = rcButton.left; |
+ rcEdit.Normalize(); |
+ vt.SetPlateRect(rcEdit); |
+ if (IsFloatZero(fFontSize)) { |
+ vt.SetAutoFontSize(TRUE); |
+ } else { |
+ vt.SetFontSize(fFontSize); |
+ } |
+ vt.Initialize(); |
+ vt.SetText(swValue.c_str()); |
+ vt.RearrangeAll(); |
+ CPDF_Rect rcContent = vt.GetContentRect(); |
+ CPDF_Point ptOffset = |
+ CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f); |
+ CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP( |
+ &map, vt.GetIterator(), ptOffset, TRUE, 0); |
+ if (sEdit.GetLength() > 0) { |
+ sAppStream << "/Tx BMC\n" |
+ << "q\n"; |
+ sAppStream << rcEdit.left << " " << rcEdit.bottom << " " |
+ << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n"; |
+ sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) |
+ << sEdit << "ET\n" |
+ << "Q\nEMC\n"; |
+ } |
+ CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP( |
+ CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), |
+ TRUE); |
+ if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) { |
+ sAppStream << "q\n" << sButton; |
+ sAppStream << rcButton.left << " " << rcButton.bottom << " " |
+ << rcButton.Width() << " " << rcButton.Height() << " re f\n"; |
+ sAppStream << "Q\n"; |
+ CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP( |
+ rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), |
+ CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0)); |
+ if (sButtonBorder.GetLength() > 0) { |
+ sAppStream << "q\n" << sButtonBorder << "Q\n"; |
+ } |
+ CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, |
+ (rcButton.top + rcButton.bottom) / 2); |
+ if (IsFloatBigger(rcButton.Width(), 6) && |
+ IsFloatBigger(rcButton.Height(), 6)) { |
+ sAppStream << "q\n" |
+ << " 0 g\n"; |
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; |
+ sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; |
+ sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; |
+ sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; |
+ sAppStream << sButton << "Q\n"; |
+ } |
+ } |
+ } break; |
+ case 2: { |
+ CPVT_FontMap map(pDoc, |
+ pStreamDict ? pStreamDict->GetDict("Resources") : NULL, |
+ pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
+ CPVT_Provider prd(&map); |
+ CPDF_Array* pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray() |
+ : NULL; |
+ CPDF_Array* pSels = FPDF_GetFieldAttr(pAnnotDict, "I") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray() |
+ : NULL; |
+ int32_t nTop = FPDF_GetFieldAttr(pAnnotDict, "TI") |
+ ? FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger() |
+ : 0; |
+ CFX_ByteTextBuf sBody; |
+ if (pOpts) { |
+ FX_FLOAT fy = rcBody.top; |
+ for (int32_t i = nTop, sz = pOpts->GetCount(); i < sz; i++) { |
+ if (IsFloatSmaller(fy, rcBody.bottom)) { |
break; |
- case 1: { |
- CFX_WideString swValue = FPDF_GetFieldAttr(pAnnotDict, "V") ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() : CFX_WideString(); |
- CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict("Resources"):NULL, pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
- CPVT_Provider prd(&map); |
- CPDF_VariableText vt; |
- vt.SetProvider(&prd); |
- CPDF_Rect rcButton = rcBody; |
- rcButton.left = rcButton.right - 13; |
- rcButton.Normalize(); |
- CPDF_Rect rcEdit = rcBody; |
- rcEdit.right = rcButton.left; |
- rcEdit.Normalize(); |
- vt.SetPlateRect(rcEdit); |
- if (IsFloatZero(fFontSize)) { |
- vt.SetAutoFontSize(TRUE); |
- } else { |
- vt.SetFontSize(fFontSize); |
- } |
- vt.Initialize(); |
- vt.SetText(swValue.c_str()); |
- vt.RearrangeAll(); |
- CPDF_Rect rcContent = vt.GetContentRect(); |
- CPDF_Point ptOffset = CPDF_Point(0.0f, (rcContent.Height() - rcEdit.Height()) / 2.0f); |
- CFX_ByteString sEdit = CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), ptOffset, TRUE, 0); |
- if (sEdit.GetLength() > 0) { |
- sAppStream << "/Tx BMC\n" << "q\n"; |
- sAppStream << rcEdit.left << " " << rcEdit.bottom << " " |
- << rcEdit.Width() << " " << rcEdit.Height() << " re\nW\nn\n"; |
- sAppStream << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << sEdit << "ET\n" << "Q\nEMC\n"; |
- } |
- CFX_ByteString sButton = CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 220.0f / 255.0f, 220.0f / 255.0f, 220.0f / 255.0f), TRUE); |
- if (sButton.GetLength() > 0 && !rcButton.IsEmpty()) { |
- sAppStream << "q\n" << sButton; |
- sAppStream << rcButton.left << " " << rcButton.bottom << " " |
- << rcButton.Width() << " " << rcButton.Height() << " re f\n"; |
- sAppStream << "Q\n"; |
- CFX_ByteString sButtonBorder = CPVT_GenerateAP::GenerateBorderAP(rcButton, 2, CPVT_Color(CT_GRAY, 0), CPVT_Color(CT_GRAY, 1), CPVT_Color(CT_GRAY, 0.5), PBS_BEVELED, CPVT_Dash(3, 0, 0)); |
- if (sButtonBorder.GetLength() > 0) { |
- sAppStream << "q\n" << sButtonBorder << "Q\n"; |
- } |
- CPDF_Point ptCenter = CPDF_Point((rcButton.left + rcButton.right) / 2, (rcButton.top + rcButton.bottom) / 2); |
- if (IsFloatBigger(rcButton.Width(), 6) && IsFloatBigger(rcButton.Height(), 6)) { |
- sAppStream << "q\n" << " 0 g\n"; |
- sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " m\n"; |
- sAppStream << ptCenter.x + 3 << " " << ptCenter.y + 1.5f << " l\n"; |
- sAppStream << ptCenter.x << " " << ptCenter.y - 1.5f << " l\n"; |
- sAppStream << ptCenter.x - 3 << " " << ptCenter.y + 1.5f << " l f\n"; |
- sAppStream << sButton << "Q\n"; |
- } |
- } |
+ } |
+ if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) { |
+ CFX_WideString swItem; |
+ if (pOpt->GetType() == PDFOBJ_STRING) { |
+ swItem = pOpt->GetUnicodeText(); |
+ } else if (pOpt->GetType() == PDFOBJ_ARRAY) { |
+ swItem = |
+ ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText(); |
} |
- break; |
- case 2: { |
- CPVT_FontMap map(pDoc, pStreamDict ? pStreamDict->GetDict("Resources"):NULL, pDefFont, sFontName.Right(sFontName.GetLength() - 1)); |
- CPVT_Provider prd(&map); |
- CPDF_Array * pOpts = FPDF_GetFieldAttr(pAnnotDict, "Opt") ? FPDF_GetFieldAttr(pAnnotDict, "Opt")->GetArray() : NULL; |
- CPDF_Array * pSels = FPDF_GetFieldAttr(pAnnotDict, "I") ? FPDF_GetFieldAttr(pAnnotDict, "I")->GetArray() : NULL; |
- int32_t nTop = FPDF_GetFieldAttr(pAnnotDict, "TI") ? FPDF_GetFieldAttr(pAnnotDict, "TI")->GetInteger() : 0; |
- CFX_ByteTextBuf sBody; |
- if (pOpts) { |
- FX_FLOAT fy = rcBody.top; |
- for (int32_t i = nTop, sz = pOpts->GetCount(); i < sz; i++) { |
- if (IsFloatSmaller(fy, rcBody.bottom)) { |
- break; |
- } |
- if (CPDF_Object* pOpt = pOpts->GetElementValue(i)) { |
- CFX_WideString swItem; |
- if (pOpt->GetType() == PDFOBJ_STRING) { |
- swItem = pOpt->GetUnicodeText(); |
- } else if (pOpt->GetType() == PDFOBJ_ARRAY) { |
- swItem = ((CPDF_Array*)pOpt)->GetElementValue(1)->GetUnicodeText(); |
- } |
- FX_BOOL bSelected = FALSE; |
- if (pSels) { |
- for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) { |
- if (i == pSels->GetInteger(s)) { |
- bSelected = TRUE; |
- break; |
- } |
- } |
- } |
- CPDF_VariableText vt; |
- vt.SetProvider(&prd); |
- vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f)); |
- if (IsFloatZero(fFontSize)) { |
- vt.SetFontSize(12.0f); |
- } else { |
- vt.SetFontSize(fFontSize); |
- } |
- vt.Initialize(); |
- vt.SetText(swItem.c_str()); |
- vt.RearrangeAll(); |
- FX_FLOAT fItemHeight = vt.GetContentRect().Height(); |
- if (bSelected) { |
- CPDF_Rect rcItem = CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy); |
- sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, 113.0f / 255.0f), TRUE) |
- << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width() << " " << rcItem.Height() << " re f\n" << "Q\n"; |
- sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(CPVT_Color(CT_GRAY, 1), TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n"; |
- } else { |
- sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), CPDF_Point(0.0f, fy), TRUE, 0) << "ET\n"; |
- } |
- fy -= fItemHeight; |
- } |
- } |
- } |
- if (sBody.GetSize() > 0) { |
- sAppStream << "/Tx BMC\n" << "q\n"; |
- sAppStream << rcBody.left << " " << rcBody.bottom << " " |
- << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n"; |
- sAppStream << sBody.GetByteString() << "Q\nEMC\n"; |
+ FX_BOOL bSelected = FALSE; |
+ if (pSels) { |
+ for (FX_DWORD s = 0, ssz = pSels->GetCount(); s < ssz; s++) { |
+ if (i == pSels->GetInteger(s)) { |
+ bSelected = TRUE; |
+ break; |
} |
+ } |
} |
- break; |
- } |
- if (pNormalStream) { |
- pNormalStream->SetData((uint8_t*)sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, FALSE); |
- pStreamDict = pNormalStream->GetDict(); |
- if (pStreamDict) { |
- pStreamDict->SetAtMatrix("Matrix", matrix); |
- pStreamDict->SetAtRect("BBox", rcBBox); |
- CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); |
- if (pStreamResList) { |
- CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font"); |
- if (!pStreamResFontList) { |
- pStreamResFontList = CPDF_Dictionary::Create(); |
- if (pStreamResFontList == NULL) { |
- return FALSE; |
- } |
- pStreamResList->SetAt("Font", pStreamResFontList); |
- } |
- if (!pStreamResFontList->KeyExist(sFontName)) { |
- pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); |
- } |
+ CPDF_VariableText vt; |
+ vt.SetProvider(&prd); |
+ vt.SetPlateRect(CPDF_Rect(rcBody.left, 0.0f, rcBody.right, 0.0f)); |
+ if (IsFloatZero(fFontSize)) { |
+ vt.SetFontSize(12.0f); |
} else { |
- pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); |
- pStreamResList = pStreamDict->GetDict("Resources"); |
+ vt.SetFontSize(fFontSize); |
} |
+ vt.Initialize(); |
+ vt.SetText(swItem.c_str()); |
+ vt.RearrangeAll(); |
+ FX_FLOAT fItemHeight = vt.GetContentRect().Height(); |
+ if (bSelected) { |
+ CPDF_Rect rcItem = |
+ CPDF_Rect(rcBody.left, fy - fItemHeight, rcBody.right, fy); |
+ sBody << "q\n" << CPVT_GenerateAP::GenerateColorAP( |
+ CPVT_Color(CT_RGB, 0, 51.0f / 255.0f, |
+ 113.0f / 255.0f), |
+ TRUE) |
+ << rcItem.left << " " << rcItem.bottom << " " |
+ << rcItem.Width() << " " << rcItem.Height() << " re f\n" |
+ << "Q\n"; |
+ sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP( |
+ CPVT_Color(CT_GRAY, 1), TRUE) |
+ << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), |
+ CPDF_Point(0.0f, fy), |
+ TRUE, 0) |
+ << "ET\n"; |
+ } else { |
+ sBody << "BT\n" << CPVT_GenerateAP::GenerateColorAP(crText, TRUE) |
+ << CPVT_GenerateAP::GenerateEditAP(&map, vt.GetIterator(), |
+ CPDF_Point(0.0f, fy), |
+ TRUE, 0) |
+ << "ET\n"; |
+ } |
+ fy -= fItemHeight; |
+ } |
+ } |
+ } |
+ if (sBody.GetSize() > 0) { |
+ sAppStream << "/Tx BMC\n" |
+ << "q\n"; |
+ sAppStream << rcBody.left << " " << rcBody.bottom << " " |
+ << rcBody.Width() << " " << rcBody.Height() << " re\nW\nn\n"; |
+ sAppStream << sBody.GetByteString() << "Q\nEMC\n"; |
+ } |
+ } break; |
+ } |
+ if (pNormalStream) { |
+ pNormalStream->SetData((uint8_t*)sAppStream.GetBuffer(), |
+ sAppStream.GetSize(), FALSE, FALSE); |
+ pStreamDict = pNormalStream->GetDict(); |
+ if (pStreamDict) { |
+ pStreamDict->SetAtMatrix("Matrix", matrix); |
+ pStreamDict->SetAtRect("BBox", rcBBox); |
+ CPDF_Dictionary* pStreamResList = pStreamDict->GetDict("Resources"); |
+ if (pStreamResList) { |
+ CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDict("Font"); |
+ if (!pStreamResFontList) { |
+ pStreamResFontList = CPDF_Dictionary::Create(); |
+ if (pStreamResFontList == NULL) { |
+ return FALSE; |
+ } |
+ pStreamResList->SetAt("Font", pStreamResFontList); |
+ } |
+ if (!pStreamResFontList->KeyExist(sFontName)) { |
+ pStreamResFontList->SetAtReference(sFontName, pDoc, pFontDict); |
} |
+ } else { |
+ pStreamDict->SetAt("Resources", pFormDict->GetDict("DR")->Clone()); |
+ pStreamResList = pStreamDict->GetDict("Resources"); |
+ } |
} |
- return TRUE; |
+ } |
+ return TRUE; |
} |
-FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) |
-{ |
- return GenerateWidgetAP(pDoc, pAnnotDict, 0); |
+FX_BOOL CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pAnnotDict) { |
+ return GenerateWidgetAP(pDoc, pAnnotDict, 0); |
} |
-FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) |
-{ |
- return GenerateWidgetAP(pDoc, pAnnotDict, 1); |
+FX_BOOL CPVT_GenerateAP::GenerateComboBoxAP(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pAnnotDict) { |
+ return GenerateWidgetAP(pDoc, pAnnotDict, 1); |
} |
-FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) |
-{ |
- return GenerateWidgetAP(pDoc, pAnnotDict, 2); |
+FX_BOOL CPVT_GenerateAP::GenerateListBoxAP(CPDF_Document* pDoc, |
+ CPDF_Dictionary* pAnnotDict) { |
+ return GenerateWidgetAP(pDoc, pAnnotDict, 2); |
} |
-CFX_ByteString CPVT_GenerateAP::GenerateEditAP(IPVT_FontMap * pFontMap, IPDF_VariableText_Iterator* pIterator, const CPDF_Point & ptOffset, FX_BOOL bContinuous, FX_WORD SubWord, const CPVT_WordRange * pVisible) |
-{ |
- CFX_ByteTextBuf sEditStream, sLineStream, sWords; |
- CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f); |
- int32_t nCurFontIndex = -1; |
- if (pIterator) { |
- if (pVisible) { |
- pIterator->SetAt(pVisible->BeginPos); |
- } else { |
- pIterator->SetAt(0); |
- } |
- CPVT_WordPlace oldplace; |
- while (pIterator->NextWord()) { |
- CPVT_WordPlace place = pIterator->GetAt(); |
- if (pVisible && place.WordCmp(pVisible->EndPos) > 0) { |
- break; |
- } |
- if (bContinuous) { |
- if (place.LineCmp(oldplace) != 0) { |
- if (sWords.GetSize() > 0) { |
- sLineStream << GetWordRenderString(sWords.GetByteString()); |
- sEditStream << sLineStream; |
- sLineStream.Clear(); |
- sWords.Clear(); |
- } |
- CPVT_Word word; |
- if (pIterator->GetWord(word)) { |
- ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y); |
- } else { |
- CPVT_Line line; |
- pIterator->GetLine(line); |
- ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, line.ptLine.y + ptOffset.y); |
- } |
- if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { |
- sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n"; |
- ptOld = ptNew; |
- } |
- } |
- CPVT_Word word; |
- if (pIterator->GetWord(word)) { |
- if (word.nFontIndex != nCurFontIndex) { |
- if (sWords.GetSize() > 0) { |
- sLineStream << GetWordRenderString(sWords.GetByteString()); |
- sWords.Clear(); |
- } |
- sLineStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize); |
- nCurFontIndex = word.nFontIndex; |
- } |
- sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord); |
- } |
- oldplace = place; |
- } else { |
- CPVT_Word word; |
- if (pIterator->GetWord(word)) { |
- ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, word.ptWord.y + ptOffset.y); |
- if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { |
- sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y << " Td\n"; |
- ptOld = ptNew; |
- } |
- if (word.nFontIndex != nCurFontIndex) { |
- sEditStream << GetFontSetString(pFontMap, word.nFontIndex, word.fFontSize); |
- nCurFontIndex = word.nFontIndex; |
- } |
- sEditStream << GetWordRenderString(GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord)); |
- } |
- } |
- } |
- if (sWords.GetSize() > 0) { |
+CFX_ByteString CPVT_GenerateAP::GenerateEditAP( |
+ IPVT_FontMap* pFontMap, |
+ IPDF_VariableText_Iterator* pIterator, |
+ const CPDF_Point& ptOffset, |
+ FX_BOOL bContinuous, |
+ FX_WORD SubWord, |
+ const CPVT_WordRange* pVisible) { |
+ CFX_ByteTextBuf sEditStream, sLineStream, sWords; |
+ CPDF_Point ptOld(0.0f, 0.0f), ptNew(0.0f, 0.0f); |
+ int32_t nCurFontIndex = -1; |
+ if (pIterator) { |
+ if (pVisible) { |
+ pIterator->SetAt(pVisible->BeginPos); |
+ } else { |
+ pIterator->SetAt(0); |
+ } |
+ CPVT_WordPlace oldplace; |
+ while (pIterator->NextWord()) { |
+ CPVT_WordPlace place = pIterator->GetAt(); |
+ if (pVisible && place.WordCmp(pVisible->EndPos) > 0) { |
+ break; |
+ } |
+ if (bContinuous) { |
+ if (place.LineCmp(oldplace) != 0) { |
+ if (sWords.GetSize() > 0) { |
sLineStream << GetWordRenderString(sWords.GetByteString()); |
sEditStream << sLineStream; |
+ sLineStream.Clear(); |
sWords.Clear(); |
+ } |
+ CPVT_Word word; |
+ if (pIterator->GetWord(word)) { |
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, |
+ word.ptWord.y + ptOffset.y); |
+ } else { |
+ CPVT_Line line; |
+ pIterator->GetLine(line); |
+ ptNew = CPDF_Point(line.ptLine.x + ptOffset.x, |
+ line.ptLine.y + ptOffset.y); |
+ } |
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { |
+ sLineStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y |
+ << " Td\n"; |
+ ptOld = ptNew; |
+ } |
+ } |
+ CPVT_Word word; |
+ if (pIterator->GetWord(word)) { |
+ if (word.nFontIndex != nCurFontIndex) { |
+ if (sWords.GetSize() > 0) { |
+ sLineStream << GetWordRenderString(sWords.GetByteString()); |
+ sWords.Clear(); |
+ } |
+ sLineStream << GetFontSetString(pFontMap, word.nFontIndex, |
+ word.fFontSize); |
+ nCurFontIndex = word.nFontIndex; |
+ } |
+ sWords << GetPDFWordString(pFontMap, nCurFontIndex, word.Word, |
+ SubWord); |
} |
+ oldplace = place; |
+ } else { |
+ CPVT_Word word; |
+ if (pIterator->GetWord(word)) { |
+ ptNew = CPDF_Point(word.ptWord.x + ptOffset.x, |
+ word.ptWord.y + ptOffset.y); |
+ if (ptNew.x != ptOld.x || ptNew.y != ptOld.y) { |
+ sEditStream << ptNew.x - ptOld.x << " " << ptNew.y - ptOld.y |
+ << " Td\n"; |
+ ptOld = ptNew; |
+ } |
+ if (word.nFontIndex != nCurFontIndex) { |
+ sEditStream << GetFontSetString(pFontMap, word.nFontIndex, |
+ word.fFontSize); |
+ nCurFontIndex = word.nFontIndex; |
+ } |
+ sEditStream << GetWordRenderString( |
+ GetPDFWordString(pFontMap, nCurFontIndex, word.Word, SubWord)); |
+ } |
+ } |
+ } |
+ if (sWords.GetSize() > 0) { |
+ sLineStream << GetWordRenderString(sWords.GetByteString()); |
+ sEditStream << sLineStream; |
+ sWords.Clear(); |
} |
- return sEditStream.GetByteString(); |
+ } |
+ return sEditStream.GetByteString(); |
} |
-CFX_ByteString CPVT_GenerateAP::GenerateBorderAP(const CPDF_Rect & rect, FX_FLOAT fWidth, |
- const CPVT_Color & color, const CPVT_Color & crLeftTop, const CPVT_Color & crRightBottom, |
- int32_t nStyle, const CPVT_Dash & dash) |
-{ |
- CFX_ByteTextBuf sAppStream; |
- CFX_ByteString sColor; |
- FX_FLOAT fLeft = rect.left; |
- FX_FLOAT fRight = rect.right; |
- FX_FLOAT fTop = rect.top; |
- FX_FLOAT fBottom = rect.bottom; |
- if (fWidth > 0.0f) { |
- FX_FLOAT fHalfWidth = fWidth / 2.0f; |
- switch (nStyle) { |
- default: |
- case PBS_SOLID: |
- sColor = GenerateColorAP(color, TRUE); |
- if (sColor.GetLength() > 0) { |
- sAppStream << sColor; |
- sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; |
- sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " |
- << fRight - fLeft - fWidth * 2 << " " << fTop - fBottom - fWidth * 2 << " re\n"; |
- sAppStream << "f*\n"; |
- } |
- break; |
- case PBS_DASH: |
- sColor = GenerateColorAP(color, FALSE); |
- if (sColor.GetLength() > 0) { |
- sAppStream << sColor; |
- sAppStream << fWidth << " w" << " [" << dash.nDash << " " << dash.nGap << "] " << dash.nPhase << " d\n"; |
- sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " m\n"; |
- sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; |
- sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 << " l\n"; |
- sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 << " l\n"; |
- sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 << " l S\n"; |
- } |
- break; |
- case PBS_BEVELED: |
- case PBS_INSET: |
- sColor = GenerateColorAP(crLeftTop, TRUE); |
- if (sColor.GetLength() > 0) { |
- sAppStream << sColor; |
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " m\n"; |
- sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth << " l\n"; |
- sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " l\n"; |
- sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; |
- sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l\n"; |
- sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l f\n"; |
- } |
- sColor = GenerateColorAP(crRightBottom, TRUE); |
- if (sColor.GetLength() > 0) { |
- sAppStream << sColor; |
- sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth << " m\n"; |
- sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; |
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " l\n"; |
- sAppStream << fLeft + fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; |
- sAppStream << fRight - fHalfWidth * 2 << " " << fBottom + fHalfWidth * 2 << " l\n"; |
- sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 << " l f\n"; |
- } |
- sColor = GenerateColorAP(color, TRUE); |
- if (sColor.GetLength() > 0) { |
- sAppStream << sColor; |
- sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " << fTop - fBottom << " re\n"; |
- sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " |
- << fRight - fLeft - fHalfWidth * 2 << " " << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; |
- } |
- break; |
- case PBS_UNDERLINED: |
- sColor = GenerateColorAP(color, FALSE); |
- if (sColor.GetLength() > 0) { |
- sAppStream << sColor; |
- sAppStream << fWidth << " w\n"; |
- sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; |
- sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; |
- } |
- break; |
+CFX_ByteString CPVT_GenerateAP::GenerateBorderAP( |
+ const CPDF_Rect& rect, |
+ FX_FLOAT fWidth, |
+ const CPVT_Color& color, |
+ const CPVT_Color& crLeftTop, |
+ const CPVT_Color& crRightBottom, |
+ int32_t nStyle, |
+ const CPVT_Dash& dash) { |
+ CFX_ByteTextBuf sAppStream; |
+ CFX_ByteString sColor; |
+ FX_FLOAT fLeft = rect.left; |
+ FX_FLOAT fRight = rect.right; |
+ FX_FLOAT fTop = rect.top; |
+ FX_FLOAT fBottom = rect.bottom; |
+ if (fWidth > 0.0f) { |
+ FX_FLOAT fHalfWidth = fWidth / 2.0f; |
+ switch (nStyle) { |
+ default: |
+ case PBS_SOLID: |
+ sColor = GenerateColorAP(color, TRUE); |
+ if (sColor.GetLength() > 0) { |
+ sAppStream << sColor; |
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " |
+ << fTop - fBottom << " re\n"; |
+ sAppStream << fLeft + fWidth << " " << fBottom + fWidth << " " |
+ << fRight - fLeft - fWidth * 2 << " " |
+ << fTop - fBottom - fWidth * 2 << " re\n"; |
+ sAppStream << "f*\n"; |
+ } |
+ break; |
+ case PBS_DASH: |
+ sColor = GenerateColorAP(color, FALSE); |
+ if (sColor.GetLength() > 0) { |
+ sAppStream << sColor; |
+ sAppStream << fWidth << " w" |
+ << " [" << dash.nDash << " " << dash.nGap << "] " |
+ << dash.nPhase << " d\n"; |
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 |
+ << " m\n"; |
+ sAppStream << fLeft + fWidth / 2 << " " << fTop - fWidth / 2 |
+ << " l\n"; |
+ sAppStream << fRight - fWidth / 2 << " " << fTop - fWidth / 2 |
+ << " l\n"; |
+ sAppStream << fRight - fWidth / 2 << " " << fBottom + fWidth / 2 |
+ << " l\n"; |
+ sAppStream << fLeft + fWidth / 2 << " " << fBottom + fWidth / 2 |
+ << " l S\n"; |
} |
+ break; |
+ case PBS_BEVELED: |
+ case PBS_INSET: |
+ sColor = GenerateColorAP(crLeftTop, TRUE); |
+ if (sColor.GetLength() > 0) { |
+ sAppStream << sColor; |
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth |
+ << " m\n"; |
+ sAppStream << fLeft + fHalfWidth << " " << fTop - fHalfWidth |
+ << " l\n"; |
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth |
+ << " l\n"; |
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 |
+ << " l\n"; |
+ sAppStream << fLeft + fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 |
+ << " l\n"; |
+ sAppStream << fLeft + fHalfWidth * 2 << " " |
+ << fBottom + fHalfWidth * 2 << " l f\n"; |
+ } |
+ sColor = GenerateColorAP(crRightBottom, TRUE); |
+ if (sColor.GetLength() > 0) { |
+ sAppStream << sColor; |
+ sAppStream << fRight - fHalfWidth << " " << fTop - fHalfWidth |
+ << " m\n"; |
+ sAppStream << fRight - fHalfWidth << " " << fBottom + fHalfWidth |
+ << " l\n"; |
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth |
+ << " l\n"; |
+ sAppStream << fLeft + fHalfWidth * 2 << " " |
+ << fBottom + fHalfWidth * 2 << " l\n"; |
+ sAppStream << fRight - fHalfWidth * 2 << " " |
+ << fBottom + fHalfWidth * 2 << " l\n"; |
+ sAppStream << fRight - fHalfWidth * 2 << " " << fTop - fHalfWidth * 2 |
+ << " l f\n"; |
+ } |
+ sColor = GenerateColorAP(color, TRUE); |
+ if (sColor.GetLength() > 0) { |
+ sAppStream << sColor; |
+ sAppStream << fLeft << " " << fBottom << " " << fRight - fLeft << " " |
+ << fTop - fBottom << " re\n"; |
+ sAppStream << fLeft + fHalfWidth << " " << fBottom + fHalfWidth << " " |
+ << fRight - fLeft - fHalfWidth * 2 << " " |
+ << fTop - fBottom - fHalfWidth * 2 << " re f*\n"; |
+ } |
+ break; |
+ case PBS_UNDERLINED: |
+ sColor = GenerateColorAP(color, FALSE); |
+ if (sColor.GetLength() > 0) { |
+ sAppStream << sColor; |
+ sAppStream << fWidth << " w\n"; |
+ sAppStream << fLeft << " " << fBottom + fWidth / 2 << " m\n"; |
+ sAppStream << fRight << " " << fBottom + fWidth / 2 << " l S\n"; |
+ } |
+ break; |
} |
- return sAppStream.GetByteString(); |
+ } |
+ return sAppStream.GetByteString(); |
} |
-CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color & color, const FX_BOOL & bFillOrStroke) |
-{ |
- CFX_ByteTextBuf sColorStream; |
- switch (color.nColorType) { |
- case CT_RGB: |
- sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " |
- << (bFillOrStroke ? "rg" : "RG") << "\n"; |
- break; |
- case CT_GRAY: |
- sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") << "\n"; |
- break; |
- case CT_CMYK: |
- sColorStream << color.fColor1 << " " << color.fColor2 << " " << color.fColor3 << " " << color.fColor4 << " " |
- << (bFillOrStroke ? "k" : "K") << "\n"; |
- break; |
- } |
- return sColorStream.GetByteString(); |
+CFX_ByteString CPVT_GenerateAP::GenerateColorAP(const CPVT_Color& color, |
+ const FX_BOOL& bFillOrStroke) { |
+ CFX_ByteTextBuf sColorStream; |
+ switch (color.nColorType) { |
+ case CT_RGB: |
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " |
+ << color.fColor3 << " " << (bFillOrStroke ? "rg" : "RG") |
+ << "\n"; |
+ break; |
+ case CT_GRAY: |
+ sColorStream << color.fColor1 << " " << (bFillOrStroke ? "g" : "G") |
+ << "\n"; |
+ break; |
+ case CT_CMYK: |
+ sColorStream << color.fColor1 << " " << color.fColor2 << " " |
+ << color.fColor3 << " " << color.fColor4 << " " |
+ << (bFillOrStroke ? "k" : "K") << "\n"; |
+ break; |
+ } |
+ return sColorStream.GetByteString(); |
} |