OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
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 "SkBlitter.h" | 10 #include "SkBlitter.h" |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 SkSafeRef(proxy); | 570 SkSafeRef(proxy); |
571 fMask = NULL; | 571 fMask = NULL; |
572 } | 572 } |
573 | 573 |
574 virtual ~Sk3DShader() { | 574 virtual ~Sk3DShader() { |
575 SkSafeUnref(fProxy); | 575 SkSafeUnref(fProxy); |
576 } | 576 } |
577 | 577 |
578 void setMask(const SkMask* mask) { fMask = mask; } | 578 void setMask(const SkMask* mask) { fMask = mask; } |
579 | 579 |
580 virtual bool setContext(const SkBitmap& device, const SkPaint& paint, | 580 virtual bool onSetContext(Context* c, const SkBitmap& device, const SkPaint&
paint, |
581 const SkMatrix& matrix) SK_OVERRIDE { | 581 const SkMatrix& matrix) SK_OVERRIDE { |
582 if (!this->INHERITED::setContext(device, paint, matrix)) { | 582 if (!this->INHERITED::onSetContext(c, device, paint, matrix)) { |
583 return false; | 583 return false; |
584 } | 584 } |
585 if (fProxy) { | 585 if (fProxy) { |
586 if (!fProxy->setContext(device, paint, matrix)) { | 586 if (!fProxy->onSetContext(c, device, paint, matrix)) { |
587 // must keep our set/end context calls balanced | |
588 this->INHERITED::endContext(); | |
589 return false; | 587 return false; |
590 } | 588 } |
591 } else { | 589 } else { |
592 fPMColor = SkPreMultiplyColor(paint.getColor()); | 590 fPMColor = SkPreMultiplyColor(paint.getColor()); |
593 } | 591 } |
594 return true; | 592 return true; |
595 } | 593 } |
596 | 594 |
597 virtual void endContext() SK_OVERRIDE { | 595 virtual void endContext() SK_OVERRIDE { |
598 if (fProxy) { | 596 if (fProxy) { |
599 fProxy->endContext(); | 597 fProxy->endContext(); |
600 } | 598 } |
601 this->INHERITED::endContext(); | 599 this->INHERITED::endContext(); |
602 } | 600 } |
603 | 601 |
604 virtual void shadeSpan(int x, int y, SkPMColor span[], int count) SK_OVERRID
E { | 602 virtual void shadeSpan(Context* c, int x, int y, SkPMColor span[], int count
) SK_OVERRIDE { |
605 if (fProxy) { | 603 if (fProxy) { |
606 fProxy->shadeSpan(x, y, span, count); | 604 fProxy->shadeSpan(c, x, y, span, count); |
607 } | 605 } |
608 | 606 |
609 if (fMask == NULL) { | 607 if (fMask == NULL) { |
610 if (fProxy == NULL) { | 608 if (fProxy == NULL) { |
611 sk_memset32(span, fPMColor, count); | 609 sk_memset32(span, fPMColor, count); |
612 } | 610 } |
613 return; | 611 return; |
614 } | 612 } |
615 | 613 |
616 SkASSERT(fMask->fBounds.contains(x, y)); | 614 SkASSERT(fMask->fBounds.contains(x, y)); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 } | 694 } |
697 | 695 |
698 private: | 696 private: |
699 SkShader* fProxy; | 697 SkShader* fProxy; |
700 SkPMColor fPMColor; | 698 SkPMColor fPMColor; |
701 const SkMask* fMask; | 699 const SkMask* fMask; |
702 | 700 |
703 typedef SkShader INHERITED; | 701 typedef SkShader INHERITED; |
704 }; | 702 }; |
705 | 703 |
| 704 // Remember, this class is going to hang onto another blitter. I think it's okay
for |
| 705 // him to just let that blitter handle the Context. |
706 class Sk3DBlitter : public SkBlitter { | 706 class Sk3DBlitter : public SkBlitter { |
707 public: | 707 public: |
708 Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader, void (*killProc)(void*)) | 708 Sk3DBlitter(SkBlitter* proxy, Sk3DShader* shader, void (*killProc)(void*)) |
709 : fProxy(proxy), f3DShader(shader), fKillProc(killProc) { | 709 : fProxy(proxy), f3DShader(shader), fKillProc(killProc) { |
710 shader->ref(); | 710 shader->ref(); |
711 } | 711 } |
712 | 712 |
713 virtual ~Sk3DBlitter() { | 713 virtual ~Sk3DBlitter() { |
714 f3DShader->unref(); | 714 f3DShader->unref(); |
715 fKillProc(fProxy); | 715 fKillProc(fProxy); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 } | 932 } |
933 | 933 |
934 /* | 934 /* |
935 * We need to have balanced calls to the shader: | 935 * We need to have balanced calls to the shader: |
936 * setContext | 936 * setContext |
937 * endContext | 937 * endContext |
938 * We make the first call here, in case it fails we can abort the draw. | 938 * We make the first call here, in case it fails we can abort the draw. |
939 * The endContext() call is made by the blitter (assuming setContext did | 939 * The endContext() call is made by the blitter (assuming setContext did |
940 * not fail) in its destructor. | 940 * not fail) in its destructor. |
941 */ | 941 */ |
942 if (shader && !shader->setContext(device, *paint, matrix)) { | 942 SkShader::Context* context = NULL; |
943 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); | 943 if (shader) { |
944 return blitter; | 944 context = shader->setContext(device, *paint, matrix); |
| 945 if (!context) { |
| 946 SK_PLACEMENT_NEW(blitter, SkNullBlitter, storage, storageSize); |
| 947 return blitter; |
| 948 } |
945 } | 949 } |
946 | 950 |
947 | 951 |
948 switch (device.config()) { | 952 switch (device.config()) { |
949 case SkBitmap::kA8_Config: | 953 case SkBitmap::kA8_Config: |
950 if (drawCoverage) { | 954 if (drawCoverage) { |
951 SkASSERT(NULL == shader); | 955 SkASSERT(NULL == shader); |
| 956 SkASSERT(NULL == context); |
952 SkASSERT(NULL == paint->getXfermode()); | 957 SkASSERT(NULL == paint->getXfermode()); |
953 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter, | 958 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Coverage_Blitter, |
954 storage, storageSize, (device, *paint)); | 959 storage, storageSize, (device, *paint)); |
955 } else if (shader) { | 960 } else if (shader) { |
| 961 // I've just made the blitters slightly larger. Make sure they'r
e still |
| 962 // small enough to fit in storage |
| 963 SkASSERT(sizeof(SkA8_Shader_Blitter) <= storageSize); |
956 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, | 964 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Shader_Blitter, |
957 storage, storageSize, (device, *paint)); | 965 storage, storageSize, (device, *paint, con
text)); |
958 } else { | 966 } else { |
959 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, | 967 SK_PLACEMENT_NEW_ARGS(blitter, SkA8_Blitter, |
960 storage, storageSize, (device, *paint)); | 968 storage, storageSize, (device, *paint)); |
961 } | 969 } |
962 break; | 970 break; |
963 | 971 |
964 case SkBitmap::kRGB_565_Config: | 972 case SkBitmap::kRGB_565_Config: |
965 blitter = SkBlitter_ChooseD565(device, *paint, storage, storageSize)
; | 973 blitter = SkBlitter_ChooseD565(device, *paint, context, storage, sto
rageSize); |
966 break; | 974 break; |
967 | 975 |
968 case SkBitmap::kARGB_8888_Config: | 976 case SkBitmap::kARGB_8888_Config: |
969 if (shader) { | 977 if (shader) { |
| 978 SkASSERT(sizeof(SkARGB32_Shader_Blitter) <= storageSize); |
970 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Shader_Blitter, | 979 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Shader_Blitter, |
971 storage, storageSize, (device, *paint)); | 980 storage, storageSize, (device, *paint, con
text)); |
972 } else if (paint->getColor() == SK_ColorBLACK) { | 981 } else if (paint->getColor() == SK_ColorBLACK) { |
973 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter, | 982 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Black_Blitter, |
974 storage, storageSize, (device, *paint)); | 983 storage, storageSize, (device, *paint)); |
975 } else if (paint->getAlpha() == 0xFF) { | 984 } else if (paint->getAlpha() == 0xFF) { |
976 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Opaque_Blitter, | 985 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Opaque_Blitter, |
977 storage, storageSize, (device, *paint)); | 986 storage, storageSize, (device, *paint)); |
978 } else { | 987 } else { |
979 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Blitter, | 988 SK_PLACEMENT_NEW_ARGS(blitter, SkARGB32_Blitter, |
980 storage, storageSize, (device, *paint)); | 989 storage, storageSize, (device, *paint)); |
981 } | 990 } |
(...skipping 15 matching lines...) Expand all Loading... |
997 return blitter; | 1006 return blitter; |
998 } | 1007 } |
999 | 1008 |
1000 /////////////////////////////////////////////////////////////////////////////// | 1009 /////////////////////////////////////////////////////////////////////////////// |
1001 | 1010 |
1002 const uint16_t gMask_0F0F = 0xF0F; | 1011 const uint16_t gMask_0F0F = 0xF0F; |
1003 const uint32_t gMask_00FF00FF = 0xFF00FF; | 1012 const uint32_t gMask_00FF00FF = 0xFF00FF; |
1004 | 1013 |
1005 /////////////////////////////////////////////////////////////////////////////// | 1014 /////////////////////////////////////////////////////////////////////////////// |
1006 | 1015 |
1007 SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint) | 1016 SkShaderBlitter::SkShaderBlitter(const SkBitmap& device, const SkPaint& paint, |
| 1017 SkShader::Context* context) |
1008 : INHERITED(device) { | 1018 : INHERITED(device) { |
1009 fShader = paint.getShader(); | 1019 fShader = paint.getShader(); |
1010 SkASSERT(fShader); | 1020 SkASSERT(fShader); |
1011 SkASSERT(fShader->setContextHasBeenCalled()); | 1021 SkASSERT(fShader->setContextHasBeenCalled()); |
1012 | 1022 |
1013 fShader->ref(); | 1023 fShader->ref(); |
1014 fShaderFlags = fShader->getFlags(); | 1024 fShaderFlags = fShader->getFlags(); |
| 1025 |
| 1026 fContext = context; |
| 1027 SkASSERT(fContext); |
1015 } | 1028 } |
1016 | 1029 |
1017 SkShaderBlitter::~SkShaderBlitter() { | 1030 SkShaderBlitter::~SkShaderBlitter() { |
1018 SkASSERT(fShader->setContextHasBeenCalled()); | 1031 SkASSERT(fShader->setContextHasBeenCalled()); |
1019 fShader->endContext(); | 1032 fShader->endContext(fContext); |
1020 fShader->unref(); | 1033 fShader->unref(); |
1021 } | 1034 } |
OLD | NEW |