| Index: src/core/SkBlitter_PM4f.cpp
|
| diff --git a/src/core/SkBlitter_PM4f.cpp b/src/core/SkBlitter_PM4f.cpp
|
| index b7d8e7f8d3292a6ad51acec98eb25494538bcacc..820d72cc2e6da8dee07754cd3ab032af6b019565 100644
|
| --- a/src/core/SkBlitter_PM4f.cpp
|
| +++ b/src/core/SkBlitter_PM4f.cpp
|
| @@ -26,17 +26,17 @@ public:
|
|
|
| void blitH(int x, int y, int width) override {
|
| SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
|
| -
|
| +
|
| fState.fProc1(fState.fXfer, State::WritableAddr(fDevice, x, y),
|
| &fState.fPM4f, width, nullptr);
|
| }
|
|
|
| void blitV(int x, int y, int height, SkAlpha alpha) override {
|
| SkASSERT(x >= 0 && y >= 0 && y + height <= fDevice.height());
|
| -
|
| +
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| size_t deviceRB = fDevice.rowBytes();
|
| -
|
| +
|
| for (int i = 0; i < height; ++i) {
|
| fState.fProc1(fState.fXfer, device, &fState.fPM4f, 1, &alpha);
|
| device = (typename State::DstType*)((char*)device + deviceRB);
|
| @@ -46,10 +46,10 @@ public:
|
| void blitRect(int x, int y, int width, int height) override {
|
| SkASSERT(x >= 0 && y >= 0 &&
|
| x + width <= fDevice.width() && y + height <= fDevice.height());
|
| -
|
| +
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| size_t deviceRB = fDevice.rowBytes();
|
| -
|
| +
|
| do {
|
| fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, nullptr);
|
| y += 1;
|
| @@ -59,7 +59,7 @@ public:
|
|
|
| void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| -
|
| +
|
| for (;;) {
|
| int count = *runs;
|
| if (count <= 0) {
|
| @@ -84,24 +84,24 @@ public:
|
|
|
| void blitLCDMask(const SkMask& mask, const SkIRect& clip) {
|
| auto proc = fState.getLCDProc(SkXfermode::kSrcIsSingle_LCDFlag);
|
| -
|
| +
|
| const int x = clip.fLeft;
|
| const int width = clip.width();
|
| const int y = clip.fTop;
|
| const int height = clip.height();
|
| -
|
| +
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| const size_t dstRB = fDevice.rowBytes();
|
| const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y);
|
| const size_t maskRB = mask.fRowBytes;
|
| -
|
| +
|
| for (int i = 0; i < height; ++i) {
|
| proc(device, &fState.fPM4f, width, maskRow);
|
| device = (typename State::DstType*)((char*)device + dstRB);
|
| maskRow = (const uint16_t*)((const char*)maskRow + maskRB);
|
| }
|
| }
|
| -
|
| +
|
| void blitMask(const SkMask& mask, const SkIRect& clip) override {
|
| if (SkMask::kLCD16_Format == mask.fFormat) {
|
| this->blitLCDMask(mask, clip);
|
| @@ -111,19 +111,19 @@ public:
|
| this->INHERITED::blitMask(mask, clip);
|
| return;
|
| }
|
| -
|
| +
|
| SkASSERT(mask.fBounds.contains(clip));
|
| -
|
| +
|
| const int x = clip.fLeft;
|
| const int width = clip.width();
|
| const int y = clip.fTop;
|
| const int height = clip.height();
|
| -
|
| +
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| const size_t dstRB = fDevice.rowBytes();
|
| const uint8_t* maskRow = (const uint8_t*)mask.getAddr(x, y);
|
| const size_t maskRB = mask.fRowBytes;
|
| -
|
| +
|
| for (int i = 0; i < height; ++i) {
|
| fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, maskRow);
|
| device = (typename State::DstType*)((char*)device + dstRB);
|
| @@ -144,10 +144,10 @@ public:
|
| , fBlitBW(bstate.fBlitBW)
|
| , fBlitAA(bstate.fBlitAA)
|
| {}
|
| -
|
| +
|
| void blitH(int x, int y, int width) override {
|
| SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
|
| -
|
| +
|
| if (fBlitBW) {
|
| fBlitBW(&fBState, x, y, fDevice, width);
|
| return;
|
| @@ -170,7 +170,7 @@ public:
|
|
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| size_t deviceRB = fDevice.rowBytes();
|
| -
|
| +
|
| if (fConstInY) {
|
| fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1);
|
| }
|
| @@ -186,17 +186,17 @@ public:
|
| void blitRect(int x, int y, int width, int height) override {
|
| SkASSERT(x >= 0 && y >= 0 &&
|
| x + width <= fDevice.width() && y + height <= fDevice.height());
|
| -
|
| +
|
| if (fBlitBW) {
|
| for (const int bottom = y + height; y < bottom; ++y) {
|
| fBlitBW(&fBState, x, y, fDevice, width);
|
| }
|
| return;
|
| }
|
| -
|
| +
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| size_t deviceRB = fDevice.rowBytes();
|
| -
|
| +
|
| if (fConstInY) {
|
| fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
|
| }
|
| @@ -211,7 +211,7 @@ public:
|
|
|
| void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| -
|
| +
|
| for (;;) {
|
| int count = *runs;
|
| if (count <= 0) {
|
| @@ -241,16 +241,16 @@ public:
|
|
|
| void blitLCDMask(const SkMask& mask, const SkIRect& clip) {
|
| auto proc = fState.getLCDProc(0);
|
| -
|
| +
|
| const int x = clip.fLeft;
|
| const int width = clip.width();
|
| int y = clip.fTop;
|
| -
|
| +
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| const size_t deviceRB = fDevice.rowBytes();
|
| const uint16_t* maskRow = (const uint16_t*)mask.getAddr(x, y);
|
| const size_t maskRB = mask.fRowBytes;
|
| -
|
| +
|
| if (fConstInY) {
|
| fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
|
| }
|
| @@ -292,7 +292,7 @@ public:
|
|
|
| typename State::DstType* device = State::WritableAddr(fDevice, x, y);
|
| const size_t deviceRB = fDevice.rowBytes();
|
| -
|
| +
|
| if (fConstInY) {
|
| fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
|
| }
|
| @@ -305,7 +305,7 @@ public:
|
| maskRow += maskRB;
|
| }
|
| }
|
| -
|
| +
|
| protected:
|
| State fState;
|
| SkShader::Context::BlitState fBState;
|
| @@ -344,10 +344,10 @@ struct State4f {
|
|
|
| struct State32 : State4f {
|
| typedef uint32_t DstType;
|
| -
|
| +
|
| SkXfermode::D32Proc fProc1;
|
| SkXfermode::D32Proc fProcN;
|
| -
|
| +
|
| State32(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext)
|
| : State4f(info, paint, shaderContext)
|
| {
|
| @@ -360,7 +360,7 @@ struct State32 : State4f {
|
| fProc1 = SkXfermode::GetD32Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle_D32Flag);
|
| fProcN = SkXfermode::GetD32Proc(fXfer, fFlags);
|
| }
|
| -
|
| +
|
| SkXfermode::LCD32Proc getLCDProc(uint32_t oneOrManyFlag) const {
|
| uint32_t flags = fFlags & 1;
|
| if (!(fFlags & SkXfermode::kDstIsSRGB_D32Flag)) {
|
| @@ -376,10 +376,10 @@ struct State32 : State4f {
|
|
|
| struct State64 : State4f {
|
| typedef uint64_t DstType;
|
| -
|
| +
|
| SkXfermode::D64Proc fProc1;
|
| SkXfermode::D64Proc fProcN;
|
| -
|
| +
|
| State64(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext)
|
| : State4f(info, paint, shaderContext)
|
| {
|
| @@ -400,7 +400,7 @@ struct State64 : State4f {
|
| }
|
| return SkXfermode::GetLCD64Proc(flags | oneOrManyFlag);
|
| }
|
| -
|
| +
|
| static DstType* WritableAddr(const SkPixmap& device, int x, int y) {
|
| return device.writable_addr64(x, y);
|
| }
|
|
|