Chromium Code Reviews| Index: core/fpdfapi/fpdf_page/cpdf_generalstate.cpp |
| diff --git a/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp b/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp |
| index 5e6fb7434d3da06e00b6db7b0831de4101c6237c..4905c1f00757706f2d788d27996d847412860124 100644 |
| --- a/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp |
| +++ b/core/fpdfapi/fpdf_page/cpdf_generalstate.cpp |
| @@ -6,6 +6,9 @@ |
| #include "core/fpdfapi/fpdf_page/include/cpdf_generalstate.h" |
| +#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
| +#include "core/fpdfapi/fpdf_render/render_int.h" |
| + |
| namespace { |
| int RI_StringToId(const CFX_ByteString& ri) { |
| @@ -22,6 +25,45 @@ int RI_StringToId(const CFX_ByteString& ri) { |
| return 0; |
| } |
| +static int GetBlendTypeInternal(const CFX_ByteStringC& mode) { |
| + switch (mode.GetID()) { |
| + case FXBSTR_ID('N', 'o', 'r', 'm'): |
| + case FXBSTR_ID('C', 'o', 'm', 'p'): |
| + return FXDIB_BLEND_NORMAL; |
| + case FXBSTR_ID('M', 'u', 'l', 't'): |
| + return FXDIB_BLEND_MULTIPLY; |
| + case FXBSTR_ID('S', 'c', 'r', 'e'): |
| + return FXDIB_BLEND_SCREEN; |
| + case FXBSTR_ID('O', 'v', 'e', 'r'): |
| + return FXDIB_BLEND_OVERLAY; |
| + case FXBSTR_ID('D', 'a', 'r', 'k'): |
| + return FXDIB_BLEND_DARKEN; |
| + case FXBSTR_ID('L', 'i', 'g', 'h'): |
| + return FXDIB_BLEND_LIGHTEN; |
| + case FXBSTR_ID('C', 'o', 'l', 'o'): |
| + if (mode.GetLength() == 10) |
| + return FXDIB_BLEND_COLORDODGE; |
| + if (mode.GetLength() == 9) |
| + return FXDIB_BLEND_COLORBURN; |
| + return FXDIB_BLEND_COLOR; |
| + case FXBSTR_ID('H', 'a', 'r', 'd'): |
| + return FXDIB_BLEND_HARDLIGHT; |
| + case FXBSTR_ID('S', 'o', 'f', 't'): |
| + return FXDIB_BLEND_SOFTLIGHT; |
| + case FXBSTR_ID('D', 'i', 'f', 'f'): |
| + return FXDIB_BLEND_DIFFERENCE; |
| + case FXBSTR_ID('E', 'x', 'c', 'l'): |
| + return FXDIB_BLEND_EXCLUSION; |
| + case FXBSTR_ID('H', 'u', 'e', 0): |
| + return FXDIB_BLEND_HUE; |
| + case FXBSTR_ID('S', 'a', 't', 'u'): |
| + return FXDIB_BLEND_SATURATION; |
| + case FXBSTR_ID('L', 'u', 'm', 'i'): |
| + return FXDIB_BLEND_LUMINOSITY; |
| + } |
| + return FXDIB_BLEND_NORMAL; |
| +} |
| + |
| } // namespace |
| CPDF_GeneralState::CPDF_GeneralState() {} |
| @@ -31,6 +73,180 @@ CPDF_GeneralState::CPDF_GeneralState(const CPDF_GeneralState& that) |
| CPDF_GeneralState::~CPDF_GeneralState() {} |
| +int CPDF_GeneralState::GetBlendType() const { |
| + const StateData* pData = m_Ref.GetObject(); |
| + return pData ? pData->m_BlendType : FXDIB_BLEND_NORMAL; |
| +} |
| + |
| +void CPDF_GeneralState::SetBlendType(int type) { |
| + m_Ref.GetPrivateCopy()->m_BlendType = type; |
| +} |
| + |
| +int CPDF_GeneralState::GetFillAlpha() const { |
| + const StateData* pData = m_Ref.GetObject(); |
| + return pData ? FXSYS_round(255 * pData->m_FillAlpha) : 255; |
| +} |
| + |
| +int CPDF_GeneralState::GetStrokeAlpha() const { |
| + const StateData* pData = m_Ref.GetObject(); |
| + return pData ? FXSYS_round(255 * pData->m_StrokeAlpha) : 255; |
| +} |
| + |
| +void CPDF_GeneralState::SetSoftMask(CPDF_Object* pObject) { |
| + m_Ref.GetPrivateCopy()->m_pSoftMask = pObject; |
| +} |
| + |
| +CPDF_Object* CPDF_GeneralState::GetSoftMask() const { |
| + const StateData* pData = m_Ref.GetObject(); |
| + return pData ? pData->m_pSoftMask : nullptr; |
| +} |
| + |
| +void CPDF_GeneralState::SetTR(CPDF_Object* pObject) { |
| + m_Ref.GetPrivateCopy()->m_pTR = pObject; |
| +} |
| + |
| +CPDF_Object* CPDF_GeneralState::GetTR() const { |
| + return m_Ref.GetObject()->m_pTR; |
| +} |
| + |
| +void CPDF_GeneralState::SetTransferFunc(CPDF_TransferFunc* pFunc) { |
| + m_Ref.GetPrivateCopy()->m_pTransferFunc = pFunc; |
| +} |
| + |
| +CPDF_TransferFunc* CPDF_GeneralState::GetTransferFunc() const { |
| + return m_Ref.GetObject()->m_pTransferFunc; |
| +} |
| + |
| +void CPDF_GeneralState::SetBlendMode(const CFX_ByteStringC& mode) { |
| + m_Ref.GetPrivateCopy()->SetBlendMode(mode); |
| +} |
| + |
| +const FX_FLOAT* CPDF_GeneralState::GetSMaskMatrix() const { |
| + return m_Ref.GetObject()->m_SMaskMatrix; |
| +} |
| + |
| +FX_FLOAT* CPDF_GeneralState::GetMutableSMaskMatrix() { |
| + return m_Ref.GetPrivateCopy()->m_SMaskMatrix; |
| +} |
| + |
| +void CPDF_GeneralState::SetStrokeAlpha(FX_FLOAT alpha) { |
| + m_Ref.GetPrivateCopy()->m_StrokeAlpha = alpha; |
| +} |
| + |
| +void CPDF_GeneralState::SetFillAlpha(FX_FLOAT alpha) { |
| + m_Ref.GetPrivateCopy()->m_FillAlpha = alpha; |
| +} |
| + |
| +void CPDF_GeneralState::SetFillOP(int op) { |
| + m_Ref.GetPrivateCopy()->m_FillOP = op; |
| +} |
| + |
| +int CPDF_GeneralState::GetFillOP() const { |
| + return m_Ref.GetObject()->m_FillOP; |
| +} |
| + |
| +void CPDF_GeneralState::SetStrokeOP(int op) { |
| + m_Ref.GetPrivateCopy()->m_StrokeOP = op; |
| +} |
| + |
| +int CPDF_GeneralState::GetStrokeOP() const { |
| + return m_Ref.GetObject()->m_StrokeOP; |
| +} |
| + |
| +void CPDF_GeneralState::SetOPMode(int mode) { |
| + m_Ref.GetPrivateCopy()->m_OPMode = mode; |
| +} |
| + |
| +int CPDF_GeneralState::GetOPMode() const { |
| + return m_Ref.GetObject()->m_OPMode; |
| +} |
| + |
| +void CPDF_GeneralState::SetBG(CPDF_Object* pObject) { |
| + m_Ref.GetPrivateCopy()->m_pBG = pObject; |
| +} |
| + |
| +void CPDF_GeneralState::SetUCR(CPDF_Object* pObject) { |
| + m_Ref.GetPrivateCopy()->m_pUCR = pObject; |
| +} |
| + |
| +void CPDF_GeneralState::SetHT(CPDF_Object* pObject) { |
| + m_Ref.GetPrivateCopy()->m_pHT = pObject; |
| +} |
| + |
| +void CPDF_GeneralState::SetFlatness(FX_FLOAT flatness) { |
| + m_Ref.GetPrivateCopy()->m_Flatness = flatness; |
| +} |
| + |
| +void CPDF_GeneralState::SetSmoothness(FX_FLOAT smoothness) { |
| + m_Ref.GetPrivateCopy()->m_Smoothness = smoothness; |
| +} |
| + |
| +void CPDF_GeneralState::SetStrokeAdjust(FX_FLOAT adjust) { |
| + m_Ref.GetPrivateCopy()->m_StrokeAdjust = adjust; |
| +} |
| + |
| +FX_FLOAT CPDF_GeneralState::GetStrokeAdjust() const { |
| + return m_Ref.GetObject()->m_StrokeAdjust; |
| +} |
| + |
| +void CPDF_GeneralState::SetAlphaSource(int source) { |
| + m_Ref.GetPrivateCopy()->m_AlphaSource = source; |
| +} |
| + |
| +void CPDF_GeneralState::SetTextKnockout(int knockout) { |
| + m_Ref.GetPrivateCopy()->m_TextKnockout = knockout; |
| +} |
| + |
| +void CPDF_GeneralState::SetMatrix(const CFX_Matrix& matrix) { |
| + m_Ref.GetPrivateCopy()->m_Matrix = matrix; |
| +} |
| + |
| +CFX_Matrix* CPDF_GeneralState::GetMutableMatrix() { |
| + return &m_Ref.GetPrivateCopy()->m_Matrix; |
| +} |
| + |
| void CPDF_GeneralState::SetRenderIntent(const CFX_ByteString& ri) { |
| m_Ref.GetPrivateCopy()->m_RenderIntent = RI_StringToId(ri); |
| } |
| + |
| +CPDF_GeneralState::StateData::StateData() { |
| + FXSYS_memset(this, 0, sizeof(CPDF_GeneralState::StateData)); |
| + FXSYS_strcpy((FX_CHAR*)m_BlendMode, "Normal"); |
|
dsinclair
2016/09/01 14:17:09
static_cast
Tom Sepez
2016/09/01 22:26:31
rewrote to use bytstrings
|
| + m_StrokeAlpha = 1.0f; |
| + m_FillAlpha = 1.0f; |
| + m_Flatness = 1.0f; |
| + m_Matrix.SetIdentity(); |
| +} |
| + |
| +CPDF_GeneralState::StateData::StateData( |
| + const CPDF_GeneralState::StateData& src) { |
| + FXSYS_memcpy(this, &src, sizeof(CPDF_GeneralState::StateData)); |
| + if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) { |
|
dsinclair
2016/09/01 14:17:09
invert and early return?
Tom Sepez
2016/09/01 22:26:31
Nah, but invert inner if.
|
| + CPDF_DocRenderData* pDocCache = |
| + src.m_pTransferFunc->m_pPDFDoc->GetRenderData(); |
| + if (!pDocCache) |
| + return; |
| + |
| + m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR); |
| + } |
| +} |
| + |
| +CPDF_GeneralState::StateData::~StateData() { |
| + if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) { |
|
dsinclair
2016/09/01 14:17:09
early return
Tom Sepez
2016/09/01 22:26:31
Same.
|
| + CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData(); |
| + if (!pDocCache) |
| + return; |
| + |
| + pDocCache->ReleaseTransferFunc(m_pTR); |
| + } |
| +} |
| + |
| +void CPDF_GeneralState::StateData::SetBlendMode( |
| + const CFX_ByteStringC& blend_mode) { |
| + if (blend_mode.GetLength() > 15) { |
| + return; |
| + } |
|
dsinclair
2016/09/01 14:17:09
nit {}'s
Tom Sepez
2016/09/01 22:26:31
No longer exists.
|
| + FXSYS_memcpy(m_BlendMode, blend_mode.raw_str(), blend_mode.GetLength()); |
| + m_BlendMode[blend_mode.GetLength()] = 0; |
| + m_BlendType = GetBlendTypeInternal(blend_mode); |
| +} |