Revert of skia/ext: Early out from analysis when we have more than 1 draw op....

Revert of skia/ext: Early out from analysis when we have more than 1 draw op. (https://codereview.chromium.org/418093003/)

Reason for revert:
This change broke some tests in Blink
Additionally, it renders DevTools shortcuts screen unusable (Open devTools -> F1 -> Shortcuts tab)

http://test-results.appspot.com/dashboards/flakiness_dashboard.html#showExpectations=true&tests=virtual%2Fandroid%2Ffullscreen%2Ffull-screen-fixed-pos-parent.html%2Cvirtual%2Fandroid%2Ffullscreen%2Ffull-screen-iframe-zIndex.html%2Cvirtual%2Fandroid%2Ffullscreen%2Ffull-screen-zIndex.html

Original issue's description:
> skia/ext: Early out from analysis when we have more than 1 draw op.
> 
> This patch puts in a heuristic that earlies out from analysis when
> we have more than one draw op. The intent here is that in most cases,
> if we see more than one draw operation, then analysis is likely not
> to be solid.
> 
> It also removes HasText from analysis canvas, since the only
> remaining use for this was a previous early out heuristic.
> 
> BUG=397198
> R=enne
> 
> Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=285499

TBR=enne@chromium.org,senorblanco@google.com,junov@chromium.org,vmpstr@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=397198

Review URL: https://codereview.chromium.org/416333003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285554 0039d316-1c4b-4281-b951-d872f2087c98
parent 6f04b037
......@@ -80,6 +80,7 @@ void AnalysisCanvas::SetForceNotTransparent(bool flag) {
void AnalysisCanvas::clear(SkColor color) {
is_transparent_ = (!is_forced_not_transparent_ && SkColorGetA(color) == 0);
has_text_ = false;
if (!is_forced_not_solid_ && SkColorGetA(color) == 255) {
is_solid_color_ = true;
......@@ -97,7 +98,6 @@ void AnalysisCanvas::drawPaint(const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawPoints(SkCanvas::PointMode mode,
......@@ -106,7 +106,6 @@ void AnalysisCanvas::drawPoints(SkCanvas::PointMode mode,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
......@@ -133,6 +132,7 @@ void AnalysisCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
!is_forced_not_transparent_ &&
xfermode == SkXfermode::kClear_Mode) {
is_transparent_ = true;
has_text_ = false;
} else if (paint.getAlpha() != 0 || xfermode != SkXfermode::kSrc_Mode) {
is_transparent_ = false;
}
......@@ -145,16 +145,15 @@ void AnalysisCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
if (!is_forced_not_solid_ && IsSolidColorPaint(paint) && does_cover_canvas) {
is_solid_color_ = true;
color_ = paint.getColor();
has_text_ = false;
} else {
is_solid_color_ = false;
}
++draw_op_count_;
}
void AnalysisCanvas::drawOval(const SkRect& oval, const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawRRect(const SkRRect& rr, const SkPaint& paint) {
......@@ -163,13 +162,11 @@ void AnalysisCanvas::drawRRect(const SkRRect& rr, const SkPaint& paint) {
// do the same work here.
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawBitmap(const SkBitmap& bitmap,
......@@ -178,7 +175,6 @@ void AnalysisCanvas::drawBitmap(const SkBitmap& bitmap,
const SkPaint*) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawBitmapRectToRect(const SkBitmap&,
......@@ -193,7 +189,6 @@ void AnalysisCanvas::drawBitmapRectToRect(const SkBitmap&,
paint = &tmpPaint;
drawRect(dst, *paint);
is_solid_color_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
......@@ -201,7 +196,6 @@ void AnalysisCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
const SkPaint* paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawBitmapNine(const SkBitmap& bitmap,
......@@ -210,7 +204,6 @@ void AnalysisCanvas::drawBitmapNine(const SkBitmap& bitmap,
const SkPaint* paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawSprite(const SkBitmap& bitmap,
......@@ -219,7 +212,6 @@ void AnalysisCanvas::drawSprite(const SkBitmap& bitmap,
const SkPaint* paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::onDrawText(const void* text,
......@@ -229,7 +221,7 @@ void AnalysisCanvas::onDrawText(const void* text,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
has_text_ = true;
}
void AnalysisCanvas::onDrawPosText(const void* text,
......@@ -238,7 +230,7 @@ void AnalysisCanvas::onDrawPosText(const void* text,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
has_text_ = true;
}
void AnalysisCanvas::onDrawPosTextH(const void* text,
......@@ -248,7 +240,7 @@ void AnalysisCanvas::onDrawPosTextH(const void* text,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
has_text_ = true;
}
void AnalysisCanvas::onDrawTextOnPath(const void* text,
......@@ -258,7 +250,7 @@ void AnalysisCanvas::onDrawTextOnPath(const void* text,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
has_text_ = true;
}
void AnalysisCanvas::onDrawDRRect(const SkRRect& outer,
......@@ -266,7 +258,6 @@ void AnalysisCanvas::onDrawDRRect(const SkRRect& outer,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
void AnalysisCanvas::drawVertices(SkCanvas::VertexMode,
......@@ -280,7 +271,6 @@ void AnalysisCanvas::drawVertices(SkCanvas::VertexMode,
const SkPaint& paint) {
is_solid_color_ = false;
is_transparent_ = false;
++draw_op_count_;
}
// Needed for now, since SkCanvas requires a bitmap, even if it is not backed
......@@ -300,7 +290,7 @@ AnalysisCanvas::AnalysisCanvas(int width, int height)
is_forced_not_transparent_(false),
is_solid_color_(true),
is_transparent_(true),
draw_op_count_(0) {}
has_text_(false) {}
AnalysisCanvas::~AnalysisCanvas() {}
......@@ -316,12 +306,11 @@ bool AnalysisCanvas::GetColorIfSolid(SkColor* color) const {
return false;
}
bool AnalysisCanvas::HasText() const { return has_text_; }
bool AnalysisCanvas::abortDrawing() {
// Early out as soon as we have more than one draw op.
// TODO(vmpstr): Investigate if 1 is the correct metric here. We need to
// balance the amount of time we spend analyzing vs how many tiles would be
// solid if the number was higher.
return draw_op_count_ > 1;
// Early out as soon as we have detected that the tile has text.
return HasText();
}
void AnalysisCanvas::onClipRect(const SkRect& rect, SkRegion::Op op,
......
......@@ -22,6 +22,7 @@ class SK_API AnalysisCanvas : public SkCanvas, public SkDrawPictureCallback {
// Returns true when a SkColor can be used to represent result.
bool GetColorIfSolid(SkColor* color) const;
bool HasText() const;
void SetForceNotSolid(bool flag);
void SetForceNotTransparent(bool flag);
......@@ -120,7 +121,7 @@ private:
bool is_solid_color_;
SkColor color_;
bool is_transparent_;
int draw_op_count_;
bool has_text_;
};
} // namespace skia
......
......@@ -280,4 +280,114 @@ TEST(AnalysisCanvasTest, SaveLayerRestore) {
EXPECT_NE(static_cast<SkColor>(SK_ColorTRANSPARENT), outputColor);
}
TEST(AnalysisCanvasTest, HasText) {
int width = 200;
int height = 100;
const char* text = "A";
size_t byteLength = 1;
SkPoint point = SkPoint::Make(SkIntToScalar(25), SkIntToScalar(25));
SkPath path;
path.moveTo(point);
path.lineTo(SkIntToScalar(75), SkIntToScalar(75));
SkPaint paint;
paint.setColor(SK_ColorGRAY);
paint.setTextSize(SkIntToScalar(10));
{
skia::AnalysisCanvas canvas(width, height);
// Test after initialization.
EXPECT_FALSE(canvas.HasText());
// Test drawing anything other than text.
canvas.drawRect(SkRect::MakeWH(width/2, height), paint);
EXPECT_FALSE(canvas.HasText());
}
{
// Test SkCanvas::drawText.
skia::AnalysisCanvas canvas(width, height);
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
}
{
// Test SkCanvas::drawPosText.
skia::AnalysisCanvas canvas(width, height);
canvas.drawPosText(text, byteLength, &point, paint);
EXPECT_TRUE(canvas.HasText());
}
{
// Test SkCanvas::drawPosTextH.
skia::AnalysisCanvas canvas(width, height);
canvas.drawPosTextH(text, byteLength, &point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
}
{
// Test SkCanvas::drawTextOnPathHV.
skia::AnalysisCanvas canvas(width, height);
canvas.drawTextOnPathHV(text, byteLength, path, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
}
{
// Test SkCanvas::drawTextOnPath.
skia::AnalysisCanvas canvas(width, height);
canvas.drawTextOnPath(text, byteLength, path, NULL, paint);
EXPECT_TRUE(canvas.HasText());
}
{
// Text under opaque rect.
skia::AnalysisCanvas canvas(width, height);
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
canvas.drawRect(SkRect::MakeWH(width, height), paint);
EXPECT_FALSE(canvas.HasText());
}
{
// Text under translucent rect.
skia::AnalysisCanvas canvas(width, height);
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
SkPaint translucentPaint;
translucentPaint.setColor(0x88FFFFFF);
canvas.drawRect(SkRect::MakeWH(width, height), translucentPaint);
EXPECT_TRUE(canvas.HasText());
}
{
// Text under rect in clear mode.
skia::AnalysisCanvas canvas(width, height);
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
SkPaint clearModePaint;
clearModePaint.setXfermodeMode(SkXfermode::kClear_Mode);
canvas.drawRect(SkRect::MakeWH(width, height), clearModePaint);
EXPECT_FALSE(canvas.HasText());
}
{
// Clear.
skia::AnalysisCanvas canvas(width, height);
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
canvas.clear(SK_ColorGRAY);
EXPECT_FALSE(canvas.HasText());
}
{
// Text inside clip region.
skia::AnalysisCanvas canvas(width, height);
canvas.clipRect(SkRect::MakeWH(100, 100));
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
EXPECT_TRUE(canvas.HasText());
}
{
// Text outside clip region.
skia::AnalysisCanvas canvas(width, height);
canvas.clipRect(SkRect::MakeXYWH(100, 0, 100, 100));
canvas.drawText(text, byteLength, point.fX, point.fY, paint);
// Analysis device does not do any clipping.
// So even when text is outside the clip region,
// it is marked as having the text.
// TODO(alokp): We may be able to do some trivial rejection.
EXPECT_TRUE(canvas.HasText());
}
}
} // namespace skia
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment