| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fpdfdoc/include/cpdf_formcontrol.h" | 7 #include "core/fpdfdoc/include/cpdf_formcontrol.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, | 28 CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField, |
| 29 CPDF_Dictionary* pWidgetDict) | 29 CPDF_Dictionary* pWidgetDict) |
| 30 : m_pField(pField), | 30 : m_pField(pField), |
| 31 m_pWidgetDict(pWidgetDict), | 31 m_pWidgetDict(pWidgetDict), |
| 32 m_pForm(m_pField->m_pForm) {} | 32 m_pForm(m_pField->m_pForm) {} |
| 33 | 33 |
| 34 CFX_ByteString CPDF_FormControl::GetOnStateName() const { | 34 CFX_ByteString CPDF_FormControl::GetOnStateName() const { |
| 35 ASSERT(GetType() == CPDF_FormField::CheckBox || | 35 ASSERT(GetType() == CPDF_FormField::CheckBox || |
| 36 GetType() == CPDF_FormField::RadioButton); | 36 GetType() == CPDF_FormField::RadioButton); |
| 37 CFX_ByteString csOn; | 37 CFX_ByteString csOn; |
| 38 CPDF_Dictionary* pAP = m_pWidgetDict->GetDictBy("AP"); | 38 CPDF_Dictionary* pAP = m_pWidgetDict->GetDictFor("AP"); |
| 39 if (!pAP) | 39 if (!pAP) |
| 40 return csOn; | 40 return csOn; |
| 41 | 41 |
| 42 CPDF_Dictionary* pN = pAP->GetDictBy("N"); | 42 CPDF_Dictionary* pN = pAP->GetDictFor("N"); |
| 43 if (!pN) | 43 if (!pN) |
| 44 return csOn; | 44 return csOn; |
| 45 | 45 |
| 46 for (const auto& it : *pN) { | 46 for (const auto& it : *pN) { |
| 47 if (it.first != "Off") | 47 if (it.first != "Off") |
| 48 return it.first; | 48 return it.first; |
| 49 } | 49 } |
| 50 return CFX_ByteString(); | 50 return CFX_ByteString(); |
| 51 } | 51 } |
| 52 | 52 |
| 53 void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn) { | 53 void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn) { |
| 54 ASSERT(GetType() == CPDF_FormField::CheckBox || | 54 ASSERT(GetType() == CPDF_FormField::CheckBox || |
| 55 GetType() == CPDF_FormField::RadioButton); | 55 GetType() == CPDF_FormField::RadioButton); |
| 56 CFX_ByteString csValue = csOn; | 56 CFX_ByteString csValue = csOn; |
| 57 if (csValue.IsEmpty()) | 57 if (csValue.IsEmpty()) |
| 58 csValue = "Yes"; | 58 csValue = "Yes"; |
| 59 else if (csValue == "Off") | 59 else if (csValue == "Off") |
| 60 csValue = "Yes"; | 60 csValue = "Yes"; |
| 61 | 61 |
| 62 CFX_ByteString csAS = m_pWidgetDict->GetStringBy("AS", "Off"); | 62 CFX_ByteString csAS = m_pWidgetDict->GetStringFor("AS", "Off"); |
| 63 if (csAS != "Off") | 63 if (csAS != "Off") |
| 64 m_pWidgetDict->SetAtName("AS", csValue); | 64 m_pWidgetDict->SetNameFor("AS", csValue); |
| 65 | 65 |
| 66 CPDF_Dictionary* pAP = m_pWidgetDict->GetDictBy("AP"); | 66 CPDF_Dictionary* pAP = m_pWidgetDict->GetDictFor("AP"); |
| 67 if (!pAP) | 67 if (!pAP) |
| 68 return; | 68 return; |
| 69 | 69 |
| 70 for (const auto& it : *pAP) { | 70 for (const auto& it : *pAP) { |
| 71 CPDF_Object* pObj1 = it.second; | 71 CPDF_Object* pObj1 = it.second; |
| 72 if (!pObj1) | 72 if (!pObj1) |
| 73 continue; | 73 continue; |
| 74 | 74 |
| 75 CPDF_Object* pObjDirect1 = pObj1->GetDirect(); | 75 CPDF_Object* pObjDirect1 = pObj1->GetDirect(); |
| 76 CPDF_Dictionary* pSubDict = pObjDirect1->AsDictionary(); | 76 CPDF_Dictionary* pSubDict = pObjDirect1->AsDictionary(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 } | 122 } |
| 123 if (csOn.IsEmpty()) | 123 if (csOn.IsEmpty()) |
| 124 csOn = "Yes"; | 124 csOn = "Yes"; |
| 125 return PDF_DecodeText(csOn); | 125 return PDF_DecodeText(csOn); |
| 126 } | 126 } |
| 127 | 127 |
| 128 bool CPDF_FormControl::IsChecked() const { | 128 bool CPDF_FormControl::IsChecked() const { |
| 129 ASSERT(GetType() == CPDF_FormField::CheckBox || | 129 ASSERT(GetType() == CPDF_FormField::CheckBox || |
| 130 GetType() == CPDF_FormField::RadioButton); | 130 GetType() == CPDF_FormField::RadioButton); |
| 131 CFX_ByteString csOn = GetOnStateName(); | 131 CFX_ByteString csOn = GetOnStateName(); |
| 132 CFX_ByteString csAS = m_pWidgetDict->GetStringBy("AS"); | 132 CFX_ByteString csAS = m_pWidgetDict->GetStringFor("AS"); |
| 133 return csAS == csOn; | 133 return csAS == csOn; |
| 134 } | 134 } |
| 135 | 135 |
| 136 bool CPDF_FormControl::IsDefaultChecked() const { | 136 bool CPDF_FormControl::IsDefaultChecked() const { |
| 137 ASSERT(GetType() == CPDF_FormField::CheckBox || | 137 ASSERT(GetType() == CPDF_FormField::CheckBox || |
| 138 GetType() == CPDF_FormField::RadioButton); | 138 GetType() == CPDF_FormField::RadioButton); |
| 139 CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV"); | 139 CPDF_Object* pDV = FPDF_GetFieldAttr(m_pField->m_pDict, "DV"); |
| 140 if (!pDV) | 140 if (!pDV) |
| 141 return FALSE; | 141 return FALSE; |
| 142 | 142 |
| 143 CFX_ByteString csDV = pDV->GetString(); | 143 CFX_ByteString csDV = pDV->GetString(); |
| 144 CFX_ByteString csOn = GetOnStateName(); | 144 CFX_ByteString csOn = GetOnStateName(); |
| 145 return (csDV == csOn); | 145 return (csDV == csOn); |
| 146 } | 146 } |
| 147 | 147 |
| 148 void CPDF_FormControl::CheckControl(FX_BOOL bChecked) { | 148 void CPDF_FormControl::CheckControl(FX_BOOL bChecked) { |
| 149 ASSERT(GetType() == CPDF_FormField::CheckBox || | 149 ASSERT(GetType() == CPDF_FormField::CheckBox || |
| 150 GetType() == CPDF_FormField::RadioButton); | 150 GetType() == CPDF_FormField::RadioButton); |
| 151 CFX_ByteString csOn = GetOnStateName(); | 151 CFX_ByteString csOn = GetOnStateName(); |
| 152 CFX_ByteString csOldAS = m_pWidgetDict->GetStringBy("AS", "Off"); | 152 CFX_ByteString csOldAS = m_pWidgetDict->GetStringFor("AS", "Off"); |
| 153 CFX_ByteString csAS = "Off"; | 153 CFX_ByteString csAS = "Off"; |
| 154 if (bChecked) | 154 if (bChecked) |
| 155 csAS = csOn; | 155 csAS = csOn; |
| 156 if (csOldAS == csAS) | 156 if (csOldAS == csAS) |
| 157 return; | 157 return; |
| 158 m_pWidgetDict->SetAtName("AS", csAS); | 158 m_pWidgetDict->SetNameFor("AS", csAS); |
| 159 } | 159 } |
| 160 | 160 |
| 161 void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, | 161 void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice, |
| 162 CFX_Matrix* pMatrix, | 162 CFX_Matrix* pMatrix, |
| 163 CPDF_Page* pPage, | 163 CPDF_Page* pPage, |
| 164 CPDF_Annot::AppearanceMode mode, | 164 CPDF_Annot::AppearanceMode mode, |
| 165 const CPDF_RenderOptions* pOptions) { | 165 const CPDF_RenderOptions* pOptions) { |
| 166 if (m_pWidgetDict->GetIntegerBy("F") & ANNOTFLAG_HIDDEN) | 166 if (m_pWidgetDict->GetIntegerFor("F") & ANNOTFLAG_HIDDEN) |
| 167 return; | 167 return; |
| 168 | 168 |
| 169 CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode); | 169 CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode); |
| 170 if (!pStream) | 170 if (!pStream) |
| 171 return; | 171 return; |
| 172 | 172 |
| 173 CFX_FloatRect form_bbox = pStream->GetDict()->GetRectBy("BBox"); | 173 CFX_FloatRect form_bbox = pStream->GetDict()->GetRectFor("BBox"); |
| 174 CFX_Matrix form_matrix = pStream->GetDict()->GetMatrixBy("Matrix"); | 174 CFX_Matrix form_matrix = pStream->GetDict()->GetMatrixFor("Matrix"); |
| 175 form_matrix.TransformRect(form_bbox); | 175 form_matrix.TransformRect(form_bbox); |
| 176 CFX_FloatRect arect = m_pWidgetDict->GetRectBy("Rect"); | 176 CFX_FloatRect arect = m_pWidgetDict->GetRectFor("Rect"); |
| 177 CFX_Matrix matrix; | 177 CFX_Matrix matrix; |
| 178 matrix.MatchRect(arect, form_bbox); | 178 matrix.MatchRect(arect, form_bbox); |
| 179 matrix.Concat(*pMatrix); | 179 matrix.Concat(*pMatrix); |
| 180 CPDF_Form form(m_pField->m_pForm->m_pDocument, | 180 CPDF_Form form(m_pField->m_pForm->m_pDocument, |
| 181 m_pField->m_pForm->m_pFormDict->GetDictBy("DR"), pStream); | 181 m_pField->m_pForm->m_pFormDict->GetDictFor("DR"), pStream); |
| 182 form.ParseContent(nullptr, nullptr, nullptr); | 182 form.ParseContent(nullptr, nullptr, nullptr); |
| 183 CPDF_RenderContext context(pPage); | 183 CPDF_RenderContext context(pPage); |
| 184 context.AppendLayer(&form, &matrix); | 184 context.AppendLayer(&form, &matrix); |
| 185 context.Render(pDevice, pOptions, nullptr); | 185 context.Render(pDevice, pOptions, nullptr); |
| 186 } | 186 } |
| 187 | 187 |
| 188 CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode() { | 188 CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode() { |
| 189 if (!m_pWidgetDict) | 189 if (!m_pWidgetDict) |
| 190 return Invert; | 190 return Invert; |
| 191 | 191 |
| 192 CFX_ByteString csH = m_pWidgetDict->GetStringBy("H", "I"); | 192 CFX_ByteString csH = m_pWidgetDict->GetStringFor("H", "I"); |
| 193 for (size_t i = 0; i < FX_ArraySize(g_sHighlightingMode); ++i) { | 193 for (size_t i = 0; i < FX_ArraySize(g_sHighlightingMode); ++i) { |
| 194 if (csH == g_sHighlightingMode[i]) | 194 if (csH == g_sHighlightingMode[i]) |
| 195 return static_cast<HighlightingMode>(i); | 195 return static_cast<HighlightingMode>(i); |
| 196 } | 196 } |
| 197 return Invert; | 197 return Invert; |
| 198 } | 198 } |
| 199 | 199 |
| 200 CPDF_ApSettings CPDF_FormControl::GetMK() const { | 200 CPDF_ApSettings CPDF_FormControl::GetMK() const { |
| 201 return CPDF_ApSettings(m_pWidgetDict ? m_pWidgetDict->GetDictBy("MK") | 201 return CPDF_ApSettings(m_pWidgetDict ? m_pWidgetDict->GetDictFor("MK") |
| 202 : nullptr); | 202 : nullptr); |
| 203 } | 203 } |
| 204 | 204 |
| 205 bool CPDF_FormControl::HasMKEntry(const CFX_ByteString& csEntry) const { | 205 bool CPDF_FormControl::HasMKEntry(const CFX_ByteString& csEntry) const { |
| 206 return GetMK().HasMKEntry(csEntry); | 206 return GetMK().HasMKEntry(csEntry); |
| 207 } | 207 } |
| 208 | 208 |
| 209 int CPDF_FormControl::GetRotation() { | 209 int CPDF_FormControl::GetRotation() { |
| 210 return GetMK().GetRotation(); | 210 return GetMK().GetRotation(); |
| 211 } | 211 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 240 | 240 |
| 241 int CPDF_FormControl::GetTextPosition() { | 241 int CPDF_FormControl::GetTextPosition() { |
| 242 return GetMK().GetTextPosition(); | 242 return GetMK().GetTextPosition(); |
| 243 } | 243 } |
| 244 | 244 |
| 245 CPDF_Action CPDF_FormControl::GetAction() { | 245 CPDF_Action CPDF_FormControl::GetAction() { |
| 246 if (!m_pWidgetDict) | 246 if (!m_pWidgetDict) |
| 247 return CPDF_Action(); | 247 return CPDF_Action(); |
| 248 | 248 |
| 249 if (m_pWidgetDict->KeyExist("A")) | 249 if (m_pWidgetDict->KeyExist("A")) |
| 250 return CPDF_Action(m_pWidgetDict->GetDictBy("A")); | 250 return CPDF_Action(m_pWidgetDict->GetDictFor("A")); |
| 251 | 251 |
| 252 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A"); | 252 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A"); |
| 253 if (!pObj) | 253 if (!pObj) |
| 254 return CPDF_Action(); | 254 return CPDF_Action(); |
| 255 | 255 |
| 256 return CPDF_Action(pObj->GetDict()); | 256 return CPDF_Action(pObj->GetDict()); |
| 257 } | 257 } |
| 258 | 258 |
| 259 CPDF_AAction CPDF_FormControl::GetAdditionalAction() { | 259 CPDF_AAction CPDF_FormControl::GetAdditionalAction() { |
| 260 if (!m_pWidgetDict) | 260 if (!m_pWidgetDict) |
| 261 return CPDF_AAction(); | 261 return CPDF_AAction(); |
| 262 | 262 |
| 263 if (m_pWidgetDict->KeyExist("AA")) | 263 if (m_pWidgetDict->KeyExist("AA")) |
| 264 return CPDF_AAction(m_pWidgetDict->GetDictBy("AA")); | 264 return CPDF_AAction(m_pWidgetDict->GetDictFor("AA")); |
| 265 return m_pField->GetAdditionalAction(); | 265 return m_pField->GetAdditionalAction(); |
| 266 } | 266 } |
| 267 | 267 |
| 268 CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance() { | 268 CPDF_DefaultAppearance CPDF_FormControl::GetDefaultAppearance() { |
| 269 if (!m_pWidgetDict) | 269 if (!m_pWidgetDict) |
| 270 return CPDF_DefaultAppearance(); | 270 return CPDF_DefaultAppearance(); |
| 271 | 271 |
| 272 if (m_pWidgetDict->KeyExist("DA")) | 272 if (m_pWidgetDict->KeyExist("DA")) |
| 273 return CPDF_DefaultAppearance(m_pWidgetDict->GetStringBy("DA")); | 273 return CPDF_DefaultAppearance(m_pWidgetDict->GetStringFor("DA")); |
| 274 | 274 |
| 275 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA"); | 275 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "DA"); |
| 276 if (pObj) | 276 if (pObj) |
| 277 return CPDF_DefaultAppearance(pObj->GetString()); | 277 return CPDF_DefaultAppearance(pObj->GetString()); |
| 278 return m_pField->m_pForm->GetDefaultAppearance(); | 278 return m_pField->m_pForm->GetDefaultAppearance(); |
| 279 } | 279 } |
| 280 | 280 |
| 281 CPDF_Font* CPDF_FormControl::GetDefaultControlFont() { | 281 CPDF_Font* CPDF_FormControl::GetDefaultControlFont() { |
| 282 CPDF_DefaultAppearance cDA = GetDefaultAppearance(); | 282 CPDF_DefaultAppearance cDA = GetDefaultAppearance(); |
| 283 CFX_ByteString csFontNameTag; | 283 CFX_ByteString csFontNameTag; |
| 284 FX_FLOAT fFontSize; | 284 FX_FLOAT fFontSize; |
| 285 cDA.GetFont(csFontNameTag, fFontSize); | 285 cDA.GetFont(csFontNameTag, fFontSize); |
| 286 if (csFontNameTag.IsEmpty()) | 286 if (csFontNameTag.IsEmpty()) |
| 287 return nullptr; | 287 return nullptr; |
| 288 | 288 |
| 289 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR"); | 289 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pWidgetDict, "DR"); |
| 290 if (CPDF_Dictionary* pDict = ToDictionary(pObj)) { | 290 if (CPDF_Dictionary* pDict = ToDictionary(pObj)) { |
| 291 CPDF_Dictionary* pFonts = pDict->GetDictBy("Font"); | 291 CPDF_Dictionary* pFonts = pDict->GetDictFor("Font"); |
| 292 if (pFonts) { | 292 if (pFonts) { |
| 293 CPDF_Dictionary* pElement = pFonts->GetDictBy(csFontNameTag); | 293 CPDF_Dictionary* pElement = pFonts->GetDictFor(csFontNameTag); |
| 294 if (pElement) { | 294 if (pElement) { |
| 295 CPDF_Font* pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement); | 295 CPDF_Font* pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement); |
| 296 if (pFont) | 296 if (pFont) |
| 297 return pFont; | 297 return pFont; |
| 298 } | 298 } |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 if (CPDF_Font* pFormFont = m_pField->m_pForm->GetFormFont(csFontNameTag)) | 301 if (CPDF_Font* pFormFont = m_pField->m_pForm->GetFormFont(csFontNameTag)) |
| 302 return pFormFont; | 302 return pFormFont; |
| 303 | 303 |
| 304 CPDF_Dictionary* pPageDict = m_pWidgetDict->GetDictBy("P"); | 304 CPDF_Dictionary* pPageDict = m_pWidgetDict->GetDictFor("P"); |
| 305 pObj = FPDF_GetFieldAttr(pPageDict, "Resources"); | 305 pObj = FPDF_GetFieldAttr(pPageDict, "Resources"); |
| 306 if (CPDF_Dictionary* pDict = ToDictionary(pObj)) { | 306 if (CPDF_Dictionary* pDict = ToDictionary(pObj)) { |
| 307 CPDF_Dictionary* pFonts = pDict->GetDictBy("Font"); | 307 CPDF_Dictionary* pFonts = pDict->GetDictFor("Font"); |
| 308 if (pFonts) { | 308 if (pFonts) { |
| 309 CPDF_Dictionary* pElement = pFonts->GetDictBy(csFontNameTag); | 309 CPDF_Dictionary* pElement = pFonts->GetDictFor(csFontNameTag); |
| 310 if (pElement) { | 310 if (pElement) { |
| 311 CPDF_Font* pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement); | 311 CPDF_Font* pFont = m_pField->m_pForm->m_pDocument->LoadFont(pElement); |
| 312 if (pFont) | 312 if (pFont) |
| 313 return pFont; | 313 return pFont; |
| 314 } | 314 } |
| 315 } | 315 } |
| 316 } | 316 } |
| 317 return nullptr; | 317 return nullptr; |
| 318 } | 318 } |
| 319 | 319 |
| 320 int CPDF_FormControl::GetControlAlignment() { | 320 int CPDF_FormControl::GetControlAlignment() { |
| 321 if (!m_pWidgetDict) | 321 if (!m_pWidgetDict) |
| 322 return 0; | 322 return 0; |
| 323 if (m_pWidgetDict->KeyExist("Q")) | 323 if (m_pWidgetDict->KeyExist("Q")) |
| 324 return m_pWidgetDict->GetIntegerBy("Q", 0); | 324 return m_pWidgetDict->GetIntegerFor("Q", 0); |
| 325 | 325 |
| 326 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q"); | 326 CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "Q"); |
| 327 if (pObj) | 327 if (pObj) |
| 328 return pObj->GetInteger(); | 328 return pObj->GetInteger(); |
| 329 return m_pField->m_pForm->GetFormAlignment(); | 329 return m_pField->m_pForm->GetFormAlignment(); |
| 330 } | 330 } |
| OLD | NEW |