Line data Source code
1 : /*
2 : * Copyright 2010 The Android Open Source Project
3 : *
4 : * Use of this source code is governed by a BSD-style license that can be
5 : * found in the LICENSE file.
6 : */
7 :
8 :
9 : #ifndef SkPDFGraphicState_DEFINED
10 : #define SkPDFGraphicState_DEFINED
11 :
12 : #include "SkPDFTypes.h"
13 : #include "SkOpts.h"
14 :
15 : class SkPaint;
16 : class SkPDFCanon;
17 :
18 : /** \class SkPDFGraphicState
19 : SkPaint objects roughly correspond to graphic state dictionaries that can
20 : be installed. So that a given dictionary is only output to the pdf file
21 : once, we want to canonicalize them.
22 : */
23 0 : class SkPDFGraphicState final : public SkPDFObject {
24 :
25 : public:
26 : enum SkPDFSMaskMode {
27 : kAlpha_SMaskMode,
28 : kLuminosity_SMaskMode
29 : };
30 :
31 : // Override emitObject so that we can populate the dictionary on
32 : // demand.
33 : void emitObject(SkWStream* stream,
34 : const SkPDFObjNumMap& objNumMap) const override;
35 :
36 : /** Get the graphic state for the passed SkPaint. The reference count of
37 : * the object is incremented and it is the caller's responsibility to
38 : * unreference it when done. This is needed to accommodate the weak
39 : * reference pattern used when the returned object is new and has no
40 : * other references.
41 : * @param paint The SkPaint to emulate.
42 : */
43 : static SkPDFGraphicState* GetGraphicStateForPaint(SkPDFCanon* canon,
44 : const SkPaint& paint);
45 :
46 : /** Make a graphic state that only sets the passed soft mask.
47 : * @param sMask The form xobject to use as a soft mask.
48 : * @param invert Indicates if the alpha of the sMask should be inverted.
49 : * @param sMaskMode Whether to use alpha or luminosity for the sMask.
50 : *
51 : * These are not de-duped.
52 : */
53 : static sk_sp<SkPDFDict> GetSMaskGraphicState(sk_sp<SkPDFObject> sMask,
54 : bool invert,
55 : SkPDFSMaskMode sMaskMode,
56 : SkPDFCanon* canon);
57 :
58 : /** Make a graphic state that only unsets the soft mask. */
59 : static sk_sp<SkPDFDict> MakeNoSmaskGraphicState();
60 : static sk_sp<SkPDFStream> MakeInvertFunction();
61 :
62 0 : bool operator==(const SkPDFGraphicState& rhs) const {
63 0 : return 0 == memcmp(&fStrokeWidth, &rhs.fStrokeWidth, 12);
64 : }
65 0 : uint32_t hash() const { return SkOpts::hash(&fStrokeWidth, 12); }
66 :
67 : private:
68 : const SkScalar fStrokeWidth;
69 : const SkScalar fStrokeMiter;
70 : const uint8_t fAlpha;
71 : const uint8_t fStrokeCap; // SkPaint::Cap
72 : const uint8_t fStrokeJoin; // SkPaint::Join
73 : const uint8_t fMode; // SkBlendMode
74 :
75 : SkPDFGraphicState(const SkPaint&);
76 :
77 : typedef SkPDFDict INHERITED;
78 : };
79 :
80 : #endif
|