| Index: core/fpdfdoc/cpdf_defaultappearance.cpp
|
| diff --git a/core/fpdfdoc/cpdf_defaultappearance.cpp b/core/fpdfdoc/cpdf_defaultappearance.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1c71ae5826864e70ee98f79cd8789fd5626ae998
|
| --- /dev/null
|
| +++ b/core/fpdfdoc/cpdf_defaultappearance.cpp
|
| @@ -0,0 +1,222 @@
|
| +// 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/fpdfdoc/include/cpdf_defaultappearance.h"
|
| +
|
| +#include "core/fpdfapi/fpdf_parser/include/cpdf_simple_parser.h"
|
| +#include "core/fpdfapi/fpdf_parser/include/fpdf_parser_decode.h"
|
| +#include "core/fpdfdoc/include/cpdf_formcontrol.h"
|
| +
|
| +FX_BOOL CPDF_DefaultAppearance::HasFont() {
|
| + if (m_csDA.IsEmpty())
|
| + return FALSE;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + return syntax.FindTagParamFromStart("Tf", 2);
|
| +}
|
| +
|
| +CFX_ByteString CPDF_DefaultAppearance::GetFontString() {
|
| + CFX_ByteString csFont;
|
| + if (m_csDA.IsEmpty())
|
| + return csFont;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart("Tf", 2)) {
|
| + csFont += syntax.GetWord();
|
| + csFont += " ";
|
| + csFont += syntax.GetWord();
|
| + csFont += " ";
|
| + csFont += syntax.GetWord();
|
| + }
|
| + return csFont;
|
| +}
|
| +
|
| +void CPDF_DefaultAppearance::GetFont(CFX_ByteString& csFontNameTag,
|
| + FX_FLOAT& fFontSize) {
|
| + csFontNameTag = "";
|
| + fFontSize = 0;
|
| + if (m_csDA.IsEmpty())
|
| + return;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart("Tf", 2)) {
|
| + csFontNameTag = CFX_ByteString(syntax.GetWord());
|
| + csFontNameTag.Delete(0, 1);
|
| + fFontSize = FX_atof(syntax.GetWord());
|
| + }
|
| + csFontNameTag = PDF_NameDecode(csFontNameTag);
|
| +}
|
| +
|
| +FX_BOOL CPDF_DefaultAppearance::HasColor(PaintOperation nOperation) {
|
| + if (m_csDA.IsEmpty())
|
| + return FALSE;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) {
|
| + return TRUE;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) {
|
| + return TRUE;
|
| + }
|
| + return syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4);
|
| +}
|
| +
|
| +CFX_ByteString CPDF_DefaultAppearance::GetColorString(
|
| + PaintOperation nOperation) {
|
| + CFX_ByteString csColor;
|
| + if (m_csDA.IsEmpty())
|
| + return csColor;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) {
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + return csColor;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) {
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + return csColor;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) {
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + csColor += " ";
|
| + csColor += syntax.GetWord();
|
| + }
|
| + return csColor;
|
| +}
|
| +
|
| +void CPDF_DefaultAppearance::GetColor(int& iColorType,
|
| + FX_FLOAT fc[4],
|
| + PaintOperation nOperation) {
|
| + iColorType = COLORTYPE_TRANSPARENT;
|
| + for (int c = 0; c < 4; c++)
|
| + fc[c] = 0;
|
| +
|
| + if (m_csDA.IsEmpty())
|
| + return;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) {
|
| + iColorType = COLORTYPE_GRAY;
|
| + fc[0] = FX_atof(syntax.GetWord());
|
| + return;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) {
|
| + iColorType = COLORTYPE_RGB;
|
| + fc[0] = FX_atof(syntax.GetWord());
|
| + fc[1] = FX_atof(syntax.GetWord());
|
| + fc[2] = FX_atof(syntax.GetWord());
|
| + return;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) {
|
| + iColorType = COLORTYPE_CMYK;
|
| + fc[0] = FX_atof(syntax.GetWord());
|
| + fc[1] = FX_atof(syntax.GetWord());
|
| + fc[2] = FX_atof(syntax.GetWord());
|
| + fc[3] = FX_atof(syntax.GetWord());
|
| + }
|
| +}
|
| +
|
| +void CPDF_DefaultAppearance::GetColor(FX_ARGB& color,
|
| + int& iColorType,
|
| + PaintOperation nOperation) {
|
| + color = 0;
|
| + iColorType = COLORTYPE_TRANSPARENT;
|
| + if (m_csDA.IsEmpty())
|
| + return;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "G" : "g"), 1)) {
|
| + iColorType = COLORTYPE_GRAY;
|
| + FX_FLOAT g = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| + color = ArgbEncode(255, (int)g, (int)g, (int)g);
|
| + return;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "RG" : "rg"), 3)) {
|
| + iColorType = COLORTYPE_RGB;
|
| + FX_FLOAT r = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| + FX_FLOAT g = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| + FX_FLOAT b = FX_atof(syntax.GetWord()) * 255 + 0.5f;
|
| + color = ArgbEncode(255, (int)r, (int)g, (int)b);
|
| + return;
|
| + }
|
| + if (syntax.FindTagParamFromStart(
|
| + (nOperation == PaintOperation::STROKE ? "K" : "k"), 4)) {
|
| + iColorType = COLORTYPE_CMYK;
|
| + FX_FLOAT c = FX_atof(syntax.GetWord());
|
| + FX_FLOAT m = FX_atof(syntax.GetWord());
|
| + FX_FLOAT y = FX_atof(syntax.GetWord());
|
| + FX_FLOAT k = FX_atof(syntax.GetWord());
|
| + FX_FLOAT r = 1.0f - std::min(1.0f, c + k);
|
| + FX_FLOAT g = 1.0f - std::min(1.0f, m + k);
|
| + FX_FLOAT b = 1.0f - std::min(1.0f, y + k);
|
| + color = ArgbEncode(255, (int)(r * 255 + 0.5f), (int)(g * 255 + 0.5f),
|
| + (int)(b * 255 + 0.5f));
|
| + }
|
| +}
|
| +
|
| +FX_BOOL CPDF_DefaultAppearance::HasTextMatrix() {
|
| + if (m_csDA.IsEmpty())
|
| + return FALSE;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + return syntax.FindTagParamFromStart("Tm", 6);
|
| +}
|
| +
|
| +CFX_ByteString CPDF_DefaultAppearance::GetTextMatrixString() {
|
| + CFX_ByteString csTM;
|
| + if (m_csDA.IsEmpty())
|
| + return csTM;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart("Tm", 6)) {
|
| + for (int i = 0; i < 6; i++) {
|
| + csTM += syntax.GetWord();
|
| + csTM += " ";
|
| + }
|
| + csTM += syntax.GetWord();
|
| + }
|
| + return csTM;
|
| +}
|
| +
|
| +CFX_Matrix CPDF_DefaultAppearance::GetTextMatrix() {
|
| + CFX_Matrix tm;
|
| + if (m_csDA.IsEmpty())
|
| + return tm;
|
| +
|
| + CPDF_SimpleParser syntax(m_csDA.AsStringC());
|
| + if (syntax.FindTagParamFromStart("Tm", 6)) {
|
| + FX_FLOAT f[6];
|
| + for (int i = 0; i < 6; i++)
|
| + f[i] = FX_atof(syntax.GetWord());
|
| + tm.Set(f[0], f[1], f[2], f[3], f[4], f[5]);
|
| + }
|
| + return tm;
|
| +}
|
|
|