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