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