diff options
Diffstat (limited to 'fpdfsdk/pdfwindow/cpwl_icon.cpp')
-rw-r--r-- | fpdfsdk/pdfwindow/cpwl_icon.cpp | 226 |
1 files changed, 83 insertions, 143 deletions
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}; } |