| Index: core/fpdfapi/fpdf_page/cpdf_generalstatedata.cpp
|
| diff --git a/core/fpdfapi/fpdf_page/cpdf_generalstatedata.cpp b/core/fpdfapi/fpdf_page/cpdf_generalstatedata.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2e4b5e4dff3c4f979a66b5bf9c344d60f898eff2
|
| --- /dev/null
|
| +++ b/core/fpdfapi/fpdf_page/cpdf_generalstatedata.cpp
|
| @@ -0,0 +1,95 @@
|
| +// Copyright 2016 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 "core/fpdfapi/fpdf_page/include/cpdf_generalstatedata.h"
|
| +
|
| +#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
|
| +#include "core/fpdfapi/fpdf_render/render_int.h"
|
| +
|
| +namespace {
|
| +
|
| +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_GeneralStateData::CPDF_GeneralStateData() {
|
| + FXSYS_memset(this, 0, sizeof(CPDF_GeneralStateData));
|
| + FXSYS_strcpy((FX_CHAR*)m_BlendMode, "Normal");
|
| + m_StrokeAlpha = 1.0f;
|
| + m_FillAlpha = 1.0f;
|
| + m_Flatness = 1.0f;
|
| + m_Matrix.SetIdentity();
|
| +}
|
| +
|
| +CPDF_GeneralStateData::CPDF_GeneralStateData(const CPDF_GeneralStateData& src) {
|
| + FXSYS_memcpy(this, &src, sizeof(CPDF_GeneralStateData));
|
| + if (src.m_pTransferFunc && src.m_pTransferFunc->m_pPDFDoc) {
|
| + CPDF_DocRenderData* pDocCache =
|
| + src.m_pTransferFunc->m_pPDFDoc->GetRenderData();
|
| + if (!pDocCache)
|
| + return;
|
| +
|
| + m_pTransferFunc = pDocCache->GetTransferFunc(m_pTR);
|
| + }
|
| +}
|
| +
|
| +CPDF_GeneralStateData::~CPDF_GeneralStateData() {
|
| + if (m_pTransferFunc && m_pTransferFunc->m_pPDFDoc) {
|
| + CPDF_DocRenderData* pDocCache = m_pTransferFunc->m_pPDFDoc->GetRenderData();
|
| + if (!pDocCache)
|
| + return;
|
| +
|
| + pDocCache->ReleaseTransferFunc(m_pTR);
|
| + }
|
| +}
|
| +
|
| +void CPDF_GeneralStateData::SetBlendMode(const CFX_ByteStringC& blend_mode) {
|
| + if (blend_mode.GetLength() > 15) {
|
| + return;
|
| + }
|
| + FXSYS_memcpy(m_BlendMode, blend_mode.GetPtr(), blend_mode.GetLength());
|
| + m_BlendMode[blend_mode.GetLength()] = 0;
|
| + m_BlendType = GetBlendTypeInternal(blend_mode);
|
| +}
|
|
|