Index: src/pdf/SkPDFShader.cpp |
diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp |
index e9283bc2756f98d333c9d0de2344206e91f29f7b..f94369bef9f06ddefdfbedb2472183e290807fb5 100644 |
--- a/src/pdf/SkPDFShader.cpp |
+++ b/src/pdf/SkPDFShader.cpp |
@@ -507,13 +507,12 @@ private: |
//////////////////////////////////////////////////////////////////////////////// |
-SkPDFFunctionShader::SkPDFFunctionShader(SkPDFShader::State* state) |
- : SkPDFDict("Pattern"), fShaderState(state) {} |
+SkPDFFunctionShader::SkPDFFunctionShader(SkPDFCanon* canon, |
+ SkPDFShader::State* state) |
+ : SkPDFDict("Pattern"), fCanon(canon), fShaderState(state) {} |
SkPDFFunctionShader::~SkPDFFunctionShader() { |
- SkAutoMutexAcquire lock(SkPDFCanon::GetShaderMutex()); |
- SkPDFCanon::GetCanon().removeFunctionShader(this); |
- lock.release(); |
+ fCanon->removeFunctionShader(this); |
fResources.unrefAll(); |
} |
@@ -523,38 +522,36 @@ bool SkPDFFunctionShader::equals(const SkPDFShader::State& state) const { |
//////////////////////////////////////////////////////////////////////////////// |
-SkPDFAlphaFunctionShader::SkPDFAlphaFunctionShader(SkPDFShader::State* state) |
- : fShaderState(state) {} |
+SkPDFAlphaFunctionShader::SkPDFAlphaFunctionShader(SkPDFCanon* canon, |
+ SkPDFShader::State* state) |
+ : fCanon(canon), fShaderState(state) {} |
bool SkPDFAlphaFunctionShader::equals(const SkPDFShader::State& state) const { |
return state == *fShaderState; |
} |
SkPDFAlphaFunctionShader::~SkPDFAlphaFunctionShader() { |
- SkAutoMutexAcquire lock(SkPDFCanon::GetShaderMutex()); |
- SkPDFCanon::GetCanon().removeAlphaShader(this); |
+ fCanon->removeAlphaShader(this); |
} |
//////////////////////////////////////////////////////////////////////////////// |
-SkPDFImageShader::SkPDFImageShader(SkPDFShader::State* state) |
- : fShaderState(state) {} |
+SkPDFImageShader::SkPDFImageShader(SkPDFCanon* canon, SkPDFShader::State* state) |
+ : fCanon(canon), fShaderState(state) {} |
bool SkPDFImageShader::equals(const SkPDFShader::State& state) const { |
return state == *fShaderState; |
} |
SkPDFImageShader::~SkPDFImageShader() { |
- SkAutoMutexAcquire lock(SkPDFCanon::GetShaderMutex()); |
- SkPDFCanon::GetCanon().removeImageShader(this); |
- lock.release(); |
+ fCanon->removeImageShader(this); |
fResources.unrefAll(); |
} |
//////////////////////////////////////////////////////////////////////////////// |
static SkPDFObject* get_pdf_shader_by_state( |
- SkAutoTDelete<SkPDFShader::State>* autoState) { |
+ SkPDFCanon* canon, SkAutoTDelete<SkPDFShader::State>* autoState) { |
const SkPDFShader::State& state = **autoState; |
if (state.fType == SkShader::kNone_GradientType && state.fImage.isNull()) { |
// TODO(vandebo) This drops SKComposeShader on the floor. We could |
@@ -563,28 +560,30 @@ static SkPDFObject* get_pdf_shader_by_state( |
// second shader, then applying the layer to the original drawing. |
return NULL; |
} else if (state.fType == SkShader::kNone_GradientType) { |
- SkPDFObject* shader = SkPDFCanon::GetCanon().findImageShader(state); |
- return shader ? SkRef(shader) : SkPDFImageShader::Create(autoState); |
+ SkPDFObject* shader = canon->findImageShader(state); |
+ return shader ? SkRef(shader) |
+ : SkPDFImageShader::Create(canon, autoState); |
} else if (state.GradientHasAlpha()) { |
- SkPDFObject* shader = SkPDFCanon::GetCanon().findAlphaShader(state); |
+ SkPDFObject* shader = canon->findAlphaShader(state); |
return shader ? SkRef(shader) |
- : SkPDFAlphaFunctionShader::Create(autoState); |
+ : SkPDFAlphaFunctionShader::Create(canon, autoState); |
} else { |
- SkPDFObject* shader = SkPDFCanon::GetCanon().findFunctionShader(state); |
- return shader ? SkRef(shader) : SkPDFFunctionShader::Create(autoState); |
+ SkPDFObject* shader = canon->findFunctionShader(state); |
+ return shader ? SkRef(shader) |
+ : SkPDFFunctionShader::Create(canon, autoState); |
} |
} |
// static |
-SkPDFObject* SkPDFShader::GetPDFShader(const SkShader& shader, |
+SkPDFObject* SkPDFShader::GetPDFShader(SkPDFCanon* canon, |
+ const SkShader& shader, |
const SkMatrix& matrix, |
const SkIRect& surfaceBBox, |
SkScalar rasterScale) { |
// There is only one mutex becasue we don't know which one we'll need. |
- SkAutoMutexAcquire lock(SkPDFCanon::GetShaderMutex()); |
SkAutoTDelete<SkPDFShader::State> state( |
SkNEW_ARGS(State, (shader, matrix, surfaceBBox, rasterScale))); |
- return get_pdf_shader_by_state(&state); |
+ return get_pdf_shader_by_state(canon, &state); |
} |
static SkPDFResourceDict* get_gradient_resource_dict( |
@@ -647,14 +646,14 @@ static SkStream* create_pattern_fill_content(int gsIndex, SkRect& bounds) { |
* luminosity mode. The shader pattern extends to the bbox. |
*/ |
static SkPDFGraphicState* create_smask_graphic_state( |
- const SkPDFShader::State& state) { |
+ SkPDFCanon* canon, const SkPDFShader::State& state) { |
SkRect bbox; |
bbox.set(state.fBBox); |
SkAutoTDelete<SkPDFShader::State> alphaToLuminosityState( |
state.CreateAlphaToLuminosityState()); |
SkAutoTUnref<SkPDFObject> luminosityShader( |
- get_pdf_shader_by_state(&alphaToLuminosityState)); |
+ get_pdf_shader_by_state(canon, &alphaToLuminosityState)); |
SkAutoTDelete<SkStream> alphaStream(create_pattern_fill_content(-1, bbox)); |
@@ -670,24 +669,25 @@ static SkPDFGraphicState* create_smask_graphic_state( |
} |
SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create( |
- SkAutoTDelete<SkPDFShader::State>* autoState) { |
+ SkPDFCanon* canon, SkAutoTDelete<SkPDFShader::State>* autoState) { |
const SkPDFShader::State& state = **autoState; |
SkRect bbox; |
bbox.set(state.fBBox); |
SkAutoTDelete<SkPDFShader::State> opaqueState(state.CreateOpaqueState()); |
- SkPDFObject* colorShader = get_pdf_shader_by_state(&opaqueState); |
+ SkPDFObject* colorShader = get_pdf_shader_by_state(canon, &opaqueState); |
if (!colorShader) { |
return NULL; |
} |
// Create resource dict with alpha graphics state as G0 and |
// pattern shader as P0, then write content stream. |
- SkAutoTUnref<SkPDFGraphicState> alphaGs(create_smask_graphic_state(state)); |
+ SkAutoTUnref<SkPDFGraphicState> alphaGs( |
+ create_smask_graphic_state(canon, state)); |
SkPDFAlphaFunctionShader* alphaFunctionShader = |
- SkNEW_ARGS(SkPDFAlphaFunctionShader, (autoState->detach())); |
+ SkNEW_ARGS(SkPDFAlphaFunctionShader, (canon, autoState->detach())); |
alphaFunctionShader->fColorShader.reset(colorShader); |
@@ -701,7 +701,7 @@ SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create( |
populate_tiling_pattern_dict(alphaFunctionShader, bbox, |
alphaFunctionShader->fResourceDict.get(), |
SkMatrix::I()); |
- SkPDFCanon::GetCanon().addAlphaShader(alphaFunctionShader); |
+ canon->addAlphaShader(alphaFunctionShader); |
return alphaFunctionShader; |
} |
@@ -774,7 +774,7 @@ static SkPDFStream* make_ps_function(const SkString& psCode, |
} |
SkPDFFunctionShader* SkPDFFunctionShader::Create( |
- SkAutoTDelete<SkPDFShader::State>* autoState) { |
+ SkPDFCanon* canon, SkAutoTDelete<SkPDFShader::State>* autoState) { |
const SkPDFShader::State& state = **autoState; |
SkString (*codeFunction)(const SkShader::GradientInfo& info, |
@@ -893,7 +893,7 @@ SkPDFFunctionShader* SkPDFFunctionShader::Create( |
SkPDFUtils::MatrixToArray(finalMatrix)); |
SkPDFFunctionShader* pdfFunctionShader = |
- SkNEW_ARGS(SkPDFFunctionShader, (autoState->detach())); |
+ SkNEW_ARGS(SkPDFFunctionShader, (canon, autoState->detach())); |
pdfFunctionShader->fResources.push(function); |
// Pass ownership to resource list. |
@@ -902,12 +902,12 @@ SkPDFFunctionShader* SkPDFFunctionShader::Create( |
pdfFunctionShader->insert("Matrix", matrixArray.get()); |
pdfFunctionShader->insert("Shading", pdfShader.get()); |
- SkPDFCanon::GetCanon().addFunctionShader(pdfFunctionShader); |
+ canon->addFunctionShader(pdfFunctionShader); |
return pdfFunctionShader; |
} |
SkPDFImageShader* SkPDFImageShader::Create( |
- SkAutoTDelete<SkPDFShader::State>* autoState) { |
+ SkPDFCanon* canon, SkAutoTDelete<SkPDFShader::State>* autoState) { |
const SkPDFShader::State& state = **autoState; |
state.fImage.lockPixels(); |
@@ -949,8 +949,10 @@ SkPDFImageShader* SkPDFImageShader::Create( |
SkScalarRoundToInt(deviceBounds.height())); |
// TODO(edisonn): should we pass here the DCT encoder of the destination device? |
// TODO(edisonn): NYI Perspective, use SkPDFDeviceFlattener. |
- SkPDFDevice pattern(size, size, unflip); |
- SkCanvas canvas(&pattern); |
+ const SkScalar dpi = 72.0f; /*TODO: get this right*/ |
mtklein
2015/02/19 23:50:38
Is that, pull it from the device instead of making
hal.canary
2015/02/20 01:22:28
I meant to do that. Done
|
+ SkAutoTUnref<SkPDFDevice> patternDevice( |
+ SkPDFDevice::CreateUnflipped(size, dpi, canon)); |
+ SkCanvas canvas(patternDevice.get()); |
SkRect patternBBox; |
image->getBounds(&patternBBox); |
@@ -1108,18 +1110,18 @@ SkPDFImageShader* SkPDFImageShader::Create( |
} |
// Put the canvas into the pattern stream (fContent). |
- SkAutoTDelete<SkStream> content(pattern.content()); |
+ SkAutoTDelete<SkStream> content(patternDevice->content()); |
SkPDFImageShader* imageShader = |
- SkNEW_ARGS(SkPDFImageShader, (autoState->detach())); |
+ SkNEW_ARGS(SkPDFImageShader, (canon, autoState->detach())); |
imageShader->setData(content.get()); |
populate_tiling_pattern_dict(imageShader, patternBBox, |
- pattern.getResourceDict(), finalMatrix); |
+ patternDevice->getResourceDict(), finalMatrix); |
imageShader->fShaderState->fImage.unlockPixels(); |
- SkPDFCanon::GetCanon().addImageShader(imageShader); |
+ canon->addImageShader(imageShader); |
return imageShader; |
} |