| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2016 Google Inc. | 2  * Copyright 2016 Google Inc. | 
| 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 "SkCoreBlitters.h" | 8 #include "SkCoreBlitters.h" | 
| 9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" | 
| 10 #include "SkShader.h" | 10 #include "SkShader.h" | 
| 11 #include "SkUtils.h" | 11 #include "SkUtils.h" | 
| 12 #include "SkXfermode.h" | 12 #include "SkXfermode.h" | 
| 13 #include "SkBlitMask.h" | 13 #include "SkBlitMask.h" | 
| 14 #include "SkTemplates.h" | 14 #include "SkTemplates.h" | 
| 15 #include "SkPM4f.h" | 15 #include "SkPM4f.h" | 
| 16 | 16 | 
| 17 template <typename State> class SkState_Blitter : public SkRasterBlitter { | 17 template <typename State> class SkState_Blitter : public SkRasterBlitter { | 
| 18     typedef SkRasterBlitter INHERITED; | 18     typedef SkRasterBlitter INHERITED; | 
| 19     State fState; | 19     State fState; | 
| 20 | 20 | 
| 21 public: | 21 public: | 
| 22     SkState_Blitter(const SkPixmap& device, const SkPaint& paint) | 22     SkState_Blitter(const SkPixmap& device, const SkPaint& paint) | 
| 23         : INHERITED(device) | 23         : INHERITED(device) | 
| 24         , fState(device.info(), paint, nullptr) | 24         , fState(device.info(), paint, nullptr) | 
| 25     {} | 25     {} | 
| 26 | 26 | 
| 27     void blitH(int x, int y, int width) override { | 27     void blitH(int x, int y, int width) override { | 
| 28         SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width()); | 28         SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width()); | 
| 29 | 29 | 
| 30         fState.fProc1(fState.fXfer, State::WritableAddr(fDevice, x, y), | 30         fState.fProc1(fState.fXfer, State::WritableAddr(fDevice, x, y), | 
| 31                       &fState.fPM4f, width, nullptr); | 31                       &fState.fPM4f, width, nullptr); | 
| 32     } | 32     } | 
| 33 | 33 | 
| 34     void blitV(int x, int y, int height, SkAlpha alpha) override { | 34     void blitV(int x, int y, int height, SkAlpha alpha) override { | 
| 35         SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height()); | 35         SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height()); | 
| 36 | 36 | 
| 37         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 37         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 38         size_t                 deviceRB = fDevice.rowBytes(); | 38         size_t                 deviceRB = fDevice.rowBytes(); | 
| 39 | 39 | 
| 40         for (int i = 0; i < height; ++i) { | 40         for (int i = 0; i < height; ++i) { | 
| 41             fState.fProc1(fState.fXfer, device, &fState.fPM4f, 1, &alpha); | 41             fState.fProc1(fState.fXfer, device, &fState.fPM4f, 1, &alpha); | 
| 42             device = (typename State::DstType*)((char*)device + deviceRB); | 42             device = (typename State::DstType*)((char*)device + deviceRB); | 
| 43         } | 43         } | 
| 44     } | 44     } | 
| 45 | 45 | 
| 46     void blitRect(int x, int y, int width, int height) override { | 46     void blitRect(int x, int y, int width, int height) override { | 
| 47         SkASSERT(x >= 0 && y >= 0 && | 47         SkASSERT(x >= 0 && y >= 0 && | 
| 48                  x + width <= fDevice.width() && y + height <= fDevice.height())
     ; | 48                  x + width <= fDevice.width() && y + height <= fDevice.height())
     ; | 
| 49 | 49 | 
| 50         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 50         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 51         size_t        deviceRB = fDevice.rowBytes(); | 51         size_t        deviceRB = fDevice.rowBytes(); | 
| 52 | 52 | 
| 53         do { | 53         do { | 
| 54             fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, nullptr); | 54             fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, nullptr); | 
| 55             y += 1; | 55             y += 1; | 
| 56             device = (typename State::DstType*)((char*)device + deviceRB); | 56             device = (typename State::DstType*)((char*)device + deviceRB); | 
| 57         } while (--height > 0); | 57         } while (--height > 0); | 
| 58     } | 58     } | 
| 59 | 59 | 
| 60     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]
     ) override { | 60     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]
     ) override { | 
| 61         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 61         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 62 | 62 | 
| 63         for (;;) { | 63         for (;;) { | 
| 64             int count = *runs; | 64             int count = *runs; | 
| 65             if (count <= 0) { | 65             if (count <= 0) { | 
| 66                 break; | 66                 break; | 
| 67             } | 67             } | 
| 68             int aa = *antialias; | 68             int aa = *antialias; | 
| 69             if (aa) { | 69             if (aa) { | 
| 70                 if (aa == 255) { | 70                 if (aa == 255) { | 
| 71                     fState.fProc1(fState.fXfer, device, &fState.fPM4f, count, nu
     llptr); | 71                     fState.fProc1(fState.fXfer, device, &fState.fPM4f, count, nu
     llptr); | 
| 72                 } else { | 72                 } else { | 
| 73                     for (int i = 0; i < count; ++i) { | 73                     for (int i = 0; i < count; ++i) { | 
| 74                         fState.fProc1(fState.fXfer, &device[i], &fState.fPM4f, 1
     , antialias); | 74                         fState.fProc1(fState.fXfer, &device[i], &fState.fPM4f, 1
     , antialias); | 
| 75                     } | 75                     } | 
| 76                 } | 76                 } | 
| 77             } | 77             } | 
| 78             device += count; | 78             device += count; | 
| 79             runs += count; | 79             runs += count; | 
| 80             antialias += count; | 80             antialias += count; | 
| 81             x += count; | 81             x += count; | 
| 82         } | 82         } | 
| 83     } | 83     } | 
| 84 | 84 | 
| 85     void blitLCDMask(const SkMask& mask, const SkIRect& clip) { | 85     void blitLCDMask(const SkMask& mask, const SkIRect& clip) { | 
| 86         auto proc = fState.getLCDProc(SkXfermode::kSrcIsSingle_LCDFlag); | 86         auto proc = fState.getLCDProc(SkXfermode::kSrcIsSingle_LCDFlag); | 
| 87 | 87 | 
| 88         const int x = clip.fLeft; | 88         const int x = clip.fLeft; | 
| 89         const int width = clip.width(); | 89         const int width = clip.width(); | 
| 90         const int y = clip.fTop; | 90         const int y = clip.fTop; | 
| 91         const int height = clip.height(); | 91         const int height = clip.height(); | 
| 92 | 92 | 
| 93         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 93         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 94         const size_t dstRB = fDevice.rowBytes(); | 94         const size_t dstRB = fDevice.rowBytes(); | 
| 95         const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y); | 95         const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y); | 
| 96         const size_t maskRB = mask.fRowBytes; | 96         const size_t maskRB = mask.fRowBytes; | 
| 97 | 97 | 
| 98         for (int i = 0; i < height; ++i) { | 98         for (int i = 0; i < height; ++i) { | 
| 99             proc(device, &fState.fPM4f, width, maskRow); | 99             proc(device, &fState.fPM4f, width, maskRow); | 
| 100             device = (typename State::DstType*)((char*)device + dstRB); | 100             device = (typename State::DstType*)((char*)device + dstRB); | 
| 101             maskRow = (const uint16_t*)((const char*)maskRow + maskRB); | 101             maskRow = (const uint16_t*)((const char*)maskRow + maskRB); | 
| 102         } | 102         } | 
| 103     } | 103     } | 
| 104 | 104 | 
| 105     void blitMask(const SkMask& mask, const SkIRect& clip) override { | 105     void blitMask(const SkMask& mask, const SkIRect& clip) override { | 
| 106         if (SkMask::kLCD16_Format == mask.fFormat) { | 106         if (SkMask::kLCD16_Format == mask.fFormat) { | 
| 107             this->blitLCDMask(mask, clip); | 107             this->blitLCDMask(mask, clip); | 
| 108             return; | 108             return; | 
| 109         } | 109         } | 
| 110         if (SkMask::kA8_Format != mask.fFormat) { | 110         if (SkMask::kA8_Format != mask.fFormat) { | 
| 111             this->INHERITED::blitMask(mask, clip); | 111             this->INHERITED::blitMask(mask, clip); | 
| 112             return; | 112             return; | 
| 113         } | 113         } | 
| 114 | 114 | 
| 115         SkASSERT(mask.fBounds.contains(clip)); | 115         SkASSERT(mask.fBounds.contains(clip)); | 
| 116 | 116 | 
| 117         const int x = clip.fLeft; | 117         const int x = clip.fLeft; | 
| 118         const int width = clip.width(); | 118         const int width = clip.width(); | 
| 119         const int y = clip.fTop; | 119         const int y = clip.fTop; | 
| 120         const int height = clip.height(); | 120         const int height = clip.height(); | 
| 121 | 121 | 
| 122         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 122         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 123         const size_t dstRB = fDevice.rowBytes(); | 123         const size_t dstRB = fDevice.rowBytes(); | 
| 124         const uint8_t* maskRow = (const uint8_t*)mask.getAddr(x, y); | 124         const uint8_t* maskRow = (const uint8_t*)mask.getAddr(x, y); | 
| 125         const size_t maskRB = mask.fRowBytes; | 125         const size_t maskRB = mask.fRowBytes; | 
| 126 | 126 | 
| 127         for (int i = 0; i < height; ++i) { | 127         for (int i = 0; i < height; ++i) { | 
| 128             fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, maskRow); | 128             fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, maskRow); | 
| 129             device = (typename State::DstType*)((char*)device + dstRB); | 129             device = (typename State::DstType*)((char*)device + dstRB); | 
| 130             maskRow += maskRB; | 130             maskRow += maskRB; | 
| 131         } | 131         } | 
| 132     } | 132     } | 
| 133 }; | 133 }; | 
| 134 | 134 | 
| 135 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 135 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 
| 136 | 136 | 
| 137 template <typename State> class SkState_Shader_Blitter : public SkShaderBlitter 
     { | 137 template <typename State> class SkState_Shader_Blitter : public SkShaderBlitter 
     { | 
| 138 public: | 138 public: | 
| 139     SkState_Shader_Blitter(const SkPixmap& device, const SkPaint& paint, | 139     SkState_Shader_Blitter(const SkPixmap& device, const SkPaint& paint, | 
| 140                            const SkShader::Context::BlitState& bstate) | 140                            const SkShader::Context::BlitState& bstate) | 
| 141         : INHERITED(device, paint, bstate.fCtx) | 141         : INHERITED(device, paint, bstate.fCtx) | 
| 142         , fState(device.info(), paint, bstate.fCtx) | 142         , fState(device.info(), paint, bstate.fCtx) | 
| 143         , fBState(bstate) | 143         , fBState(bstate) | 
| 144         , fBlitBW(bstate.fBlitBW) | 144         , fBlitBW(bstate.fBlitBW) | 
| 145         , fBlitAA(bstate.fBlitAA) | 145         , fBlitAA(bstate.fBlitAA) | 
| 146     {} | 146     {} | 
| 147 | 147 | 
| 148     void blitH(int x, int y, int width) override { | 148     void blitH(int x, int y, int width) override { | 
| 149         SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width()); | 149         SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width()); | 
| 150 | 150 | 
| 151         if (fBlitBW) { | 151         if (fBlitBW) { | 
| 152             fBlitBW(&fBState, x, y, fDevice, width); | 152             fBlitBW(&fBState, x, y, fDevice, width); | 
| 153             return; | 153             return; | 
| 154         } | 154         } | 
| 155 | 155 | 
| 156         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 156         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 157         fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 157         fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 158         fState.fProcN(fState.fXfer, device, fState.fBuffer, width, nullptr); | 158         fState.fProcN(fState.fXfer, device, fState.fBuffer, width, nullptr); | 
| 159     } | 159     } | 
| 160 | 160 | 
| 161     void blitV(int x, int y, int height, SkAlpha alpha) override { | 161     void blitV(int x, int y, int height, SkAlpha alpha) override { | 
| 162         SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height()); | 162         SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height()); | 
| 163 | 163 | 
| 164         if (fBlitAA) { | 164         if (fBlitAA) { | 
| 165             for (const int bottom = y + height; y < bottom; ++y) { | 165             for (const int bottom = y + height; y < bottom; ++y) { | 
| 166                 fBlitAA(&fBState, x, y, fDevice, 1, &alpha); | 166                 fBlitAA(&fBState, x, y, fDevice, 1, &alpha); | 
| 167             } | 167             } | 
| 168             return; | 168             return; | 
| 169         } | 169         } | 
| 170 | 170 | 
| 171         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 171         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 172         size_t                   deviceRB = fDevice.rowBytes(); | 172         size_t                   deviceRB = fDevice.rowBytes(); | 
| 173 | 173 | 
| 174         if (fConstInY) { | 174         if (fConstInY) { | 
| 175             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1); | 175             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1); | 
| 176         } | 176         } | 
| 177         for (const int bottom = y + height; y < bottom; ++y) { | 177         for (const int bottom = y + height; y < bottom; ++y) { | 
| 178             if (!fConstInY) { | 178             if (!fConstInY) { | 
| 179                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1); | 179                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1); | 
| 180             } | 180             } | 
| 181             fState.fProcN(fState.fXfer, device, fState.fBuffer, 1, &alpha); | 181             fState.fProcN(fState.fXfer, device, fState.fBuffer, 1, &alpha); | 
| 182             device = (typename State::DstType*)((char*)device + deviceRB); | 182             device = (typename State::DstType*)((char*)device + deviceRB); | 
| 183         } | 183         } | 
| 184     } | 184     } | 
| 185 | 185 | 
| 186     void blitRect(int x, int y, int width, int height) override { | 186     void blitRect(int x, int y, int width, int height) override { | 
| 187         SkASSERT(x >= 0 && y >= 0 && | 187         SkASSERT(x >= 0 && y >= 0 && | 
| 188                  x + width <= fDevice.width() && y + height <= fDevice.height())
     ; | 188                  x + width <= fDevice.width() && y + height <= fDevice.height())
     ; | 
| 189 | 189 | 
| 190         if (fBlitBW) { | 190         if (fBlitBW) { | 
| 191             for (const int bottom = y + height; y < bottom; ++y) { | 191             for (const int bottom = y + height; y < bottom; ++y) { | 
| 192                 fBlitBW(&fBState, x, y, fDevice, width); | 192                 fBlitBW(&fBState, x, y, fDevice, width); | 
| 193             } | 193             } | 
| 194             return; | 194             return; | 
| 195         } | 195         } | 
| 196 | 196 | 
| 197         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 197         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 198         size_t                   deviceRB = fDevice.rowBytes(); | 198         size_t                   deviceRB = fDevice.rowBytes(); | 
| 199 | 199 | 
| 200         if (fConstInY) { | 200         if (fConstInY) { | 
| 201             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 201             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 202         } | 202         } | 
| 203         for (const int bottom = y + height; y < bottom; ++y) { | 203         for (const int bottom = y + height; y < bottom; ++y) { | 
| 204             if (!fConstInY) { | 204             if (!fConstInY) { | 
| 205                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 205                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 206             } | 206             } | 
| 207             fState.fProcN(fState.fXfer, device, fState.fBuffer, width, nullptr); | 207             fState.fProcN(fState.fXfer, device, fState.fBuffer, width, nullptr); | 
| 208             device = (typename State::DstType*)((char*)device + deviceRB); | 208             device = (typename State::DstType*)((char*)device + deviceRB); | 
| 209         } | 209         } | 
| 210     } | 210     } | 
| 211 | 211 | 
| 212     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]
     ) override { | 212     void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]
     ) override { | 
| 213         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 213         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 214 | 214 | 
| 215         for (;;) { | 215         for (;;) { | 
| 216             int count = *runs; | 216             int count = *runs; | 
| 217             if (count <= 0) { | 217             if (count <= 0) { | 
| 218                 break; | 218                 break; | 
| 219             } | 219             } | 
| 220             int aa = *antialias; | 220             int aa = *antialias; | 
| 221             if (aa) { | 221             if (aa) { | 
| 222                 if (fBlitBW && (aa == 255)) { | 222                 if (fBlitBW && (aa == 255)) { | 
| 223                     fBlitBW(&fBState, x, y, fDevice, count); | 223                     fBlitBW(&fBState, x, y, fDevice, count); | 
| 224                 } else { | 224                 } else { | 
| 225                     fShaderContext->shadeSpan4f(x, y, fState.fBuffer, count); | 225                     fShaderContext->shadeSpan4f(x, y, fState.fBuffer, count); | 
| 226                     if (aa == 255) { | 226                     if (aa == 255) { | 
| 227                         fState.fProcN(fState.fXfer, device, fState.fBuffer, coun
     t, nullptr); | 227                         fState.fProcN(fState.fXfer, device, fState.fBuffer, coun
     t, nullptr); | 
| 228                     } else { | 228                     } else { | 
| 229                         for (int i = 0; i < count; ++i) { | 229                         for (int i = 0; i < count; ++i) { | 
| 230                             fState.fProcN(fState.fXfer, &device[i], &fState.fBuf
     fer[i], 1, antialias); | 230                             fState.fProcN(fState.fXfer, &device[i], &fState.fBuf
     fer[i], 1, antialias); | 
| 231                         } | 231                         } | 
| 232                     } | 232                     } | 
| 233                 } | 233                 } | 
| 234             } | 234             } | 
| 235             device += count; | 235             device += count; | 
| 236             runs += count; | 236             runs += count; | 
| 237             antialias += count; | 237             antialias += count; | 
| 238             x += count; | 238             x += count; | 
| 239         } | 239         } | 
| 240     } | 240     } | 
| 241 | 241 | 
| 242     void blitLCDMask(const SkMask& mask, const SkIRect& clip) { | 242     void blitLCDMask(const SkMask& mask, const SkIRect& clip) { | 
| 243         auto proc = fState.getLCDProc(0); | 243         auto proc = fState.getLCDProc(0); | 
| 244 | 244 | 
| 245         const int x = clip.fLeft; | 245         const int x = clip.fLeft; | 
| 246         const int width = clip.width(); | 246         const int width = clip.width(); | 
| 247         int y = clip.fTop; | 247         int y = clip.fTop; | 
| 248 | 248 | 
| 249         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 249         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 250         const size_t deviceRB = fDevice.rowBytes(); | 250         const size_t deviceRB = fDevice.rowBytes(); | 
| 251         const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y); | 251         const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y); | 
| 252         const size_t maskRB = mask.fRowBytes; | 252         const size_t maskRB = mask.fRowBytes; | 
| 253 | 253 | 
| 254         if (fConstInY) { | 254         if (fConstInY) { | 
| 255             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 255             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 256         } | 256         } | 
| 257         for (; y < clip.fBottom; ++y) { | 257         for (; y < clip.fBottom; ++y) { | 
| 258             if (!fConstInY) { | 258             if (!fConstInY) { | 
| 259                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 259                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 260             } | 260             } | 
| 261             proc(device, fState.fBuffer, width, maskRow); | 261             proc(device, fState.fBuffer, width, maskRow); | 
| 262             device = (typename State::DstType*)((char*)device + deviceRB); | 262             device = (typename State::DstType*)((char*)device + deviceRB); | 
| 263             maskRow = (const uint16_t*)((const char*)maskRow + maskRB); | 263             maskRow = (const uint16_t*)((const char*)maskRow + maskRB); | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 285         if (fBlitAA) { | 285         if (fBlitAA) { | 
| 286             for (; y < clip.fBottom; ++y) { | 286             for (; y < clip.fBottom; ++y) { | 
| 287                 fBlitAA(&fBState, x, y, fDevice, width, maskRow); | 287                 fBlitAA(&fBState, x, y, fDevice, width, maskRow); | 
| 288                 maskRow += maskRB; | 288                 maskRow += maskRB; | 
| 289             } | 289             } | 
| 290             return; | 290             return; | 
| 291         } | 291         } | 
| 292 | 292 | 
| 293         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 293         typename State::DstType* device = State::WritableAddr(fDevice, x, y); | 
| 294         const size_t deviceRB = fDevice.rowBytes(); | 294         const size_t deviceRB = fDevice.rowBytes(); | 
| 295 | 295 | 
| 296         if (fConstInY) { | 296         if (fConstInY) { | 
| 297             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 297             fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 298         } | 298         } | 
| 299         for (; y < clip.fBottom; ++y) { | 299         for (; y < clip.fBottom; ++y) { | 
| 300             if (!fConstInY) { | 300             if (!fConstInY) { | 
| 301                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 301                 fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width); | 
| 302             } | 302             } | 
| 303             fState.fProcN(fState.fXfer, device, fState.fBuffer, width, maskRow); | 303             fState.fProcN(fState.fXfer, device, fState.fBuffer, width, maskRow); | 
| 304             device = (typename State::DstType*)((char*)device + deviceRB); | 304             device = (typename State::DstType*)((char*)device + deviceRB); | 
| 305             maskRow += maskRB; | 305             maskRow += maskRB; | 
| 306         } | 306         } | 
| 307     } | 307     } | 
| 308 | 308 | 
| 309 protected: | 309 protected: | 
| 310     State                        fState; | 310     State                        fState; | 
| 311     SkShader::Context::BlitState fBState; | 311     SkShader::Context::BlitState fBState; | 
| 312     SkShader::Context::BlitBW    fBlitBW; | 312     SkShader::Context::BlitBW    fBlitBW; | 
| 313     SkShader::Context::BlitAA    fBlitAA; | 313     SkShader::Context::BlitAA    fBlitAA; | 
| 314 | 314 | 
| 315     typedef SkShaderBlitter INHERITED; | 315     typedef SkShaderBlitter INHERITED; | 
| 316 }; | 316 }; | 
| 317 | 317 | 
| 318 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 318 ////////////////////////////////////////////////////////////////////////////////
     /////////////////// | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 337     SkXfermode*             fXfer; | 337     SkXfermode*             fXfer; | 
| 338     SkPM4f                  fPM4f; | 338     SkPM4f                  fPM4f; | 
| 339     SkAutoTMalloc<SkPM4f>   fBuffer; | 339     SkAutoTMalloc<SkPM4f>   fBuffer; | 
| 340     uint32_t                fFlags; | 340     uint32_t                fFlags; | 
| 341 | 341 | 
| 342     SkShader::Context::BlitState fBState; | 342     SkShader::Context::BlitState fBState; | 
| 343 }; | 343 }; | 
| 344 | 344 | 
| 345 struct State32 : State4f { | 345 struct State32 : State4f { | 
| 346     typedef uint32_t    DstType; | 346     typedef uint32_t    DstType; | 
| 347 | 347 | 
| 348     SkXfermode::D32Proc fProc1; | 348     SkXfermode::D32Proc fProc1; | 
| 349     SkXfermode::D32Proc fProcN; | 349     SkXfermode::D32Proc fProcN; | 
| 350 | 350 | 
| 351     State32(const SkImageInfo& info, const SkPaint& paint, const SkShader::Conte
     xt* shaderContext) | 351     State32(const SkImageInfo& info, const SkPaint& paint, const SkShader::Conte
     xt* shaderContext) | 
| 352         : State4f(info, paint, shaderContext) | 352         : State4f(info, paint, shaderContext) | 
| 353     { | 353     { | 
| 354         if (is_opaque(paint, shaderContext)) { | 354         if (is_opaque(paint, shaderContext)) { | 
| 355             fFlags |= SkXfermode::kSrcIsOpaque_D32Flag; | 355             fFlags |= SkXfermode::kSrcIsOpaque_D32Flag; | 
| 356         } | 356         } | 
| 357         if (info.isSRGB()) { | 357         if (info.isSRGB()) { | 
| 358             fFlags |= SkXfermode::kDstIsSRGB_D32Flag; | 358             fFlags |= SkXfermode::kDstIsSRGB_D32Flag; | 
| 359         } | 359         } | 
| 360         fProc1 = SkXfermode::GetD32Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle
     _D32Flag); | 360         fProc1 = SkXfermode::GetD32Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle
     _D32Flag); | 
| 361         fProcN = SkXfermode::GetD32Proc(fXfer, fFlags); | 361         fProcN = SkXfermode::GetD32Proc(fXfer, fFlags); | 
| 362     } | 362     } | 
| 363 | 363 | 
| 364     SkXfermode::LCD32Proc getLCDProc(uint32_t oneOrManyFlag) const { | 364     SkXfermode::LCD32Proc getLCDProc(uint32_t oneOrManyFlag) const { | 
| 365         uint32_t flags = fFlags & 1; | 365         uint32_t flags = fFlags & 1; | 
| 366         if (!(fFlags & SkXfermode::kDstIsSRGB_D32Flag)) { | 366         if (!(fFlags & SkXfermode::kDstIsSRGB_D32Flag)) { | 
| 367             flags |= SkXfermode::kDstIsLinearInt_LCDFlag; | 367             flags |= SkXfermode::kDstIsLinearInt_LCDFlag; | 
| 368         } | 368         } | 
| 369         return SkXfermode::GetLCD32Proc(flags | oneOrManyFlag); | 369         return SkXfermode::GetLCD32Proc(flags | oneOrManyFlag); | 
| 370     } | 370     } | 
| 371 | 371 | 
| 372     static DstType* WritableAddr(const SkPixmap& device, int x, int y) { | 372     static DstType* WritableAddr(const SkPixmap& device, int x, int y) { | 
| 373         return device.writable_addr32(x, y); | 373         return device.writable_addr32(x, y); | 
| 374     } | 374     } | 
| 375 }; | 375 }; | 
| 376 | 376 | 
| 377 struct State64 : State4f { | 377 struct State64 : State4f { | 
| 378     typedef uint64_t    DstType; | 378     typedef uint64_t    DstType; | 
| 379 | 379 | 
| 380     SkXfermode::D64Proc fProc1; | 380     SkXfermode::D64Proc fProc1; | 
| 381     SkXfermode::D64Proc fProcN; | 381     SkXfermode::D64Proc fProcN; | 
| 382 | 382 | 
| 383     State64(const SkImageInfo& info, const SkPaint& paint, const SkShader::Conte
     xt* shaderContext) | 383     State64(const SkImageInfo& info, const SkPaint& paint, const SkShader::Conte
     xt* shaderContext) | 
| 384         : State4f(info, paint, shaderContext) | 384         : State4f(info, paint, shaderContext) | 
| 385     { | 385     { | 
| 386         if (is_opaque(paint, shaderContext)) { | 386         if (is_opaque(paint, shaderContext)) { | 
| 387             fFlags |= SkXfermode::kSrcIsOpaque_D64Flag; | 387             fFlags |= SkXfermode::kSrcIsOpaque_D64Flag; | 
| 388         } | 388         } | 
| 389         if (kRGBA_F16_SkColorType == info.colorType()) { | 389         if (kRGBA_F16_SkColorType == info.colorType()) { | 
| 390             fFlags |= SkXfermode::kDstIsFloat16_D64Flag; | 390             fFlags |= SkXfermode::kDstIsFloat16_D64Flag; | 
| 391         } | 391         } | 
| 392         fProc1 = SkXfermode::GetD64Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle
     _D64Flag); | 392         fProc1 = SkXfermode::GetD64Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle
     _D64Flag); | 
| 393         fProcN = SkXfermode::GetD64Proc(fXfer, fFlags); | 393         fProcN = SkXfermode::GetD64Proc(fXfer, fFlags); | 
| 394     } | 394     } | 
| 395 | 395 | 
| 396     SkXfermode::LCD64Proc getLCDProc(uint32_t oneOrManyFlag) const { | 396     SkXfermode::LCD64Proc getLCDProc(uint32_t oneOrManyFlag) const { | 
| 397         uint32_t flags = fFlags & 1; | 397         uint32_t flags = fFlags & 1; | 
| 398         if (!(fFlags & SkXfermode::kDstIsFloat16_D64Flag)) { | 398         if (!(fFlags & SkXfermode::kDstIsFloat16_D64Flag)) { | 
| 399             flags |= SkXfermode::kDstIsLinearInt_LCDFlag; | 399             flags |= SkXfermode::kDstIsLinearInt_LCDFlag; | 
| 400         } | 400         } | 
| 401         return SkXfermode::GetLCD64Proc(flags | oneOrManyFlag); | 401         return SkXfermode::GetLCD64Proc(flags | oneOrManyFlag); | 
| 402     } | 402     } | 
| 403 | 403 | 
| 404     static DstType* WritableAddr(const SkPixmap& device, int x, int y) { | 404     static DstType* WritableAddr(const SkPixmap& device, int x, int y) { | 
| 405         return device.writable_addr64(x, y); | 405         return device.writable_addr64(x, y); | 
| 406     } | 406     } | 
| 407 }; | 407 }; | 
| 408 | 408 | 
| 409 template <typename State> SkBlitter* create(const SkPixmap& device, const SkPain
     t& paint, | 409 template <typename State> SkBlitter* create(const SkPixmap& device, const SkPain
     t& paint, | 
| 410                                             SkShader::Context* shaderContext, | 410                                             SkShader::Context* shaderContext, | 
| 411                                             SkTBlitterAllocator* allocator) { | 411                                             SkTBlitterAllocator* allocator) { | 
| 412     SkASSERT(allocator != nullptr); | 412     SkASSERT(allocator != nullptr); | 
| 413 | 413 | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 432                                    SkShader::Context* shaderContext, | 432                                    SkShader::Context* shaderContext, | 
| 433                                    SkTBlitterAllocator* allocator) { | 433                                    SkTBlitterAllocator* allocator) { | 
| 434     return create<State32>(device, paint, shaderContext, allocator); | 434     return create<State32>(device, paint, shaderContext, allocator); | 
| 435 } | 435 } | 
| 436 | 436 | 
| 437 SkBlitter* SkBlitter_ARGB64_Create(const SkPixmap& device, const SkPaint& paint, | 437 SkBlitter* SkBlitter_ARGB64_Create(const SkPixmap& device, const SkPaint& paint, | 
| 438                                    SkShader::Context* shaderContext, | 438                                    SkShader::Context* shaderContext, | 
| 439                                    SkTBlitterAllocator* allocator) { | 439                                    SkTBlitterAllocator* allocator) { | 
| 440     return create<State64>(device, paint, shaderContext, allocator); | 440     return create<State64>(device, paint, shaderContext, allocator); | 
| 441 } | 441 } | 
| OLD | NEW | 
|---|