1e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt/*
2e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt * Copyright 2015 Google Inc.
3e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt *
4e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt * Use of this source code is governed by a BD-style license that can be
5e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt * found in the LICENSE file.
6e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt */
7e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
8e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "gm.h"
9e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
10e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "SkCanvas.h"
11e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "SkSurface.h"
12e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "SkTextBlob.h"
13e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
14e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt// This tests that we don't try to reuse textblobs from the GPU textblob cache across pixel geometry
15e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt// changes when we have LCD.  crbug/486744
16e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittnamespace skiagm {
17e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittclass TextBlobGeometryChange : public GM {
18e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittpublic:
19e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    TextBlobGeometryChange() { }
20e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
21e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittprotected:
22e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    SkString onShortName() override {
23e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        return SkString("textblobgeometrychange");
24e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
25e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
26e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    SkISize onISize() override {
27e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        return SkISize::Make(kWidth, kHeight);
28e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
29e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
30e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    void onDraw(SkCanvas* canvas) override {
31e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        const char text[] = "Hamburgefons";
32e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
33e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkPaint paint;
34e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        sk_tool_utils::set_portable_typeface(&paint);
35e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        paint.setTextSize(20);
36e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        paint.setAntiAlias(true);
37e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        paint.setLCDRenderText(true);
38e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
39e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkTextBlobBuilder builder;
40e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
41e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        sk_tool_utils::add_to_text_blob(&builder, text, paint, 10, 10);
42e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
43e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkAutoTUnref<const SkTextBlob> blob(builder.build());
44e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
45e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200);
46e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
47e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkAutoTUnref<SkSurface> surface(canvas->newSurface(info, &props));
48e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        if (surface) {
49e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            SkCanvas* c = surface->getCanvas();
50e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
51e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            // LCD text on white background
52e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            SkRect rect = SkRect::MakeLTRB(0.f, 0.f, SkIntToScalar(kWidth), kHeight / 2.f);
53e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            SkPaint rectPaint;
54e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            rectPaint.setColor(0xffffffff);
55e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            canvas->drawRect(rect, rectPaint);
56e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            canvas->drawTextBlob(blob.get(), 10, 50, paint);
57e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
58e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            // This should not look garbled since we should disable LCD text in this case
59e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            // (i.e., unknown pixel geometry)
60e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            c->clear(0x00ffffff);
61e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            c->drawTextBlob(blob.get(), 10, 150, paint);
62e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            surface->draw(canvas, 0, 0, nullptr);
63e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        } else {
64e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            const char* text = "This test requires a surface";
65e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            size_t len = strlen(text);
66e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            SkPaint paint;
67e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt            canvas->drawText(text, len, 10, 100, paint);
68e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        }
69e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
70e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
71e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittprivate:
72e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    static const int kWidth = 200;
73e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    static const int kHeight = 200;
74e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
75e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    typedef GM INHERITED;
76e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt};
77e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
78e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt//////////////////////////////////////////////////////////////////////////////
79e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
80e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittDEF_GM( return SkNEW(TextBlobGeometryChange); )
81e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt}
82