blob: 227fd62045d3286cde2f3d2a5732f237b48087d9 [file] [log] [blame]
tsepezadbd3292016-08-29 14:07:28 -07001// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
dsinclair41872fa2016-10-04 11:29:35 -07007#include "core/fpdfapi/page/cpdf_colorstate.h"
tsepezadbd3292016-08-29 14:07:28 -07008
dsinclair41872fa2016-10-04 11:29:35 -07009#include "core/fpdfapi/page/cpdf_pattern.h"
10#include "core/fpdfapi/page/cpdf_tilingpattern.h"
dsinclair74a34fc2016-09-29 16:41:42 -070011#include "core/fxge/fx_dib.h"
tsepezadbd3292016-08-29 14:07:28 -070012
tsepezca90b872016-08-31 10:41:00 -070013CPDF_ColorState::CPDF_ColorState() {}
14
15CPDF_ColorState::CPDF_ColorState(const CPDF_ColorState& that)
16 : m_Ref(that.m_Ref) {}
17
18CPDF_ColorState::~CPDF_ColorState() {}
19
20void CPDF_ColorState::Emplace() {
21 m_Ref.Emplace();
22}
23
24void CPDF_ColorState::SetDefault() {
tsepezf40c6f12016-09-06 11:45:32 -070025 m_Ref.GetPrivateCopy()->SetDefault();
tsepezca90b872016-08-31 10:41:00 -070026}
27
Lei Zhang40d37b12018-03-20 21:06:35 +000028FX_COLORREF CPDF_ColorState::GetFillColorRef() const {
29 return m_Ref.GetObject()->m_FillColorRef;
tsepezca90b872016-08-31 10:41:00 -070030}
31
Lei Zhang40d37b12018-03-20 21:06:35 +000032void CPDF_ColorState::SetFillColorRef(FX_COLORREF colorref) {
33 m_Ref.GetPrivateCopy()->m_FillColorRef = colorref;
tsepezca90b872016-08-31 10:41:00 -070034}
35
Lei Zhang40d37b12018-03-20 21:06:35 +000036FX_COLORREF CPDF_ColorState::GetStrokeColorRef() const {
37 return m_Ref.GetObject()->m_StrokeColorRef;
tsepezca90b872016-08-31 10:41:00 -070038}
39
Lei Zhang40d37b12018-03-20 21:06:35 +000040void CPDF_ColorState::SetStrokeColorRef(FX_COLORREF colorref) {
41 m_Ref.GetPrivateCopy()->m_StrokeColorRef = colorref;
tsepezca90b872016-08-31 10:41:00 -070042}
43
44const CPDF_Color* CPDF_ColorState::GetFillColor() const {
tsepezf40c6f12016-09-06 11:45:32 -070045 const ColorData* pData = m_Ref.GetObject();
tsepezca90b872016-08-31 10:41:00 -070046 return pData ? &pData->m_FillColor : nullptr;
47}
48
49CPDF_Color* CPDF_ColorState::GetMutableFillColor() {
50 return &m_Ref.GetPrivateCopy()->m_FillColor;
51}
52
53bool CPDF_ColorState::HasFillColor() const {
54 const CPDF_Color* pColor = GetFillColor();
55 return pColor && !pColor->IsNull();
56}
57
58const CPDF_Color* CPDF_ColorState::GetStrokeColor() const {
tsepezf40c6f12016-09-06 11:45:32 -070059 const ColorData* pData = m_Ref.GetObject();
tsepezca90b872016-08-31 10:41:00 -070060 return pData ? &pData->m_StrokeColor : nullptr;
61}
62
63CPDF_Color* CPDF_ColorState::GetMutableStrokeColor() {
64 return &m_Ref.GetPrivateCopy()->m_StrokeColor;
65}
66
67bool CPDF_ColorState::HasStrokeColor() const {
68 const CPDF_Color* pColor = GetStrokeColor();
69 return pColor && !pColor->IsNull();
70}
71
tsepezadbd3292016-08-29 14:07:28 -070072void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS,
Dan Sinclair05df0752017-03-14 14:43:42 -040073 float* pValue,
tsepezadbd3292016-08-29 14:07:28 -070074 uint32_t nValues) {
tsepezf40c6f12016-09-06 11:45:32 -070075 ColorData* pData = m_Ref.GetPrivateCopy();
Lei Zhang40d37b12018-03-20 21:06:35 +000076 SetColor(pData->m_FillColor, &pData->m_FillColorRef, pCS, pValue, nValues);
tsepezadbd3292016-08-29 14:07:28 -070077}
78
79void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS,
Dan Sinclair05df0752017-03-14 14:43:42 -040080 float* pValue,
tsepezadbd3292016-08-29 14:07:28 -070081 uint32_t nValues) {
tsepezf40c6f12016-09-06 11:45:32 -070082 ColorData* pData = m_Ref.GetPrivateCopy();
Lei Zhang40d37b12018-03-20 21:06:35 +000083 SetColor(pData->m_StrokeColor, &pData->m_StrokeColorRef, pCS, pValue,
84 nValues);
tsepezadbd3292016-08-29 14:07:28 -070085}
86
tsepezadbd3292016-08-29 14:07:28 -070087void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern,
Dan Sinclair05df0752017-03-14 14:43:42 -040088 float* pValue,
tsepezadbd3292016-08-29 14:07:28 -070089 uint32_t nValues) {
tsepezf40c6f12016-09-06 11:45:32 -070090 ColorData* pData = m_Ref.GetPrivateCopy();
tsepezadbd3292016-08-29 14:07:28 -070091 pData->m_FillColor.SetValue(pPattern, pValue, nValues);
Lei Zhanga12159b2017-03-15 13:26:37 -070092 int R;
93 int G;
94 int B;
95 bool ret = pData->m_FillColor.GetRGB(&R, &G, &B);
tsepezadbd3292016-08-29 14:07:28 -070096 if (CPDF_TilingPattern* pTilingPattern = pPattern->AsTilingPattern()) {
97 if (!ret && pTilingPattern->colored()) {
Lei Zhang40d37b12018-03-20 21:06:35 +000098 pData->m_FillColorRef = 0x00BFBFBF;
tsepezadbd3292016-08-29 14:07:28 -070099 return;
100 }
101 }
Lei Zhang4f7479a2018-03-21 13:37:06 +0000102 pData->m_FillColorRef = ret ? FXSYS_BGR(B, G, R) : 0xFFFFFFFF;
tsepezadbd3292016-08-29 14:07:28 -0700103}
104
105void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern,
Dan Sinclair05df0752017-03-14 14:43:42 -0400106 float* pValue,
tsepezadbd3292016-08-29 14:07:28 -0700107 uint32_t nValues) {
tsepezf40c6f12016-09-06 11:45:32 -0700108 ColorData* pData = m_Ref.GetPrivateCopy();
tsepezadbd3292016-08-29 14:07:28 -0700109 pData->m_StrokeColor.SetValue(pPattern, pValue, nValues);
Lei Zhanga12159b2017-03-15 13:26:37 -0700110 int R;
111 int G;
112 int B;
113 bool ret = pData->m_StrokeColor.GetRGB(&R, &G, &B);
tsepezadbd3292016-08-29 14:07:28 -0700114 if (CPDF_TilingPattern* pTilingPattern = pPattern->AsTilingPattern()) {
115 if (!ret && pTilingPattern->colored()) {
Lei Zhang40d37b12018-03-20 21:06:35 +0000116 pData->m_StrokeColorRef = 0x00BFBFBF;
tsepezadbd3292016-08-29 14:07:28 -0700117 return;
118 }
119 }
Lei Zhang40d37b12018-03-20 21:06:35 +0000120 pData->m_StrokeColorRef =
Lei Zhang4f7479a2018-03-21 13:37:06 +0000121 pData->m_StrokeColor.GetRGB(&R, &G, &B) ? FXSYS_BGR(B, G, R) : 0xFFFFFFFF;
tsepezadbd3292016-08-29 14:07:28 -0700122}
tsepezca90b872016-08-31 10:41:00 -0700123
124void CPDF_ColorState::SetColor(CPDF_Color& color,
Lei Zhang40d37b12018-03-20 21:06:35 +0000125 FX_COLORREF* colorref,
tsepezca90b872016-08-31 10:41:00 -0700126 CPDF_ColorSpace* pCS,
Dan Sinclair05df0752017-03-14 14:43:42 -0400127 float* pValue,
tsepezca90b872016-08-31 10:41:00 -0700128 uint32_t nValues) {
129 if (pCS)
130 color.SetColorSpace(pCS);
131 else if (color.IsNull())
132 color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
133
134 if (color.GetColorSpace()->CountComponents() > nValues)
135 return;
136
137 color.SetValue(pValue);
138 int R;
139 int G;
140 int B;
Lei Zhang4f7479a2018-03-21 13:37:06 +0000141 *colorref = color.GetRGB(&R, &G, &B) ? FXSYS_BGR(B, G, R) : 0xFFFFFFFF;
tsepezca90b872016-08-31 10:41:00 -0700142}
tsepezf40c6f12016-09-06 11:45:32 -0700143
Lei Zhang40d37b12018-03-20 21:06:35 +0000144CPDF_ColorState::ColorData::ColorData()
145 : m_FillColorRef(0), m_StrokeColorRef(0) {}
tsepezf40c6f12016-09-06 11:45:32 -0700146
147CPDF_ColorState::ColorData::ColorData(const ColorData& src)
Lei Zhang40d37b12018-03-20 21:06:35 +0000148 : m_FillColorRef(src.m_FillColorRef),
149 m_StrokeColorRef(src.m_StrokeColorRef) {
tsepezf40c6f12016-09-06 11:45:32 -0700150 m_FillColor.Copy(&src.m_FillColor);
151 m_StrokeColor.Copy(&src.m_StrokeColor);
152}
153
154CPDF_ColorState::ColorData::~ColorData() {}
155
156void CPDF_ColorState::ColorData::SetDefault() {
Lei Zhang40d37b12018-03-20 21:06:35 +0000157 m_FillColorRef = 0;
158 m_StrokeColorRef = 0;
tsepezf40c6f12016-09-06 11:45:32 -0700159 m_FillColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
160 m_StrokeColor.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
161}