xref: /aosp_15_r20/external/pdfium/xfa/fgas/graphics/cfgas_geshading.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/graphics/cfgas_geshading.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
CFGAS_GEShading(const CFX_PointF & beginPoint,const CFX_PointF & endPoint,bool isExtendedBegin,bool isExtendedEnd,FX_ARGB beginArgb,FX_ARGB endArgb)9*3ac0a46fSAndroid Build Coastguard Worker CFGAS_GEShading::CFGAS_GEShading(const CFX_PointF& beginPoint,
10*3ac0a46fSAndroid Build Coastguard Worker                                  const CFX_PointF& endPoint,
11*3ac0a46fSAndroid Build Coastguard Worker                                  bool isExtendedBegin,
12*3ac0a46fSAndroid Build Coastguard Worker                                  bool isExtendedEnd,
13*3ac0a46fSAndroid Build Coastguard Worker                                  FX_ARGB beginArgb,
14*3ac0a46fSAndroid Build Coastguard Worker                                  FX_ARGB endArgb)
15*3ac0a46fSAndroid Build Coastguard Worker     : m_type(Type::kAxial),
16*3ac0a46fSAndroid Build Coastguard Worker       m_beginPoint(beginPoint),
17*3ac0a46fSAndroid Build Coastguard Worker       m_endPoint(endPoint),
18*3ac0a46fSAndroid Build Coastguard Worker       m_beginRadius(0),
19*3ac0a46fSAndroid Build Coastguard Worker       m_endRadius(0),
20*3ac0a46fSAndroid Build Coastguard Worker       m_isExtendedBegin(isExtendedBegin),
21*3ac0a46fSAndroid Build Coastguard Worker       m_isExtendedEnd(isExtendedEnd) {
22*3ac0a46fSAndroid Build Coastguard Worker   InitArgbArray(beginArgb, endArgb);
23*3ac0a46fSAndroid Build Coastguard Worker }
24*3ac0a46fSAndroid Build Coastguard Worker 
CFGAS_GEShading(const CFX_PointF & beginPoint,const CFX_PointF & endPoint,float beginRadius,float endRadius,bool isExtendedBegin,bool isExtendedEnd,FX_ARGB beginArgb,FX_ARGB endArgb)25*3ac0a46fSAndroid Build Coastguard Worker CFGAS_GEShading::CFGAS_GEShading(const CFX_PointF& beginPoint,
26*3ac0a46fSAndroid Build Coastguard Worker                                  const CFX_PointF& endPoint,
27*3ac0a46fSAndroid Build Coastguard Worker                                  float beginRadius,
28*3ac0a46fSAndroid Build Coastguard Worker                                  float endRadius,
29*3ac0a46fSAndroid Build Coastguard Worker                                  bool isExtendedBegin,
30*3ac0a46fSAndroid Build Coastguard Worker                                  bool isExtendedEnd,
31*3ac0a46fSAndroid Build Coastguard Worker                                  FX_ARGB beginArgb,
32*3ac0a46fSAndroid Build Coastguard Worker                                  FX_ARGB endArgb)
33*3ac0a46fSAndroid Build Coastguard Worker     : m_type(Type::kRadial),
34*3ac0a46fSAndroid Build Coastguard Worker       m_beginPoint(beginPoint),
35*3ac0a46fSAndroid Build Coastguard Worker       m_endPoint(endPoint),
36*3ac0a46fSAndroid Build Coastguard Worker       m_beginRadius(beginRadius),
37*3ac0a46fSAndroid Build Coastguard Worker       m_endRadius(endRadius),
38*3ac0a46fSAndroid Build Coastguard Worker       m_isExtendedBegin(isExtendedBegin),
39*3ac0a46fSAndroid Build Coastguard Worker       m_isExtendedEnd(isExtendedEnd) {
40*3ac0a46fSAndroid Build Coastguard Worker   InitArgbArray(beginArgb, endArgb);
41*3ac0a46fSAndroid Build Coastguard Worker }
42*3ac0a46fSAndroid Build Coastguard Worker 
43*3ac0a46fSAndroid Build Coastguard Worker CFGAS_GEShading::~CFGAS_GEShading() = default;
44*3ac0a46fSAndroid Build Coastguard Worker 
InitArgbArray(FX_ARGB beginArgb,FX_ARGB endArgb)45*3ac0a46fSAndroid Build Coastguard Worker void CFGAS_GEShading::InitArgbArray(FX_ARGB beginArgb, FX_ARGB endArgb) {
46*3ac0a46fSAndroid Build Coastguard Worker   int32_t a1;
47*3ac0a46fSAndroid Build Coastguard Worker   int32_t r1;
48*3ac0a46fSAndroid Build Coastguard Worker   int32_t g1;
49*3ac0a46fSAndroid Build Coastguard Worker   int32_t b1;
50*3ac0a46fSAndroid Build Coastguard Worker   std::tie(a1, r1, g1, b1) = ArgbDecode(beginArgb);
51*3ac0a46fSAndroid Build Coastguard Worker 
52*3ac0a46fSAndroid Build Coastguard Worker   int32_t a2;
53*3ac0a46fSAndroid Build Coastguard Worker   int32_t r2;
54*3ac0a46fSAndroid Build Coastguard Worker   int32_t g2;
55*3ac0a46fSAndroid Build Coastguard Worker   int32_t b2;
56*3ac0a46fSAndroid Build Coastguard Worker   std::tie(a2, r2, g2, b2) = ArgbDecode(endArgb);
57*3ac0a46fSAndroid Build Coastguard Worker 
58*3ac0a46fSAndroid Build Coastguard Worker   float f = static_cast<float>(kSteps - 1);
59*3ac0a46fSAndroid Build Coastguard Worker   float aScale = 1.0 * (a2 - a1) / f;
60*3ac0a46fSAndroid Build Coastguard Worker   float rScale = 1.0 * (r2 - r1) / f;
61*3ac0a46fSAndroid Build Coastguard Worker   float gScale = 1.0 * (g2 - g1) / f;
62*3ac0a46fSAndroid Build Coastguard Worker   float bScale = 1.0 * (b2 - b1) / f;
63*3ac0a46fSAndroid Build Coastguard Worker 
64*3ac0a46fSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSteps; i++) {
65*3ac0a46fSAndroid Build Coastguard Worker     int32_t a3 = static_cast<int32_t>(i * aScale);
66*3ac0a46fSAndroid Build Coastguard Worker     int32_t r3 = static_cast<int32_t>(i * rScale);
67*3ac0a46fSAndroid Build Coastguard Worker     int32_t g3 = static_cast<int32_t>(i * gScale);
68*3ac0a46fSAndroid Build Coastguard Worker     int32_t b3 = static_cast<int32_t>(i * bScale);
69*3ac0a46fSAndroid Build Coastguard Worker 
70*3ac0a46fSAndroid Build Coastguard Worker     // TODO(dsinclair): Add overloads for FX_ARGB. pdfium:437
71*3ac0a46fSAndroid Build Coastguard Worker     m_argbArray[i] = ArgbEncode(a1 + a3, r1 + r3, g1 + g3, b1 + b3);
72*3ac0a46fSAndroid Build Coastguard Worker   }
73*3ac0a46fSAndroid Build Coastguard Worker }
74