| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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 "../../public/fpdf_formfill.h" | 7 #include "../../public/fpdf_formfill.h" |
| 8 #include "../../public/fpdfview.h" | 8 #include "../../public/fpdfview.h" |
| 9 #include "../../third_party/base/nonstd_unique_ptr.h" | 9 #include "../../third_party/base/nonstd_unique_ptr.h" |
| 10 #include "../include/fsdk_define.h" | 10 #include "../include/fsdk_define.h" |
| 11 #include "../include/fsdk_mgr.h" | 11 #include "../include/fsdk_mgr.h" |
| 12 #include "../include/javascript/IJavaScript.h" | 12 #include "../include/javascript/IJavaScript.h" |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 CPDFSDK_Document* FormHandleToSDKDoc(FPDF_FORMHANDLE hHandle) | 16 CPDFSDK_Document* FormHandleToSDKDoc(FPDF_FORMHANDLE hHandle) { |
| 17 { | 17 CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; |
| 18 CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; | 18 return pEnv ? pEnv->GetSDKDocument() : nullptr; |
| 19 return pEnv ? pEnv->GetSDKDocument() : nullptr; | 19 } |
| 20 } | 20 |
| 21 | 21 CPDFSDK_InterForm* FormHandleToInterForm(FPDF_FORMHANDLE hHandle) { |
| 22 CPDFSDK_InterForm* FormHandleToInterForm(FPDF_FORMHANDLE hHandle) | 22 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); |
| 23 { | 23 return pSDKDoc ? pSDKDoc->GetInterForm() : nullptr; |
| 24 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); | 24 } |
| 25 return pSDKDoc ? pSDKDoc->GetInterForm() : nullptr; | 25 |
| 26 } | 26 CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle, |
| 27 | 27 FPDF_PAGE page) { |
| 28 CPDFSDK_PageView* FormHandleToPageView(FPDF_FORMHANDLE hHandle, FPDF_PAGE page) | 28 if (!page) |
| 29 { | 29 return nullptr; |
| 30 if (!page) | 30 |
| 31 return nullptr; | 31 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); |
| 32 | 32 return pSDKDoc ? pSDKDoc->GetPageView((CPDF_Page*)page, TRUE) : nullptr; |
| 33 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); | |
| 34 return pSDKDoc ? pSDKDoc->GetPageView((CPDF_Page*)page, TRUE) : nullptr; | |
| 35 } | 33 } |
| 36 | 34 |
| 37 } // namespace | 35 } // namespace |
| 38 | 36 |
| 39 DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint( | 37 DLLEXPORT int STDCALL FPDPage_HasFormFieldAtPoint(FPDF_FORMHANDLE hHandle, |
| 40 FPDF_FORMHANDLE hHandle, FPDF_PAGE page, double page_x, double page_y) | 38 FPDF_PAGE page, |
| 41 { | 39 double page_x, |
| 42 if (!page || !hHandle) | 40 double page_y) { |
| 43 return -1; | 41 if (!page || !hHandle) |
| 44 CPDF_Page* pPage = (CPDF_Page*) page; | 42 return -1; |
| 45 | 43 CPDF_Page* pPage = (CPDF_Page*)page; |
| 46 nonstd::unique_ptr<CPDF_InterForm> pInterForm( | 44 |
| 47 new CPDF_InterForm(pPage->m_pDocument, FALSE)); | 45 nonstd::unique_ptr<CPDF_InterForm> pInterForm( |
| 48 CPDF_FormControl* pFormCtrl = pInterForm->GetControlAtPoint( | 46 new CPDF_InterForm(pPage->m_pDocument, FALSE)); |
| 49 pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y); | 47 CPDF_FormControl* pFormCtrl = |
| 50 if (!pFormCtrl) | 48 pInterForm->GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y); |
| 51 return -1; | 49 if (!pFormCtrl) |
| 52 | 50 return -1; |
| 53 CPDF_FormField* pFormField = pFormCtrl->GetField(); | 51 |
| 54 if(!pFormField) | 52 CPDF_FormField* pFormField = pFormCtrl->GetField(); |
| 55 return -1; | 53 if (!pFormField) |
| 56 | 54 return -1; |
| 57 return pFormField->GetFieldType(); | 55 |
| 58 } | 56 return pFormField->GetFieldType(); |
| 59 | 57 } |
| 60 DLLEXPORT FPDF_FORMHANDLE STDCALL FPDFDOC_InitFormFillEnvironment( | 58 |
| 61 FPDF_DOCUMENT document, FPDF_FORMFILLINFO* formInfo) | 59 DLLEXPORT FPDF_FORMHANDLE STDCALL |
| 62 { | 60 FPDFDOC_InitFormFillEnvironment(FPDF_DOCUMENT document, |
| 63 if (!document || !formInfo || formInfo->version != 1) | 61 FPDF_FORMFILLINFO* formInfo) { |
| 64 return nullptr; | 62 if (!document || !formInfo || formInfo->version != 1) |
| 65 | 63 return nullptr; |
| 66 CPDF_Document* pDocument = (CPDF_Document*)document; | 64 |
| 67 CPDFDoc_Environment* pEnv = new CPDFDoc_Environment(pDocument, formInfo); | 65 CPDF_Document* pDocument = (CPDF_Document*)document; |
| 68 pEnv->SetSDKDocument(new CPDFSDK_Document(pDocument, pEnv)); | 66 CPDFDoc_Environment* pEnv = new CPDFDoc_Environment(pDocument, formInfo); |
| 69 return pEnv; | 67 pEnv->SetSDKDocument(new CPDFSDK_Document(pDocument, pEnv)); |
| 70 } | 68 return pEnv; |
| 71 | 69 } |
| 72 DLLEXPORT void STDCALL FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle) | 70 |
| 73 { | 71 DLLEXPORT void STDCALL |
| 74 if (!hHandle) | 72 FPDFDOC_ExitFormFillEnvironment(FPDF_FORMHANDLE hHandle) { |
| 75 return; | 73 if (!hHandle) |
| 76 | 74 return; |
| 77 CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; | 75 |
| 78 if (CPDFSDK_Document* pSDKDoc = pEnv->GetSDKDocument()) | 76 CPDFDoc_Environment* pEnv = (CPDFDoc_Environment*)hHandle; |
| 79 { | 77 if (CPDFSDK_Document* pSDKDoc = pEnv->GetSDKDocument()) { |
| 80 pEnv->SetSDKDocument(NULL); | 78 pEnv->SetSDKDocument(NULL); |
| 81 delete pSDKDoc; | 79 delete pSDKDoc; |
| 80 } |
| 81 delete pEnv; |
| 82 } |
| 83 |
| 84 DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, |
| 85 FPDF_PAGE page, |
| 86 int modifier, |
| 87 double page_x, |
| 88 double page_y) { |
| 89 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); |
| 90 if (!pPageView) |
| 91 return FALSE; |
| 92 |
| 93 CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); |
| 94 return pPageView->OnMouseMove(pt, modifier); |
| 95 } |
| 96 |
| 97 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, |
| 98 FPDF_PAGE page, |
| 99 int modifier, |
| 100 double page_x, |
| 101 double page_y) { |
| 102 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); |
| 103 if (!pPageView) |
| 104 return FALSE; |
| 105 |
| 106 CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); |
| 107 return pPageView->OnLButtonDown(pt, modifier); |
| 108 } |
| 109 |
| 110 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, |
| 111 FPDF_PAGE page, |
| 112 int modifier, |
| 113 double page_x, |
| 114 double page_y) { |
| 115 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); |
| 116 if (!pPageView) |
| 117 return FALSE; |
| 118 |
| 119 CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); |
| 120 return pPageView->OnLButtonUp(pt, modifier); |
| 121 } |
| 122 |
| 123 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, |
| 124 FPDF_PAGE page, |
| 125 int nKeyCode, |
| 126 int modifier) { |
| 127 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); |
| 128 if (!pPageView) |
| 129 return FALSE; |
| 130 |
| 131 return pPageView->OnKeyDown(nKeyCode, modifier); |
| 132 } |
| 133 |
| 134 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, |
| 135 FPDF_PAGE page, |
| 136 int nKeyCode, |
| 137 int modifier) { |
| 138 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); |
| 139 if (!pPageView) |
| 140 return FALSE; |
| 141 |
| 142 return pPageView->OnKeyUp(nKeyCode, modifier); |
| 143 } |
| 144 |
| 145 DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, |
| 146 FPDF_PAGE page, |
| 147 int nChar, |
| 148 int modifier) { |
| 149 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); |
| 150 if (!pPageView) |
| 151 return FALSE; |
| 152 |
| 153 return pPageView->OnChar(nChar, modifier); |
| 154 } |
| 155 |
| 156 DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle) { |
| 157 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); |
| 158 if (!pSDKDoc) |
| 159 return FALSE; |
| 160 |
| 161 return pSDKDoc->KillFocusAnnot(0); |
| 162 } |
| 163 |
| 164 DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, |
| 165 FPDF_BITMAP bitmap, |
| 166 FPDF_PAGE page, |
| 167 int start_x, |
| 168 int start_y, |
| 169 int size_x, |
| 170 int size_y, |
| 171 int rotate, |
| 172 int flags) { |
| 173 if (!hHandle || !page) |
| 174 return; |
| 175 |
| 176 CPDF_Page* pPage = (CPDF_Page*)page; |
| 177 CPDF_RenderOptions options; |
| 178 if (flags & FPDF_LCD_TEXT) |
| 179 options.m_Flags |= RENDER_CLEARTYPE; |
| 180 else |
| 181 options.m_Flags &= ~RENDER_CLEARTYPE; |
| 182 |
| 183 // Grayscale output |
| 184 if (flags & FPDF_GRAYSCALE) { |
| 185 options.m_ColorMode = RENDER_COLOR_GRAY; |
| 186 options.m_ForeColor = 0; |
| 187 options.m_BackColor = 0xffffff; |
| 188 } |
| 189 |
| 190 options.m_AddFlags = flags >> 8; |
| 191 options.m_pOCContext = new CPDF_OCContext(pPage->m_pDocument); |
| 192 |
| 193 CFX_AffineMatrix matrix; |
| 194 pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); |
| 195 |
| 196 FX_RECT clip; |
| 197 clip.left = start_x; |
| 198 clip.right = start_x + size_x; |
| 199 clip.top = start_y; |
| 200 clip.bottom = start_y + size_y; |
| 201 |
| 202 #ifdef _SKIA_SUPPORT_ |
| 203 nonstd::unique_ptr<CFX_SkiaDevice> pDevice(new CFX_SkiaDevice); |
| 204 #else |
| 205 nonstd::unique_ptr<CFX_FxgeDevice> pDevice(new CFX_FxgeDevice); |
| 206 #endif |
| 207 pDevice->Attach((CFX_DIBitmap*)bitmap); |
| 208 pDevice->SaveState(); |
| 209 pDevice->SetClip_Rect(&clip); |
| 210 |
| 211 if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, pPage)) |
| 212 pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options); |
| 213 |
| 214 pDevice->RestoreState(); |
| 215 delete options.m_pOCContext; |
| 216 } |
| 217 |
| 218 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle, |
| 219 int fieldType, |
| 220 unsigned long color) { |
| 221 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) |
| 222 pInterForm->SetHighlightColor(color, fieldType); |
| 223 } |
| 224 |
| 225 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle, |
| 226 unsigned char alpha) { |
| 227 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) |
| 228 pInterForm->SetHighlightAlpha(alpha); |
| 229 } |
| 230 |
| 231 DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle) { |
| 232 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) |
| 233 pInterForm->RemoveAllHighLight(); |
| 234 } |
| 235 |
| 236 DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, |
| 237 FPDF_FORMHANDLE hHandle) { |
| 238 if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page)) |
| 239 pPageView->SetValid(TRUE); |
| 240 } |
| 241 |
| 242 DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, |
| 243 FPDF_FORMHANDLE hHandle) { |
| 244 if (!hHandle || !page) |
| 245 return; |
| 246 |
| 247 CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(); |
| 248 if (!pSDKDoc) |
| 249 return; |
| 250 |
| 251 CPDF_Page* pPage = (CPDF_Page*)page; |
| 252 CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE); |
| 253 if (pPageView) { |
| 254 pPageView->SetValid(FALSE); |
| 255 // ReMovePageView() takes care of the delete for us. |
| 256 pSDKDoc->ReMovePageView(pPage); |
| 257 } |
| 258 } |
| 259 |
| 260 DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle) { |
| 261 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); |
| 262 if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) |
| 263 pSDKDoc->ProcJavascriptFun(); |
| 264 } |
| 265 |
| 266 DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle) { |
| 267 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); |
| 268 if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) |
| 269 pSDKDoc->ProcOpenAction(); |
| 270 } |
| 271 |
| 272 DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, |
| 273 int aaType) { |
| 274 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); |
| 275 if (!pSDKDoc) |
| 276 return; |
| 277 |
| 278 CPDF_Document* pDoc = pSDKDoc->GetDocument(); |
| 279 CPDF_Dictionary* pDic = pDoc->GetRoot(); |
| 280 if (!pDic) |
| 281 return; |
| 282 |
| 283 CPDF_AAction aa = pDic->GetDict(FX_BSTRC("AA")); |
| 284 if (aa.ActionExist((CPDF_AAction::AActionType)aaType)) { |
| 285 CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType); |
| 286 CPDFSDK_ActionHandler* pActionHandler = |
| 287 ((CPDFDoc_Environment*)hHandle)->GetActionHander(); |
| 288 ASSERT(pActionHandler != NULL); |
| 289 pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaType, |
| 290 pSDKDoc); |
| 291 } |
| 292 } |
| 293 |
| 294 DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, |
| 295 FPDF_FORMHANDLE hHandle, |
| 296 int aaType) { |
| 297 if (!hHandle || !page) |
| 298 return; |
| 299 CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(); |
| 300 CPDF_Page* pPage = (CPDF_Page*)page; |
| 301 CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE); |
| 302 if (pPageView) { |
| 303 CPDFDoc_Environment* pEnv = pSDKDoc->GetEnv(); |
| 304 ASSERT(pEnv != NULL); |
| 305 |
| 306 CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander(); |
| 307 ASSERT(pActionHandler != NULL); |
| 308 |
| 309 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; |
| 310 ASSERT(pPageDict != NULL); |
| 311 |
| 312 CPDF_AAction aa = pPageDict->GetDict(FX_BSTRC("AA")); |
| 313 |
| 314 FX_BOOL bExistOAAction = FALSE; |
| 315 FX_BOOL bExistCAAction = FALSE; |
| 316 if (FPDFPAGE_AACTION_OPEN == aaType) { |
| 317 bExistOAAction = aa.ActionExist(CPDF_AAction::OpenPage); |
| 318 if (bExistOAAction) { |
| 319 CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage); |
| 320 pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pSDKDoc); |
| 321 } |
| 322 } else { |
| 323 bExistCAAction = aa.ActionExist(CPDF_AAction::ClosePage); |
| 324 if (bExistCAAction) { |
| 325 CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage); |
| 326 pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, pSDKDoc); |
| 327 } |
| 82 } | 328 } |
| 83 delete pEnv; | 329 } |
| 84 } | 330 } |
| 85 | |
| 86 DLLEXPORT FPDF_BOOL STDCALL FORM_OnMouseMove(FPDF_FORMHANDLE hHandle, FPDF_PAGE
page, int modifier, double page_x, double page_y) | |
| 87 { | |
| 88 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
| 89 if (!pPageView) | |
| 90 return FALSE; | |
| 91 | |
| 92 CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
| 93 return pPageView->OnMouseMove(pt, modifier); | |
| 94 } | |
| 95 | |
| 96 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonDown(FPDF_FORMHANDLE hHandle, FPDF_PAG
E page, int modifier, double page_x, double page_y) | |
| 97 { | |
| 98 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
| 99 if (!pPageView) | |
| 100 return FALSE; | |
| 101 | |
| 102 CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
| 103 return pPageView->OnLButtonDown(pt, modifier); | |
| 104 } | |
| 105 | |
| 106 DLLEXPORT FPDF_BOOL STDCALL FORM_OnLButtonUp(FPDF_FORMHANDLE hHandle, FPDF_PAGE
page, int modifier, double page_x, double page_y) | |
| 107 { | |
| 108 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
| 109 if (!pPageView) | |
| 110 return FALSE; | |
| 111 | |
| 112 CPDF_Point pt((FX_FLOAT)page_x, (FX_FLOAT)page_y); | |
| 113 return pPageView->OnLButtonUp(pt, modifier); | |
| 114 } | |
| 115 | |
| 116 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyDown(FPDF_FORMHANDLE hHandle, FPDF_PAGE pa
ge, int nKeyCode, int modifier) | |
| 117 { | |
| 118 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
| 119 if (!pPageView) | |
| 120 return FALSE; | |
| 121 | |
| 122 return pPageView->OnKeyDown(nKeyCode, modifier); | |
| 123 } | |
| 124 | |
| 125 DLLEXPORT FPDF_BOOL STDCALL FORM_OnKeyUp(FPDF_FORMHANDLE hHandle, FPDF_PAGE page
, int nKeyCode, int modifier) | |
| 126 { | |
| 127 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
| 128 if (!pPageView) | |
| 129 return FALSE; | |
| 130 | |
| 131 return pPageView->OnKeyUp(nKeyCode, modifier); | |
| 132 } | |
| 133 | |
| 134 DLLEXPORT FPDF_BOOL STDCALL FORM_OnChar(FPDF_FORMHANDLE hHandle, FPDF_PAGE page,
int nChar, int modifier) | |
| 135 { | |
| 136 CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page); | |
| 137 if (!pPageView) | |
| 138 return FALSE; | |
| 139 | |
| 140 return pPageView->OnChar(nChar, modifier); | |
| 141 } | |
| 142 | |
| 143 DLLEXPORT FPDF_BOOL STDCALL FORM_ForceToKillFocus(FPDF_FORMHANDLE hHandle) | |
| 144 { | |
| 145 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); | |
| 146 if (!pSDKDoc) | |
| 147 return FALSE; | |
| 148 | |
| 149 return pSDKDoc->KillFocusAnnot(0); | |
| 150 } | |
| 151 | |
| 152 DLLEXPORT void STDCALL FPDF_FFLDraw(FPDF_FORMHANDLE hHandle, FPDF_BITMAP bitmap,
FPDF_PAGE page, | |
| 153 int start_x, int start_y, int size_x, int si
ze_y, int rotate, int flags) | |
| 154 { | |
| 155 if (!hHandle || !page) | |
| 156 return; | |
| 157 | |
| 158 CPDF_Page* pPage = (CPDF_Page*)page; | |
| 159 CPDF_RenderOptions options; | |
| 160 if (flags & FPDF_LCD_TEXT) | |
| 161 options.m_Flags |= RENDER_CLEARTYPE; | |
| 162 else | |
| 163 options.m_Flags &= ~RENDER_CLEARTYPE; | |
| 164 | |
| 165 //Grayscale output | |
| 166 if (flags & FPDF_GRAYSCALE) | |
| 167 { | |
| 168 options.m_ColorMode = RENDER_COLOR_GRAY; | |
| 169 options.m_ForeColor = 0; | |
| 170 options.m_BackColor = 0xffffff; | |
| 171 } | |
| 172 | |
| 173 options.m_AddFlags = flags >> 8; | |
| 174 options.m_pOCContext = new CPDF_OCContext(pPage->m_pDocument); | |
| 175 | |
| 176 CFX_AffineMatrix matrix; | |
| 177 pPage->GetDisplayMatrix(matrix, start_x, start_y, size_x, size_y, rotate); | |
| 178 | |
| 179 FX_RECT clip; | |
| 180 clip.left = start_x; | |
| 181 clip.right = start_x + size_x; | |
| 182 clip.top = start_y; | |
| 183 clip.bottom = start_y + size_y; | |
| 184 | |
| 185 #ifdef _SKIA_SUPPORT_ | |
| 186 nonstd::unique_ptr<CFX_SkiaDevice> pDevice(new CFX_SkiaDevice); | |
| 187 #else | |
| 188 nonstd::unique_ptr<CFX_FxgeDevice> pDevice(new CFX_FxgeDevice); | |
| 189 #endif | |
| 190 pDevice->Attach((CFX_DIBitmap*)bitmap); | |
| 191 pDevice->SaveState(); | |
| 192 pDevice->SetClip_Rect(&clip); | |
| 193 | |
| 194 if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, pPage)) | |
| 195 pPageView->PageView_OnDraw(pDevice.get(), &matrix, &options); | |
| 196 | |
| 197 pDevice->RestoreState(); | |
| 198 delete options.m_pOCContext; | |
| 199 } | |
| 200 | |
| 201 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightColor(FPDF_FORMHANDLE hHandle,
int fieldType, unsigned long color) | |
| 202 { | |
| 203 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) | |
| 204 pInterForm->SetHighlightColor(color, fieldType); | |
| 205 } | |
| 206 | |
| 207 DLLEXPORT void STDCALL FPDF_SetFormFieldHighlightAlpha(FPDF_FORMHANDLE hHandle,
unsigned char alpha) | |
| 208 { | |
| 209 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) | |
| 210 pInterForm->SetHighlightAlpha(alpha); | |
| 211 } | |
| 212 | |
| 213 DLLEXPORT void STDCALL FPDF_RemoveFormFieldHighlight(FPDF_FORMHANDLE hHandle) | |
| 214 { | |
| 215 if (CPDFSDK_InterForm* pInterForm = FormHandleToInterForm(hHandle)) | |
| 216 pInterForm->RemoveAllHighLight(); | |
| 217 } | |
| 218 | |
| 219 DLLEXPORT void STDCALL FORM_OnAfterLoadPage(FPDF_PAGE page, FPDF_FORMHANDLE hHan
dle) | |
| 220 { | |
| 221 if (CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page)) | |
| 222 pPageView->SetValid(TRUE); | |
| 223 } | |
| 224 | |
| 225 DLLEXPORT void STDCALL FORM_OnBeforeClosePage(FPDF_PAGE page, FPDF_FORMHANDLE hH
andle) | |
| 226 { | |
| 227 if (!hHandle || !page) | |
| 228 return; | |
| 229 | |
| 230 CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(
); | |
| 231 if (!pSDKDoc) | |
| 232 return; | |
| 233 | |
| 234 CPDF_Page* pPage = (CPDF_Page*)page; | |
| 235 CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE); | |
| 236 if (pPageView) | |
| 237 { | |
| 238 pPageView->SetValid(FALSE); | |
| 239 // ReMovePageView() takes care of the delete for us. | |
| 240 pSDKDoc->ReMovePageView(pPage); | |
| 241 } | |
| 242 } | |
| 243 | |
| 244 DLLEXPORT void STDCALL FORM_DoDocumentJSAction(FPDF_FORMHANDLE hHandle) | |
| 245 { | |
| 246 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); | |
| 247 if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) | |
| 248 pSDKDoc->ProcJavascriptFun(); | |
| 249 } | |
| 250 | |
| 251 DLLEXPORT void STDCALL FORM_DoDocumentOpenAction(FPDF_FORMHANDLE hHandle) | |
| 252 { | |
| 253 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); | |
| 254 if (pSDKDoc && ((CPDFDoc_Environment*)hHandle)->IsJSInitiated()) | |
| 255 pSDKDoc->ProcOpenAction(); | |
| 256 } | |
| 257 | |
| 258 DLLEXPORT void STDCALL FORM_DoDocumentAAction(FPDF_FORMHANDLE hHandle, int aaTyp
e) | |
| 259 { | |
| 260 CPDFSDK_Document* pSDKDoc = FormHandleToSDKDoc(hHandle); | |
| 261 if (!pSDKDoc) | |
| 262 return; | |
| 263 | |
| 264 CPDF_Document* pDoc = pSDKDoc->GetDocument(); | |
| 265 CPDF_Dictionary* pDic = pDoc->GetRoot(); | |
| 266 if (!pDic) | |
| 267 return; | |
| 268 | |
| 269 CPDF_AAction aa = pDic->GetDict(FX_BSTRC("AA")); | |
| 270 if (aa.ActionExist((CPDF_AAction::AActionType)aaType)) | |
| 271 { | |
| 272 CPDF_Action action = aa.GetAction((CPDF_AAction::AActionType)aaType); | |
| 273 CPDFSDK_ActionHandler *pActionHandler = ((CPDFDoc_Environment*)hHandle)-
>GetActionHander(); | |
| 274 ASSERT(pActionHandler != NULL); | |
| 275 pActionHandler->DoAction_Document(action, (CPDF_AAction::AActionType)aaT
ype, pSDKDoc); | |
| 276 } | |
| 277 } | |
| 278 | |
| 279 DLLEXPORT void STDCALL FORM_DoPageAAction(FPDF_PAGE page, FPDF_FORMHANDLE hHandl
e, int aaType) | |
| 280 { | |
| 281 if(!hHandle || !page) | |
| 282 return; | |
| 283 CPDFSDK_Document* pSDKDoc = ((CPDFDoc_Environment*)hHandle)->GetSDKDocument(
); | |
| 284 CPDF_Page* pPage = (CPDF_Page*)page; | |
| 285 CPDFSDK_PageView* pPageView = pSDKDoc->GetPageView(pPage, FALSE); | |
| 286 if(pPageView) | |
| 287 { | |
| 288 CPDFDoc_Environment *pEnv = pSDKDoc->GetEnv(); | |
| 289 ASSERT(pEnv != NULL); | |
| 290 | |
| 291 CPDFSDK_ActionHandler *pActionHandler = pEnv->GetActionHander(); | |
| 292 ASSERT(pActionHandler != NULL); | |
| 293 | |
| 294 CPDF_Dictionary *pPageDict = pPage->m_pFormDict; | |
| 295 ASSERT(pPageDict != NULL); | |
| 296 | |
| 297 CPDF_AAction aa = pPageDict->GetDict(FX_BSTRC("AA")); | |
| 298 | |
| 299 FX_BOOL bExistOAAction = FALSE; | |
| 300 FX_BOOL bExistCAAction = FALSE; | |
| 301 if (FPDFPAGE_AACTION_OPEN == aaType) | |
| 302 { | |
| 303 bExistOAAction = aa.ActionExist(CPDF_AAction::OpenPage); | |
| 304 if (bExistOAAction) | |
| 305 { | |
| 306 CPDF_Action action = aa.GetAction(CPDF_AAction::OpenPage); | |
| 307 pActionHandler->DoAction_Page(action, CPDF_AAction::OpenPage, pS
DKDoc); | |
| 308 } | |
| 309 } | |
| 310 else | |
| 311 { | |
| 312 bExistCAAction = aa.ActionExist(CPDF_AAction::ClosePage); | |
| 313 if (bExistCAAction) | |
| 314 { | |
| 315 CPDF_Action action = aa.GetAction(CPDF_AAction::ClosePage); | |
| 316 pActionHandler->DoAction_Page(action, CPDF_AAction::ClosePage, p
SDKDoc); | |
| 317 } | |
| 318 } | |
| 319 } | |
| 320 } | |
| OLD | NEW |