Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Unified Diff: src/core/SkBlitter_PM4f.cpp

Issue 1721223002: simplify/unify xferproc api (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkBitmapProcShader.h ('k') | src/core/SkSpriteBlitter4f.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkBlitter_PM4f.cpp
diff --git a/src/core/SkBlitter_PM4f.cpp b/src/core/SkBlitter_PM4f.cpp
index 24fc4a39ddbebb732f0fca1763f4aba6d719fe36..179aec355743d62d9ce45d9dd486d212275790f1 100644
--- a/src/core/SkBlitter_PM4f.cpp
+++ b/src/core/SkBlitter_PM4f.cpp
@@ -27,7 +27,8 @@ public:
void blitH(int x, int y, int width) override {
SkASSERT(x >= 0 && y >= 0 && x + width <= fDevice.width());
- fState.fProc1(fState, State::WritableAddr(fDevice, x, y), fState.fPM4f, width, nullptr);
+ fState.fProc1(fState.fXfer, State::WritableAddr(fDevice, x, y),
+ &fState.fPM4f, width, nullptr);
}
void blitV(int x, int y, int height, SkAlpha alpha) override {
@@ -37,7 +38,7 @@ public:
size_t deviceRB = fDevice.rowBytes();
for (int i = 0; i < height; ++i) {
- fState.fProc1(fState, device, fState.fPM4f, 1, &alpha);
+ fState.fProc1(fState.fXfer, device, &fState.fPM4f, 1, &alpha);
device = (typename State::DstType*)((char*)device + deviceRB);
}
}
@@ -50,7 +51,7 @@ public:
size_t deviceRB = fDevice.rowBytes();
do {
- fState.fProc1(fState, device, fState.fPM4f, width, nullptr);
+ fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, nullptr);
y += 1;
device = (typename State::DstType*)((char*)device + deviceRB);
} while (--height > 0);
@@ -67,10 +68,10 @@ public:
int aa = *antialias;
if (aa) {
if (aa == 255) {
- fState.fProc1(fState, device, fState.fPM4f, count, nullptr);
+ fState.fProc1(fState.fXfer, device, &fState.fPM4f, count, nullptr);
} else {
for (int i = 0; i < count; ++i) {
- fState.fProc1(fState, &device[i], fState.fPM4f, 1, antialias);
+ fState.fProc1(fState.fXfer, &device[i], &fState.fPM4f, 1, antialias);
}
}
}
@@ -124,7 +125,7 @@ public:
const size_t maskRB = mask.fRowBytes;
for (int i = 0; i < height; ++i) {
- fState.fProc1(fState, device, fState.fPM4f, width, maskRow);
+ fState.fProc1(fState.fXfer, device, &fState.fPM4f, width, maskRow);
device = (typename State::DstType*)((char*)device + dstRB);
maskRow += maskRB;
}
@@ -146,7 +147,7 @@ public:
typename State::DstType* device = State::WritableAddr(fDevice, x, y);
fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
- fState.fProcN(fState, device, fState.fBuffer, width, nullptr);
+ fState.fProcN(fState.fXfer, device, fState.fBuffer, width, nullptr);
}
void blitV(int x, int y, int height, SkAlpha alpha) override {
@@ -163,7 +164,7 @@ public:
if (!fConstInY) {
fShaderContext->shadeSpan4f(x, y, fState.fBuffer, 1);
}
- fState.fProcN(fState, device, fState.fBuffer, 1, &alpha);
+ fState.fProcN(fState.fXfer, device, fState.fBuffer, 1, &alpha);
device = (typename State::DstType*)((char*)device + deviceRB);
}
}
@@ -183,7 +184,7 @@ public:
if (!fConstInY) {
fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
}
- fState.fProcN(fState, device, fState.fBuffer, width, nullptr);
+ fState.fProcN(fState.fXfer, device, fState.fBuffer, width, nullptr);
device = (typename State::DstType*)((char*)device + deviceRB);
}
}
@@ -200,10 +201,10 @@ public:
if (aa) {
fShaderContext->shadeSpan4f(x, y, fState.fBuffer, count);
if (aa == 255) {
- fState.fProcN(fState, device, fState.fBuffer, count, nullptr);
+ fState.fProcN(fState.fXfer, device, fState.fBuffer, count, nullptr);
} else {
for (int i = 0; i < count; ++i) {
- fState.fProcN(fState, &device[i], &fState.fBuffer[i], 1, antialias);
+ fState.fProcN(fState.fXfer, &device[i], &fState.fBuffer[i], 1, antialias);
}
}
}
@@ -267,7 +268,7 @@ public:
if (!fConstInY) {
fShaderContext->shadeSpan4f(x, y, fState.fBuffer, width);
}
- fState.fProcN(fState, device, fState.fBuffer, width, maskRow);
+ fState.fProcN(fState.fXfer, device, fState.fBuffer, width, maskRow);
device = (typename State::DstType*)((char*)device + deviceRB);
maskRow += maskRB;
}
@@ -286,47 +287,45 @@ static bool is_opaque(const SkPaint& paint, const SkShader::Context* shaderConte
: 0xFF == paint.getAlpha();
}
-struct State32 : SkXfermode::PM4fState {
- typedef uint32_t DstType;
-
- SkXfermode::PM4fProc1 fProc1;
- SkXfermode::PM4fProcN fProcN;
+struct State4f {
+ State4f(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext) {
+ fXfer = paint.getXfermode();
+ if (shaderContext) {
+ fBuffer.reset(info.width());
+ } else {
+ fPM4f = SkColor4f::FromColor(paint.getColor()).premul();
+ }
+ fFlags = 0;
+ }
+
+ SkXfermode* fXfer;
SkPM4f fPM4f;
- SkPM4f* fBuffer;
+ SkAutoTMalloc<SkPM4f> fBuffer;
+ uint32_t fFlags;
+};
+
+struct State32 : State4f {
+ typedef uint32_t DstType;
- State32(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext) {
- fXfer = SkSafeRef(paint.getXfermode());
- fFlags = 0;
+ SkXfermode::D32Proc fProc1;
+ SkXfermode::D32Proc fProcN;
+
+ State32(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext)
+ : State4f(info, paint, shaderContext)
+ {
if (is_opaque(paint, shaderContext)) {
- fFlags |= SkXfermode::kSrcIsOpaque_PM4fFlag;
+ fFlags |= SkXfermode::kSrcIsOpaque_D32Flag;
}
if (info.isSRGB()) {
- fFlags |= SkXfermode::kDstIsSRGB_PM4fFlag;
- }
- if (fXfer) {
- fProc1 = fXfer->getPM4fProc1(fFlags);
- fProcN = fXfer->getPM4fProcN(fFlags);
- } else {
- fProc1 = SkXfermode::GetPM4fProc1(SkXfermode::kSrcOver_Mode, fFlags);
- fProcN = SkXfermode::GetPM4fProcN(SkXfermode::kSrcOver_Mode, fFlags);
- }
-
- fBuffer = nullptr;
- if (shaderContext) {
- fBuffer = new SkPM4f[info.width()];
- } else {
- fPM4f = SkColor4f::FromColor(paint.getColor()).premul();
+ fFlags |= SkXfermode::kDstIsSRGB_D32Flag;
}
+ fProc1 = SkXfermode::GetD32Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle_D32Flag);
+ fProcN = SkXfermode::GetD32Proc(fXfer, fFlags);
}
- ~State32() {
- SkSafeUnref(fXfer);
- delete[] fBuffer;
- }
-
SkXfermode::LCD32Proc getLCDProc(uint32_t oneOrManyFlag) const {
uint32_t flags = fFlags & 1;
- if (!(fFlags & SkXfermode::kDstIsSRGB_PM4fFlag)) {
+ if (!(fFlags & SkXfermode::kDstIsSRGB_D32Flag)) {
flags |= SkXfermode::kDstIsLinearInt_LCDFlag;
}
return SkXfermode::GetLCD32Proc(flags | oneOrManyFlag);
@@ -337,47 +336,28 @@ struct State32 : SkXfermode::PM4fState {
}
};
-struct State64 : SkXfermode::U64State {
- typedef uint64_t DstType;
+struct State64 : State4f {
+ typedef uint64_t DstType;
- SkXfermode::U64Proc1 fProc1;
- SkXfermode::U64ProcN fProcN;
- SkPM4f fPM4f;
- SkPM4f* fBuffer;
+ SkXfermode::D64Proc fProc1;
+ SkXfermode::D64Proc fProcN;
- State64(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext) {
- fXfer = SkSafeRef(paint.getXfermode());
- fFlags = 0;
+ State64(const SkImageInfo& info, const SkPaint& paint, const SkShader::Context* shaderContext)
+ : State4f(info, paint, shaderContext)
+ {
if (is_opaque(paint, shaderContext)) {
- fFlags |= SkXfermode::kSrcIsOpaque_PM4fFlag;
+ fFlags |= SkXfermode::kSrcIsOpaque_D64Flag;
}
if (kRGBA_F16_SkColorType == info.colorType()) {
- fFlags |= SkXfermode::kDstIsFloat16_U64Flag;
- }
-
- SkXfermode::Mode mode;
- if (!SkXfermode::AsMode(fXfer, &mode)) {
- mode = SkXfermode::kSrcOver_Mode;
- }
- fProc1 = SkXfermode::GetU64Proc1(mode, fFlags);
- fProcN = SkXfermode::GetU64ProcN(mode, fFlags);
-
- fBuffer = nullptr;
- if (shaderContext) {
- fBuffer = new SkPM4f[info.width()];
- } else {
- fPM4f = SkColor4f::FromColor(paint.getColor()).premul();
+ fFlags |= SkXfermode::kDstIsFloat16_D64Flag;
}
+ fProc1 = SkXfermode::GetD64Proc(fXfer, fFlags | SkXfermode::kSrcIsSingle_D64Flag);
+ fProcN = SkXfermode::GetD64Proc(fXfer, fFlags);
}
-
- ~State64() {
- SkSafeUnref(fXfer);
- delete[] fBuffer;
- }
-
+
SkXfermode::LCD64Proc getLCDProc(uint32_t oneOrManyFlag) const {
uint32_t flags = fFlags & 1;
- if (!(fFlags & SkXfermode::kDstIsFloat16_U64Flag)) {
+ if (!(fFlags & SkXfermode::kDstIsFloat16_D64Flag)) {
flags |= SkXfermode::kDstIsLinearInt_LCDFlag;
}
return SkXfermode::GetLCD64Proc(flags | oneOrManyFlag);
« no previous file with comments | « src/core/SkBitmapProcShader.h ('k') | src/core/SkSpriteBlitter4f.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698