Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkColorSpacePriv.h" | |
| 8 #include "SkOpts.h" | 9 #include "SkOpts.h" |
| 9 #include "SkSmallAllocator.h" | 10 #include "SkSmallAllocator.h" |
| 10 #include "SkSpriteBlitter.h" | 11 #include "SkSpriteBlitter.h" |
| 11 | 12 |
| 12 SkSpriteBlitter::SkSpriteBlitter(const SkPixmap& source) | 13 SkSpriteBlitter::SkSpriteBlitter(const SkPixmap& source) |
| 13 : fSource(source) {} | 14 : fSource(source) {} |
| 14 | 15 |
| 15 void SkSpriteBlitter::setup(const SkPixmap& dst, int left, int top, const SkPain t& paint) { | 16 void SkSpriteBlitter::setup(const SkPixmap& dst, int left, int top, const SkPain t& paint) { |
| 16 fDst = dst; | 17 fDst = dst; |
| 17 fLeft = left; | 18 fLeft = left; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 52 // 1. src == dst format | 53 // 1. src == dst format |
| 53 // 2. paint has no modifiers (i.e. alpha, colorfilter, etc.) | 54 // 2. paint has no modifiers (i.e. alpha, colorfilter, etc.) |
| 54 // 3. xfermode needs no blending: e.g. kSrc_Mode or kSrcOver_Mode + opaque src | 55 // 3. xfermode needs no blending: e.g. kSrc_Mode or kSrcOver_Mode + opaque src |
| 55 // | 56 // |
| 56 class SkSpriteBlitter_Src_SrcOver final : public SkSpriteBlitter { | 57 class SkSpriteBlitter_Src_SrcOver final : public SkSpriteBlitter { |
| 57 public: | 58 public: |
| 58 static bool Supports(const SkPixmap& dst, const SkPixmap& src, const SkPaint & paint) { | 59 static bool Supports(const SkPixmap& dst, const SkPixmap& src, const SkPaint & paint) { |
| 59 if (dst.colorType() != src.colorType()) { | 60 if (dst.colorType() != src.colorType()) { |
| 60 return false; | 61 return false; |
| 61 } | 62 } |
| 62 if (dst.info().profileType() != src.info().profileType()) { | 63 if (SkColorSpacePriv::EQ(dst.info().colorSpace(), src.info().colorSpace( ))) { |
|
Brian Osman
2016/06/20 20:09:19
Should this be !EQ ?
reed1
2016/06/20 21:05:52
Done.
| |
| 63 return false; | 64 return false; |
| 64 } | 65 } |
| 65 if (paint.getMaskFilter() || paint.getColorFilter() || paint.getImageFil ter()) { | 66 if (paint.getMaskFilter() || paint.getColorFilter() || paint.getImageFil ter()) { |
| 66 return false; | 67 return false; |
| 67 } | 68 } |
| 68 if (0xFF != paint.getAlpha()) { | 69 if (0xFF != paint.getAlpha()) { |
| 69 return false; | 70 return false; |
| 70 } | 71 } |
| 71 SkXfermode::Mode mode; | 72 SkXfermode::Mode mode; |
| 72 if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { | 73 if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { |
| 73 return false; | 74 return false; |
| 74 } | 75 } |
| 75 if (SkXfermode::kSrc_Mode == mode) { | 76 if (SkXfermode::kSrc_Mode == mode) { |
| 76 return true; | 77 return true; |
| 77 } | 78 } |
| 78 if (SkXfermode::kSrcOver_Mode == mode && src.isOpaque()) { | 79 if (SkXfermode::kSrcOver_Mode == mode && src.isOpaque()) { |
| 79 return true; | 80 return true; |
| 80 } | 81 } |
| 81 | 82 |
| 82 // At this point memcpy can't be used. The following check for using Src Over. | 83 // At this point memcpy can't be used. The following check for using Src Over. |
| 83 | 84 |
| 84 if (dst.colorType() != kN32_SkColorType | 85 if (dst.colorType() != kN32_SkColorType || nullptr == dst.info().colorSp ace()) { |
|
Brian Osman
2016/06/20 20:09:19
What exactly was this checking for before? I don't
reed1
2016/06/20 21:05:52
Not sure :) Seems like this class wants to be SRGB
| |
| 85 || dst.info().profileType() != kSRGB_SkColorProfileType) { | |
| 86 return false; | 86 return false; |
| 87 } | 87 } |
| 88 | 88 |
| 89 return SkXfermode::kSrcOver_Mode == mode; | 89 return SkXfermode::kSrcOver_Mode == mode; |
| 90 } | 90 } |
| 91 | 91 |
| 92 SkSpriteBlitter_Src_SrcOver(const SkPixmap& src) | 92 SkSpriteBlitter_Src_SrcOver(const SkPixmap& src) |
| 93 : INHERITED(src) {} | 93 : INHERITED(src) {} |
| 94 | 94 |
| 95 void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) ove rride { | 95 void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) ove rride { |
| 96 SkASSERT(Supports(dst, fSource, paint)); | 96 SkASSERT(Supports(dst, fSource, paint)); |
| 97 this->INHERITED::setup(dst, left, top, paint); | 97 this->INHERITED::setup(dst, left, top, paint); |
| 98 SkXfermode::Mode mode; | 98 SkXfermode::Mode mode; |
| 99 if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { | 99 if (!SkXfermode::AsMode(paint.getXfermode(), &mode)) { |
| 100 SkFAIL("Should never happen."); | 100 SkFAIL("Should never happen."); |
| 101 } | 101 } |
| 102 | 102 |
| 103 SkASSERT(mode == SkXfermode::kSrcOver_Mode || mode == SkXfermode::kSrc_M ode); | 103 SkASSERT(mode == SkXfermode::kSrcOver_Mode || mode == SkXfermode::kSrc_M ode); |
| 104 | 104 |
| 105 if (mode == SkXfermode::kSrcOver_Mode && !fSource.isOpaque()) { | 105 if (mode == SkXfermode::kSrcOver_Mode && !fSource.isOpaque()) { |
| 106 fUseMemcpy = false; | 106 fUseMemcpy = false; |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 | 109 |
| 110 void blitRect(int x, int y, int width, int height) override { | 110 void blitRect(int x, int y, int width, int height) override { |
| 111 SkASSERT(fDst.colorType() == fSource.colorType()); | 111 SkASSERT(fDst.colorType() == fSource.colorType()); |
| 112 SkASSERT(fDst.info().profileType() == fSource.info().profileType()); | 112 SkASSERT(SkColorSpacePriv::EQ(fDst.info().colorSpace(), fSource.info().c olorSpace())); |
| 113 SkASSERT(width > 0 && height > 0); | 113 SkASSERT(width > 0 && height > 0); |
| 114 | 114 |
| 115 if (fUseMemcpy) { | 115 if (fUseMemcpy) { |
| 116 char* dst = (char*)fDst.writable_addr(x, y); | 116 char* dst = (char*)fDst.writable_addr(x, y); |
| 117 const char* src = (const char*)fSource.addr(x - fLeft, y - fTop); | 117 const char* src = (const char*)fSource.addr(x - fLeft, y - fTop); |
| 118 const size_t dstRB = fDst.rowBytes(); | 118 const size_t dstRB = fDst.rowBytes(); |
| 119 const size_t srcRB = fSource.rowBytes(); | 119 const size_t srcRB = fSource.rowBytes(); |
| 120 const size_t bytesToCopy = width << fSource.shiftPerPixel(); | 120 const size_t bytesToCopy = width << fSource.shiftPerPixel(); |
| 121 | 121 |
| 122 while (height --> 0) { | 122 while (height --> 0) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 168 SkSpriteBlitter* blitter = nullptr; | 168 SkSpriteBlitter* blitter = nullptr; |
| 169 | 169 |
| 170 if (SkSpriteBlitter_Src_SrcOver::Supports(dst, source, paint)) { | 170 if (SkSpriteBlitter_Src_SrcOver::Supports(dst, source, paint)) { |
| 171 blitter = allocator->createT<SkSpriteBlitter_Src_SrcOver>(source); | 171 blitter = allocator->createT<SkSpriteBlitter_Src_SrcOver>(source); |
| 172 } else { | 172 } else { |
| 173 switch (dst.colorType()) { | 173 switch (dst.colorType()) { |
| 174 case kRGB_565_SkColorType: | 174 case kRGB_565_SkColorType: |
| 175 blitter = SkSpriteBlitter::ChooseD16(source, paint, allocator); | 175 blitter = SkSpriteBlitter::ChooseD16(source, paint, allocator); |
| 176 break; | 176 break; |
| 177 case kN32_SkColorType: | 177 case kN32_SkColorType: |
| 178 if (dst.info().isSRGB()) { | 178 if (dst.info().gammaCloseToSRGB()) { |
| 179 blitter = SkSpriteBlitter::ChooseS32(source, paint, allocato r); | 179 blitter = SkSpriteBlitter::ChooseS32(source, paint, allocato r); |
| 180 } else { | 180 } else { |
| 181 blitter = SkSpriteBlitter::ChooseL32(source, paint, allocato r); | 181 blitter = SkSpriteBlitter::ChooseL32(source, paint, allocato r); |
| 182 } | 182 } |
| 183 break; | 183 break; |
| 184 case kRGBA_F16_SkColorType: | 184 case kRGBA_F16_SkColorType: |
| 185 blitter = SkSpriteBlitter::ChooseF16(source, paint, allocator); | 185 blitter = SkSpriteBlitter::ChooseF16(source, paint, allocator); |
| 186 break; | 186 break; |
| 187 default: | 187 default: |
| 188 break; | 188 break; |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 | 191 |
| 192 if (blitter) { | 192 if (blitter) { |
| 193 blitter->setup(dst, left, top, paint); | 193 blitter->setup(dst, left, top, paint); |
| 194 } | 194 } |
| 195 return blitter; | 195 return blitter; |
| 196 } | 196 } |
| OLD | NEW |