diff options
Diffstat (limited to 'fpdfsdk/src/pdfwindow/PWL_Icon.cpp')
-rw-r--r-- | fpdfsdk/src/pdfwindow/PWL_Icon.cpp | 544 |
1 files changed, 272 insertions, 272 deletions
diff --git a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp index a859a52de7..b85b845553 100644 --- a/fpdfsdk/src/pdfwindow/PWL_Icon.cpp +++ b/fpdfsdk/src/pdfwindow/PWL_Icon.cpp @@ -1,272 +1,272 @@ -// 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/pdfwindow/PDFWindow.h"
-#include "../../include/pdfwindow/PWL_Wnd.h"
-#include "../../include/pdfwindow/PWL_Icon.h"
-#include "../../include/pdfwindow/PWL_Utils.h"
-
-/* ------------------------------- CPWL_Image ---------------------------------- */
-
-CPWL_Image::CPWL_Image() : m_pPDFStream(NULL)
-{
-}
-
-CPWL_Image::~CPWL_Image()
-{
-}
-
-CFX_ByteString CPWL_Image::GetImageAppStream()
-{
- CFX_ByteTextBuf sAppStream;
-
- CFX_ByteString sAlias = this->GetImageAlias();
- CPDF_Rect rcPlate = GetClientRect();
- CPDF_Matrix mt;
- mt.SetReverse(GetImageMatrix());
-
- FX_FLOAT fHScale = 1.0f;
- FX_FLOAT fVScale = 1.0f;
- GetScale(fHScale,fVScale);
-
- FX_FLOAT fx = 0.0f;
- FX_FLOAT fy = 0.0f;
- GetImageOffset(fx,fy);
-
- if (m_pPDFStream && sAlias.GetLength()>0)
- {
- sAppStream << "q\n";
- sAppStream << rcPlate.left << " " << rcPlate.bottom << " "
- << rcPlate.right - rcPlate.left << " " << rcPlate.top - rcPlate.bottom << " re W n\n";
-
- sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx << " " << rcPlate.bottom + fy << " cm\n";
- sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " " << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n";
-
- sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n" << "Q\n";
- }
-
- return sAppStream.GetByteString();
-}
-
-void CPWL_Image::SetPDFStream(CPDF_Stream * pStream)
-{
- m_pPDFStream = pStream;
-}
-
-CPDF_Stream * CPWL_Image::GetPDFStream()
-{
- return this->m_pPDFStream;
-}
-
-void CPWL_Image::GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight)
-{
- fWidth = 0.0f;
- fHeight = 0.0f;
-
- if (m_pPDFStream)
- {
- if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
- {
- CPDF_Rect rect = pDict->GetRect("BBox");
-
- fWidth = rect.right - rect.left;
- fHeight = rect.top - rect.bottom;
- }
- }
-}
-
-CPDF_Matrix CPWL_Image::GetImageMatrix()
-{
- if (m_pPDFStream)
- {
- if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
- {
- return pDict->GetMatrix("Matrix");
- }
- }
-
- return CPDF_Matrix();
-}
-
-CFX_ByteString CPWL_Image::GetImageAlias()
-{
- if (m_sImageAlias.IsEmpty())
- {
- if (m_pPDFStream)
- {
- if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict())
- {
- return pDict->GetString("Name");
- }
- }
- }
- else
- return m_sImageAlias;
-
- return CFX_ByteString();
-}
-
-void CPWL_Image::SetImageAlias(FX_LPCSTR sImageAlias)
-{
- m_sImageAlias = sImageAlias;
-}
-
-void CPWL_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
-{
- fHScale = 1.0f;
- fVScale = 1.0f;
-}
-
-
-void CPWL_Image::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)
-{
- x = 0.0f;
- y = 0.0f;
-}
-
-/* ------------------------------- CPWL_Icon ---------------------------------- */
-
-CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL)
-{
-}
-
-CPWL_Icon::~CPWL_Icon()
-{
-}
-
-FX_INT32 CPWL_Icon::GetScaleMethod()
-{
- if (m_pIconFit)
- return m_pIconFit->GetScaleMethod();
-
- return 0;
-}
-
-FX_BOOL CPWL_Icon::IsProportionalScale()
-{
- if (m_pIconFit)
- return m_pIconFit->IsProportionalScale();
-
- return FALSE;
-}
-
-void CPWL_Icon::GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom)
-{
- if (m_pIconFit)
- {
- //m_pIconFit->GetIconPosition(fLeft,fBottom);
- fLeft = 0.0f;
- fBottom = 0.0f;
- CPDF_Array* pA = m_pIconFit->m_pDict->GetArray("A");
- if (pA != NULL)
- {
- FX_DWORD dwCount = pA->GetCount();
- if (dwCount > 0) fLeft = pA->GetNumber(0);
- if (dwCount > 1) fBottom = pA->GetNumber(1);
- }
- }
- else
- {
- fLeft = 0.0f;
- fBottom = 0.0f;
- }
-}
-
-FX_BOOL CPWL_Icon::GetFittingBounds()
-{
- if (m_pIconFit)
- return m_pIconFit->GetFittingBounds();
-
- return FALSE;
-}
-
-void CPWL_Icon::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale)
-{
- fHScale = 1.0f;
- fVScale = 1.0f;
-
- if (m_pPDFStream)
- {
- FX_FLOAT fImageWidth,fImageHeight;
- FX_FLOAT fPlateWidth,fPlateHeight;
-
- CPDF_Rect rcPlate = this->GetClientRect();
- fPlateWidth = rcPlate.right - rcPlate.left;
- fPlateHeight = rcPlate.top - rcPlate.bottom;
-
- GetImageSize(fImageWidth,fImageHeight);
-
- FX_INT32 nScaleMethod = this->GetScaleMethod();
-
- /*
- enum ScaleMethod
- {
- Always = 0, //A, Always scale
- Bigger, //B, Scale only when the icon is bigger than the annotation rectangle
- Smaller, //S, Scale only when the icon is smaller then the annotation rectangle
- Never //N, Never scale
- };
- */
-
- switch (nScaleMethod)
- {
- default:
- case 0:
- fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
- fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
- break;
- case 1:
- if (fPlateWidth < fImageWidth)
- fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
- if (fPlateHeight < fImageHeight)
- fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
- break;
- case 2:
- if (fPlateWidth > fImageWidth)
- fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f);
- if (fPlateHeight > fImageHeight)
- fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f);
- break;
- case 3:
- break;
- }
-
- FX_FLOAT fMinScale;
- if (IsProportionalScale())
- {
- fMinScale = PWL_MIN(fHScale,fVScale);
- fHScale = fMinScale;
- fVScale = fMinScale;
- }
- }
-}
-
-void CPWL_Icon::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y)
-{
- FX_FLOAT fLeft,fBottom;
-
- this->GetIconPosition(fLeft,fBottom);
- x = 0.0f;
- y = 0.0f;
-
- FX_FLOAT fImageWidth,fImageHeight;
- GetImageSize(fImageWidth,fImageHeight);
-
- FX_FLOAT fHScale,fVScale;
- GetScale(fHScale,fVScale);
-
- FX_FLOAT fImageFactWidth = fImageWidth * fHScale;
- FX_FLOAT fImageFactHeight = fImageHeight * fVScale;
-
- FX_FLOAT fPlateWidth,fPlateHeight;
- CPDF_Rect rcPlate = this->GetClientRect();
- fPlateWidth = rcPlate.right - rcPlate.left;
- fPlateHeight = rcPlate.top - rcPlate.bottom;
-
- x = (fPlateWidth - fImageFactWidth) * fLeft;
- y = (fPlateHeight - fImageFactHeight) * fBottom;
-}
-
+// 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/pdfwindow/PDFWindow.h" +#include "../../include/pdfwindow/PWL_Wnd.h" +#include "../../include/pdfwindow/PWL_Icon.h" +#include "../../include/pdfwindow/PWL_Utils.h" + +/* ------------------------------- CPWL_Image ---------------------------------- */ + +CPWL_Image::CPWL_Image() : m_pPDFStream(NULL) +{ +} + +CPWL_Image::~CPWL_Image() +{ +} + +CFX_ByteString CPWL_Image::GetImageAppStream() +{ + CFX_ByteTextBuf sAppStream; + + CFX_ByteString sAlias = this->GetImageAlias(); + CPDF_Rect rcPlate = GetClientRect(); + CPDF_Matrix mt; + mt.SetReverse(GetImageMatrix()); + + FX_FLOAT fHScale = 1.0f; + FX_FLOAT fVScale = 1.0f; + GetScale(fHScale,fVScale); + + FX_FLOAT fx = 0.0f; + FX_FLOAT fy = 0.0f; + GetImageOffset(fx,fy); + + if (m_pPDFStream && sAlias.GetLength()>0) + { + sAppStream << "q\n"; + sAppStream << rcPlate.left << " " << rcPlate.bottom << " " + << rcPlate.right - rcPlate.left << " " << rcPlate.top - rcPlate.bottom << " re W n\n"; + + sAppStream << fHScale << " 0 0 " << fVScale << " " << rcPlate.left + fx << " " << rcPlate.bottom + fy << " cm\n"; + sAppStream << mt.GetA() << " " << mt.GetB() << " " << mt.GetC() << " " << mt.GetD() << " " << mt.GetE() << " " << mt.GetF() << " cm\n"; + + sAppStream << "0 g 0 G 1 w /" << sAlias << " Do\n" << "Q\n"; + } + + return sAppStream.GetByteString(); +} + +void CPWL_Image::SetPDFStream(CPDF_Stream * pStream) +{ + m_pPDFStream = pStream; +} + +CPDF_Stream * CPWL_Image::GetPDFStream() +{ + return this->m_pPDFStream; +} + +void CPWL_Image::GetImageSize(FX_FLOAT & fWidth,FX_FLOAT & fHeight) +{ + fWidth = 0.0f; + fHeight = 0.0f; + + if (m_pPDFStream) + { + if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict()) + { + CPDF_Rect rect = pDict->GetRect("BBox"); + + fWidth = rect.right - rect.left; + fHeight = rect.top - rect.bottom; + } + } +} + +CPDF_Matrix CPWL_Image::GetImageMatrix() +{ + if (m_pPDFStream) + { + if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict()) + { + return pDict->GetMatrix("Matrix"); + } + } + + return CPDF_Matrix(); +} + +CFX_ByteString CPWL_Image::GetImageAlias() +{ + if (m_sImageAlias.IsEmpty()) + { + if (m_pPDFStream) + { + if (CPDF_Dictionary * pDict = m_pPDFStream->GetDict()) + { + return pDict->GetString("Name"); + } + } + } + else + return m_sImageAlias; + + return CFX_ByteString(); +} + +void CPWL_Image::SetImageAlias(FX_LPCSTR sImageAlias) +{ + m_sImageAlias = sImageAlias; +} + +void CPWL_Image::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale) +{ + fHScale = 1.0f; + fVScale = 1.0f; +} + + +void CPWL_Image::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y) +{ + x = 0.0f; + y = 0.0f; +} + +/* ------------------------------- CPWL_Icon ---------------------------------- */ + +CPWL_Icon::CPWL_Icon() : m_pIconFit(NULL) +{ +} + +CPWL_Icon::~CPWL_Icon() +{ +} + +FX_INT32 CPWL_Icon::GetScaleMethod() +{ + if (m_pIconFit) + return m_pIconFit->GetScaleMethod(); + + return 0; +} + +FX_BOOL CPWL_Icon::IsProportionalScale() +{ + if (m_pIconFit) + return m_pIconFit->IsProportionalScale(); + + return FALSE; +} + +void CPWL_Icon::GetIconPosition(FX_FLOAT & fLeft, FX_FLOAT & fBottom) +{ + if (m_pIconFit) + { + //m_pIconFit->GetIconPosition(fLeft,fBottom); + fLeft = 0.0f; + fBottom = 0.0f; + CPDF_Array* pA = m_pIconFit->m_pDict->GetArray("A"); + if (pA != NULL) + { + FX_DWORD dwCount = pA->GetCount(); + if (dwCount > 0) fLeft = pA->GetNumber(0); + if (dwCount > 1) fBottom = pA->GetNumber(1); + } + } + else + { + fLeft = 0.0f; + fBottom = 0.0f; + } +} + +FX_BOOL CPWL_Icon::GetFittingBounds() +{ + if (m_pIconFit) + return m_pIconFit->GetFittingBounds(); + + return FALSE; +} + +void CPWL_Icon::GetScale(FX_FLOAT & fHScale,FX_FLOAT & fVScale) +{ + fHScale = 1.0f; + fVScale = 1.0f; + + if (m_pPDFStream) + { + FX_FLOAT fImageWidth,fImageHeight; + FX_FLOAT fPlateWidth,fPlateHeight; + + CPDF_Rect rcPlate = this->GetClientRect(); + fPlateWidth = rcPlate.right - rcPlate.left; + fPlateHeight = rcPlate.top - rcPlate.bottom; + + GetImageSize(fImageWidth,fImageHeight); + + FX_INT32 nScaleMethod = this->GetScaleMethod(); + + /* + enum ScaleMethod + { + Always = 0, //A, Always scale + Bigger, //B, Scale only when the icon is bigger than the annotation rectangle + Smaller, //S, Scale only when the icon is smaller then the annotation rectangle + Never //N, Never scale + }; + */ + + switch (nScaleMethod) + { + default: + case 0: + fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f); + fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f); + break; + case 1: + if (fPlateWidth < fImageWidth) + fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f); + if (fPlateHeight < fImageHeight) + fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f); + break; + case 2: + if (fPlateWidth > fImageWidth) + fHScale = fPlateWidth / PWL_MAX(fImageWidth,1.0f); + if (fPlateHeight > fImageHeight) + fVScale = fPlateHeight / PWL_MAX(fImageHeight,1.0f); + break; + case 3: + break; + } + + FX_FLOAT fMinScale; + if (IsProportionalScale()) + { + fMinScale = PWL_MIN(fHScale,fVScale); + fHScale = fMinScale; + fVScale = fMinScale; + } + } +} + +void CPWL_Icon::GetImageOffset(FX_FLOAT & x,FX_FLOAT & y) +{ + FX_FLOAT fLeft,fBottom; + + this->GetIconPosition(fLeft,fBottom); + x = 0.0f; + y = 0.0f; + + FX_FLOAT fImageWidth,fImageHeight; + GetImageSize(fImageWidth,fImageHeight); + + FX_FLOAT fHScale,fVScale; + GetScale(fHScale,fVScale); + + FX_FLOAT fImageFactWidth = fImageWidth * fHScale; + FX_FLOAT fImageFactHeight = fImageHeight * fVScale; + + FX_FLOAT fPlateWidth,fPlateHeight; + CPDF_Rect rcPlate = this->GetClientRect(); + fPlateWidth = rcPlate.right - rcPlate.left; + fPlateHeight = rcPlate.top - rcPlate.bottom; + + x = (fPlateWidth - fImageFactWidth) * fLeft; + y = (fPlateHeight - fImageFactHeight) * fBottom; +} + |