OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkPDFShader.h" | 10 #include "SkPDFShader.h" |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 } | 511 } |
512 } | 512 } |
513 | 513 |
514 // static | 514 // static |
515 SkPDFObject* SkPDFShader::GetPDFShader(SkPDFCanon* canon, | 515 SkPDFObject* SkPDFShader::GetPDFShader(SkPDFCanon* canon, |
516 SkScalar dpi, | 516 SkScalar dpi, |
517 const SkShader& shader, | 517 const SkShader& shader, |
518 const SkMatrix& matrix, | 518 const SkMatrix& matrix, |
519 const SkIRect& surfaceBBox, | 519 const SkIRect& surfaceBBox, |
520 SkScalar rasterScale) { | 520 SkScalar rasterScale) { |
521 SkAutoTDelete<SkPDFShader::State> state( | 521 SkAutoTDelete<SkPDFShader::State> state(new State(shader, matrix, surfaceBBo
x, rasterScale)); |
522 SkNEW_ARGS(State, (shader, matrix, surfaceBBox, rasterScale))); | |
523 return get_pdf_shader_by_state(canon, dpi, &state); | 522 return get_pdf_shader_by_state(canon, dpi, &state); |
524 } | 523 } |
525 | 524 |
526 static SkPDFDict* get_gradient_resource_dict( | 525 static SkPDFDict* get_gradient_resource_dict( |
527 SkPDFObject* functionShader, | 526 SkPDFObject* functionShader, |
528 SkPDFObject* gState) { | 527 SkPDFObject* gState) { |
529 SkTDArray<SkPDFObject*> patterns; | 528 SkTDArray<SkPDFObject*> patterns; |
530 if (functionShader) { | 529 if (functionShader) { |
531 patterns.push(functionShader); | 530 patterns.push(functionShader); |
532 } | 531 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 if (!colorShader) { | 617 if (!colorShader) { |
619 return NULL; | 618 return NULL; |
620 } | 619 } |
621 | 620 |
622 // Create resource dict with alpha graphics state as G0 and | 621 // Create resource dict with alpha graphics state as G0 and |
623 // pattern shader as P0, then write content stream. | 622 // pattern shader as P0, then write content stream. |
624 SkAutoTUnref<SkPDFObject> alphaGs( | 623 SkAutoTUnref<SkPDFObject> alphaGs( |
625 create_smask_graphic_state(canon, dpi, state)); | 624 create_smask_graphic_state(canon, dpi, state)); |
626 | 625 |
627 SkPDFAlphaFunctionShader* alphaFunctionShader = | 626 SkPDFAlphaFunctionShader* alphaFunctionShader = |
628 SkNEW_ARGS(SkPDFAlphaFunctionShader, (autoState->detach())); | 627 new SkPDFAlphaFunctionShader(autoState->detach()); |
629 | 628 |
630 SkAutoTUnref<SkPDFDict> resourceDict( | 629 SkAutoTUnref<SkPDFDict> resourceDict( |
631 get_gradient_resource_dict(colorShader.get(), alphaGs.get())); | 630 get_gradient_resource_dict(colorShader.get(), alphaGs.get())); |
632 | 631 |
633 SkAutoTDelete<SkStream> colorStream( | 632 SkAutoTDelete<SkStream> colorStream( |
634 create_pattern_fill_content(0, bbox)); | 633 create_pattern_fill_content(0, bbox)); |
635 alphaFunctionShader->setData(colorStream.get()); | 634 alphaFunctionShader->setData(colorStream.get()); |
636 | 635 |
637 populate_tiling_pattern_dict(alphaFunctionShader, bbox, resourceDict.get(), | 636 populate_tiling_pattern_dict(alphaFunctionShader, bbox, resourceDict.get(), |
638 SkMatrix::I()); | 637 SkMatrix::I()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 | 672 |
674 affine->setAll(sx - p0 * tx / p2, kx - p1 * tx / p2, tx / p2, | 673 affine->setAll(sx - p0 * tx / p2, kx - p1 * tx / p2, tx / p2, |
675 ky - p0 * ty / p2, sy - p1 * ty / p2, ty / p2, | 674 ky - p0 * ty / p2, sy - p1 * ty / p2, ty / p2, |
676 zero, zero, one); | 675 zero, zero, one); |
677 | 676 |
678 return true; | 677 return true; |
679 } | 678 } |
680 | 679 |
681 namespace { | 680 namespace { |
682 SkPDFObject* create_range_object() { | 681 SkPDFObject* create_range_object() { |
683 SkPDFArray* range = SkNEW(SkPDFArray); | 682 SkPDFArray* range = new SkPDFArray; |
684 range->reserve(6); | 683 range->reserve(6); |
685 range->appendInt(0); | 684 range->appendInt(0); |
686 range->appendInt(1); | 685 range->appendInt(1); |
687 range->appendInt(0); | 686 range->appendInt(0); |
688 range->appendInt(1); | 687 range->appendInt(1); |
689 range->appendInt(0); | 688 range->appendInt(0); |
690 range->appendInt(1); | 689 range->appendInt(1); |
691 return range; | 690 return range; |
692 } | 691 } |
693 | 692 |
694 template <typename T> void unref(T* ptr) { ptr->unref();} | 693 template <typename T> void unref(T* ptr) { ptr->unref();} |
695 } // namespace | 694 } // namespace |
696 | 695 |
697 SK_DECLARE_STATIC_LAZY_PTR(SkPDFObject, rangeObject, | 696 SK_DECLARE_STATIC_LAZY_PTR(SkPDFObject, rangeObject, |
698 create_range_object, unref<SkPDFObject>); | 697 create_range_object, unref<SkPDFObject>); |
699 | 698 |
700 static SkPDFStream* make_ps_function(const SkString& psCode, | 699 static SkPDFStream* make_ps_function(const SkString& psCode, |
701 SkPDFArray* domain) { | 700 SkPDFArray* domain) { |
702 SkAutoDataUnref funcData( | 701 SkAutoDataUnref funcData( |
703 SkData::NewWithCopy(psCode.c_str(), psCode.size())); | 702 SkData::NewWithCopy(psCode.c_str(), psCode.size())); |
704 SkPDFStream* result = SkNEW_ARGS(SkPDFStream, (funcData.get())); | 703 SkPDFStream* result = new SkPDFStream(funcData.get()); |
705 result->insertInt("FunctionType", 4); | 704 result->insertInt("FunctionType", 4); |
706 result->insertObject("Domain", SkRef(domain)); | 705 result->insertObject("Domain", SkRef(domain)); |
707 result->insertObject("Range", SkRef(rangeObject.get())); | 706 result->insertObject("Range", SkRef(rangeObject.get())); |
708 return result; | 707 return result; |
709 } | 708 } |
710 | 709 |
711 SkPDFFunctionShader* SkPDFFunctionShader::Create( | 710 SkPDFFunctionShader* SkPDFFunctionShader::Create( |
712 SkPDFCanon* canon, SkAutoTDelete<SkPDFShader::State>* autoState) { | 711 SkPDFCanon* canon, SkAutoTDelete<SkPDFShader::State>* autoState) { |
713 const SkPDFShader::State& state = **autoState; | 712 const SkPDFShader::State& state = **autoState; |
714 | 713 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 | 806 |
808 SkAutoTUnref<SkPDFDict> pdfShader(new SkPDFDict); | 807 SkAutoTUnref<SkPDFDict> pdfShader(new SkPDFDict); |
809 pdfShader->insertInt("ShadingType", 1); | 808 pdfShader->insertInt("ShadingType", 1); |
810 pdfShader->insertName("ColorSpace", "DeviceRGB"); | 809 pdfShader->insertName("ColorSpace", "DeviceRGB"); |
811 pdfShader->insertObject("Domain", SkRef(domain.get())); | 810 pdfShader->insertObject("Domain", SkRef(domain.get())); |
812 | 811 |
813 SkAutoTUnref<SkPDFStream> function( | 812 SkAutoTUnref<SkPDFStream> function( |
814 make_ps_function(functionCode, domain.get())); | 813 make_ps_function(functionCode, domain.get())); |
815 pdfShader->insertObjRef("Function", function.detach()); | 814 pdfShader->insertObjRef("Function", function.detach()); |
816 | 815 |
817 SkPDFFunctionShader* pdfFunctionShader = | 816 SkPDFFunctionShader* pdfFunctionShader = new SkPDFFunctionShader(autoState->
detach()); |
818 SkNEW_ARGS(SkPDFFunctionShader, (autoState->detach())); | |
819 | 817 |
820 pdfFunctionShader->insertInt("PatternType", 2); | 818 pdfFunctionShader->insertInt("PatternType", 2); |
821 pdfFunctionShader->insertObject("Matrix", | 819 pdfFunctionShader->insertObject("Matrix", |
822 SkPDFUtils::MatrixToArray(finalMatrix)); | 820 SkPDFUtils::MatrixToArray(finalMatrix)); |
823 pdfFunctionShader->insertObject("Shading", pdfShader.detach()); | 821 pdfFunctionShader->insertObject("Shading", pdfShader.detach()); |
824 | 822 |
825 canon->addFunctionShader(pdfFunctionShader); | 823 canon->addFunctionShader(pdfFunctionShader); |
826 return pdfFunctionShader; | 824 return pdfFunctionShader; |
827 } | 825 } |
828 | 826 |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1021 bottomMatrix.postTranslate(2 * width, 0); | 1019 bottomMatrix.postTranslate(2 * width, 0); |
1022 drawBitmapMatrix(&canvas, bottom, bottomMatrix); | 1020 drawBitmapMatrix(&canvas, bottom, bottomMatrix); |
1023 } | 1021 } |
1024 patternBBox.fBottom = deviceBounds.height(); | 1022 patternBBox.fBottom = deviceBounds.height(); |
1025 } | 1023 } |
1026 } | 1024 } |
1027 | 1025 |
1028 // Put the canvas into the pattern stream (fContent). | 1026 // Put the canvas into the pattern stream (fContent). |
1029 SkAutoTDelete<SkStreamAsset> content(patternDevice->content()); | 1027 SkAutoTDelete<SkStreamAsset> content(patternDevice->content()); |
1030 | 1028 |
1031 SkPDFImageShader* imageShader = | 1029 SkPDFImageShader* imageShader = new SkPDFImageShader(autoState->detach()); |
1032 SkNEW_ARGS(SkPDFImageShader, (autoState->detach())); | |
1033 imageShader->setData(content.get()); | 1030 imageShader->setData(content.get()); |
1034 | 1031 |
1035 SkAutoTUnref<SkPDFDict> resourceDict( | 1032 SkAutoTUnref<SkPDFDict> resourceDict( |
1036 patternDevice->createResourceDict()); | 1033 patternDevice->createResourceDict()); |
1037 populate_tiling_pattern_dict(imageShader, patternBBox, | 1034 populate_tiling_pattern_dict(imageShader, patternBBox, |
1038 resourceDict.get(), finalMatrix); | 1035 resourceDict.get(), finalMatrix); |
1039 | 1036 |
1040 imageShader->fShaderState->fImage.unlockPixels(); | 1037 imageShader->fShaderState->fImage.unlockPixels(); |
1041 | 1038 |
1042 canon->addImageShader(imageShader); | 1039 canon->addImageShader(imageShader); |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 return false; | 1229 return false; |
1233 } | 1230 } |
1234 | 1231 |
1235 void SkPDFShader::State::AllocateGradientInfoStorage() { | 1232 void SkPDFShader::State::AllocateGradientInfoStorage() { |
1236 fColorData.set(sk_malloc_throw( | 1233 fColorData.set(sk_malloc_throw( |
1237 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); | 1234 fInfo.fColorCount * (sizeof(SkColor) + sizeof(SkScalar)))); |
1238 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); | 1235 fInfo.fColors = reinterpret_cast<SkColor*>(fColorData.get()); |
1239 fInfo.fColorOffsets = | 1236 fInfo.fColorOffsets = |
1240 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); | 1237 reinterpret_cast<SkScalar*>(fInfo.fColors + fInfo.fColorCount); |
1241 } | 1238 } |
OLD | NEW |