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"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
11e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "SkCanvas.h"
12e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "SkSurface.h"
13e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt#include "SkTextBlob.h"
14e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
15e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt// This tests that we don't try to reuse textblobs from the GPU textblob cache across pixel geometry
16e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt// changes when we have LCD.  crbug/486744
17e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittnamespace skiagm {
18e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittclass TextBlobGeometryChange : public GM {
19e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittpublic:
20e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    TextBlobGeometryChange() { }
21e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
22e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittprotected:
23e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    SkString onShortName() override {
24e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        return SkString("textblobgeometrychange");
25e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
26e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
27e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    SkISize onISize() override {
28e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        return SkISize::Make(kWidth, kHeight);
29e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
30e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
31e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    void onDraw(SkCanvas* canvas) override {
32e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        const char text[] = "Hamburgefons";
33e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
34e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkPaint paint;
351818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&paint);
36e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        paint.setTextSize(20);
37e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        paint.setAntiAlias(true);
38e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        paint.setLCDRenderText(true);
39e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
40e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        SkTextBlobBuilder builder;
41e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
42e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        sk_tool_utils::add_to_text_blob(&builder, text, paint, 10, 10);
43e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
4437283c28aa5bea2204c18956e74f83b238d7a891fmalita        sk_sp<SkTextBlob> blob(builder.make());
45e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
460e22eb8e6efc7d7ab7a601ba555947916d139906brianosman        SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200);
473a0dbde1cfa84b08c7dd5b597142e9f6179f2d07brianosman        SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
489e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        auto surface = canvas->makeSurface(info, &props);
499e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        if (!surface) {
509e65f9399ea9d50dca723ca23c10ec4145b54abemtklein            surface = SkSurface::MakeRaster(info, &props);
51e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        }
529e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        SkCanvas* c = surface->getCanvas();
539e65f9399ea9d50dca723ca23c10ec4145b54abemtklein
549e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        // LCD text on white background
559e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        SkRect rect = SkRect::MakeLTRB(0.f, 0.f, SkIntToScalar(kWidth), kHeight / 2.f);
569e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        SkPaint rectPaint;
579e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        rectPaint.setColor(0xffffffff);
589e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        canvas->drawRect(rect, rectPaint);
5937283c28aa5bea2204c18956e74f83b238d7a891fmalita        canvas->drawTextBlob(blob, 10, 50, paint);
609e65f9399ea9d50dca723ca23c10ec4145b54abemtklein
619e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        // This should not look garbled since we should disable LCD text in this case
629e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        // (i.e., unknown pixel geometry)
639e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        c->clear(0x00ffffff);
6437283c28aa5bea2204c18956e74f83b238d7a891fmalita        c->drawTextBlob(blob, 10, 150, paint);
659e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        surface->draw(canvas, 0, 0, nullptr);
66e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
67e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
68e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittprivate:
69dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kWidth = 200;
70dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kHeight = 200;
71e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
72e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    typedef GM INHERITED;
73e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt};
74e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
75e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt//////////////////////////////////////////////////////////////////////////////
76e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
77385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new TextBlobGeometryChange;)
78e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt}
79