aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar herb <herb@google.com>2015-12-18 08:50:08 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-18 08:50:08 -0800
commit1e810b3cc290b5b5d95c7789661271256288977c (patch)
tree0b8931b4bf33449e5c32006d58cd33b8d3cf034f /src
parent31d46df1b0adf230c58b59c918d2d2ba64adf1ad (diff)
Revert of Fix UB function problems for shaders and mask. (patchset #3 id:40001 of https://codereview.chromium.org/1530743002/ )
Reason for revert: Breaks man gold tests. Original issue's description: > Fix UB function problems for shaders and mask. > > BUG=skia:4634 > GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1530743002 > > Committed: https://skia.googlesource.com/skia/+/dafd044e4aea529f88d899247678d4549f776388 TBR=mtklein@google.com,reed@google.com NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia:4634 Review URL: https://codereview.chromium.org/1534243002
Diffstat (limited to 'src')
-rw-r--r--src/core/SkBitmapProcShader.cpp4
-rw-r--r--src/core/SkBitmapProcState.cpp24
-rw-r--r--src/core/SkBitmapProcState.h6
-rw-r--r--src/core/SkBitmapProcState_shaderproc.h5
-rw-r--r--src/core/SkBlitMask.h2
-rw-r--r--src/core/SkBlitMask_D32.cpp36
-rw-r--r--src/core/SkBlitter_ARGB32.cpp4
7 files changed, 39 insertions, 42 deletions
diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp
index 6c9410ee32..dd97380bbd 100644
--- a/src/core/SkBitmapProcShader.cpp
+++ b/src/core/SkBitmapProcShader.cpp
@@ -174,7 +174,7 @@ void SkBitmapProcShader::BitmapProcShaderContext::shadeSpan(int x, int y, SkPMCo
int count) {
const SkBitmapProcState& state = *fState;
if (state.getShaderProc32()) {
- state.getShaderProc32()(&state, x, y, dstC, count);
+ state.getShaderProc32()(state, x, y, dstC, count);
return;
}
@@ -225,7 +225,7 @@ void SkBitmapProcShader::BitmapProcShaderContext::shadeSpan16(int x, int y, uint
int count) {
const SkBitmapProcState& state = *fState;
if (state.getShaderProc16()) {
- state.getShaderProc16()(&state, x, y, dstC, count);
+ state.getShaderProc16()(state, x, y, dstC, count);
return;
}
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 1ec47fb602..6ed83002d9 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -24,14 +24,14 @@
extern const SkBitmapProcState::SampleProc16 gSkBitmapProcStateSample16_neon[];
extern const SkBitmapProcState::SampleProc32 gSkBitmapProcStateSample32_neon[];
extern void S16_D16_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, int, uint16_t*);
-extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const void *, int, int, uint16_t*, int);
-extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const void *, int, int, uint16_t*, int);
+extern void Clamp_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint16_t*, int);
+extern void Repeat_S16_D16_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint16_t*, int);
extern void SI8_opaque_D32_filter_DX_neon(const SkBitmapProcState&, const uint32_t*, int, SkPMColor*);
-extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const void *, int, int, uint32_t*, int);
-extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const void*, int, int, uint32_t*, int);
+extern void SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int);
+extern void Clamp_SI8_opaque_D32_filter_DX_shaderproc_neon(const SkBitmapProcState&, int, int, uint32_t*, int);
#endif
-extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const void*, int, int, uint32_t*, int);
+extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState&, int, int, uint32_t*, int);
#define NAME_WRAP(x) x
#include "SkBitmapProcState_filter.h"
@@ -391,11 +391,10 @@ bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp,
return true;
}
-static void Clamp_S32_D32_nofilter_trans_shaderproc(const void* sIn,
+static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
int x, int y,
SkPMColor* SK_RESTRICT colors,
int count) {
- const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn);
SkASSERT(((s.fInvType & ~SkMatrix::kTranslate_Mask)) == 0);
SkASSERT(s.fInvKy == 0);
SkASSERT(count > 0 && colors != nullptr);
@@ -466,11 +465,10 @@ static inline int sk_int_mirror(int x, int n) {
return x;
}
-static void Repeat_S32_D32_nofilter_trans_shaderproc(const void* sIn,
+static void Repeat_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
int x, int y,
SkPMColor* SK_RESTRICT colors,
int count) {
- const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn);
SkASSERT(((s.fInvType & ~SkMatrix::kTranslate_Mask)) == 0);
SkASSERT(s.fInvKy == 0);
SkASSERT(count > 0 && colors != nullptr);
@@ -507,11 +505,10 @@ static void Repeat_S32_D32_nofilter_trans_shaderproc(const void* sIn,
}
}
-static void S32_D32_constX_shaderproc(const void* sIn,
+static void S32_D32_constX_shaderproc(const SkBitmapProcState& s,
int x, int y,
SkPMColor* SK_RESTRICT colors,
int count) {
- const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn);
SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) == 0);
SkASSERT(s.fInvKy == 0);
SkASSERT(count > 0 && colors != nullptr);
@@ -621,7 +618,7 @@ static void S32_D32_constX_shaderproc(const void* sIn,
sk_memset32(colors, color, count);
}
-static void DoNothing_shaderproc(const void*, int x, int y,
+static void DoNothing_shaderproc(const SkBitmapProcState&, int x, int y,
SkPMColor* SK_RESTRICT colors, int count) {
// if we get called, the matrix is too tricky, so we just draw nothing
sk_memset32(colors, 0, count);
@@ -814,9 +811,8 @@ int SkBitmapProcState::maxCountForBufferSize(size_t bufferSize) const {
///////////////////////
-void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const void* sIn, int x, int y,
+void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, int x, int y,
SkPMColor* SK_RESTRICT dst, int count) {
- const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn);
SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
SkMatrix::kScale_Mask)) == 0);
diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h
index bd2a344eca..342da78c05 100644
--- a/src/core/SkBitmapProcState.h
+++ b/src/core/SkBitmapProcState.h
@@ -32,9 +32,11 @@ struct SkBitmapProcState {
SkBitmapProcState(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMode tmy);
~SkBitmapProcState();
- typedef void (*ShaderProc32)(const void* ctx, int x, int y, SkPMColor[], int count);
+ typedef void (*ShaderProc32)(const SkBitmapProcState&, int x, int y,
+ SkPMColor[], int count);
- typedef void (*ShaderProc16)(const void* ctx, int x, int y, uint16_t[], int count);
+ typedef void (*ShaderProc16)(const SkBitmapProcState&, int x, int y,
+ uint16_t[], int count);
typedef void (*MatrixProc)(const SkBitmapProcState&,
uint32_t bitmapXY[],
diff --git a/src/core/SkBitmapProcState_shaderproc.h b/src/core/SkBitmapProcState_shaderproc.h
index b1fdc5f056..94b2d3b48c 100644
--- a/src/core/SkBitmapProcState_shaderproc.h
+++ b/src/core/SkBitmapProcState_shaderproc.h
@@ -12,12 +12,11 @@
// Can't be static in the general case because some of these implementations
// will be defined and referenced in different object files.
-void SCALE_FILTER_NAME(const void* sIn, int x, int y,
+void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
DSTTYPE* SK_RESTRICT colors, int count);
-void SCALE_FILTER_NAME(const void* sIn, int x, int y,
+void SCALE_FILTER_NAME(const SkBitmapProcState& s, int x, int y,
DSTTYPE* SK_RESTRICT colors, int count) {
- const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn);
SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
SkMatrix::kScale_Mask)) == 0);
SkASSERT(s.fInvKy == 0);
diff --git a/src/core/SkBlitMask.h b/src/core/SkBlitMask.h
index b53ff7dfd8..f36f9f3d82 100644
--- a/src/core/SkBlitMask.h
+++ b/src/core/SkBlitMask.h
@@ -44,7 +44,7 @@ public:
* onto a row of dst colors. The RowFactory that returns this function ptr
* will have been told the formats for the mask and the dst.
*/
- typedef void (*RowProc)(SkPMColor* dst, const void* mask,
+ typedef void (*RowProc)(void* dst, const void* mask,
const SkPMColor* src, int width);
/**
diff --git a/src/core/SkBlitMask_D32.cpp b/src/core/SkBlitMask_D32.cpp
index 5a1ad2813e..3cc791af4e 100644
--- a/src/core/SkBlitMask_D32.cpp
+++ b/src/core/SkBlitMask_D32.cpp
@@ -76,9 +76,9 @@ bool SkBlitMask::BlitColor(const SkPixmap& device, const SkMask& mask,
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-static void BW_RowProc_Blend(
- SkPMColor* SK_RESTRICT dst, const void* maskIn, const SkPMColor* SK_RESTRICT src, int count) {
- const uint8_t* SK_RESTRICT mask = static_cast<const uint8_t*>(maskIn);
+static void BW_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
+ const uint8_t* SK_RESTRICT mask,
+ const SkPMColor* SK_RESTRICT src, int count) {
int i, octuple = (count + 7) >> 3;
for (i = 0; i < octuple; ++i) {
int m = *mask++;
@@ -105,9 +105,9 @@ static void BW_RowProc_Blend(
}
}
-static void BW_RowProc_Opaque(
- SkPMColor* SK_RESTRICT dst, const void* maskIn, const SkPMColor* SK_RESTRICT src, int count) {
- const uint8_t* SK_RESTRICT mask = static_cast<const uint8_t*>(maskIn);
+static void BW_RowProc_Opaque(SkPMColor* SK_RESTRICT dst,
+ const uint8_t* SK_RESTRICT mask,
+ const SkPMColor* SK_RESTRICT src, int count) {
int i, octuple = (count + 7) >> 3;
for (i = 0; i < octuple; ++i) {
int m = *mask++;
@@ -134,9 +134,9 @@ static void BW_RowProc_Opaque(
}
}
-static void A8_RowProc_Blend(
- SkPMColor* SK_RESTRICT dst, const void* maskIn, const SkPMColor* SK_RESTRICT src, int count) {
- const uint8_t* SK_RESTRICT mask = static_cast<const uint8_t*>(maskIn);
+static void A8_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
+ const uint8_t* SK_RESTRICT mask,
+ const SkPMColor* SK_RESTRICT src, int count) {
for (int i = 0; i < count; ++i) {
if (mask[i]) {
dst[i] = SkBlendARGB32(src[i], dst[i], mask[i]);
@@ -153,9 +153,9 @@ static void A8_RowProc_Blend(
#define EXPAND1(v, m, s) (((v) >> 8) & (m)) * (s)
#define COMBINE(e0, e1, m) ((((e0) >> 8) & (m)) | ((e1) & ~(m)))
-static void A8_RowProc_Opaque(
- SkPMColor* SK_RESTRICT dst, const void* maskIn, const SkPMColor* SK_RESTRICT src, int count) {
- const uint8_t* SK_RESTRICT mask = static_cast<const uint8_t*>(maskIn);
+static void A8_RowProc_Opaque(SkPMColor* SK_RESTRICT dst,
+ const uint8_t* SK_RESTRICT mask,
+ const SkPMColor* SK_RESTRICT src, int count) {
for (int i = 0; i < count; ++i) {
int m = mask[i];
if (m) {
@@ -188,9 +188,9 @@ static int src_alpha_blend(int src, int dst, int srcA, int mask) {
return dst + SkAlphaMul(src - SkAlphaMul(srcA, dst), mask);
}
-static void LCD16_RowProc_Blend(
- SkPMColor* SK_RESTRICT dst, const void* maskIn, const SkPMColor* SK_RESTRICT src, int count) {
- const uint8_t* SK_RESTRICT mask = static_cast<const uint8_t*>(maskIn);
+static void LCD16_RowProc_Blend(SkPMColor* SK_RESTRICT dst,
+ const uint16_t* SK_RESTRICT mask,
+ const SkPMColor* SK_RESTRICT src, int count) {
for (int i = 0; i < count; ++i) {
uint16_t m = mask[i];
if (0 == m) {
@@ -231,9 +231,9 @@ static void LCD16_RowProc_Blend(
}
}
-static void LCD16_RowProc_Opaque(
- SkPMColor* SK_RESTRICT dst, const void* maskIn, const SkPMColor* SK_RESTRICT src, int count) {
- const uint8_t* SK_RESTRICT mask = static_cast<const uint8_t*>(maskIn);
+static void LCD16_RowProc_Opaque(SkPMColor* SK_RESTRICT dst,
+ const uint16_t* SK_RESTRICT mask,
+ const SkPMColor* SK_RESTRICT src, int count) {
for (int i = 0; i < count; ++i) {
uint16_t m = mask[i];
if (0 == m) {
diff --git a/src/core/SkBlitter_ARGB32.cpp b/src/core/SkBlitter_ARGB32.cpp
index a00ed86d8e..e44ad02da5 100644
--- a/src/core/SkBlitter_ARGB32.cpp
+++ b/src/core/SkBlitter_ARGB32.cpp
@@ -570,7 +570,7 @@ void SkARGB32_Shader_Blitter::blitMask(const SkMask& mask, const SkIRect& clip)
SkXfermode* xfer = fXfermode;
do {
shaderContext->shadeSpan(x, y, span, width);
- xfer->xfer32(reinterpret_cast<SkPMColor*>(dstRow), span, width, maskRow);
+ xfer->xfer32((SkPMColor*)dstRow, span, width, maskRow);
dstRow += dstRB;
maskRow += maskRB;
y += 1;
@@ -578,7 +578,7 @@ void SkARGB32_Shader_Blitter::blitMask(const SkMask& mask, const SkIRect& clip)
} else {
do {
shaderContext->shadeSpan(x, y, span, width);
- proc(reinterpret_cast<SkPMColor*>(dstRow), maskRow, span, width);
+ proc(dstRow, maskRow, span, width);
dstRow += dstRB;
maskRow += maskRB;
y += 1;