OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2008 The Android Open Source Project | 3 * Copyright 2008 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 "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 SkASSERT(!area.isEmpty()); | 832 SkASSERT(!area.isEmpty()); |
833 { | 833 { |
834 SkIRect total = { 0, 0, this->width(), this->height() }; | 834 SkIRect total = { 0, 0, this->width(), this->height() }; |
835 SkASSERT(total.contains(area)); | 835 SkASSERT(total.contains(area)); |
836 } | 836 } |
837 #endif | 837 #endif |
838 | 838 |
839 switch (fInfo.colorType()) { | 839 switch (fInfo.colorType()) { |
840 case kUnknown_SkColorType: | 840 case kUnknown_SkColorType: |
841 case kIndex_8_SkColorType: | 841 case kIndex_8_SkColorType: |
842 return; // can't erase | 842 return; // can't erase. Should we bzero so the memory is not uniniti
alized? |
843 default: | 843 default: |
844 break; | 844 break; |
845 } | 845 } |
846 | 846 |
847 SkAutoLockPixels alp(*this); | 847 SkAutoLockPixels alp(*this); |
848 // perform this check after the lock call | 848 // perform this check after the lock call |
849 if (!this->readyToDraw()) { | 849 if (!this->readyToDraw()) { |
850 return; | 850 return; |
851 } | 851 } |
852 | 852 |
853 int height = area.height(); | 853 int height = area.height(); |
854 const int width = area.width(); | 854 const int width = area.width(); |
855 const int rowBytes = fRowBytes; | 855 const int rowBytes = fRowBytes; |
856 | 856 |
857 // make rgb premultiplied | |
858 if (255 != a) { | |
859 r = SkAlphaMul(r, a); | |
860 g = SkAlphaMul(g, a); | |
861 b = SkAlphaMul(b, a); | |
862 } | |
863 | |
864 switch (this->colorType()) { | 857 switch (this->colorType()) { |
865 case kAlpha_8_SkColorType: { | 858 case kAlpha_8_SkColorType: { |
866 uint8_t* p = this->getAddr8(area.fLeft, area.fTop); | 859 uint8_t* p = this->getAddr8(area.fLeft, area.fTop); |
867 while (--height >= 0) { | 860 while (--height >= 0) { |
868 memset(p, a, width); | 861 memset(p, a, width); |
869 p += rowBytes; | 862 p += rowBytes; |
870 } | 863 } |
871 break; | 864 break; |
872 } | 865 } |
873 case kARGB_4444_SkColorType: | 866 case kARGB_4444_SkColorType: |
874 case kRGB_565_SkColorType: { | 867 case kRGB_565_SkColorType: { |
875 uint16_t* p = this->getAddr16(area.fLeft, area.fTop);; | 868 uint16_t* p = this->getAddr16(area.fLeft, area.fTop);; |
876 uint16_t v; | 869 uint16_t v; |
877 | 870 |
| 871 // make rgb premultiplied |
| 872 if (255 != a) { |
| 873 r = SkAlphaMul(r, a); |
| 874 g = SkAlphaMul(g, a); |
| 875 b = SkAlphaMul(b, a); |
| 876 } |
| 877 |
878 if (kARGB_4444_SkColorType == this->colorType()) { | 878 if (kARGB_4444_SkColorType == this->colorType()) { |
879 v = pack_8888_to_4444(a, r, g, b); | 879 v = pack_8888_to_4444(a, r, g, b); |
880 } else { | 880 } else { |
881 v = SkPackRGB16(r >> (8 - SK_R16_BITS), | 881 v = SkPackRGB16(r >> (8 - SK_R16_BITS), |
882 g >> (8 - SK_G16_BITS), | 882 g >> (8 - SK_G16_BITS), |
883 b >> (8 - SK_B16_BITS)); | 883 b >> (8 - SK_B16_BITS)); |
884 } | 884 } |
885 while (--height >= 0) { | 885 while (--height >= 0) { |
886 sk_memset16(p, v, width); | 886 sk_memset16(p, v, width); |
887 p = (uint16_t*)((char*)p + rowBytes); | 887 p = (uint16_t*)((char*)p + rowBytes); |
888 } | 888 } |
889 break; | 889 break; |
890 } | 890 } |
891 case kPMColor_SkColorType: { | 891 case kBGRA_8888_SkColorType: |
892 // what to do about BGRA or RGBA (which ever is != PMColor ? | 892 case kRGBA_8888_SkColorType: { |
893 // for now we don't support them. | |
894 uint32_t* p = this->getAddr32(area.fLeft, area.fTop); | 893 uint32_t* p = this->getAddr32(area.fLeft, area.fTop); |
895 uint32_t v = SkPackARGB32(a, r, g, b); | 894 |
| 895 if (255 != a && kPremul_SkAlphaType == this->alphaType()) { |
| 896 r = SkAlphaMul(r, a); |
| 897 g = SkAlphaMul(g, a); |
| 898 b = SkAlphaMul(b, a); |
| 899 } |
| 900 uint32_t v = kRGBA_8888_SkColorType == this->colorType() ? |
| 901 SkPackARGB_as_RGBA(a, r, g, b) : SkPackARGB_as_BGRA(a,
r, g, b); |
896 | 902 |
897 while (--height >= 0) { | 903 while (--height >= 0) { |
898 sk_memset32(p, v, width); | 904 sk_memset32(p, v, width); |
899 p = (uint32_t*)((char*)p + rowBytes); | 905 p = (uint32_t*)((char*)p + rowBytes); |
900 } | 906 } |
901 break; | 907 break; |
902 } | 908 } |
903 default: | 909 default: |
904 return; // no change, so don't call notifyPixelsChanged() | 910 return; // no change, so don't call notifyPixelsChanged() |
905 } | 911 } |
(...skipping 816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1722 /////////////////////////////////////////////////////////////////////////////// | 1728 /////////////////////////////////////////////////////////////////////////////// |
1723 | 1729 |
1724 #ifdef SK_DEBUG | 1730 #ifdef SK_DEBUG |
1725 void SkImageInfo::validate() const { | 1731 void SkImageInfo::validate() const { |
1726 SkASSERT(fWidth >= 0); | 1732 SkASSERT(fWidth >= 0); |
1727 SkASSERT(fHeight >= 0); | 1733 SkASSERT(fHeight >= 0); |
1728 SkASSERT(SkColorTypeIsValid(fColorType)); | 1734 SkASSERT(SkColorTypeIsValid(fColorType)); |
1729 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); | 1735 SkASSERT(SkAlphaTypeIsValid(fAlphaType)); |
1730 } | 1736 } |
1731 #endif | 1737 #endif |
OLD | NEW |