aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBitmapProcState.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-06-04 14:12:25 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-06-04 14:12:25 -0700
commitad7ae6c821c530dd6cb54b0e8931ba8b10e8d87d (patch)
tree8ef2a833209c3e2c1c445232869c76a320ec1b4c /src/core/SkBitmapProcState.cpp
parenta84f569f0dbf07da55d168bc56538078dd1d2c08 (diff)
switch bitmapshader internals over to pixmap
BUG=skia: NOTRY=True Review URL: https://codereview.chromium.org/1158273007
Diffstat (limited to 'src/core/SkBitmapProcState.cpp')
-rw-r--r--src/core/SkBitmapProcState.cpp63
1 files changed, 32 insertions, 31 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 314fdd74c6..2227010da3 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -54,12 +54,12 @@ static bool matrix_only_scale_translate(const SkMatrix& m) {
* For the purposes of drawing bitmaps, if a matrix is "almost" translate
* go ahead and treat it as if it were, so that subsequent code can go fast.
*/
-static bool just_trans_clamp(const SkMatrix& matrix, const SkBitmap& bitmap) {
+static bool just_trans_clamp(const SkMatrix& matrix, const SkPixmap& pixmap) {
SkASSERT(matrix_only_scale_translate(matrix));
if (matrix.getType() & SkMatrix::kScale_Mask) {
- SkRect src, dst;
- bitmap.getBounds(&src);
+ SkRect dst;
+ SkRect src = SkRect::Make(pixmap.bounds());
// Can't call mapRect(), since that will fix up inverted rectangles,
// e.g. when scale is negative, and we don't want to return true for
@@ -74,7 +74,7 @@ static bool just_trans_clamp(const SkMatrix& matrix, const SkBitmap& bitmap) {
// phase (in pixel space) that any translate in the matrix might impart.
SkIRect idst;
dst.round(&idst);
- return idst.width() == bitmap.width() && idst.height() == bitmap.height();
+ return idst.width() == pixmap.width() && idst.height() == pixmap.height();
}
// if we got here, we're either kTranslate_Mask or identity
return true;
@@ -114,20 +114,21 @@ static bool valid_for_filtering(unsigned dimension) {
* and may be removed.
*/
bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
- fBitmap = NULL;
+ fPixmap.reset();
fInvMatrix = inv;
fFilterLevel = paint.getFilterQuality();
SkDefaultBitmapController controller;
fBMState = controller.requestBitmap(fOrigBitmap, inv, paint.getFilterQuality(),
fBMStateStorage.get(), fBMStateStorage.size());
- if (NULL == fBMState) {
+ // Note : we allow the controller to return an empty (zero-dimension) result. Should we?
+ if (NULL == fBMState || fBMState->pixmap().info().isEmpty()) {
return false;
}
- fBitmap = &fBMState->lockedBitmap();
+ fPixmap = fBMState->pixmap();
fInvMatrix = fBMState->invMatrix();
fFilterLevel = fBMState->quality();
- SkASSERT(fBitmap->getPixels());
+ SkASSERT(fPixmap.addr());
bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) == 0;
bool clampClamp = SkShader::kClamp_TileMode == fTileModeX &&
@@ -141,7 +142,7 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
// in both X and Y since clamping to width,height is just as easy as to 0xFFFF.
if (!(clampClamp || trivialMatrix)) {
- fInvMatrix.postIDiv(fBitmap->width(), fBitmap->height());
+ fInvMatrix.postIDiv(fPixmap.width(), fPixmap.height());
}
// Now that all possible changes to the matrix have taken place, check
@@ -155,7 +156,7 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
if (matrix_only_scale_translate(fInvMatrix)) {
SkMatrix forward;
if (fInvMatrix.invert(&forward)) {
- if (clampClamp ? just_trans_clamp(forward, *fBitmap)
+ if (clampClamp ? just_trans_clamp(forward, fPixmap)
: just_trans_general(forward)) {
SkScalar tx = -SkScalarRoundToScalar(forward.getTranslateX());
SkScalar ty = -SkScalarRoundToScalar(forward.getTranslateY());
@@ -188,7 +189,7 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
// the image has a suitable size.
if (fInvType <= SkMatrix::kTranslate_Mask ||
- !valid_for_filtering(fBitmap->width() | fBitmap->height()))
+ !valid_for_filtering(fPixmap.width() | fPixmap.height()))
{
fFilterLevel = kNone_SkFilterQuality;
}
@@ -207,7 +208,7 @@ bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp,
///////////////////////////////////////////////////////////////////////
- const SkAlphaType at = fBitmap->alphaType();
+ const SkAlphaType at = fPixmap.alphaType();
// No need to do this if we're doing HQ sampling; if filter quality is
// still set to HQ by the time we get here, then we must have installed
@@ -226,7 +227,7 @@ bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp,
index |= 4;
}
// bits 3,4,5 encoding the source bitmap format
- switch (fBitmap->colorType()) {
+ switch (fPixmap.colorType()) {
case kN32_SkColorType:
if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) {
return false;
@@ -383,8 +384,8 @@ static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
SkASSERT(count > 0 && colors != NULL);
SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
- const int maxX = s.fBitmap->width() - 1;
- const int maxY = s.fBitmap->height() - 1;
+ const int maxX = s.fPixmap.width() - 1;
+ const int maxY = s.fPixmap.height() - 1;
int ix = s.fFilterOneX + x;
int iy = SkClampMax(s.fFilterOneY + y, maxY);
#ifdef SK_DEBUG
@@ -399,7 +400,7 @@ static void Clamp_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
SkASSERT(ix == ix2);
}
#endif
- const SkPMColor* row = s.fBitmap->getAddr32(0, iy);
+ const SkPMColor* row = s.fPixmap.addr32(0, iy);
// clamp to the left
if (ix < 0) {
@@ -457,8 +458,8 @@ static void Repeat_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
SkASSERT(count > 0 && colors != NULL);
SkASSERT(kNone_SkFilterQuality == s.fFilterLevel);
- const int stopX = s.fBitmap->width();
- const int stopY = s.fBitmap->height();
+ const int stopX = s.fPixmap.width();
+ const int stopY = s.fPixmap.height();
int ix = s.fFilterOneX + x;
int iy = sk_int_mod(s.fFilterOneY + y, stopY);
#ifdef SK_DEBUG
@@ -473,7 +474,7 @@ static void Repeat_S32_D32_nofilter_trans_shaderproc(const SkBitmapProcState& s,
SkASSERT(ix == ix2);
}
#endif
- const SkPMColor* row = s.fBitmap->getAddr32(0, iy);
+ const SkPMColor* row = s.fPixmap.addr32(0, iy);
ix = sk_int_mod(ix, stopX);
for (;;) {
@@ -495,7 +496,7 @@ static void S32_D32_constX_shaderproc(const SkBitmapProcState& s,
SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)) == 0);
SkASSERT(s.fInvKy == 0);
SkASSERT(count > 0 && colors != NULL);
- SkASSERT(1 == s.fBitmap->width());
+ SkASSERT(1 == s.fPixmap.width());
int iY0;
int iY1 SK_INIT_TO_AVOID_WARNING;
@@ -525,7 +526,7 @@ static void S32_D32_constX_shaderproc(const SkBitmapProcState& s,
// its own tiling and sampling we need to undo that here.
if (SkShader::kClamp_TileMode != s.fTileModeX ||
SkShader::kClamp_TileMode != s.fTileModeY) {
- yTemp = SkScalarFloorToInt(pt.fY * s.fBitmap->height());
+ yTemp = SkScalarFloorToInt(pt.fY * s.fPixmap.height());
} else {
yTemp = SkScalarFloorToInt(pt.fY);
}
@@ -533,7 +534,7 @@ static void S32_D32_constX_shaderproc(const SkBitmapProcState& s,
yTemp = s.fFilterOneY + y;
}
- const int stopY = s.fBitmap->height();
+ const int stopY = s.fPixmap.height();
switch (s.fTileModeY) {
case SkShader::kClamp_TileMode:
iY0 = SkClampMax(yTemp, stopY-1);
@@ -557,7 +558,7 @@ static void S32_D32_constX_shaderproc(const SkBitmapProcState& s,
if (s.fInvType > SkMatrix::kTranslate_Mask &&
(SkShader::kClamp_TileMode != s.fTileModeX ||
SkShader::kClamp_TileMode != s.fTileModeY)) {
- pt.fY *= s.fBitmap->height();
+ pt.fY *= s.fPixmap.height();
}
int iY2;
@@ -579,11 +580,11 @@ static void S32_D32_constX_shaderproc(const SkBitmapProcState& s,
#endif
}
- const SkPMColor* row0 = s.fBitmap->getAddr32(0, iY0);
+ const SkPMColor* row0 = s.fPixmap.addr32(0, iY0);
SkPMColor color;
if (kNone_SkFilterQuality != s.fFilterLevel) {
- const SkPMColor* row1 = s.fBitmap->getAddr32(0, iY1);
+ const SkPMColor* row1 = s.fPixmap.addr32(0, iY1);
if (s.fAlphaScale < 256) {
Filter_32_alpha(iSubY, *row0, *row1, &color, s.fAlphaScale);
@@ -631,13 +632,13 @@ bool SkBitmapProcState::setupForTranslate() {
SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() {
- if (kN32_SkColorType != fBitmap->colorType()) {
+ if (kN32_SkColorType != fPixmap.colorType()) {
return NULL;
}
static const unsigned kMask = SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask;
- if (1 == fBitmap->width() && 0 == (fInvType & ~kMask)) {
+ if (1 == fPixmap.width() && 0 == (fInvType & ~kMask)) {
if (kNone_SkFilterQuality == fFilterLevel &&
fInvType <= SkMatrix::kTranslate_Mask &&
!this->setupForTranslate()) {
@@ -752,7 +753,7 @@ void SkBitmapProcState::DebugMatrixProc(const SkBitmapProcState& state,
} else {
proc = state.fFilterLevel != kNone_SkFilterQuality ? check_affine_filter : check_affine_nofilter;
}
- proc(bitmapXY, count, state.fBitmap->width(), state.fBitmap->height());
+ proc(bitmapXY, count, state.fPixmap.width(), state.fPixmap.height());
}
SkBitmapProcState::MatrixProc SkBitmapProcState::getMatrixProc() const {
@@ -799,7 +800,7 @@ void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, in
SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask |
SkMatrix::kScale_Mask)) == 0);
- const unsigned maxX = s.fBitmap->width() - 1;
+ const unsigned maxX = s.fPixmap.width() - 1;
SkFractionalInt fx;
int dstY;
{
@@ -807,12 +808,12 @@ void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, in
s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf,
&pt);
fx = SkScalarToFractionalInt(pt.fY);
- const unsigned maxY = s.fBitmap->height() - 1;
+ const unsigned maxY = s.fPixmap.height() - 1;
dstY = SkClampMax(SkFractionalIntToInt(fx), maxY);
fx = SkScalarToFractionalInt(pt.fX);
}
- const SkPMColor* SK_RESTRICT src = s.fBitmap->getAddr32(0, dstY);
+ const SkPMColor* SK_RESTRICT src = s.fPixmap.addr32(0, dstY);
const SkFractionalInt dx = s.fInvSxFractionalInt;
// Check if we're safely inside [0...maxX] so no need to clamp each computed index.