From cbbc9df143287e5fd85063822aa2c570ed8df9d5 Mon Sep 17 00:00:00 2001 From: joshualitt Date: Wed, 24 Feb 2016 05:49:55 -0800 Subject: Create new GM to target translations problems in GrAtlasTextContext BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1721833005 Review URL: https://codereview.chromium.org/1721833005 --- gm/textblobblockreordering.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 gm/textblobblockreordering.cpp (limited to 'gm/textblobblockreordering.cpp') diff --git a/gm/textblobblockreordering.cpp b/gm/textblobblockreordering.cpp new file mode 100644 index 0000000000..6542825fe1 --- /dev/null +++ b/gm/textblobblockreordering.cpp @@ -0,0 +1,91 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" + +#include "SkCanvas.h" +#include "SkTextBlob.h" + +namespace skiagm { +class TextBlobBlockReordering : public GM { +public: + // This gm tests that textblobs translate properly when their draw order is different from their + // flush order + TextBlobBlockReordering() { } + +protected: + void onOnceBeforeDraw() override { + SkTextBlobBuilder builder; + + // make textblob + // Large text is used to trigger atlas eviction + SkPaint paint; + paint.setTextSize(56); + const char* text = "AB"; + sk_tool_utils::set_portable_typeface(&paint); + + SkRect bounds; + paint.measureText(text, strlen(text), &bounds); + + SkScalar yOffset = bounds.height(); + sk_tool_utils::add_to_text_blob(&builder, text, paint, 0, yOffset - 30); + + // build + fBlob.reset(builder.build()); + } + + SkString onShortName() override { + return SkString("textblobblockreordering"); + } + + SkISize onISize() override { + return SkISize::Make(kWidth, kHeight); + } + + // This draws the same text blob 3 times. The second draw used a different + // xfer mode so it doens't get batched with the first and third. + // ultimately thye iwll be flushed in the order first, third, and then second + void onDraw(SkCanvas* canvas) override { + canvas->drawColor(sk_tool_utils::color_to_565(SK_ColorGRAY)); + + SkPaint paint; + canvas->translate(10, 40); + + SkRect bounds = fBlob->bounds(); + const int yDelta = SkScalarFloorToInt(bounds.height()) + 20; + const int xDelta = SkScalarFloorToInt(bounds.width()); + + canvas->drawTextBlob(fBlob, 0, 0, paint); + + canvas->translate(SkIntToScalar(xDelta), SkIntToScalar(yDelta)); + + // draw a rect where the text should be, and then twiddle the xfermode + // so we don't batch + SkPaint redPaint; + redPaint.setColor(SK_ColorRED); + canvas->drawRect(bounds, redPaint); + SkPaint srcInPaint(paint); + srcInPaint.setXfermodeMode(SkXfermode::kSrcIn_Mode); + canvas->drawTextBlob(fBlob, 0, 0, srcInPaint); + + canvas->translate(SkIntToScalar(xDelta), SkIntToScalar(yDelta)); + canvas->drawTextBlob(fBlob, 0, 0, paint); + } + +private: + SkAutoTUnref fBlob; + + static const int kWidth = 275; + static const int kHeight = 200; + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +DEF_GM(return new TextBlobBlockReordering;) +} -- cgit v1.2.3