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