diff options
author | halcanary <halcanary@google.com> | 2016-03-21 14:33:17 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 14:33:17 -0700 |
commit | 989da4a32cd6823359f31c971c3b3f31425e905e (patch) | |
tree | 0ff6449e003fdbd7413bc5604b16f2a2a4c878dc /src/pdf/SkPDFShader.cpp | |
parent | 2cab66be9c47660da6a2cc94b469c14d5bed958e (diff) |
SkPDF: SkPDFDevice has ptr to SkPDFDocument
This is necessary for pre-serialization of images.
BUG=skia:5087
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1802963002
Review URL: https://codereview.chromium.org/1802963002
Diffstat (limited to 'src/pdf/SkPDFShader.cpp')
-rw-r--r-- | src/pdf/SkPDFShader.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp index f5e5b1e439..a9f2754226 100644 --- a/src/pdf/SkPDFShader.cpp +++ b/src/pdf/SkPDFShader.cpp @@ -12,6 +12,7 @@ #include "SkData.h" #include "SkPDFCanon.h" #include "SkPDFDevice.h" +#include "SkPDFDocument.h" #include "SkPDFFormXObject.h" #include "SkPDFGraphicState.h" #include "SkPDFResourceDict.h" @@ -485,10 +486,11 @@ SkPDFImageShader::~SkPDFImageShader() {} //////////////////////////////////////////////////////////////////////////////// static SkPDFObject* get_pdf_shader_by_state( - SkPDFCanon* canon, + SkPDFDocument* doc, SkScalar dpi, SkAutoTDelete<SkPDFShader::State>* autoState) { const SkPDFShader::State& state = **autoState; + SkPDFCanon* canon = doc->canon(); if (state.fType == SkShader::kNone_GradientType && state.fImage.isNull()) { // TODO(vandebo) This drops SKComposeShader on the floor. We could // handle compose shader by pulling things up to a layer, drawing with @@ -498,11 +500,11 @@ static SkPDFObject* get_pdf_shader_by_state( } else if (state.fType == SkShader::kNone_GradientType) { SkPDFObject* shader = canon->findImageShader(state); return shader ? SkRef(shader) - : SkPDFImageShader::Create(canon, dpi, autoState); + : SkPDFImageShader::Create(doc, dpi, autoState); } else if (state.GradientHasAlpha()) { SkPDFObject* shader = canon->findAlphaShader(state); return shader ? SkRef(shader) - : SkPDFAlphaFunctionShader::Create(canon, dpi, autoState); + : SkPDFAlphaFunctionShader::Create(doc, dpi, autoState); } else { SkPDFObject* shader = canon->findFunctionShader(state); return shader ? SkRef(shader) @@ -511,14 +513,14 @@ static SkPDFObject* get_pdf_shader_by_state( } // static -SkPDFObject* SkPDFShader::GetPDFShader(SkPDFCanon* canon, +SkPDFObject* SkPDFShader::GetPDFShader(SkPDFDocument* doc, SkScalar dpi, const SkShader& shader, const SkMatrix& matrix, const SkIRect& surfaceBBox, SkScalar rasterScale) { SkAutoTDelete<SkPDFShader::State> state(new State(shader, matrix, surfaceBBox, rasterScale)); - return get_pdf_shader_by_state(canon, dpi, &state); + return get_pdf_shader_by_state(doc, dpi, &state); } static sk_sp<SkPDFDict> get_gradient_resource_dict( @@ -579,14 +581,14 @@ static SkStream* create_pattern_fill_content(int gsIndex, SkRect& bounds) { * luminosity mode. The shader pattern extends to the bbox. */ static sk_sp<SkPDFObject> create_smask_graphic_state( - SkPDFCanon* canon, SkScalar dpi, const SkPDFShader::State& state) { + SkPDFDocument* doc, SkScalar dpi, const SkPDFShader::State& state) { SkRect bbox; bbox.set(state.fBBox); SkAutoTDelete<SkPDFShader::State> alphaToLuminosityState( state.CreateAlphaToLuminosityState()); sk_sp<SkPDFObject> luminosityShader( - get_pdf_shader_by_state(canon, dpi, &alphaToLuminosityState)); + get_pdf_shader_by_state(doc, dpi, &alphaToLuminosityState)); SkAutoTDelete<SkStream> alphaStream(create_pattern_fill_content(-1, bbox)); @@ -598,11 +600,11 @@ static sk_sp<SkPDFObject> create_smask_graphic_state( return SkPDFGraphicState::GetSMaskGraphicState( alphaMask.get(), false, - SkPDFGraphicState::kLuminosity_SMaskMode, canon); + SkPDFGraphicState::kLuminosity_SMaskMode, doc->canon()); } SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create( - SkPDFCanon* canon, + SkPDFDocument* doc, SkScalar dpi, SkAutoTDelete<SkPDFShader::State>* autoState) { const SkPDFShader::State& state = **autoState; @@ -612,14 +614,14 @@ SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create( SkAutoTDelete<SkPDFShader::State> opaqueState(state.CreateOpaqueState()); sk_sp<SkPDFObject> colorShader( - get_pdf_shader_by_state(canon, dpi, &opaqueState)); + get_pdf_shader_by_state(doc, dpi, &opaqueState)); if (!colorShader) { return nullptr; } // Create resource dict with alpha graphics state as G0 and // pattern shader as P0, then write content stream. - auto alphaGs = create_smask_graphic_state(canon, dpi, state); + auto alphaGs = create_smask_graphic_state(doc, dpi, state); SkPDFAlphaFunctionShader* alphaFunctionShader = new SkPDFAlphaFunctionShader(autoState->release()); @@ -633,7 +635,7 @@ SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create( populate_tiling_pattern_dict(alphaFunctionShader, bbox, resourceDict.get(), SkMatrix::I()); - canon->addAlphaShader(alphaFunctionShader); + doc->canon()->addAlphaShader(alphaFunctionShader); return alphaFunctionShader; } @@ -820,7 +822,7 @@ SkPDFFunctionShader* SkPDFFunctionShader::Create( } SkPDFImageShader* SkPDFImageShader::Create( - SkPDFCanon* canon, + SkPDFDocument* doc, SkScalar dpi, SkAutoTDelete<SkPDFShader::State>* autoState) { const SkPDFShader::State& state = **autoState; @@ -860,7 +862,7 @@ SkPDFImageShader* SkPDFImageShader::Create( SkISize size = SkISize::Make(SkScalarRoundToInt(deviceBounds.width()), SkScalarRoundToInt(deviceBounds.height())); sk_sp<SkPDFDevice> patternDevice( - SkPDFDevice::CreateUnflipped(size, dpi, canon)); + SkPDFDevice::CreateUnflipped(size, dpi, doc)); SkCanvas canvas(patternDevice.get()); SkRect patternBBox; @@ -1030,7 +1032,7 @@ SkPDFImageShader* SkPDFImageShader::Create( imageShader->fShaderState->fImage.unlockPixels(); - canon->addImageShader(imageShader); + doc->canon()->addImageShader(imageShader); return imageShader; } |