diff options
-rw-r--r-- | fpdfsdk/pdfwindow/cpwl_appstream.cpp | 91 | ||||
-rw-r--r-- | fpdfsdk/pdfwindow/cpwl_icon.cpp | 226 | ||||
-rw-r--r-- | fpdfsdk/pdfwindow/cpwl_icon.h | 47 |
3 files changed, 150 insertions, 214 deletions
diff --git a/fpdfsdk/pdfwindow/cpwl_appstream.cpp b/fpdfsdk/pdfwindow/cpwl_appstream.cpp index cf291e341d..f7b57365df 100644 --- a/fpdfsdk/pdfwindow/cpwl_appstream.cpp +++ b/fpdfsdk/pdfwindow/cpwl_appstream.cpp @@ -593,6 +593,53 @@ CFX_ByteString GetEditAppStream(CFX_Edit* pEdit, return CFX_ByteString(sAppStream); } +CFX_ByteString GenerateIconAppStream(CPDF_IconFit& fit, + CPDF_Stream* pIconStream, + const CFX_FloatRect& rcIcon) { + if (rcIcon.IsEmpty() || !pIconStream) + return CFX_ByteString(); + + CPWL_Icon icon; + PWL_CREATEPARAM cp; + cp.dwFlags = PWS_VISIBLE; + icon.Create(cp); + icon.SetIconFit(&fit); + icon.SetPDFStream(pIconStream); + icon.Move(rcIcon, false, false); + + CFX_ByteString sAlias = icon.GetImageAlias(); + if (sAlias.GetLength() <= 0) + return CFX_ByteString(); + + CFX_FloatRect rcPlate = icon.GetClientRect(); + CFX_Matrix mt = icon.GetImageMatrix().GetInverse(); + + float fHScale; + float fVScale; + std::tie(fHScale, fVScale) = icon.GetScale(); + + float fx; + float fy; + std::tie(fx, fy) = icon.GetImageOffset(); + + std::ostringstream str; + str << "q\n"; + str << rcPlate.left << " " << rcPlate.bottom << " " + << rcPlate.right - rcPlate.left << " " << rcPlate.top - rcPlate.bottom + << " re W n\n"; + + str << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx << " " + << rcPlate.bottom + fy << " cm\n"; + str << mt.a << " " << mt.b << " " << mt.c << " " << mt.d << " " << mt.e << " " + << mt.f << " cm\n"; + + str << "0 g 0 G 1 w /" << sAlias << " Do\n" + << "Q\n"; + icon.Destroy(); + + return CFX_ByteString(str); +} + CFX_ByteString GetPushButtonAppStream(const CFX_FloatRect& rcBBox, IPVT_FontMap* pFontMap, CPDF_Stream* pIconStream, @@ -756,54 +803,14 @@ CFX_ByteString GetPushButtonAppStream(const CFX_FloatRect& rcBBox, } std::ostringstream sTemp; - - if (!rcIcon.IsEmpty()) { - CPWL_Icon icon; - PWL_CREATEPARAM cp; - cp.dwFlags = PWS_VISIBLE; - icon.Create(cp); - icon.SetIconFit(&IconFit); - icon.SetPDFStream(pIconStream); - icon.Move(rcIcon, false, false); - - CFX_ByteString sAlias = icon.GetImageAlias(); - if (sAlias.GetLength() > 0) { - CFX_FloatRect rcPlate = icon.GetClientRect(); - CFX_Matrix mt = icon.GetImageMatrix().GetInverse(); - - float fHScale = 1.0f; - float fVScale = 1.0f; - icon.GetScale(fHScale, fVScale); - - float fx = 0.0f; - float fy = 0.0f; - icon.GetImageOffset(fx, fy); - - if (icon.GetPDFStream()) { - sTemp << "q\n"; - sTemp << rcPlate.left << " " << rcPlate.bottom << " " - << rcPlate.right - rcPlate.left << " " - << rcPlate.top - rcPlate.bottom << " re W n\n"; - - sTemp << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx - << " " << rcPlate.bottom + fy << " cm\n"; - sTemp << mt.a << " " << mt.b << " " << mt.c << " " << mt.d << " " - << mt.e << " " << mt.f << " cm\n"; - - sTemp << "0 g 0 G 1 w /" << sAlias << " Do\n" - << "Q\n"; - } - } - icon.Destroy(); - } + sTemp << GenerateIconAppStream(IconFit, pIconStream, rcIcon); if (!rcLabel.IsEmpty()) { pEdit->SetPlateRect(rcLabel); CFX_ByteString sEdit = GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, 0.0f), true, 0); - if (sEdit.GetLength() > 0) { + if (sEdit.GetLength() > 0) sTemp << "BT\n" << GetColorAppStream(crText, true) << sEdit << "ET\n"; - } } if (sTemp.tellp() <= 0) diff --git a/fpdfsdk/pdfwindow/cpwl_icon.cpp b/fpdfsdk/pdfwindow/cpwl_icon.cpp index d2f2e5fb93..4de3e7080d 100644 --- a/fpdfsdk/pdfwindow/cpwl_icon.cpp +++ b/fpdfsdk/pdfwindow/cpwl_icon.cpp @@ -13,179 +13,119 @@ #include "core/fpdfapi/parser/cpdf_stream.h" #include "fpdfsdk/pdfwindow/cpwl_wnd.h" -CPWL_Image::CPWL_Image() : m_pPDFStream(nullptr) {} +CPWL_Icon::CPWL_Icon() : m_pPDFStream(nullptr), m_pIconFit(nullptr) {} -CPWL_Image::~CPWL_Image() {} - -void CPWL_Image::SetPDFStream(CPDF_Stream* pStream) { - m_pPDFStream = pStream; -} - -CPDF_Stream* CPWL_Image::GetPDFStream() const { - return m_pPDFStream.Get(); -} +CPWL_Icon::~CPWL_Icon() {} -void CPWL_Image::GetImageSize(float& fWidth, float& fHeight) { - fWidth = 0.0f; - fHeight = 0.0f; +std::pair<float, float> CPWL_Icon::GetImageSize() { + if (!m_pPDFStream) + return {0.0f, 0.0f}; - if (m_pPDFStream) { - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { - CFX_FloatRect rect = pDict->GetRectFor("BBox"); + CPDF_Dictionary* pDict = m_pPDFStream->GetDict(); + if (!pDict) + return {0.0f, 0.0f}; - fWidth = rect.right - rect.left; - fHeight = rect.top - rect.bottom; - } - } + CFX_FloatRect rect = pDict->GetRectFor("BBox"); + return {rect.right - rect.left, rect.top - rect.bottom}; } -CFX_Matrix CPWL_Image::GetImageMatrix() { - if (m_pPDFStream) { - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { - return pDict->GetMatrixFor("Matrix"); - } - } - +CFX_Matrix CPWL_Icon::GetImageMatrix() { + if (!m_pPDFStream) + return CFX_Matrix(); + if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) + return pDict->GetMatrixFor("Matrix"); return CFX_Matrix(); } -CFX_ByteString CPWL_Image::GetImageAlias() { - if (!m_sImageAlias.IsEmpty()) - return m_sImageAlias; - - if (m_pPDFStream) { - if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) { - return pDict->GetStringFor("Name"); - } - } - +CFX_ByteString CPWL_Icon::GetImageAlias() { + if (!m_pPDFStream) + return CFX_ByteString(); + if (CPDF_Dictionary* pDict = m_pPDFStream->GetDict()) + return pDict->GetStringFor("Name"); return CFX_ByteString(); } -void CPWL_Image::SetImageAlias(const char* sImageAlias) { - m_sImageAlias = sImageAlias; -} - -void CPWL_Image::GetScale(float& fHScale, float& fVScale) { - fHScale = 1.0f; - fVScale = 1.0f; -} - -void CPWL_Image::GetImageOffset(float& x, float& y) { - x = 0.0f; - y = 0.0f; -} - -CPWL_Icon::CPWL_Icon() : m_pIconFit(nullptr) {} - -CPWL_Icon::~CPWL_Icon() {} - -CPDF_IconFit* CPWL_Icon::GetIconFit() const { - return m_pIconFit.Get(); -} - -int32_t CPWL_Icon::GetScaleMethod() { - if (m_pIconFit) - return m_pIconFit->GetScaleMethod(); +std::pair<float, float> CPWL_Icon::GetIconPosition() { + if (!m_pIconFit) + return {0.0f, 0.0f}; - return 0; -} + CPDF_Array* pA = + m_pIconFit->GetDict() ? m_pIconFit->GetDict()->GetArrayFor("A") : nullptr; + if (!pA) + return {0.0f, 0.0f}; -bool CPWL_Icon::IsProportionalScale() { - if (m_pIconFit) - return m_pIconFit->IsProportionalScale(); - - return false; -} - -void CPWL_Icon::GetIconPosition(float& fLeft, float& fBottom) { - if (m_pIconFit) { - fLeft = 0.0f; - fBottom = 0.0f; - CPDF_Array* pA = m_pIconFit->GetDict() - ? m_pIconFit->GetDict()->GetArrayFor("A") - : nullptr; - if (pA) { - size_t dwCount = pA->GetCount(); - if (dwCount > 0) - fLeft = pA->GetNumberAt(0); - if (dwCount > 1) - fBottom = pA->GetNumberAt(1); - } - } else { - fLeft = 0.0f; - fBottom = 0.0f; - } + size_t dwCount = pA->GetCount(); + return {dwCount > 0 ? pA->GetNumberAt(0) : 0.0f, + dwCount > 1 ? pA->GetNumberAt(1) : 0.0f}; } -void CPWL_Icon::GetScale(float& fHScale, float& fVScale) { - fHScale = 1.0f; - fVScale = 1.0f; +std::pair<float, float> CPWL_Icon::GetScale() { + float fHScale = 1.0f; + float fVScale = 1.0f; - if (m_pPDFStream) { - float fImageWidth, fImageHeight; - float fPlateWidth, fPlateHeight; + if (!m_pPDFStream) + return {fHScale, fVScale}; - CFX_FloatRect rcPlate = GetClientRect(); - fPlateWidth = rcPlate.right - rcPlate.left; - fPlateHeight = rcPlate.top - rcPlate.bottom; - - GetImageSize(fImageWidth, fImageHeight); - - int32_t nScaleMethod = GetScaleMethod(); - - switch (nScaleMethod) { - default: - case 0: + CFX_FloatRect rcPlate = GetClientRect(); + float fPlateWidth = rcPlate.right - rcPlate.left; + float fPlateHeight = rcPlate.top - rcPlate.bottom; + + float fImageWidth; + float fImageHeight; + std::tie(fImageWidth, fImageHeight) = GetImageSize(); + + int32_t nScaleMethod = m_pIconFit ? m_pIconFit->GetScaleMethod() : 0; + + switch (nScaleMethod) { + default: + case 0: + fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); + fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); + break; + case 1: + if (fPlateWidth < fImageWidth) fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); + if (fPlateHeight < fImageHeight) fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); - break; - case 1: - if (fPlateWidth < fImageWidth) - fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); - if (fPlateHeight < fImageHeight) - fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); - break; - case 2: - if (fPlateWidth > fImageWidth) - fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); - if (fPlateHeight > fImageHeight) - fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); - break; - case 3: - break; - } - - float fMinScale; - if (IsProportionalScale()) { - fMinScale = std::min(fHScale, fVScale); - fHScale = fMinScale; - fVScale = fMinScale; - } + break; + case 2: + if (fPlateWidth > fImageWidth) + fHScale = fPlateWidth / std::max(fImageWidth, 1.0f); + if (fPlateHeight > fImageHeight) + fVScale = fPlateHeight / std::max(fImageHeight, 1.0f); + break; + case 3: + break; } -} -void CPWL_Icon::GetImageOffset(float& x, float& y) { - float fLeft, fBottom; + float fMinScale; + if (m_pIconFit && m_pIconFit->IsProportionalScale()) { + fMinScale = std::min(fHScale, fVScale); + fHScale = fMinScale; + fVScale = fMinScale; + } + return {fHScale, fVScale}; +} - GetIconPosition(fLeft, fBottom); - x = 0.0f; - y = 0.0f; +std::pair<float, float> CPWL_Icon::GetImageOffset() { + float fLeft; + float fBottom; + std::tie(fLeft, fBottom) = GetIconPosition(); - float fImageWidth, fImageHeight; - GetImageSize(fImageWidth, fImageHeight); + float fImageWidth; + float fImageHeight; + std::tie(fImageWidth, fImageHeight) = GetImageSize(); float fHScale, fVScale; - GetScale(fHScale, fVScale); + std::tie(fHScale, fVScale) = GetScale(); float fImageFactWidth = fImageWidth * fHScale; float fImageFactHeight = fImageHeight * fVScale; - float fPlateWidth, fPlateHeight; CFX_FloatRect rcPlate = GetClientRect(); - fPlateWidth = rcPlate.right - rcPlate.left; - fPlateHeight = rcPlate.top - rcPlate.bottom; + float fPlateWidth = rcPlate.right - rcPlate.left; + float fPlateHeight = rcPlate.top - rcPlate.bottom; - x = (fPlateWidth - fImageFactWidth) * fLeft; - y = (fPlateHeight - fImageFactHeight) * fBottom; + return {(fPlateWidth - fImageFactWidth) * fLeft, + (fPlateHeight - fImageFactHeight) * fBottom}; } diff --git a/fpdfsdk/pdfwindow/cpwl_icon.h b/fpdfsdk/pdfwindow/cpwl_icon.h index 0b82a4b5d6..e97c540bf6 100644 --- a/fpdfsdk/pdfwindow/cpwl_icon.h +++ b/fpdfsdk/pdfwindow/cpwl_icon.h @@ -7,48 +7,37 @@ #ifndef FPDFSDK_PDFWINDOW_CPWL_ICON_H_ #define FPDFSDK_PDFWINDOW_CPWL_ICON_H_ +#include <utility> + #include "core/fxcrt/cfx_unowned_ptr.h" #include "core/fxcrt/fx_string.h" #include "fpdfsdk/pdfwindow/cpwl_wnd.h" -class CPWL_Image : public CPWL_Wnd { - public: - CPWL_Image(); - ~CPWL_Image() override; - - virtual void GetScale(float& fHScale, float& fVScale); - virtual void GetImageOffset(float& x, float& y); - - CPDF_Stream* GetPDFStream() const; - void SetPDFStream(CPDF_Stream* pStream); - void GetImageSize(float& fWidth, float& fHeight); - CFX_Matrix GetImageMatrix(); - CFX_ByteString GetImageAlias(); - void SetImageAlias(const char* sImageAlias); - - protected: - CFX_UnownedPtr<CPDF_Stream> m_pPDFStream; - CFX_ByteString m_sImageAlias; -}; - -class CPWL_Icon : public CPWL_Image { +class CPWL_Icon : public CPWL_Wnd { public: CPWL_Icon(); ~CPWL_Icon() override; - CPDF_IconFit* GetIconFit() const; + void SetIconFit(CPDF_IconFit* pIconFit) { m_pIconFit = pIconFit; } + void SetPDFStream(CPDF_Stream* pStream) { m_pPDFStream = pStream; } - // CPWL_Image - void GetScale(float& fHScale, float& fVScale) override; - void GetImageOffset(float& x, float& y) override; + // horizontal scale, vertical scale + std::pair<float, float> GetScale(); - int32_t GetScaleMethod(); - bool IsProportionalScale(); - void GetIconPosition(float& fLeft, float& fBottom); + // x, y + std::pair<float, float> GetImageOffset(); - void SetIconFit(CPDF_IconFit* pIconFit) { m_pIconFit = pIconFit; } + CFX_Matrix GetImageMatrix(); + CFX_ByteString GetImageAlias(); private: + // left, bottom + std::pair<float, float> GetIconPosition(); + + // width, height + std::pair<float, float> GetImageSize(); + + CFX_UnownedPtr<CPDF_Stream> m_pPDFStream; CFX_UnownedPtr<CPDF_IconFit> m_pIconFit; }; |