xref: /aosp_15_r20/external/skia/src/pdf/SkPDFGraphicState.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2010 The Android Open Source Project
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker 
9*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPDFGraphicState_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker #define SkPDFGraphicState_DEFINED
11*c8dee2aaSAndroid Build Coastguard Worker 
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMacros.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkChecksum.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/pdf/SkPDFTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
18*c8dee2aaSAndroid Build Coastguard Worker #include <cstring>
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker class SkPDFDocument;
21*c8dee2aaSAndroid Build Coastguard Worker class SkPaint;
22*c8dee2aaSAndroid Build Coastguard Worker 
23*c8dee2aaSAndroid Build Coastguard Worker /** \class SkPDFGraphicState
24*c8dee2aaSAndroid Build Coastguard Worker     SkPaint objects roughly correspond to graphic state dictionaries that can
25*c8dee2aaSAndroid Build Coastguard Worker     be installed. So that a given dictionary is only output to the pdf file
26*c8dee2aaSAndroid Build Coastguard Worker     once, we want to canonicalize them.
27*c8dee2aaSAndroid Build Coastguard Worker */
28*c8dee2aaSAndroid Build Coastguard Worker namespace SkPDFGraphicState {
29*c8dee2aaSAndroid Build Coastguard Worker     enum SkPDFSMaskMode {
30*c8dee2aaSAndroid Build Coastguard Worker         kAlpha_SMaskMode,
31*c8dee2aaSAndroid Build Coastguard Worker         kLuminosity_SMaskMode
32*c8dee2aaSAndroid Build Coastguard Worker     };
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker     /** Get the graphic state for the passed SkPaint.
35*c8dee2aaSAndroid Build Coastguard Worker      */
36*c8dee2aaSAndroid Build Coastguard Worker     SkPDFIndirectReference GetGraphicStateForPaint(SkPDFDocument*, const SkPaint&);
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     /** Make a graphic state that only sets the passed soft mask.
39*c8dee2aaSAndroid Build Coastguard Worker      *  @param sMask     The form xobject to use as a soft mask.
40*c8dee2aaSAndroid Build Coastguard Worker      *  @param invert    Indicates if the alpha of the sMask should be inverted.
41*c8dee2aaSAndroid Build Coastguard Worker      *  @param sMaskMode Whether to use alpha or luminosity for the sMask.
42*c8dee2aaSAndroid Build Coastguard Worker      *
43*c8dee2aaSAndroid Build Coastguard Worker      *  These are not de-duped.
44*c8dee2aaSAndroid Build Coastguard Worker      */
45*c8dee2aaSAndroid Build Coastguard Worker     SkPDFIndirectReference GetSMaskGraphicState(SkPDFIndirectReference sMask,
46*c8dee2aaSAndroid Build Coastguard Worker                                                 bool invert,
47*c8dee2aaSAndroid Build Coastguard Worker                                                 SkPDFSMaskMode sMaskMode,
48*c8dee2aaSAndroid Build Coastguard Worker                                                 SkPDFDocument* doc);
49*c8dee2aaSAndroid Build Coastguard Worker }  // namespace SkPDFGraphicState
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker SK_BEGIN_REQUIRE_DENSE
52*c8dee2aaSAndroid Build Coastguard Worker struct SkPDFStrokeGraphicState {
53*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fStrokeWidth;
54*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fStrokeMiter;
55*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fAlpha;
56*c8dee2aaSAndroid Build Coastguard Worker     uint8_t fStrokeCap;   // SkPaint::Cap
57*c8dee2aaSAndroid Build Coastguard Worker     uint8_t fStrokeJoin;  // SkPaint::Join
58*c8dee2aaSAndroid Build Coastguard Worker     uint8_t fBlendMode;   // SkBlendMode
59*c8dee2aaSAndroid Build Coastguard Worker     uint8_t fPADDING = 0;
60*c8dee2aaSAndroid Build Coastguard Worker     bool operator==(const SkPDFStrokeGraphicState& o) const { return !memcmp(this, &o, sizeof(o)); }
61*c8dee2aaSAndroid Build Coastguard Worker     bool operator!=(const SkPDFStrokeGraphicState& o) const { return !(*this == o); }
62*c8dee2aaSAndroid Build Coastguard Worker 
63*c8dee2aaSAndroid Build Coastguard Worker     using Hash = SkForceDirectHash<SkPDFStrokeGraphicState>;
64*c8dee2aaSAndroid Build Coastguard Worker };
65*c8dee2aaSAndroid Build Coastguard Worker SK_END_REQUIRE_DENSE
66*c8dee2aaSAndroid Build Coastguard Worker 
67*c8dee2aaSAndroid Build Coastguard Worker SK_BEGIN_REQUIRE_DENSE
68*c8dee2aaSAndroid Build Coastguard Worker struct SkPDFFillGraphicState {
69*c8dee2aaSAndroid Build Coastguard Worker     SkScalar fAlpha;
70*c8dee2aaSAndroid Build Coastguard Worker     uint8_t fBlendMode;
71*c8dee2aaSAndroid Build Coastguard Worker     uint8_t fPADDING[3] = {0, 0, 0};
72*c8dee2aaSAndroid Build Coastguard Worker     bool operator==(const SkPDFFillGraphicState& o) const { return !memcmp(this, &o, sizeof(o)); }
73*c8dee2aaSAndroid Build Coastguard Worker     bool operator!=(const SkPDFFillGraphicState& o) const { return !(*this == o); }
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker     using Hash = SkForceDirectHash<SkPDFFillGraphicState>;
76*c8dee2aaSAndroid Build Coastguard Worker };
77*c8dee2aaSAndroid Build Coastguard Worker SK_END_REQUIRE_DENSE
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker #endif
80