From 2736276deff3abef9d6b226eb9f585abe1384591 Mon Sep 17 00:00:00 2001 From: jaepark Date: Thu, 11 Aug 2016 13:10:39 -0700 Subject: Move CPDFSDK_Annot, CPDFSDK_BAAnnot and CPDFSDK_DateTime to their own files. Review-Url: https://codereview.chromium.org/2236743002 --- BUILD.gn | 8 +- fpdfsdk/cpdfsdk_annot.cpp | 105 +++++ fpdfsdk/cpdfsdk_baannot.cpp | 404 +++++++++++++++++ fpdfsdk/cpdfsdk_datetime.cpp | 405 +++++++++++++++++ fpdfsdk/formfiller/cba_fontmap.cpp | 2 +- fpdfsdk/fsdk_annothandler.cpp | 1 + fpdfsdk/fsdk_baseannot.cpp | 907 ------------------------------------- fpdfsdk/fsdk_baseform.cpp | 2 +- fpdfsdk/include/cpdfsdk_annot.h | 68 +++ fpdfsdk/include/cpdfsdk_baannot.h | 104 +++++ fpdfsdk/include/cpdfsdk_datetime.h | 52 +++ fpdfsdk/include/fsdk_baseannot.h | 191 -------- fpdfsdk/include/fsdk_baseform.h | 3 +- fpdfsdk/include/fsdk_mgr.h | 2 +- pdfium.gyp | 8 +- 15 files changed, 1156 insertions(+), 1106 deletions(-) create mode 100644 fpdfsdk/cpdfsdk_annot.cpp create mode 100644 fpdfsdk/cpdfsdk_baannot.cpp create mode 100644 fpdfsdk/cpdfsdk_datetime.cpp delete mode 100644 fpdfsdk/fsdk_baseannot.cpp create mode 100644 fpdfsdk/include/cpdfsdk_annot.h create mode 100644 fpdfsdk/include/cpdfsdk_baannot.h create mode 100644 fpdfsdk/include/cpdfsdk_datetime.h delete mode 100644 fpdfsdk/include/fsdk_baseannot.h diff --git a/BUILD.gn b/BUILD.gn index d128719462..8d9dd8167e 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -64,6 +64,9 @@ static_library("pdfium") { sources = [ "fpdfsdk/cfx_systemhandler.cpp", "fpdfsdk/cfx_systemhandler.h", + "fpdfsdk/cpdfsdk_annot.cpp", + "fpdfsdk/cpdfsdk_baannot.cpp", + "fpdfsdk/cpdfsdk_datetime.cpp", "fpdfsdk/fpdf_dataavail.cpp", "fpdfsdk/fpdf_ext.cpp", "fpdfsdk/fpdf_flatten.cpp", @@ -81,13 +84,14 @@ static_library("pdfium") { "fpdfsdk/fpdfview.cpp", "fpdfsdk/fsdk_actionhandler.cpp", "fpdfsdk/fsdk_annothandler.cpp", - "fpdfsdk/fsdk_baseannot.cpp", "fpdfsdk/fsdk_baseform.cpp", "fpdfsdk/fsdk_mgr.cpp", "fpdfsdk/fsdk_pauseadapter.cpp", + "fpdfsdk/include/cpdfsdk_annot.h", + "fpdfsdk/include/cpdfsdk_baannot.h", + "fpdfsdk/include/cpdfsdk_datetime.h", "fpdfsdk/include/fsdk_actionhandler.h", "fpdfsdk/include/fsdk_annothandler.h", - "fpdfsdk/include/fsdk_baseannot.h", "fpdfsdk/include/fsdk_baseform.h", "fpdfsdk/include/fsdk_pauseadapter.h", "public/fpdf_dataavail.h", diff --git a/fpdfsdk/cpdfsdk_annot.cpp b/fpdfsdk/cpdfsdk_annot.cpp new file mode 100644 index 0000000000..e0abe6f54e --- /dev/null +++ b/fpdfsdk/cpdfsdk_annot.cpp @@ -0,0 +1,105 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/include/cpdfsdk_annot.h" + +#include + +#include "fpdfsdk/include/fsdk_mgr.h" + +#ifdef PDF_ENABLE_XFA +#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h" +#endif // PDF_ENABLE_XFA + +namespace { + +const float kMinWidth = 1.0f; +const float kMinHeight = 1.0f; + +} // namespace + +CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView) + : m_pPageView(pPageView), m_bSelected(FALSE), m_nTabOrder(-1) {} + +CPDFSDK_Annot::~CPDFSDK_Annot() {} + +#ifdef PDF_ENABLE_XFA + +FX_BOOL CPDFSDK_Annot::IsXFAField() { + return FALSE; +} + +CXFA_FFWidget* CPDFSDK_Annot::GetXFAWidget() const { + return nullptr; +} + +CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage() { + return m_pPageView ? m_pPageView->GetPDFXFAPage() : nullptr; +} + +#endif // PDF_ENABLE_XFA + +FX_FLOAT CPDFSDK_Annot::GetMinWidth() const { + return kMinWidth; +} + +FX_FLOAT CPDFSDK_Annot::GetMinHeight() const { + return kMinHeight; +} + +int CPDFSDK_Annot::GetLayoutOrder() const { + return 5; +} + +CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot() const { + return nullptr; +} + +CFX_ByteString CPDFSDK_Annot::GetType() const { + return ""; +} + +CFX_ByteString CPDFSDK_Annot::GetSubType() const { + return ""; +} + +void CPDFSDK_Annot::SetRect(const CFX_FloatRect& rect) {} + +CFX_FloatRect CPDFSDK_Annot::GetRect() const { + return CFX_FloatRect(); +} + +void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions) {} + +FX_BOOL CPDFSDK_Annot::IsSelected() { + return m_bSelected; +} + +void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected) { + m_bSelected = bSelected; +} + +int CPDFSDK_Annot::GetTabOrder() { + return m_nTabOrder; +} + +void CPDFSDK_Annot::SetTabOrder(int iTabOrder) { + m_nTabOrder = iTabOrder; +} + +UnderlyingPageType* CPDFSDK_Annot::GetUnderlyingPage() { +#ifdef PDF_ENABLE_XFA + return GetPDFXFAPage(); +#else // PDF_ENABLE_XFA + return GetPDFPage(); +#endif // PDF_ENABLE_XFA +} + +CPDF_Page* CPDFSDK_Annot::GetPDFPage() { + return m_pPageView ? m_pPageView->GetPDFPage() : nullptr; +} diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp new file mode 100644 index 0000000000..6a4ba86d94 --- /dev/null +++ b/fpdfsdk/cpdfsdk_baannot.cpp @@ -0,0 +1,404 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/include/cpdfsdk_baannot.h" + +#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" +#include "core/fpdfapi/fpdf_parser/include/cpdf_number.h" +#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" +#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" +#include "fpdfsdk/include/cpdfsdk_datetime.h" +#include "fpdfsdk/include/fsdk_mgr.h" + +CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, + CPDFSDK_PageView* pPageView) + : CPDFSDK_Annot(pPageView), m_pAnnot(pAnnot) {} + +CPDFSDK_BAAnnot::~CPDFSDK_BAAnnot() {} + +CPDF_Annot* CPDFSDK_BAAnnot::GetPDFAnnot() const { + return m_pAnnot; +} + +CPDF_Dictionary* CPDFSDK_BAAnnot::GetAnnotDict() const { + return m_pAnnot->GetAnnotDict(); +} + +void CPDFSDK_BAAnnot::SetRect(const CFX_FloatRect& rect) { + ASSERT(rect.right - rect.left >= GetMinWidth()); + ASSERT(rect.top - rect.bottom >= GetMinHeight()); + + m_pAnnot->GetAnnotDict()->SetAtRect("Rect", rect); +} + +CFX_FloatRect CPDFSDK_BAAnnot::GetRect() const { + CFX_FloatRect rect; + m_pAnnot->GetRect(rect); + return rect; +} + +CFX_ByteString CPDFSDK_BAAnnot::GetType() const { + return m_pAnnot->GetSubType(); +} + +CFX_ByteString CPDFSDK_BAAnnot::GetSubType() const { + return ""; +} + +void CPDFSDK_BAAnnot::DrawAppearance(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions) { + m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, + mode, pOptions); +} + +FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid() { + return !!m_pAnnot->GetAnnotDict()->GetDictBy("AP"); +} + +FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode) { + CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); + if (!pAP) + return FALSE; + + // Choose the right sub-ap + const FX_CHAR* ap_entry = "N"; + if (mode == CPDF_Annot::Down) + ap_entry = "D"; + else if (mode == CPDF_Annot::Rollover) + ap_entry = "R"; + if (!pAP->KeyExist(ap_entry)) + ap_entry = "N"; + + // Get the AP stream or subdirectory + CPDF_Object* psub = pAP->GetDirectObjectBy(ap_entry); + return !!psub; +} + +void CPDFSDK_BAAnnot::DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions) { + m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions); +} + +void CPDFSDK_BAAnnot::ClearCachedAP() { + m_pAnnot->ClearCachedAP(); +} + +void CPDFSDK_BAAnnot::SetContents(const CFX_WideString& sContents) { + if (sContents.IsEmpty()) + m_pAnnot->GetAnnotDict()->RemoveAt("Contents"); + else + m_pAnnot->GetAnnotDict()->SetAtString("Contents", + PDF_EncodeText(sContents)); +} + +CFX_WideString CPDFSDK_BAAnnot::GetContents() const { + return m_pAnnot->GetAnnotDict()->GetUnicodeTextBy("Contents"); +} + +void CPDFSDK_BAAnnot::SetAnnotName(const CFX_WideString& sName) { + if (sName.IsEmpty()) + m_pAnnot->GetAnnotDict()->RemoveAt("NM"); + else + m_pAnnot->GetAnnotDict()->SetAtString("NM", PDF_EncodeText(sName)); +} + +CFX_WideString CPDFSDK_BAAnnot::GetAnnotName() const { + return m_pAnnot->GetAnnotDict()->GetUnicodeTextBy("NM"); +} + +void CPDFSDK_BAAnnot::SetModifiedDate(const FX_SYSTEMTIME& st) { + CPDFSDK_DateTime dt(st); + CFX_ByteString str = dt.ToPDFDateTimeString(); + + if (str.IsEmpty()) + m_pAnnot->GetAnnotDict()->RemoveAt("M"); + else + m_pAnnot->GetAnnotDict()->SetAtString("M", str); +} + +FX_SYSTEMTIME CPDFSDK_BAAnnot::GetModifiedDate() const { + FX_SYSTEMTIME systime; + CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetStringBy("M"); + + CPDFSDK_DateTime dt(str); + dt.ToSystemTime(systime); + + return systime; +} + +void CPDFSDK_BAAnnot::SetFlags(uint32_t nFlags) { + m_pAnnot->GetAnnotDict()->SetAtInteger("F", nFlags); +} + +uint32_t CPDFSDK_BAAnnot::GetFlags() const { + return m_pAnnot->GetAnnotDict()->GetIntegerBy("F"); +} + +void CPDFSDK_BAAnnot::SetAppState(const CFX_ByteString& str) { + if (str.IsEmpty()) + m_pAnnot->GetAnnotDict()->RemoveAt("AS"); + else + m_pAnnot->GetAnnotDict()->SetAtString("AS", str); +} + +CFX_ByteString CPDFSDK_BAAnnot::GetAppState() const { + return m_pAnnot->GetAnnotDict()->GetStringBy("AS"); +} + +void CPDFSDK_BAAnnot::SetStructParent(int key) { + m_pAnnot->GetAnnotDict()->SetAtInteger("StructParent", key); +} + +int CPDFSDK_BAAnnot::GetStructParent() const { + return m_pAnnot->GetAnnotDict()->GetIntegerBy("StructParent"); +} + +// border +void CPDFSDK_BAAnnot::SetBorderWidth(int nWidth) { + CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); + + if (pBorder) { + pBorder->SetAt(2, new CPDF_Number(nWidth)); + } else { + CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); + + if (!pBSDict) { + pBSDict = new CPDF_Dictionary; + m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); + } + + pBSDict->SetAtInteger("W", nWidth); + } +} + +int CPDFSDK_BAAnnot::GetBorderWidth() const { + if (CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border")) { + return pBorder->GetIntegerAt(2); + } + if (CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS")) { + return pBSDict->GetIntegerBy("W", 1); + } + return 1; +} + +void CPDFSDK_BAAnnot::SetBorderStyle(BorderStyle nStyle) { + CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); + if (!pBSDict) { + pBSDict = new CPDF_Dictionary; + m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); + } + + switch (nStyle) { + case BorderStyle::SOLID: + pBSDict->SetAtName("S", "S"); + break; + case BorderStyle::DASH: + pBSDict->SetAtName("S", "D"); + break; + case BorderStyle::BEVELED: + pBSDict->SetAtName("S", "B"); + break; + case BorderStyle::INSET: + pBSDict->SetAtName("S", "I"); + break; + case BorderStyle::UNDERLINE: + pBSDict->SetAtName("S", "U"); + break; + default: + break; + } +} + +BorderStyle CPDFSDK_BAAnnot::GetBorderStyle() const { + CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); + if (pBSDict) { + CFX_ByteString sBorderStyle = pBSDict->GetStringBy("S", "S"); + if (sBorderStyle == "S") + return BorderStyle::SOLID; + if (sBorderStyle == "D") + return BorderStyle::DASH; + if (sBorderStyle == "B") + return BorderStyle::BEVELED; + if (sBorderStyle == "I") + return BorderStyle::INSET; + if (sBorderStyle == "U") + return BorderStyle::UNDERLINE; + } + + CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); + if (pBorder) { + if (pBorder->GetCount() >= 4) { + CPDF_Array* pDP = pBorder->GetArrayAt(3); + if (pDP && pDP->GetCount() > 0) + return BorderStyle::DASH; + } + } + + return BorderStyle::SOLID; +} + +void CPDFSDK_BAAnnot::SetColor(FX_COLORREF color) { + CPDF_Array* pArray = new CPDF_Array; + pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f); + pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f); + pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f); + m_pAnnot->GetAnnotDict()->SetAt("C", pArray); +} + +void CPDFSDK_BAAnnot::RemoveColor() { + m_pAnnot->GetAnnotDict()->RemoveAt("C"); +} + +FX_BOOL CPDFSDK_BAAnnot::GetColor(FX_COLORREF& color) const { + if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArrayBy("C")) { + size_t nCount = pEntry->GetCount(); + if (nCount == 1) { + FX_FLOAT g = pEntry->GetNumberAt(0) * 255; + + color = FXSYS_RGB((int)g, (int)g, (int)g); + + return TRUE; + } else if (nCount == 3) { + FX_FLOAT r = pEntry->GetNumberAt(0) * 255; + FX_FLOAT g = pEntry->GetNumberAt(1) * 255; + FX_FLOAT b = pEntry->GetNumberAt(2) * 255; + + color = FXSYS_RGB((int)r, (int)g, (int)b); + + return TRUE; + } else if (nCount == 4) { + FX_FLOAT c = pEntry->GetNumberAt(0); + FX_FLOAT m = pEntry->GetNumberAt(1); + FX_FLOAT y = pEntry->GetNumberAt(2); + FX_FLOAT k = pEntry->GetNumberAt(3); + + FX_FLOAT r = 1.0f - std::min(1.0f, c + k); + FX_FLOAT g = 1.0f - std::min(1.0f, m + k); + FX_FLOAT b = 1.0f - std::min(1.0f, y + k); + + color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255)); + + return TRUE; + } + } + + return FALSE; +} + +void CPDFSDK_BAAnnot::WriteAppearance(const CFX_ByteString& sAPType, + const CFX_FloatRect& rcBBox, + const CFX_Matrix& matrix, + const CFX_ByteString& sContents, + const CFX_ByteString& sAPState) { + CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); + + if (!pAPDict) { + pAPDict = new CPDF_Dictionary; + m_pAnnot->GetAnnotDict()->SetAt("AP", pAPDict); + } + + CPDF_Stream* pStream = nullptr; + CPDF_Dictionary* pParentDict = nullptr; + + if (sAPState.IsEmpty()) { + pParentDict = pAPDict; + pStream = pAPDict->GetStreamBy(sAPType); + } else { + CPDF_Dictionary* pAPTypeDict = pAPDict->GetDictBy(sAPType); + if (!pAPTypeDict) { + pAPTypeDict = new CPDF_Dictionary; + pAPDict->SetAt(sAPType, pAPTypeDict); + } + pParentDict = pAPTypeDict; + pStream = pAPTypeDict->GetStreamBy(sAPState); + } + + if (!pStream) { + pStream = new CPDF_Stream(nullptr, 0, nullptr); + CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); + int32_t objnum = pDoc->AddIndirectObject(pStream); + pParentDict->SetAtReference(sAPType, pDoc, objnum); + } + + CPDF_Dictionary* pStreamDict = pStream->GetDict(); + if (!pStreamDict) { + pStreamDict = new CPDF_Dictionary; + pStreamDict->SetAtName("Type", "XObject"); + pStreamDict->SetAtName("Subtype", "Form"); + pStreamDict->SetAtInteger("FormType", 1); + pStream->InitStream(nullptr, 0, pStreamDict); + } + + if (pStreamDict) { + pStreamDict->SetAtMatrix("Matrix", matrix); + pStreamDict->SetAtRect("BBox", rcBBox); + } + + pStream->SetData((uint8_t*)sContents.c_str(), sContents.GetLength(), FALSE, + FALSE); +} + +FX_BOOL CPDFSDK_BAAnnot::IsVisible() const { + uint32_t nFlags = GetFlags(); + return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || + (nFlags & ANNOTFLAG_NOVIEW)); +} + +CPDF_Action CPDFSDK_BAAnnot::GetAction() const { + return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDictBy("A")); +} + +void CPDFSDK_BAAnnot::SetAction(const CPDF_Action& action) { + ASSERT(action.GetDict()); + if (action.GetDict() != m_pAnnot->GetAnnotDict()->GetDictBy("A")) { + CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); + CPDF_Dictionary* pDict = action.GetDict(); + if (pDict && pDict->GetObjNum() == 0) { + pDoc->AddIndirectObject(pDict); + } + m_pAnnot->GetAnnotDict()->SetAtReference("A", pDoc, pDict->GetObjNum()); + } +} + +void CPDFSDK_BAAnnot::RemoveAction() { + m_pAnnot->GetAnnotDict()->RemoveAt("A"); +} + +CPDF_AAction CPDFSDK_BAAnnot::GetAAction() const { + return CPDF_AAction(m_pAnnot->GetAnnotDict()->GetDictBy("AA")); +} + +void CPDFSDK_BAAnnot::SetAAction(const CPDF_AAction& aa) { + if (aa.GetDict() != m_pAnnot->GetAnnotDict()->GetDictBy("AA")) + m_pAnnot->GetAnnotDict()->SetAt("AA", aa.GetDict()); +} + +void CPDFSDK_BAAnnot::RemoveAAction() { + m_pAnnot->GetAnnotDict()->RemoveAt("AA"); +} + +CPDF_Action CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT) { + CPDF_AAction AAction = GetAAction(); + + if (AAction.ActionExist(eAAT)) + return AAction.GetAction(eAAT); + + if (eAAT == CPDF_AAction::ButtonUp) + return GetAction(); + + return CPDF_Action(); +} + +void CPDFSDK_BAAnnot::Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions) { + m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal); + m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, + CPDF_Annot::Normal, nullptr); +} diff --git a/fpdfsdk/cpdfsdk_datetime.cpp b/fpdfsdk/cpdfsdk_datetime.cpp new file mode 100644 index 0000000000..0dcf6b2055 --- /dev/null +++ b/fpdfsdk/cpdfsdk_datetime.cpp @@ -0,0 +1,405 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "fpdfsdk/include/cpdfsdk_datetime.h" + +#include "core/fxcrt/include/fx_ext.h" + +namespace { + +int GetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) { + return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60); +} + +bool IsLeapYear(int16_t year) { + return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))); +} + +uint16_t GetYearDays(int16_t year) { + return (IsLeapYear(year) ? 366 : 365); +} + +uint8_t GetMonthDays(int16_t year, uint8_t month) { + uint8_t mDays; + switch (month) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + mDays = 31; + break; + + case 4: + case 6: + case 9: + case 11: + mDays = 30; + break; + + case 2: + if (IsLeapYear(year)) + mDays = 29; + else + mDays = 28; + break; + + default: + mDays = 0; + break; + } + + return mDays; +} + +} // namespace + +CPDFSDK_DateTime::CPDFSDK_DateTime() { + ResetDateTime(); +} + +CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) { + ResetDateTime(); + + FromPDFDateTimeString(dtStr); +} + +CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime) { + FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME)); +} + +CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) { + tzset(); + + dt.year = static_cast(st.wYear); + dt.month = static_cast(st.wMonth); + dt.day = static_cast(st.wDay); + dt.hour = static_cast(st.wHour); + dt.minute = static_cast(st.wMinute); + dt.second = static_cast(st.wSecond); +} + +void CPDFSDK_DateTime::ResetDateTime() { + tzset(); + + time_t curTime; + time(&curTime); + struct tm* newtime = localtime(&curTime); + + dt.year = newtime->tm_year + 1900; + dt.month = newtime->tm_mon + 1; + dt.day = newtime->tm_mday; + dt.hour = newtime->tm_hour; + dt.minute = newtime->tm_min; + dt.second = newtime->tm_sec; +} + +bool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& datetime) const { + return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0); +} + +bool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const { + return !(*this == datetime); +} + +time_t CPDFSDK_DateTime::ToTime_t() const { + struct tm newtime; + + newtime.tm_year = dt.year - 1900; + newtime.tm_mon = dt.month - 1; + newtime.tm_mday = dt.day; + newtime.tm_hour = dt.hour; + newtime.tm_min = dt.minute; + newtime.tm_sec = dt.second; + + return mktime(&newtime); +} + +CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString( + const CFX_ByteString& dtStr) { + int strLength = dtStr.GetLength(); + if (strLength <= 0) + return *this; + + int i = 0; + while (i < strLength && !std::isdigit(dtStr[i])) + ++i; + + if (i >= strLength) + return *this; + + int j = 0; + int k = 0; + FX_CHAR ch; + while (i < strLength && j < 4) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.year = static_cast(k); + if (i >= strLength || j < 4) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.month = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.day = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.hour = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.minute = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.second = static_cast(k); + if (i >= strLength || j < 2) + return *this; + + ch = dtStr[i++]; + if (ch != '-' && ch != '+') + return *this; + if (ch == '-') + dt.tzHour = -1; + else + dt.tzHour = 1; + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.tzHour *= static_cast(k); + if (i >= strLength || j < 2) + return *this; + + if (dtStr[i++] != '\'') + return *this; + j = 0; + k = 0; + while (i < strLength && j < 2) { + ch = dtStr[i]; + k = k * 10 + FXSYS_toDecimalDigit(ch); + j++; + if (!std::isdigit(ch)) + break; + i++; + } + dt.tzMinute = static_cast(k); + return *this; +} + +CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() { + CFX_ByteString str1; + str1.Format("%04d-%02u-%02u %02u:%02u:%02u ", dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second); + if (dt.tzHour < 0) + str1 += "-"; + else + str1 += "+"; + CFX_ByteString str2; + str2.Format("%02d:%02u", std::abs(static_cast(dt.tzHour)), dt.tzMinute); + return str1 + str2; +} + +CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() { + CFX_ByteString dtStr; + char tempStr[32]; + memset(tempStr, 0, sizeof(tempStr)); + FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02u%02u%02u%02u%02u", + dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); + dtStr = CFX_ByteString(tempStr); + if (dt.tzHour < 0) + dtStr += CFX_ByteString("-"); + else + dtStr += CFX_ByteString("+"); + memset(tempStr, 0, sizeof(tempStr)); + FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02u'", + std::abs(static_cast(dt.tzHour)), dt.tzMinute); + dtStr += CFX_ByteString(tempStr); + return dtStr; +} + +void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) { + time_t t = this->ToTime_t(); + struct tm* pTime = localtime(&t); + + if (!pTime) + return; + + st.wYear = static_cast(pTime->tm_year) + 1900; + st.wMonth = static_cast(pTime->tm_mon) + 1; + st.wDay = static_cast(pTime->tm_mday); + st.wDayOfWeek = static_cast(pTime->tm_wday); + st.wHour = static_cast(pTime->tm_hour); + st.wMinute = static_cast(pTime->tm_min); + st.wSecond = static_cast(pTime->tm_sec); + st.wMilliseconds = 0; +} + +CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const { + CPDFSDK_DateTime new_dt = *this; + new_dt.AddSeconds( + -GetTimeZoneInSeconds(new_dt.dt.tzHour, new_dt.dt.tzMinute)); + new_dt.dt.tzHour = 0; + new_dt.dt.tzMinute = 0; + return new_dt; +} + +CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) { + if (days == 0) + return *this; + + int16_t y = dt.year; + uint8_t m = dt.month; + uint8_t d = dt.day; + + int ldays = days; + if (ldays > 0) { + int16_t yy = y; + if ((static_cast(m) * 100 + d) > 300) + yy++; + int ydays = GetYearDays(yy); + int mdays; + while (ldays >= ydays) { + y++; + ldays -= ydays; + yy++; + mdays = GetMonthDays(y, m); + if (d > mdays) { + m++; + d -= mdays; + } + ydays = GetYearDays(yy); + } + mdays = GetMonthDays(y, m) - d + 1; + while (ldays >= mdays) { + ldays -= mdays; + m++; + d = 1; + mdays = GetMonthDays(y, m); + } + d += ldays; + } else { + ldays *= -1; + int16_t yy = y; + if ((static_cast(m) * 100 + d) < 300) + yy--; + int ydays = GetYearDays(yy); + while (ldays >= ydays) { + y--; + ldays -= ydays; + yy--; + int mdays = GetMonthDays(y, m); + if (d > mdays) { + m++; + d -= mdays; + } + ydays = GetYearDays(yy); + } + while (ldays >= d) { + ldays -= d; + m--; + d = GetMonthDays(y, m); + } + d -= ldays; + } + + dt.year = y; + dt.month = m; + dt.day = d; + + return *this; +} + +CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) { + if (seconds == 0) + return *this; + + int n; + int days; + + n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds; + if (n < 0) { + days = (n - 86399) / 86400; + n -= days * 86400; + } else { + days = n / 86400; + n %= 86400; + } + dt.hour = static_cast(n / 3600); + dt.hour %= 24; + n %= 3600; + dt.minute = static_cast(n / 60); + dt.second = static_cast(n % 60); + if (days != 0) + AddDays(days); + + return *this; +} diff --git a/fpdfsdk/formfiller/cba_fontmap.cpp b/fpdfsdk/formfiller/cba_fontmap.cpp index 563078dd54..97590d20dd 100644 --- a/fpdfsdk/formfiller/cba_fontmap.cpp +++ b/fpdfsdk/formfiller/cba_fontmap.cpp @@ -13,7 +13,7 @@ #include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" #include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" #include "core/fpdfdoc/include/cpdf_formfield.h" -#include "fpdfsdk/include/fsdk_baseannot.h" +#include "fpdfsdk/include/cpdfsdk_annot.h" CBA_FontMap::CBA_FontMap(CPDFSDK_Annot* pAnnot, CFX_SystemHandler* pSystemHandler) diff --git a/fpdfsdk/fsdk_annothandler.cpp b/fpdfsdk/fsdk_annothandler.cpp index 6216ab1c28..5e65a1f947 100644 --- a/fpdfsdk/fsdk_annothandler.cpp +++ b/fpdfsdk/fsdk_annothandler.cpp @@ -14,6 +14,7 @@ #include "core/fpdfdoc/include/cpdf_interform.h" #include "core/fxge/include/cfx_renderdevice.h" #include "fpdfsdk/formfiller/cffl_formfiller.h" +#include "fpdfsdk/include/cpdfsdk_datetime.h" #include "fpdfsdk/include/fsdk_define.h" #include "fpdfsdk/include/fsdk_mgr.h" diff --git a/fpdfsdk/fsdk_baseannot.cpp b/fpdfsdk/fsdk_baseannot.cpp deleted file mode 100644 index 21ba6a7a80..0000000000 --- a/fpdfsdk/fsdk_baseannot.cpp +++ /dev/null @@ -1,907 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#include - -#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h" -#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" -#include "core/fpdfapi/fpdf_parser/include/cpdf_number.h" -#include "core/fpdfapi/fpdf_parser/include/cpdf_stream.h" -#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h" -#include "core/fxcrt/include/fx_ext.h" -#include "core/fxge/include/cfx_renderdevice.h" -#include "fpdfsdk/include/fsdk_baseannot.h" -#include "fpdfsdk/include/fsdk_define.h" -#include "fpdfsdk/include/fsdk_mgr.h" - -#ifdef PDF_ENABLE_XFA -#include "fpdfsdk/fpdfxfa/include/fpdfxfa_doc.h" -#endif // PDF_ENABLE_XFA - -namespace { - -const float kMinWidth = 1.0f; -const float kMinHeight = 1.0f; - -int gAfxGetTimeZoneInSeconds(int8_t tzhour, uint8_t tzminute) { - return (int)tzhour * 3600 + (int)tzminute * (tzhour >= 0 ? 60 : -60); -} - -bool gAfxIsLeapYear(int16_t year) { - return ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))); -} - -uint16_t gAfxGetYearDays(int16_t year) { - return (gAfxIsLeapYear(year) ? 366 : 365); -} - -uint8_t gAfxGetMonthDays(int16_t year, uint8_t month) { - uint8_t mDays; - switch (month) { - case 1: - case 3: - case 5: - case 7: - case 8: - case 10: - case 12: - mDays = 31; - break; - - case 4: - case 6: - case 9: - case 11: - mDays = 30; - break; - - case 2: - if (gAfxIsLeapYear(year)) - mDays = 29; - else - mDays = 28; - break; - - default: - mDays = 0; - break; - } - - return mDays; -} - -} // namespace - -CPDFSDK_DateTime::CPDFSDK_DateTime() { - ResetDateTime(); -} - -CPDFSDK_DateTime::CPDFSDK_DateTime(const CFX_ByteString& dtStr) { - ResetDateTime(); - - FromPDFDateTimeString(dtStr); -} - -CPDFSDK_DateTime::CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime) { - operator=(datetime); -} - -CPDFSDK_DateTime::CPDFSDK_DateTime(const FX_SYSTEMTIME& st) { - operator=(st); -} - -void CPDFSDK_DateTime::ResetDateTime() { - tzset(); - - time_t curTime; - time(&curTime); - struct tm* newtime = localtime(&curTime); - - dt.year = newtime->tm_year + 1900; - dt.month = newtime->tm_mon + 1; - dt.day = newtime->tm_mday; - dt.hour = newtime->tm_hour; - dt.minute = newtime->tm_min; - dt.second = newtime->tm_sec; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::operator=( - const CPDFSDK_DateTime& datetime) { - FXSYS_memcpy(&dt, &datetime.dt, sizeof(FX_DATETIME)); - return *this; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::operator=(const FX_SYSTEMTIME& st) { - tzset(); - - dt.year = static_cast(st.wYear); - dt.month = static_cast(st.wMonth); - dt.day = static_cast(st.wDay); - dt.hour = static_cast(st.wHour); - dt.minute = static_cast(st.wMinute); - dt.second = static_cast(st.wSecond); - return *this; -} - -bool CPDFSDK_DateTime::operator==(const CPDFSDK_DateTime& datetime) const { - return (FXSYS_memcmp(&dt, &datetime.dt, sizeof(FX_DATETIME)) == 0); -} - -bool CPDFSDK_DateTime::operator!=(const CPDFSDK_DateTime& datetime) const { - return !(*this == datetime); -} - -time_t CPDFSDK_DateTime::ToTime_t() const { - struct tm newtime; - - newtime.tm_year = dt.year - 1900; - newtime.tm_mon = dt.month - 1; - newtime.tm_mday = dt.day; - newtime.tm_hour = dt.hour; - newtime.tm_min = dt.minute; - newtime.tm_sec = dt.second; - - return mktime(&newtime); -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::FromPDFDateTimeString( - const CFX_ByteString& dtStr) { - int strLength = dtStr.GetLength(); - if (strLength <= 0) - return *this; - - int i = 0; - while (i < strLength && !std::isdigit(dtStr[i])) - ++i; - - if (i >= strLength) - return *this; - - int j = 0; - int k = 0; - FX_CHAR ch; - while (i < strLength && j < 4) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.year = static_cast(k); - if (i >= strLength || j < 4) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.month = static_cast(k); - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.day = static_cast(k); - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.hour = static_cast(k); - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.minute = static_cast(k); - if (i >= strLength || j < 2) - return *this; - - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.second = static_cast(k); - if (i >= strLength || j < 2) - return *this; - - ch = dtStr[i++]; - if (ch != '-' && ch != '+') - return *this; - if (ch == '-') - dt.tzHour = -1; - else - dt.tzHour = 1; - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.tzHour *= static_cast(k); - if (i >= strLength || j < 2) - return *this; - - if (dtStr[i++] != '\'') - return *this; - j = 0; - k = 0; - while (i < strLength && j < 2) { - ch = dtStr[i]; - k = k * 10 + FXSYS_toDecimalDigit(ch); - j++; - if (!std::isdigit(ch)) - break; - i++; - } - dt.tzMinute = static_cast(k); - return *this; -} - -CFX_ByteString CPDFSDK_DateTime::ToCommonDateTimeString() { - CFX_ByteString str1; - str1.Format("%04d-%02u-%02u %02u:%02u:%02u ", dt.year, dt.month, dt.day, - dt.hour, dt.minute, dt.second); - if (dt.tzHour < 0) - str1 += "-"; - else - str1 += "+"; - CFX_ByteString str2; - str2.Format("%02d:%02u", std::abs(static_cast(dt.tzHour)), dt.tzMinute); - return str1 + str2; -} - -CFX_ByteString CPDFSDK_DateTime::ToPDFDateTimeString() { - CFX_ByteString dtStr; - char tempStr[32]; - memset(tempStr, 0, sizeof(tempStr)); - FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "D:%04d%02u%02u%02u%02u%02u", - dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); - dtStr = CFX_ByteString(tempStr); - if (dt.tzHour < 0) - dtStr += CFX_ByteString("-"); - else - dtStr += CFX_ByteString("+"); - memset(tempStr, 0, sizeof(tempStr)); - FXSYS_snprintf(tempStr, sizeof(tempStr) - 1, "%02d'%02u'", - std::abs(static_cast(dt.tzHour)), dt.tzMinute); - dtStr += CFX_ByteString(tempStr); - return dtStr; -} - -void CPDFSDK_DateTime::ToSystemTime(FX_SYSTEMTIME& st) { - time_t t = this->ToTime_t(); - struct tm* pTime = localtime(&t); - if (pTime) { - st.wYear = static_cast(pTime->tm_year) + 1900; - st.wMonth = static_cast(pTime->tm_mon) + 1; - st.wDay = static_cast(pTime->tm_mday); - st.wDayOfWeek = static_cast(pTime->tm_wday); - st.wHour = static_cast(pTime->tm_hour); - st.wMinute = static_cast(pTime->tm_min); - st.wSecond = static_cast(pTime->tm_sec); - st.wMilliseconds = 0; - } -} - -CPDFSDK_DateTime CPDFSDK_DateTime::ToGMT() const { - CPDFSDK_DateTime new_dt = *this; - new_dt.AddSeconds( - -gAfxGetTimeZoneInSeconds(new_dt.dt.tzHour, new_dt.dt.tzMinute)); - new_dt.dt.tzHour = 0; - new_dt.dt.tzMinute = 0; - return new_dt; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::AddDays(short days) { - if (days == 0) - return *this; - - int16_t y = dt.year; - uint8_t m = dt.month; - uint8_t d = dt.day; - - int ldays = days; - if (ldays > 0) { - int16_t yy = y; - if ((static_cast(m) * 100 + d) > 300) - yy++; - int ydays = gAfxGetYearDays(yy); - int mdays; - while (ldays >= ydays) { - y++; - ldays -= ydays; - yy++; - mdays = gAfxGetMonthDays(y, m); - if (d > mdays) { - m++; - d -= mdays; - } - ydays = gAfxGetYearDays(yy); - } - mdays = gAfxGetMonthDays(y, m) - d + 1; - while (ldays >= mdays) { - ldays -= mdays; - m++; - d = 1; - mdays = gAfxGetMonthDays(y, m); - } - d += ldays; - } else { - ldays *= -1; - int16_t yy = y; - if ((static_cast(m) * 100 + d) < 300) - yy--; - int ydays = gAfxGetYearDays(yy); - while (ldays >= ydays) { - y--; - ldays -= ydays; - yy--; - int mdays = gAfxGetMonthDays(y, m); - if (d > mdays) { - m++; - d -= mdays; - } - ydays = gAfxGetYearDays(yy); - } - while (ldays >= d) { - ldays -= d; - m--; - d = gAfxGetMonthDays(y, m); - } - d -= ldays; - } - - dt.year = y; - dt.month = m; - dt.day = d; - - return *this; -} - -CPDFSDK_DateTime& CPDFSDK_DateTime::AddSeconds(int seconds) { - if (seconds == 0) - return *this; - - int n; - int days; - - n = dt.hour * 3600 + dt.minute * 60 + dt.second + seconds; - if (n < 0) { - days = (n - 86399) / 86400; - n -= days * 86400; - } else { - days = n / 86400; - n %= 86400; - } - dt.hour = static_cast(n / 3600); - dt.hour %= 24; - n %= 3600; - dt.minute = static_cast(n / 60); - dt.second = static_cast(n % 60); - if (days != 0) - AddDays(days); - - return *this; -} - -CPDFSDK_Annot::CPDFSDK_Annot(CPDFSDK_PageView* pPageView) - : m_pPageView(pPageView), m_bSelected(FALSE), m_nTabOrder(-1) {} - -CPDFSDK_Annot::~CPDFSDK_Annot() {} - -#ifdef PDF_ENABLE_XFA - -FX_BOOL CPDFSDK_Annot::IsXFAField() { - return FALSE; -} - -CXFA_FFWidget* CPDFSDK_Annot::GetXFAWidget() const { - return nullptr; -} - -#endif // PDF_ENABLE_XFA - -FX_FLOAT CPDFSDK_Annot::GetMinWidth() const { - return kMinWidth; -} - -FX_FLOAT CPDFSDK_Annot::GetMinHeight() const { - return kMinHeight; -} - -int CPDFSDK_Annot::GetLayoutOrder() const { - return 5; -} - -CPDF_Annot* CPDFSDK_Annot::GetPDFAnnot() const { - return nullptr; -} - -CFX_ByteString CPDFSDK_Annot::GetType() const { - return ""; -} - -CFX_ByteString CPDFSDK_Annot::GetSubType() const { - return ""; -} - -void CPDFSDK_Annot::SetRect(const CFX_FloatRect& rect) {} - -CFX_FloatRect CPDFSDK_Annot::GetRect() const { - return CFX_FloatRect(); -} - -void CPDFSDK_Annot::Annot_OnDraw(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - CPDF_RenderOptions* pOptions) {} - -CPDFSDK_BAAnnot::CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, - CPDFSDK_PageView* pPageView) - : CPDFSDK_Annot(pPageView), m_pAnnot(pAnnot) {} - -CPDFSDK_BAAnnot::~CPDFSDK_BAAnnot() {} - -CPDF_Annot* CPDFSDK_BAAnnot::GetPDFAnnot() const { - return m_pAnnot; -} - -FX_BOOL CPDFSDK_Annot::IsSelected() { - return m_bSelected; -} - -void CPDFSDK_Annot::SetSelected(FX_BOOL bSelected) { - m_bSelected = bSelected; -} - -int CPDFSDK_Annot::GetTabOrder() { - return m_nTabOrder; -} - -void CPDFSDK_Annot::SetTabOrder(int iTabOrder) { - m_nTabOrder = iTabOrder; -} - -CPDF_Dictionary* CPDFSDK_BAAnnot::GetAnnotDict() const { - return m_pAnnot->GetAnnotDict(); -} - -void CPDFSDK_BAAnnot::SetRect(const CFX_FloatRect& rect) { - ASSERT(rect.right - rect.left >= GetMinWidth()); - ASSERT(rect.top - rect.bottom >= GetMinHeight()); - - m_pAnnot->GetAnnotDict()->SetAtRect("Rect", rect); -} - -CFX_FloatRect CPDFSDK_BAAnnot::GetRect() const { - CFX_FloatRect rect; - m_pAnnot->GetRect(rect); - return rect; -} - -CFX_ByteString CPDFSDK_BAAnnot::GetType() const { - return m_pAnnot->GetSubType(); -} - -CFX_ByteString CPDFSDK_BAAnnot::GetSubType() const { - return ""; -} - -void CPDFSDK_BAAnnot::DrawAppearance(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - CPDF_Annot::AppearanceMode mode, - const CPDF_RenderOptions* pOptions) { - m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, - mode, pOptions); -} - -FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid() { - return !!m_pAnnot->GetAnnotDict()->GetDictBy("AP"); -} - -FX_BOOL CPDFSDK_BAAnnot::IsAppearanceValid(CPDF_Annot::AppearanceMode mode) { - CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); - if (!pAP) - return FALSE; - - // Choose the right sub-ap - const FX_CHAR* ap_entry = "N"; - if (mode == CPDF_Annot::Down) - ap_entry = "D"; - else if (mode == CPDF_Annot::Rollover) - ap_entry = "R"; - if (!pAP->KeyExist(ap_entry)) - ap_entry = "N"; - - // Get the AP stream or subdirectory - CPDF_Object* psub = pAP->GetDirectObjectBy(ap_entry); - return !!psub; -} - -void CPDFSDK_BAAnnot::DrawBorder(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - const CPDF_RenderOptions* pOptions) { - m_pAnnot->DrawBorder(pDevice, pUser2Device, pOptions); -} - -void CPDFSDK_BAAnnot::ClearCachedAP() { - m_pAnnot->ClearCachedAP(); -} - -void CPDFSDK_BAAnnot::SetContents(const CFX_WideString& sContents) { - if (sContents.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("Contents"); - else - m_pAnnot->GetAnnotDict()->SetAtString("Contents", - PDF_EncodeText(sContents)); -} - -CFX_WideString CPDFSDK_BAAnnot::GetContents() const { - return m_pAnnot->GetAnnotDict()->GetUnicodeTextBy("Contents"); -} - -void CPDFSDK_BAAnnot::SetAnnotName(const CFX_WideString& sName) { - if (sName.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("NM"); - else - m_pAnnot->GetAnnotDict()->SetAtString("NM", PDF_EncodeText(sName)); -} - -CFX_WideString CPDFSDK_BAAnnot::GetAnnotName() const { - return m_pAnnot->GetAnnotDict()->GetUnicodeTextBy("NM"); -} - -void CPDFSDK_BAAnnot::SetModifiedDate(const FX_SYSTEMTIME& st) { - CPDFSDK_DateTime dt(st); - CFX_ByteString str = dt.ToPDFDateTimeString(); - - if (str.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("M"); - else - m_pAnnot->GetAnnotDict()->SetAtString("M", str); -} - -FX_SYSTEMTIME CPDFSDK_BAAnnot::GetModifiedDate() const { - FX_SYSTEMTIME systime; - CFX_ByteString str = m_pAnnot->GetAnnotDict()->GetStringBy("M"); - - CPDFSDK_DateTime dt(str); - dt.ToSystemTime(systime); - - return systime; -} - -void CPDFSDK_BAAnnot::SetFlags(uint32_t nFlags) { - m_pAnnot->GetAnnotDict()->SetAtInteger("F", nFlags); -} - -uint32_t CPDFSDK_BAAnnot::GetFlags() const { - return m_pAnnot->GetAnnotDict()->GetIntegerBy("F"); -} - -void CPDFSDK_BAAnnot::SetAppState(const CFX_ByteString& str) { - if (str.IsEmpty()) - m_pAnnot->GetAnnotDict()->RemoveAt("AS"); - else - m_pAnnot->GetAnnotDict()->SetAtString("AS", str); -} - -CFX_ByteString CPDFSDK_BAAnnot::GetAppState() const { - return m_pAnnot->GetAnnotDict()->GetStringBy("AS"); -} - -void CPDFSDK_BAAnnot::SetStructParent(int key) { - m_pAnnot->GetAnnotDict()->SetAtInteger("StructParent", key); -} - -int CPDFSDK_BAAnnot::GetStructParent() const { - return m_pAnnot->GetAnnotDict()->GetIntegerBy("StructParent"); -} - -// border -void CPDFSDK_BAAnnot::SetBorderWidth(int nWidth) { - CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); - - if (pBorder) { - pBorder->SetAt(2, new CPDF_Number(nWidth)); - } else { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - - if (!pBSDict) { - pBSDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); - } - - pBSDict->SetAtInteger("W", nWidth); - } -} - -int CPDFSDK_BAAnnot::GetBorderWidth() const { - if (CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border")) { - return pBorder->GetIntegerAt(2); - } - if (CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS")) { - return pBSDict->GetIntegerBy("W", 1); - } - return 1; -} - -void CPDFSDK_BAAnnot::SetBorderStyle(BorderStyle nStyle) { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - if (!pBSDict) { - pBSDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("BS", pBSDict); - } - - switch (nStyle) { - case BorderStyle::SOLID: - pBSDict->SetAtName("S", "S"); - break; - case BorderStyle::DASH: - pBSDict->SetAtName("S", "D"); - break; - case BorderStyle::BEVELED: - pBSDict->SetAtName("S", "B"); - break; - case BorderStyle::INSET: - pBSDict->SetAtName("S", "I"); - break; - case BorderStyle::UNDERLINE: - pBSDict->SetAtName("S", "U"); - break; - default: - break; - } -} - -BorderStyle CPDFSDK_BAAnnot::GetBorderStyle() const { - CPDF_Dictionary* pBSDict = m_pAnnot->GetAnnotDict()->GetDictBy("BS"); - if (pBSDict) { - CFX_ByteString sBorderStyle = pBSDict->GetStringBy("S", "S"); - if (sBorderStyle == "S") - return BorderStyle::SOLID; - if (sBorderStyle == "D") - return BorderStyle::DASH; - if (sBorderStyle == "B") - return BorderStyle::BEVELED; - if (sBorderStyle == "I") - return BorderStyle::INSET; - if (sBorderStyle == "U") - return BorderStyle::UNDERLINE; - } - - CPDF_Array* pBorder = m_pAnnot->GetAnnotDict()->GetArrayBy("Border"); - if (pBorder) { - if (pBorder->GetCount() >= 4) { - CPDF_Array* pDP = pBorder->GetArrayAt(3); - if (pDP && pDP->GetCount() > 0) - return BorderStyle::DASH; - } - } - - return BorderStyle::SOLID; -} - -void CPDFSDK_BAAnnot::SetColor(FX_COLORREF color) { - CPDF_Array* pArray = new CPDF_Array; - pArray->AddNumber((FX_FLOAT)FXSYS_GetRValue(color) / 255.0f); - pArray->AddNumber((FX_FLOAT)FXSYS_GetGValue(color) / 255.0f); - pArray->AddNumber((FX_FLOAT)FXSYS_GetBValue(color) / 255.0f); - m_pAnnot->GetAnnotDict()->SetAt("C", pArray); -} - -void CPDFSDK_BAAnnot::RemoveColor() { - m_pAnnot->GetAnnotDict()->RemoveAt("C"); -} - -FX_BOOL CPDFSDK_BAAnnot::GetColor(FX_COLORREF& color) const { - if (CPDF_Array* pEntry = m_pAnnot->GetAnnotDict()->GetArrayBy("C")) { - size_t nCount = pEntry->GetCount(); - if (nCount == 1) { - FX_FLOAT g = pEntry->GetNumberAt(0) * 255; - - color = FXSYS_RGB((int)g, (int)g, (int)g); - - return TRUE; - } else if (nCount == 3) { - FX_FLOAT r = pEntry->GetNumberAt(0) * 255; - FX_FLOAT g = pEntry->GetNumberAt(1) * 255; - FX_FLOAT b = pEntry->GetNumberAt(2) * 255; - - color = FXSYS_RGB((int)r, (int)g, (int)b); - - return TRUE; - } else if (nCount == 4) { - FX_FLOAT c = pEntry->GetNumberAt(0); - FX_FLOAT m = pEntry->GetNumberAt(1); - FX_FLOAT y = pEntry->GetNumberAt(2); - FX_FLOAT k = pEntry->GetNumberAt(3); - - FX_FLOAT r = 1.0f - std::min(1.0f, c + k); - FX_FLOAT g = 1.0f - std::min(1.0f, m + k); - FX_FLOAT b = 1.0f - std::min(1.0f, y + k); - - color = FXSYS_RGB((int)(r * 255), (int)(g * 255), (int)(b * 255)); - - return TRUE; - } - } - - return FALSE; -} - -void CPDFSDK_BAAnnot::WriteAppearance(const CFX_ByteString& sAPType, - const CFX_FloatRect& rcBBox, - const CFX_Matrix& matrix, - const CFX_ByteString& sContents, - const CFX_ByteString& sAPState) { - CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictBy("AP"); - - if (!pAPDict) { - pAPDict = new CPDF_Dictionary; - m_pAnnot->GetAnnotDict()->SetAt("AP", pAPDict); - } - - CPDF_Stream* pStream = nullptr; - CPDF_Dictionary* pParentDict = nullptr; - - if (sAPState.IsEmpty()) { - pParentDict = pAPDict; - pStream = pAPDict->GetStreamBy(sAPType); - } else { - CPDF_Dictionary* pAPTypeDict = pAPDict->GetDictBy(sAPType); - if (!pAPTypeDict) { - pAPTypeDict = new CPDF_Dictionary; - pAPDict->SetAt(sAPType, pAPTypeDict); - } - pParentDict = pAPTypeDict; - pStream = pAPTypeDict->GetStreamBy(sAPState); - } - - if (!pStream) { - pStream = new CPDF_Stream(nullptr, 0, nullptr); - CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); - int32_t objnum = pDoc->AddIndirectObject(pStream); - pParentDict->SetAtReference(sAPType, pDoc, objnum); - } - - CPDF_Dictionary* pStreamDict = pStream->GetDict(); - if (!pStreamDict) { - pStreamDict = new CPDF_Dictionary; - pStreamDict->SetAtName("Type", "XObject"); - pStreamDict->SetAtName("Subtype", "Form"); - pStreamDict->SetAtInteger("FormType", 1); - pStream->InitStream(nullptr, 0, pStreamDict); - } - - if (pStreamDict) { - pStreamDict->SetAtMatrix("Matrix", matrix); - pStreamDict->SetAtRect("BBox", rcBBox); - } - - pStream->SetData((uint8_t*)sContents.c_str(), sContents.GetLength(), FALSE, - FALSE); -} - -FX_BOOL CPDFSDK_BAAnnot::IsVisible() const { - uint32_t nFlags = GetFlags(); - return !((nFlags & ANNOTFLAG_INVISIBLE) || (nFlags & ANNOTFLAG_HIDDEN) || - (nFlags & ANNOTFLAG_NOVIEW)); -} - -CPDF_Action CPDFSDK_BAAnnot::GetAction() const { - return CPDF_Action(m_pAnnot->GetAnnotDict()->GetDictBy("A")); -} - -void CPDFSDK_BAAnnot::SetAction(const CPDF_Action& action) { - ASSERT(action.GetDict()); - if (action.GetDict() != m_pAnnot->GetAnnotDict()->GetDictBy("A")) { - CPDF_Document* pDoc = m_pPageView->GetPDFDocument(); - CPDF_Dictionary* pDict = action.GetDict(); - if (pDict && pDict->GetObjNum() == 0) { - pDoc->AddIndirectObject(pDict); - } - m_pAnnot->GetAnnotDict()->SetAtReference("A", pDoc, pDict->GetObjNum()); - } -} - -void CPDFSDK_BAAnnot::RemoveAction() { - m_pAnnot->GetAnnotDict()->RemoveAt("A"); -} - -CPDF_AAction CPDFSDK_BAAnnot::GetAAction() const { - return CPDF_AAction(m_pAnnot->GetAnnotDict()->GetDictBy("AA")); -} - -void CPDFSDK_BAAnnot::SetAAction(const CPDF_AAction& aa) { - if (aa.GetDict() != m_pAnnot->GetAnnotDict()->GetDictBy("AA")) - m_pAnnot->GetAnnotDict()->SetAt("AA", aa.GetDict()); -} - -void CPDFSDK_BAAnnot::RemoveAAction() { - m_pAnnot->GetAnnotDict()->RemoveAt("AA"); -} - -CPDF_Action CPDFSDK_BAAnnot::GetAAction(CPDF_AAction::AActionType eAAT) { - CPDF_AAction AAction = GetAAction(); - - if (AAction.ActionExist(eAAT)) - return AAction.GetAction(eAAT); - - if (eAAT == CPDF_AAction::ButtonUp) - return GetAction(); - - return CPDF_Action(); -} - -void CPDFSDK_BAAnnot::Annot_OnDraw(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - CPDF_RenderOptions* pOptions) { - m_pAnnot->GetAPForm(m_pPageView->GetPDFPage(), CPDF_Annot::Normal); - m_pAnnot->DrawAppearance(m_pPageView->GetPDFPage(), pDevice, pUser2Device, - CPDF_Annot::Normal, nullptr); -} - -UnderlyingPageType* CPDFSDK_Annot::GetUnderlyingPage() { -#ifdef PDF_ENABLE_XFA - return GetPDFXFAPage(); -#else // PDF_ENABLE_XFA - return GetPDFPage(); -#endif // PDF_ENABLE_XFA -} - -CPDF_Page* CPDFSDK_Annot::GetPDFPage() { - return m_pPageView ? m_pPageView->GetPDFPage() : nullptr; -} - -#ifdef PDF_ENABLE_XFA - -CPDFXFA_Page* CPDFSDK_Annot::GetPDFXFAPage() { - return m_pPageView ? m_pPageView->GetPDFXFAPage() : nullptr; -} - -#endif // PDF_ENABLE_XFA diff --git a/fpdfsdk/fsdk_baseform.cpp b/fpdfsdk/fsdk_baseform.cpp index c5c6187c4e..4b12d78022 100644 --- a/fpdfsdk/fsdk_baseform.cpp +++ b/fpdfsdk/fsdk_baseform.cpp @@ -23,8 +23,8 @@ #include "core/fxge/include/cfx_renderdevice.h" #include "fpdfsdk/formfiller/cffl_formfiller.h" #include "fpdfsdk/fxedit/include/fxet_edit.h" +#include "fpdfsdk/include/cpdfsdk_annot.h" #include "fpdfsdk/include/fsdk_actionhandler.h" -#include "fpdfsdk/include/fsdk_baseannot.h" #include "fpdfsdk/include/fsdk_define.h" #include "fpdfsdk/include/fsdk_mgr.h" #include "fpdfsdk/javascript/ijs_context.h" diff --git a/fpdfsdk/include/cpdfsdk_annot.h b/fpdfsdk/include/cpdfsdk_annot.h new file mode 100644 index 0000000000..5f5cce4728 --- /dev/null +++ b/fpdfsdk/include/cpdfsdk_annot.h @@ -0,0 +1,68 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_INCLUDE_CPDFSDK_ANNOT_H_ +#define FPDFSDK_INCLUDE_CPDFSDK_ANNOT_H_ + +#include "core/fpdfdoc/include/cpdf_aaction.h" +#include "core/fpdfdoc/include/cpdf_annot.h" +#include "core/fpdfdoc/include/cpdf_defaultappearance.h" +#include "core/fxcrt/include/fx_basic.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/include/fsdk_common.h" +#include "fpdfsdk/include/fsdk_define.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Page; +class CPDF_RenderOptions; +class CPDFSDK_PageView; + +class CPDFSDK_Annot { + public: + explicit CPDFSDK_Annot(CPDFSDK_PageView* pPageView); + virtual ~CPDFSDK_Annot(); + +#ifdef PDF_ENABLE_XFA + virtual FX_BOOL IsXFAField(); + virtual CXFA_FFWidget* GetXFAWidget() const; +#endif // PDF_ENABLE_XFA + + virtual FX_FLOAT GetMinWidth() const; + virtual FX_FLOAT GetMinHeight() const; + virtual int GetLayoutOrder() const; + virtual CPDF_Annot* GetPDFAnnot() const; + virtual CFX_ByteString GetType() const; + virtual CFX_ByteString GetSubType() const; + virtual CFX_FloatRect GetRect() const; + + virtual void SetRect(const CFX_FloatRect& rect); + virtual void Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions); + + UnderlyingPageType* GetUnderlyingPage(); + CPDF_Page* GetPDFPage(); +#ifdef PDF_ENABLE_XFA + CPDFXFA_Page* GetPDFXFAPage(); +#endif // PDF_ENABLE_XFA + + void SetPage(CPDFSDK_PageView* pPageView); + CPDFSDK_PageView* GetPageView() const { return m_pPageView; } + + int GetTabOrder(); + void SetTabOrder(int iTabOrder); + + FX_BOOL IsSelected(); + void SetSelected(FX_BOOL bSelected); + + protected: + CPDFSDK_PageView* m_pPageView; + FX_BOOL m_bSelected; + int m_nTabOrder; +}; + +#endif // FPDFSDK_INCLUDE_CPDFSDK_ANNOT_H_ diff --git a/fpdfsdk/include/cpdfsdk_baannot.h b/fpdfsdk/include/cpdfsdk_baannot.h new file mode 100644 index 0000000000..abe23fe1b9 --- /dev/null +++ b/fpdfsdk/include/cpdfsdk_baannot.h @@ -0,0 +1,104 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_INCLUDE_CPDFSDK_BAANNOT_H_ +#define FPDFSDK_INCLUDE_CPDFSDK_BAANNOT_H_ + +#include "core/fpdfdoc/include/cpdf_aaction.h" +#include "core/fpdfdoc/include/cpdf_action.h" +#include "core/fpdfdoc/include/cpdf_annot.h" +#include "core/fpdfdoc/include/cpdf_defaultappearance.h" +#include "core/fxcrt/include/fx_coordinates.h" +#include "core/fxcrt/include/fx_string.h" +#include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/include/cpdfsdk_annot.h" + +class CFX_Matrix; +class CFX_RenderDevice; +class CPDF_Dictionary; +class CPDF_RenderOptions; +class CPDFSDK_PageView; + +class CPDFSDK_BAAnnot : public CPDFSDK_Annot { + public: + CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView); + ~CPDFSDK_BAAnnot() override; + + // CPDFSDK_Annot + CFX_ByteString GetType() const override; + CFX_ByteString GetSubType() const override; + void SetRect(const CFX_FloatRect& rect) override; + CFX_FloatRect GetRect() const override; + CPDF_Annot* GetPDFAnnot() const override; + void Annot_OnDraw(CFX_RenderDevice* pDevice, + CFX_Matrix* pUser2Device, + CPDF_RenderOptions* pOptions) override; + + CPDF_Dictionary* GetAnnotDict() const; + + void SetContents(const CFX_WideString& sContents); + CFX_WideString GetContents() const; + + void SetAnnotName(const CFX_WideString& sName); + CFX_WideString GetAnnotName() const; + + void SetModifiedDate(const FX_SYSTEMTIME& st); + FX_SYSTEMTIME GetModifiedDate() const; + + void SetFlags(uint32_t nFlags); + uint32_t GetFlags() const; + + void SetAppState(const CFX_ByteString& str); + CFX_ByteString GetAppState() const; + + void SetStructParent(int key); + int GetStructParent() const; + + void SetBorderWidth(int nWidth); + int GetBorderWidth() const; + + void SetBorderStyle(BorderStyle nStyle); + BorderStyle GetBorderStyle() const; + + void SetColor(FX_COLORREF color); + void RemoveColor(); + FX_BOOL GetColor(FX_COLORREF& color) const; + + FX_BOOL IsVisible() const; + + CPDF_Action GetAction() const; + void SetAction(const CPDF_Action& a); + void RemoveAction(); + + CPDF_AAction GetAAction() const; + void SetAAction(const CPDF_AAction& aa); + void RemoveAAction(); + + virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT); + virtual FX_BOOL IsAppearanceValid(); + virtual FX_BOOL IsAppearanceValid(CPDF_Annot::AppearanceMode mode); + virtual void DrawAppearance(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + CPDF_Annot::AppearanceMode mode, + const CPDF_RenderOptions* pOptions); + + void DrawBorder(CFX_RenderDevice* pDevice, + const CFX_Matrix* pUser2Device, + const CPDF_RenderOptions* pOptions); + + void ClearCachedAP(); + + void WriteAppearance(const CFX_ByteString& sAPType, + const CFX_FloatRect& rcBBox, + const CFX_Matrix& matrix, + const CFX_ByteString& sContents, + const CFX_ByteString& sAPState = ""); + + protected: + CPDF_Annot* m_pAnnot; +}; + +#endif // FPDFSDK_INCLUDE_CPDFSDK_BAANNOT_H_ diff --git a/fpdfsdk/include/cpdfsdk_datetime.h b/fpdfsdk/include/cpdfsdk_datetime.h new file mode 100644 index 0000000000..785d96adc4 --- /dev/null +++ b/fpdfsdk/include/cpdfsdk_datetime.h @@ -0,0 +1,52 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef FPDFSDK_INCLUDE_CPDFSDK_DATETIME_H_ +#define FPDFSDK_INCLUDE_CPDFSDK_DATETIME_H_ + +#if _FX_OS_ == _FX_ANDROID_ +#include "time.h" +#else +#include +#endif + +#include "fpdfsdk/cfx_systemhandler.h" + +class CPDFSDK_DateTime { + public: + CPDFSDK_DateTime(); + explicit CPDFSDK_DateTime(const CFX_ByteString& dtStr); + explicit CPDFSDK_DateTime(const FX_SYSTEMTIME& st); + CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime); + + bool operator==(const CPDFSDK_DateTime& datetime) const; + bool operator!=(const CPDFSDK_DateTime& datetime) const; + + CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr); + CFX_ByteString ToCommonDateTimeString(); + CFX_ByteString ToPDFDateTimeString(); + void ToSystemTime(FX_SYSTEMTIME& st); + time_t ToTime_t() const; + CPDFSDK_DateTime ToGMT() const; + CPDFSDK_DateTime& AddDays(short days); + CPDFSDK_DateTime& AddSeconds(int seconds); + + void ResetDateTime(); + + private: + struct FX_DATETIME { + int16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t minute; + uint8_t second; + int8_t tzHour; + uint8_t tzMinute; + } dt; +}; + +#endif // FPDFSDK_INCLUDE_CPDFSDK_DATETIME_H_ diff --git a/fpdfsdk/include/fsdk_baseannot.h b/fpdfsdk/include/fsdk_baseannot.h deleted file mode 100644 index 83bb02de1c..0000000000 --- a/fpdfsdk/include/fsdk_baseannot.h +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2014 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com - -#ifndef FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_ -#define FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_ - -#if _FX_OS_ == _FX_ANDROID_ -#include "time.h" -#else -#include -#endif - -#include "core/fpdfdoc/include/cpdf_aaction.h" -#include "core/fpdfdoc/include/cpdf_annot.h" -#include "core/fpdfdoc/include/cpdf_defaultappearance.h" -#include "core/fxcrt/include/fx_basic.h" -#include "fpdfsdk/cfx_systemhandler.h" -#include "fpdfsdk/include/fsdk_common.h" -#include "fpdfsdk/include/fsdk_define.h" - -class CPDFSDK_PageView; -class CPDF_Page; -class CFX_Matrix; -class CPDF_RenderOptions; -class CFX_RenderDevice; - -class CPDFSDK_DateTime { - public: - CPDFSDK_DateTime(); - explicit CPDFSDK_DateTime(const CFX_ByteString& dtStr); - explicit CPDFSDK_DateTime(const FX_SYSTEMTIME& st); - CPDFSDK_DateTime(const CPDFSDK_DateTime& datetime); - - CPDFSDK_DateTime& operator=(const CPDFSDK_DateTime& datetime); - CPDFSDK_DateTime& operator=(const FX_SYSTEMTIME& st); - bool operator==(const CPDFSDK_DateTime& datetime) const; - bool operator!=(const CPDFSDK_DateTime& datetime) const; - - CPDFSDK_DateTime& FromPDFDateTimeString(const CFX_ByteString& dtStr); - CFX_ByteString ToCommonDateTimeString(); - CFX_ByteString ToPDFDateTimeString(); - void ToSystemTime(FX_SYSTEMTIME& st); - time_t ToTime_t() const; - CPDFSDK_DateTime ToGMT() const; - CPDFSDK_DateTime& AddDays(short days); - CPDFSDK_DateTime& AddSeconds(int seconds); - - void ResetDateTime(); - - struct FX_DATETIME { - int16_t year; - uint8_t month; - uint8_t day; - uint8_t hour; - uint8_t minute; - uint8_t second; - int8_t tzHour; - uint8_t tzMinute; - } dt; -}; - -class CPDFSDK_Annot { - public: - explicit CPDFSDK_Annot(CPDFSDK_PageView* pPageView); - virtual ~CPDFSDK_Annot(); - -#ifdef PDF_ENABLE_XFA - virtual FX_BOOL IsXFAField(); - virtual CXFA_FFWidget* GetXFAWidget() const; -#endif // PDF_ENABLE_XFA - - virtual FX_FLOAT GetMinWidth() const; - virtual FX_FLOAT GetMinHeight() const; - // define layout order to 5. - virtual int GetLayoutOrder() const; - virtual CPDF_Annot* GetPDFAnnot() const; - virtual CFX_ByteString GetType() const; - virtual CFX_ByteString GetSubType() const; - virtual CFX_FloatRect GetRect() const; - - virtual void SetRect(const CFX_FloatRect& rect); - virtual void Annot_OnDraw(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - CPDF_RenderOptions* pOptions); - - UnderlyingPageType* GetUnderlyingPage(); - CPDF_Page* GetPDFPage(); -#ifdef PDF_ENABLE_XFA - CPDFXFA_Page* GetPDFXFAPage(); -#endif // PDF_ENABLE_XFA - - void SetPage(CPDFSDK_PageView* pPageView); - CPDFSDK_PageView* GetPageView() const { return m_pPageView; } - - // Tab Order - int GetTabOrder(); - void SetTabOrder(int iTabOrder); - - // Selection - FX_BOOL IsSelected(); - void SetSelected(FX_BOOL bSelected); - - protected: - CPDFSDK_PageView* m_pPageView; - FX_BOOL m_bSelected; - int m_nTabOrder; -}; - -class CPDFSDK_BAAnnot : public CPDFSDK_Annot { - public: - CPDFSDK_BAAnnot(CPDF_Annot* pAnnot, CPDFSDK_PageView* pPageView); - ~CPDFSDK_BAAnnot() override; - - // CPDFSDK_Annot - CFX_ByteString GetType() const override; - CFX_ByteString GetSubType() const override; - void SetRect(const CFX_FloatRect& rect) override; - CFX_FloatRect GetRect() const override; - CPDF_Annot* GetPDFAnnot() const override; - void Annot_OnDraw(CFX_RenderDevice* pDevice, - CFX_Matrix* pUser2Device, - CPDF_RenderOptions* pOptions) override; - - CPDF_Dictionary* GetAnnotDict() const; - - void SetContents(const CFX_WideString& sContents); - CFX_WideString GetContents() const; - - void SetAnnotName(const CFX_WideString& sName); - CFX_WideString GetAnnotName() const; - - void SetModifiedDate(const FX_SYSTEMTIME& st); - FX_SYSTEMTIME GetModifiedDate() const; - - void SetFlags(uint32_t nFlags); - uint32_t GetFlags() const; - - void SetAppState(const CFX_ByteString& str); - CFX_ByteString GetAppState() const; - - void SetStructParent(int key); - int GetStructParent() const; - - void SetBorderWidth(int nWidth); - int GetBorderWidth() const; - - void SetBorderStyle(BorderStyle nStyle); - BorderStyle GetBorderStyle() const; - - void SetColor(FX_COLORREF color); - void RemoveColor(); - FX_BOOL GetColor(FX_COLORREF& color) const; - - FX_BOOL IsVisible() const; - - CPDF_Action GetAction() const; - void SetAction(const CPDF_Action& a); - void RemoveAction(); - - CPDF_AAction GetAAction() const; - void SetAAction(const CPDF_AAction& aa); - void RemoveAAction(); - - virtual CPDF_Action GetAAction(CPDF_AAction::AActionType eAAT); - virtual FX_BOOL IsAppearanceValid(); - virtual FX_BOOL IsAppearanceValid(CPDF_Annot::AppearanceMode mode); - virtual void DrawAppearance(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - CPDF_Annot::AppearanceMode mode, - const CPDF_RenderOptions* pOptions); - - void DrawBorder(CFX_RenderDevice* pDevice, - const CFX_Matrix* pUser2Device, - const CPDF_RenderOptions* pOptions); - - void ClearCachedAP(); - - void WriteAppearance(const CFX_ByteString& sAPType, - const CFX_FloatRect& rcBBox, - const CFX_Matrix& matrix, - const CFX_ByteString& sContents, - const CFX_ByteString& sAPState = ""); - - protected: - CPDF_Annot* m_pAnnot; -}; - -#endif // FPDFSDK_INCLUDE_FSDK_BASEANNOT_H_ diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h index d386c7fa2d..c5f45e75ae 100644 --- a/fpdfsdk/include/fsdk_baseform.h +++ b/fpdfsdk/include/fsdk_baseform.h @@ -14,7 +14,8 @@ #include "core/fpdfdoc/include/ipdf_formnotify.h" #include "core/fxcrt/include/fx_basic.h" #include "core/fxge/include/fx_dib.h" -#include "fpdfsdk/include/fsdk_baseannot.h" +#include "fpdfsdk/include/cpdfsdk_annot.h" +#include "fpdfsdk/include/cpdfsdk_baannot.h" #if _FX_OS_ == _FX_ANDROID_ #include "time.h" diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h index 1c180db57f..1389d6cbbf 100644 --- a/fpdfsdk/include/fsdk_mgr.h +++ b/fpdfsdk/include/fsdk_mgr.h @@ -15,9 +15,9 @@ #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" #include "core/fpdfdoc/include/cpdf_occontext.h" #include "fpdfsdk/cfx_systemhandler.h" +#include "fpdfsdk/include/cpdfsdk_annot.h" #include "fpdfsdk/include/fsdk_actionhandler.h" #include "fpdfsdk/include/fsdk_annothandler.h" -#include "fpdfsdk/include/fsdk_baseannot.h" #include "fpdfsdk/include/fsdk_baseform.h" #include "fpdfsdk/include/fsdk_common.h" #include "fpdfsdk/include/fsdk_define.h" diff --git a/pdfium.gyp b/pdfium.gyp index 3e415939d4..1cc8758bd9 100644 --- a/pdfium.gyp +++ b/pdfium.gyp @@ -86,11 +86,16 @@ 'sources': [ 'fpdfsdk/cfx_systemhandler.cpp', 'fpdfsdk/cfx_systemhandler.h', + 'fpdfsdk/include/cpdfsdk_annot.h', + 'fpdfsdk/include/cpdfsdk_baannot.h', + 'fpdfsdk/include/cpdfsdk_datetime.h', 'fpdfsdk/include/fsdk_actionhandler.h', 'fpdfsdk/include/fsdk_annothandler.h', - 'fpdfsdk/include/fsdk_baseannot.h', 'fpdfsdk/include/fsdk_baseform.h', 'fpdfsdk/include/fsdk_pauseadapter.h', + 'fpdfsdk/cpdfsdk_annot.cpp', + 'fpdfsdk/cpdfsdk_baannot.cpp', + 'fpdfsdk/cpdfsdk_datetime.cpp', 'fpdfsdk/fpdfdoc.cpp', 'fpdfsdk/fpdfeditimg.cpp', 'fpdfsdk/fpdfeditpage.cpp', @@ -108,7 +113,6 @@ 'fpdfsdk/fpdf_transformpage.cpp', 'fpdfsdk/fsdk_actionhandler.cpp', 'fpdfsdk/fsdk_annothandler.cpp', - 'fpdfsdk/fsdk_baseannot.cpp', 'fpdfsdk/fsdk_baseform.cpp', 'fpdfsdk/fsdk_mgr.cpp', 'fpdfsdk/fsdk_pauseadapter.cpp', -- cgit v1.2.3