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