textblobgeometrychange.cpp revision 9e65f9399ea9d50dca723ca23c10ec4145b54abe
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;
341818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        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
45898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman        SkImageInfo info = SkImageInfo::MakeN32Premul(200, 200, canvas->imageInfo().profileType());
46898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman        SkSurfaceProps canvasProps(SkSurfaceProps::kLegacyFontHost_InitType);
47898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman        uint32_t allowSRGBInputs = canvas->getProps(&canvasProps)
48898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman            ? canvasProps.flags() & SkSurfaceProps::kAllowSRGBInputs_Flag : 0;
49898235c4864df66aa7f6d32bc2a8b8551040ce1ebrianosman        SkSurfaceProps props(allowSRGBInputs, kUnknown_SkPixelGeometry);
509e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        auto surface = canvas->makeSurface(info, &props);
519e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        if (!surface) {
529e65f9399ea9d50dca723ca23c10ec4145b54abemtklein            surface = SkSurface::MakeRaster(info, &props);
53e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt        }
549e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        SkCanvas* c = surface->getCanvas();
559e65f9399ea9d50dca723ca23c10ec4145b54abemtklein
569e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        // LCD text on white background
579e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        SkRect rect = SkRect::MakeLTRB(0.f, 0.f, SkIntToScalar(kWidth), kHeight / 2.f);
589e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        SkPaint rectPaint;
599e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        rectPaint.setColor(0xffffffff);
609e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        canvas->drawRect(rect, rectPaint);
619e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        canvas->drawTextBlob(blob.get(), 10, 50, paint);
629e65f9399ea9d50dca723ca23c10ec4145b54abemtklein
639e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        // This should not look garbled since we should disable LCD text in this case
649e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        // (i.e., unknown pixel geometry)
659e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        c->clear(0x00ffffff);
669e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        c->drawTextBlob(blob.get(), 10, 150, paint);
679e65f9399ea9d50dca723ca23c10ec4145b54abemtklein        surface->draw(canvas, 0, 0, nullptr);
68e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    }
69e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
70e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualittprivate:
71e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    static const int kWidth = 200;
72e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    static const int kHeight = 200;
73e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
74e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt    typedef GM INHERITED;
75e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt};
76e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
77e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt//////////////////////////////////////////////////////////////////////////////
78e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt
79385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new TextBlobGeometryChange;)
80e4cee1f283c435618343f0c7b298207d5a9a3e1cjoshualitt}
81