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

Unified Diff: src/core/SkBitmapProcState.cpp

Issue 1753903002: fission bitmapprocstate (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: done 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
Index: src/core/SkBitmapProcState.cpp
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 7c37a154d2013ef857fb9620471b2a51c393ee81..ca7dbb0485ad3badc2c8aab798969bf7fd97c582 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -36,7 +36,7 @@ extern void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const void*, int, int, u
#include "SkBitmapProcState_filter.h"
#include "SkBitmapProcState_procs.h"
-SkBitmapProcState::SkBitmapProcState(const SkBitmapProvider& provider,
+SkBitmapProcInfo::SkBitmapProcInfo(const SkBitmapProvider& provider,
herb_g 2016/03/02 16:00:18 Line up params and below.
reed1 2016/03/02 16:28:27 Done.
SkShader::TileMode tmx, SkShader::TileMode tmy)
: fProvider(provider)
, fBMState(nullptr)
@@ -45,7 +45,7 @@ SkBitmapProcState::SkBitmapProcState(const SkBitmapProvider& provider,
fTileModeY = tmy;
}
-SkBitmapProcState::SkBitmapProcState(const SkBitmap& bm,
+SkBitmapProcInfo::SkBitmapProcInfo(const SkBitmap& bm,
SkShader::TileMode tmx, SkShader::TileMode tmy)
: fProvider(SkBitmapProvider(bm))
, fBMState(nullptr)
@@ -54,7 +54,7 @@ SkBitmapProcState::SkBitmapProcState(const SkBitmap& bm,
fTileModeY = tmy;
}
-SkBitmapProcState::~SkBitmapProcState() {
+SkBitmapProcInfo::~SkBitmapProcInfo() {
SkInPlaceDeleteCheck(fBMState, fBMStateStorage.get());
}
@@ -118,23 +118,14 @@ static bool valid_for_filtering(unsigned dimension) {
return (dimension & ~0x3FFF) == 0;
}
-/*
- * Analyze filter-quality and matrix, and decide how to implement that.
- *
- * In general, we cascade down the request level [ High ... None ]
- * - for a given level, if we can fulfill it, fine, else
- * - else we downgrade to the next lower level and try again.
- * We can always fulfill requests for Low and None
- * - sometimes we will "ignore" Low and give None, but this is likely a legacy perf hack
- * and may be removed.
- */
-bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
+bool SkBitmapProcInfo::init(const SkMatrix& inv, const SkPaint& paint) {
+ const int origW = fProvider.info().width();
+ const int origH = fProvider.info().height();
+
fPixmap.reset();
fInvMatrix = inv;
fFilterLevel = paint.getFilterQuality();
- const int origW = fProvider.info().width();
- const int origH = fProvider.info().height();
bool allow_ignore_fractional_translate = true; // historical default
if (kMedium_SkFilterQuality == fFilterLevel) {
allow_ignore_fractional_translate = false;
@@ -149,9 +140,10 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
}
fPixmap = fBMState->pixmap();
fInvMatrix = fBMState->invMatrix();
+ fPaintColor = paint.getColor();
fFilterLevel = fBMState->quality();
SkASSERT(fPixmap.addr());
-
+
bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) == 0;
bool clampClamp = SkShader::kClamp_TileMode == fTileModeX &&
SkShader::kClamp_TileMode == fTileModeY;
@@ -179,30 +171,14 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
SkMatrix forward;
if (fInvMatrix.invert(&forward)) {
if ((clampClamp && allow_ignore_fractional_translate)
- ? just_trans_clamp(forward, fPixmap)
- : just_trans_general(forward)) {
+ ? just_trans_clamp(forward, fPixmap)
+ : just_trans_general(forward)) {
fInvMatrix.setTranslate(-forward.getTranslateX(), -forward.getTranslateY());
}
}
}
- fInvProc = fInvMatrix.getMapXYProc();
- fInvType = fInvMatrix.getType();
- fInvSx = SkScalarToFixed(fInvMatrix.getScaleX());
- fInvSxFractionalInt = SkScalarToFractionalInt(fInvMatrix.getScaleX());
- fInvKy = SkScalarToFixed(fInvMatrix.getSkewY());
- fInvKyFractionalInt = SkScalarToFractionalInt(fInvMatrix.getSkewY());
-
- fAlphaScale = SkAlpha255To256(paint.getAlpha());
-
- fShaderProc32 = nullptr;
- fShaderProc16 = nullptr;
- fSampleProc32 = nullptr;
-
- // recompute the triviality of the matrix here because we may have
- // changed it!
-
- trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) == 0;
+ fInvType = fInvMatrix.getType();
// If our target pixmap is the same as the original, then we revert back to legacy behavior
// and allow the code to ignore fractional translate.
@@ -224,12 +200,41 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) {
fFilterLevel = kNone_SkFilterQuality;
}
}
+
+ return true;
+}
+
+/*
+ * Analyze filter-quality and matrix, and decide how to implement that.
+ *
+ * In general, we cascade down the request level [ High ... None ]
+ * - for a given level, if we can fulfill it, fine, else
+ * - else we downgrade to the next lower level and try again.
+ * We can always fulfill requests for Low and None
+ * - sometimes we will "ignore" Low and give None, but this is likely a legacy perf hack
+ * and may be removed.
+ */
+bool SkBitmapProcState::chooseProcs() {
+ fInvProc = fInvMatrix.getMapXYProc();
+ fInvSx = SkScalarToFixed(fInvMatrix.getScaleX());
herb_g 2016/03/02 16:00:18 Align =?
reed1 2016/03/02 16:28:27 Done.
+ fInvSxFractionalInt = SkScalarToFractionalInt(fInvMatrix.getScaleX());
+ fInvKy = SkScalarToFixed(fInvMatrix.getSkewY());
+ fInvKyFractionalInt = SkScalarToFractionalInt(fInvMatrix.getSkewY());
+
+ fAlphaScale = SkAlpha255To256(SkColorGetA(fPaintColor));
+
+ fShaderProc32 = nullptr;
+ fShaderProc16 = nullptr;
+ fSampleProc32 = nullptr;
+
+ const bool trivialMatrix = (fInvMatrix.getType() & ~SkMatrix::kTranslate_Mask) == 0;
+ const bool clampClamp = SkShader::kClamp_TileMode == fTileModeX &&
+ SkShader::kClamp_TileMode == fTileModeY;
- return this->chooseScanlineProcs(trivialMatrix, clampClamp, paint);
+ return this->chooseScanlineProcs(trivialMatrix, clampClamp);
}
-bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp,
- const SkPaint& paint) {
+bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp) {
fMatrixProc = this->chooseMatrixProc(trivialMatrix);
// TODO(dominikg): SkASSERT(fMatrixProc) instead? chooseMatrixProc never returns nullptr.
if (nullptr == fMatrixProc) {
@@ -281,11 +286,11 @@ bool SkBitmapProcState::chooseScanlineProcs(bool trivialMatrix, bool clampClamp,
break;
case kAlpha_8_SkColorType:
index |= 32;
- fPaintPMColor = SkPreMultiplyColor(paint.getColor());
+ fPaintPMColor = SkPreMultiplyColor(fPaintColor);
break;
case kGray_8_SkColorType:
index |= 40;
- fPaintPMColor = SkPreMultiplyColor(paint.getColor());
+ fPaintPMColor = SkPreMultiplyColor(fPaintColor);
break;
default:
// TODO(dominikg): Should we ever get here? SkASSERT(false) instead?

Powered by Google App Engine
This is Rietveld 408576698