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

Unified Diff: src/effects/SkLayerDrawLooper.cpp

Issue 1362253002: Simplify SkLayerDrawLooper Base URL: https://chromium.googlesource.com/skia.git@flat
Patch Set: Created 5 years, 3 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
« include/effects/SkLayerDrawLooper.h ('K') | « include/effects/SkLayerDrawLooper.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkLayerDrawLooper.cpp
diff --git a/src/effects/SkLayerDrawLooper.cpp b/src/effects/SkLayerDrawLooper.cpp
index bca65ef77a2c43cac9860b9815ff272510de85e6..7f1c81c52ebdfa2aa592677a1992f070d0be8d4a 100644
--- a/src/effects/SkLayerDrawLooper.cpp
+++ b/src/effects/SkLayerDrawLooper.cpp
@@ -7,6 +7,7 @@
*/
#include "SkCanvas.h"
#include "SkColor.h"
+#include "SkPaint.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkLayerDrawLooper.h"
@@ -21,19 +22,16 @@ SkLayerDrawLooper::LayerInfo::LayerInfo() {
fPostTranslate = false;
}
-SkLayerDrawLooper::SkLayerDrawLooper()
- : fRecs(nullptr),
- fCount(0) {
-}
+SkLayerDrawLooper::SkLayerDrawLooper() : fRecs() {}
-SkLayerDrawLooper::~SkLayerDrawLooper() {
- Rec* rec = fRecs;
- while (rec) {
- Rec* next = rec->fNext;
- delete rec;
- rec = next;
- }
-}
+SkLayerDrawLooper::~SkLayerDrawLooper() {}
+
+struct SkLayerDrawLooper::Rec {
+ explicit Rec(const LayerInfo& info) : fPaint(), fInfo(info) {}
+
+ SkPaint fPaint;
+ LayerInfo fInfo;
+};
SkLayerDrawLooper::Context* SkLayerDrawLooper::createContext(SkCanvas* canvas, void* storage) const {
canvas->save();
@@ -128,35 +126,36 @@ static void postTranslate(SkCanvas* canvas, SkScalar dx, SkScalar dy) {
}
SkLayerDrawLooper::LayerDrawLooperContext::LayerDrawLooperContext(
- const SkLayerDrawLooper* looper) : fCurrRec(looper->fRecs) {}
+ const SkLayerDrawLooper* looper)
+ : fCurr(looper->fRecs.begin()), fEnd(looper->fRecs.end()) {}
bool SkLayerDrawLooper::LayerDrawLooperContext::next(SkCanvas* canvas,
SkPaint* paint) {
canvas->restore();
- if (nullptr == fCurrRec) {
+ if (fEnd == fCurr) {
return false;
}
- ApplyInfo(paint, fCurrRec->fPaint, fCurrRec->fInfo);
+ const Rec& rec = *fCurr++;
+ ApplyInfo(paint, rec.fPaint, rec.fInfo);
canvas->save();
- if (fCurrRec->fInfo.fPostTranslate) {
- postTranslate(canvas, fCurrRec->fInfo.fOffset.fX,
- fCurrRec->fInfo.fOffset.fY);
+ if (rec.fInfo.fPostTranslate) {
+ postTranslate(canvas, rec.fInfo.fOffset.fX,
+ rec.fInfo.fOffset.fY);
} else {
- canvas->translate(fCurrRec->fInfo.fOffset.fX,
- fCurrRec->fInfo.fOffset.fY);
+ canvas->translate(rec.fInfo.fOffset.fX,
+ rec.fInfo.fOffset.fY);
}
- fCurrRec = fCurrRec->fNext;
return true;
}
bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const {
- if (fCount != 2) {
+ if (fRecs.size() != 2) {
return false;
}
- const Rec* rec = fRecs;
+ const Rec* rec = &fRecs[0];
// bottom layer needs to be just blur(maskfilter)
if ((rec->fInfo.fPaintBits & ~kMaskFilter_Bit)) {
@@ -174,7 +173,7 @@ bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const {
return false;
}
- rec = rec->fNext;
+ rec = &fRecs[1];
// top layer needs to be "plain"
if (rec->fInfo.fPaintBits) {
return false;
@@ -188,8 +187,8 @@ bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const {
if (bsRec) {
bsRec->fSigma = maskBlur.fSigma;
- bsRec->fOffset = fRecs->fInfo.fOffset;
- bsRec->fColor = fRecs->fPaint.getColor();
+ bsRec->fOffset = fRecs[0].fInfo.fOffset;
+ bsRec->fColor = fRecs[0].fPaint.getColor();
bsRec->fStyle = maskBlur.fStyle;
bsRec->fQuality = maskBlur.fQuality;
}
@@ -199,19 +198,17 @@ bool SkLayerDrawLooper::asABlurShadow(BlurShadowRec* bsRec) const {
///////////////////////////////////////////////////////////////////////////////
void SkLayerDrawLooper::flatten(SkWriteBuffer& buffer) const {
- buffer.writeInt(fCount);
+ buffer.writeInt(fRecs.size());
- Rec* rec = fRecs;
- for (int i = 0; i < fCount; i++) {
+ for (const Rec& rec : fRecs) {
// Legacy "flagsmask" field -- now ignored, remove when we bump version
buffer.writeInt(0);
- buffer.writeInt(rec->fInfo.fPaintBits);
- buffer.writeInt(rec->fInfo.fColorMode);
- buffer.writePoint(rec->fInfo.fOffset);
- buffer.writeBool(rec->fInfo.fPostTranslate);
- buffer.writePaint(rec->fPaint);
- rec = rec->fNext;
+ buffer.writeInt(rec.fInfo.fPaintBits);
+ buffer.writeInt(rec.fInfo.fColorMode);
+ buffer.writePoint(rec.fInfo.fOffset);
+ buffer.writeBool(rec.fInfo.fPostTranslate);
+ buffer.writePaint(rec.fPaint);
}
}
@@ -219,6 +216,7 @@ SkFlattenable* SkLayerDrawLooper::CreateProc(SkReadBuffer& buffer) {
int count = buffer.readInt();
Builder builder;
+ builder.reserve(count);
for (int i = 0; i < count; i++) {
LayerInfo info;
// Legacy "flagsmask" field -- now ignored, remove when we bump version
@@ -235,30 +233,30 @@ SkFlattenable* SkLayerDrawLooper::CreateProc(SkReadBuffer& buffer) {
#ifndef SK_IGNORE_TO_STRING
void SkLayerDrawLooper::toString(SkString* str) const {
- str->appendf("SkLayerDrawLooper (%d): ", fCount);
+ str->appendf("SkLayerDrawLooper (%zu): ", fRecs.size());
- Rec* rec = fRecs;
- for (int i = 0; i < fCount; i++) {
- str->appendf("%d: paintBits: (", i);
- if (0 == rec->fInfo.fPaintBits) {
+ for (size_t i = 0; i < fRecs.size(); i++) {
+ const Rec& rec = fRecs[i];
+ str->appendf("%zu: paintBits: (", i);
+ if (0 == rec.fInfo.fPaintBits) {
str->append("None");
- } else if (kEntirePaint_Bits == rec->fInfo.fPaintBits) {
+ } else if (kEntirePaint_Bits == rec.fInfo.fPaintBits) {
str->append("EntirePaint");
} else {
bool needSeparator = false;
- SkAddFlagToString(str, SkToBool(kStyle_Bit & rec->fInfo.fPaintBits), "Style",
+ SkAddFlagToString(str, SkToBool(kStyle_Bit & rec.fInfo.fPaintBits), "Style",
&needSeparator);
- SkAddFlagToString(str, SkToBool(kTextSkewX_Bit & rec->fInfo.fPaintBits), "TextSkewX",
+ SkAddFlagToString(str, SkToBool(kTextSkewX_Bit & rec.fInfo.fPaintBits), "TextSkewX",
&needSeparator);
- SkAddFlagToString(str, SkToBool(kPathEffect_Bit & rec->fInfo.fPaintBits), "PathEffect",
+ SkAddFlagToString(str, SkToBool(kPathEffect_Bit & rec.fInfo.fPaintBits), "PathEffect",
&needSeparator);
- SkAddFlagToString(str, SkToBool(kMaskFilter_Bit & rec->fInfo.fPaintBits), "MaskFilter",
+ SkAddFlagToString(str, SkToBool(kMaskFilter_Bit & rec.fInfo.fPaintBits), "MaskFilter",
&needSeparator);
- SkAddFlagToString(str, SkToBool(kShader_Bit & rec->fInfo.fPaintBits), "Shader",
+ SkAddFlagToString(str, SkToBool(kShader_Bit & rec.fInfo.fPaintBits), "Shader",
&needSeparator);
- SkAddFlagToString(str, SkToBool(kColorFilter_Bit & rec->fInfo.fPaintBits), "ColorFilter",
+ SkAddFlagToString(str, SkToBool(kColorFilter_Bit & rec.fInfo.fPaintBits), "ColorFilter",
&needSeparator);
- SkAddFlagToString(str, SkToBool(kXfermode_Bit & rec->fInfo.fPaintBits), "Xfermode",
+ SkAddFlagToString(str, SkToBool(kXfermode_Bit & rec.fInfo.fPaintBits), "Xfermode",
&needSeparator);
}
str->append(") ");
@@ -270,88 +268,48 @@ void SkLayerDrawLooper::toString(SkString* str) const {
"kColorBurn", "kHardLight", "kSoftLight", "kDifference", "kExclusion"
};
- str->appendf("mode: %s ", gModeStrings[rec->fInfo.fColorMode]);
+ str->appendf("mode: %s ", gModeStrings[rec.fInfo.fColorMode]);
str->append("offset: (");
- str->appendScalar(rec->fInfo.fOffset.fX);
+ str->appendScalar(rec.fInfo.fOffset.fX);
str->append(", ");
- str->appendScalar(rec->fInfo.fOffset.fY);
+ str->appendScalar(rec.fInfo.fOffset.fY);
str->append(") ");
str->append("postTranslate: ");
- if (rec->fInfo.fPostTranslate) {
+ if (rec.fInfo.fPostTranslate) {
str->append("true ");
} else {
str->append("false ");
}
- rec->fPaint.toString(str);
- rec = rec->fNext;
+ rec.fPaint.toString(str);
}
}
#endif
SkLayerDrawLooper::Builder::Builder()
- : fRecs(nullptr),
- fTopRec(nullptr),
- fCount(0) {
-}
+ : fRecs() {}
-SkLayerDrawLooper::Builder::~Builder() {
- Rec* rec = fRecs;
- while (rec) {
- Rec* next = rec->fNext;
- delete rec;
- rec = next;
- }
-}
-
-SkPaint* SkLayerDrawLooper::Builder::addLayer(const LayerInfo& info) {
- fCount += 1;
+SkLayerDrawLooper::Builder::~Builder() {}
- Rec* rec = new Rec;
- rec->fNext = fRecs;
- rec->fInfo = info;
- fRecs = rec;
- if (nullptr == fTopRec) {
- fTopRec = rec;
- }
+void SkLayerDrawLooper::Builder::reserve(size_t n) {
+ fRecs.reserve(n);
+}
- return &rec->fPaint;
+SkPaint* SkLayerDrawLooper::Builder::addLayerOnTop(const LayerInfo& info) {
+ fRecs.push_back(Rec(info));
+ return &fRecs.back().fPaint;
}
-void SkLayerDrawLooper::Builder::addLayer(SkScalar dx, SkScalar dy) {
+void SkLayerDrawLooper::Builder::addLayerOnTop(SkScalar dx, SkScalar dy) {
LayerInfo info;
-
info.fOffset.set(dx, dy);
- (void)this->addLayer(info);
-}
-
-SkPaint* SkLayerDrawLooper::Builder::addLayerOnTop(const LayerInfo& info) {
- fCount += 1;
-
- Rec* rec = new Rec;
- rec->fNext = nullptr;
- rec->fInfo = info;
- if (nullptr == fRecs) {
- fRecs = rec;
- } else {
- SkASSERT(fTopRec);
- fTopRec->fNext = rec;
- }
- fTopRec = rec;
-
- return &rec->fPaint;
+ this->addLayerOnTop(info);
}
SkLayerDrawLooper* SkLayerDrawLooper::Builder::detachLooper() {
SkLayerDrawLooper* looper = new SkLayerDrawLooper;
- looper->fCount = fCount;
- looper->fRecs = fRecs;
-
- fCount = 0;
- fRecs = nullptr;
- fTopRec = nullptr;
-
+ fRecs.swap(looper->fRecs);
return looper;
}
« include/effects/SkLayerDrawLooper.h ('K') | « include/effects/SkLayerDrawLooper.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698