Index: core/fpdfdoc/cpdf_annot.cpp |
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp |
index e79acab7a09c40ec9c792810f9a68b5a92d784da..6525ff620cc282ffb24e54d50fc31091395d7722 100644 |
--- a/core/fpdfdoc/cpdf_annot.cpp |
+++ b/core/fpdfdoc/cpdf_annot.cpp |
@@ -21,9 +21,9 @@ |
CPDF_Annot::CPDF_Annot(CPDF_Dictionary* pDict, CPDF_Document* pDocument) |
: m_pAnnotDict(pDict), |
m_pDocument(pDocument), |
- m_sSubtype(m_pAnnotDict->GetStringBy("Subtype")), |
m_bOpenState(false), |
m_pPopupAnnot(nullptr) { |
+ m_nSubtype = StringToAnnotSubtype(m_pAnnotDict->GetStringBy("Subtype")); |
GenerateAPIfNeeded(); |
} |
@@ -32,31 +32,32 @@ CPDF_Annot::~CPDF_Annot() { |
} |
void CPDF_Annot::GenerateAPIfNeeded() { |
- if (m_sSubtype == "Circle") |
+ if (m_nSubtype == CPDF_Annot::Subtype::CIRCLE) |
CPVT_GenerateAP::GenerateCircleAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Highlight") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::HIGHLIGHT) |
CPVT_GenerateAP::GenerateHighlightAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Ink") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::INK) |
CPVT_GenerateAP::GenerateInkAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Popup") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::POPUP) |
CPVT_GenerateAP::GeneratePopupAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Square") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::SQUARE) |
CPVT_GenerateAP::GenerateSquareAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Squiggly") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::SQUIGGLY) |
CPVT_GenerateAP::GenerateSquigglyAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "StrikeOut") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::STRIKEOUT) |
CPVT_GenerateAP::GenerateStrikeOutAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Text") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::TEXT) |
CPVT_GenerateAP::GenerateTextAP(m_pDocument, m_pAnnotDict); |
- else if (m_sSubtype == "Underline") |
+ else if (m_nSubtype == CPDF_Annot::Subtype::UNDERLINE) |
CPVT_GenerateAP::GenerateUnderlineAP(m_pDocument, m_pAnnotDict); |
} |
void CPDF_Annot::ClearCachedAP() { |
m_APMap.clear(); |
} |
-CFX_ByteString CPDF_Annot::GetSubtype() const { |
- return m_sSubtype; |
+ |
+CPDF_Annot::Subtype CPDF_Annot::GetSubtype() const { |
+ return m_nSubtype; |
} |
CFX_FloatRect CPDF_Annot::GetRect() const { |
@@ -148,6 +149,125 @@ bool CPDF_Annot::IsAnnotationHidden(CPDF_Dictionary* pAnnotDict) { |
return !!(pAnnotDict->GetIntegerBy("F") & ANNOTFLAG_HIDDEN); |
} |
+// Static. |
+CPDF_Annot::Subtype CPDF_Annot::StringToAnnotSubtype( |
+ const CFX_ByteString& sSubtype) { |
+ if (sSubtype == "Text") |
+ return CPDF_Annot::Subtype::TEXT; |
+ if (sSubtype == "Link") |
+ return CPDF_Annot::Subtype::LINK; |
+ if (sSubtype == "FreeText") |
+ return CPDF_Annot::Subtype::FREETEXT; |
+ if (sSubtype == "Line") |
+ return CPDF_Annot::Subtype::LINE; |
+ if (sSubtype == "Square") |
+ return CPDF_Annot::Subtype::SQUARE; |
+ if (sSubtype == "Circle") |
+ return CPDF_Annot::Subtype::CIRCLE; |
+ if (sSubtype == "Polygon") |
+ return CPDF_Annot::Subtype::POLYGON; |
+ if (sSubtype == "PolyLine") |
+ return CPDF_Annot::Subtype::POLYLINE; |
+ if (sSubtype == "Highlight") |
+ return CPDF_Annot::Subtype::HIGHLIGHT; |
+ if (sSubtype == "Underline") |
+ return CPDF_Annot::Subtype::UNDERLINE; |
+ if (sSubtype == "Squiggly") |
+ return CPDF_Annot::Subtype::SQUIGGLY; |
+ if (sSubtype == "StrikeOut") |
+ return CPDF_Annot::Subtype::STRIKEOUT; |
+ if (sSubtype == "Stamp") |
+ return CPDF_Annot::Subtype::STAMP; |
+ if (sSubtype == "Caret") |
+ return CPDF_Annot::Subtype::CARET; |
+ if (sSubtype == "Ink") |
+ return CPDF_Annot::Subtype::INK; |
+ if (sSubtype == "Popup") |
+ return CPDF_Annot::Subtype::POPUP; |
+ if (sSubtype == "FileAttachment") |
+ return CPDF_Annot::Subtype::FILEATTACHMENT; |
+ if (sSubtype == "Sound") |
+ return CPDF_Annot::Subtype::SOUND; |
+ if (sSubtype == "Movie") |
+ return CPDF_Annot::Subtype::MOVIE; |
+ if (sSubtype == "Widget") |
+ return CPDF_Annot::Subtype::WIDGET; |
+ if (sSubtype == "Screen") |
+ return CPDF_Annot::Subtype::SCREEN; |
+ if (sSubtype == "PrinterMark") |
+ return CPDF_Annot::Subtype::PRINTERMARK; |
+ if (sSubtype == "TrapNet") |
+ return CPDF_Annot::Subtype::TRAPNET; |
+ if (sSubtype == "Watermark") |
+ return CPDF_Annot::Subtype::WATERMARK; |
+ if (sSubtype == "3D") |
+ return CPDF_Annot::Subtype::THREED; |
+ if (sSubtype == "RichMedia") |
+ return CPDF_Annot::Subtype::RICHMEDIA; |
+ if (sSubtype == "XFAWidget") |
+ return CPDF_Annot::Subtype::XFAWIDGET; |
+ return CPDF_Annot::Subtype::UNKNOWN; |
+} |
+ |
+// Static. |
+CFX_ByteString CPDF_Annot::AnnotSubtypeToString(CPDF_Annot::Subtype nSubtype) { |
+ if (nSubtype == CPDF_Annot::Subtype::TEXT) |
+ return "Text"; |
+ if (nSubtype == CPDF_Annot::Subtype::LINK) |
+ return "Link"; |
+ if (nSubtype == CPDF_Annot::Subtype::FREETEXT) |
+ return "FreeText"; |
+ if (nSubtype == CPDF_Annot::Subtype::LINE) |
+ return "Line"; |
+ if (nSubtype == CPDF_Annot::Subtype::SQUARE) |
+ return "Square"; |
+ if (nSubtype == CPDF_Annot::Subtype::CIRCLE) |
+ return "Circle"; |
+ if (nSubtype == CPDF_Annot::Subtype::POLYGON) |
+ return "Polygon"; |
+ if (nSubtype == CPDF_Annot::Subtype::POLYLINE) |
+ return "PolyLine"; |
+ if (nSubtype == CPDF_Annot::Subtype::HIGHLIGHT) |
+ return "Highlight"; |
+ if (nSubtype == CPDF_Annot::Subtype::UNDERLINE) |
+ return "Underline"; |
+ if (nSubtype == CPDF_Annot::Subtype::SQUIGGLY) |
+ return "Squiggly"; |
+ if (nSubtype == CPDF_Annot::Subtype::STRIKEOUT) |
+ return "StrikeOut"; |
+ if (nSubtype == CPDF_Annot::Subtype::STAMP) |
+ return "Stamp"; |
+ if (nSubtype == CPDF_Annot::Subtype::CARET) |
+ return "Caret"; |
+ if (nSubtype == CPDF_Annot::Subtype::INK) |
+ return "Ink"; |
+ if (nSubtype == CPDF_Annot::Subtype::POPUP) |
+ return "Popup"; |
+ if (nSubtype == CPDF_Annot::Subtype::FILEATTACHMENT) |
+ return "FileAttachment"; |
+ if (nSubtype == CPDF_Annot::Subtype::SOUND) |
+ return "Sound"; |
+ if (nSubtype == CPDF_Annot::Subtype::MOVIE) |
+ return "Movie"; |
+ if (nSubtype == CPDF_Annot::Subtype::WIDGET) |
+ return "Widget"; |
+ if (nSubtype == CPDF_Annot::Subtype::SCREEN) |
+ return "Screen"; |
+ if (nSubtype == CPDF_Annot::Subtype::PRINTERMARK) |
+ return "PrinterMark"; |
+ if (nSubtype == CPDF_Annot::Subtype::TRAPNET) |
+ return "TrapNet"; |
+ if (nSubtype == CPDF_Annot::Subtype::WATERMARK) |
+ return "Watermark"; |
+ if (nSubtype == CPDF_Annot::Subtype::THREED) |
+ return "3D"; |
+ if (nSubtype == CPDF_Annot::Subtype::RICHMEDIA) |
+ return "RichMedia"; |
+ if (nSubtype == CPDF_Annot::Subtype::XFAWIDGET) |
+ return "XFAWidget"; |
+ return ""; |
+} |
+ |
FX_BOOL CPDF_Annot::DrawAppearance(CPDF_Page* pPage, |
CFX_RenderDevice* pDevice, |
const CFX_Matrix* pUser2Device, |
@@ -156,7 +276,7 @@ FX_BOOL CPDF_Annot::DrawAppearance(CPDF_Page* pPage, |
if (IsAnnotationHidden(m_pAnnotDict)) |
return FALSE; |
- if (m_sSubtype == "Popup" && !m_bOpenState) |
+ if (m_nSubtype == CPDF_Annot::Subtype::POPUP && !m_bOpenState) |
return FALSE; |
// It might happen that by the time this annotation instance was created, |
@@ -193,7 +313,7 @@ FX_BOOL CPDF_Annot::DrawInContext(const CPDF_Page* pPage, |
void CPDF_Annot::DrawBorder(CFX_RenderDevice* pDevice, |
const CFX_Matrix* pUser2Device, |
const CPDF_RenderOptions* pOptions) { |
- if (GetSubtype() == "Popup") |
+ if (GetSubtype() == CPDF_Annot::Subtype::POPUP) |
return; |
uint32_t annot_flags = GetFlags(); |