diff options
Diffstat (limited to 'core/src/fpdfdoc/doc_ap.cpp')
-rw-r--r-- | core/src/fpdfdoc/doc_ap.cpp | 1616 |
1 files changed, 868 insertions, 748 deletions
diff --git a/core/src/fpdfdoc/doc_ap.cpp b/core/src/fpdfdoc/doc_ap.cpp index f94a4d60e0..feedb32989 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(); } |