1496d29f6b273340efa59f1077d9338688c685f1bjoshualitt/* 2496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * Copyright 2015 Google Inc. 3496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * 4496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * Use of this source code is governed by a BSD-style license that can be 5496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * found in the LICENSE file. 6496d29f6b273340efa59f1077d9338688c685f1bjoshualitt */ 7496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 8496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 9496d29f6b273340efa59f1077d9338688c685f1bjoshualitt/* 10496d29f6b273340efa59f1077d9338688c685f1bjoshualitt * Tests overlapping LCD text 11496d29f6b273340efa59f1077d9338688c685f1bjoshualitt */ 12496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 13496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "gm.h" 1433d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 15496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "SkCanvas.h" 16496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "SkSurface.h" 17496d29f6b273340efa59f1077d9338688c685f1bjoshualitt#include "SkTextBlob.h" 18496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 19496d29f6b273340efa59f1077d9338688c685f1bjoshualittnamespace skiagm { 20496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 21dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kWidth = 750; 22dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kHeight = 750; 23496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 24496d29f6b273340efa59f1077d9338688c685f1bjoshualittclass LcdOverlapGM : public skiagm::GM { 25496d29f6b273340efa59f1077d9338688c685f1bjoshualittpublic: 26496d29f6b273340efa59f1077d9338688c685f1bjoshualitt LcdOverlapGM() { 27496d29f6b273340efa59f1077d9338688c685f1bjoshualitt const int kPointSize = 25; 28496d29f6b273340efa59f1077d9338688c685f1bjoshualitt fTextHeight = SkIntToScalar(kPointSize); 29496d29f6b273340efa59f1077d9338688c685f1bjoshualitt } 30496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 31496d29f6b273340efa59f1077d9338688c685f1bjoshualittprotected: 32496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkString onShortName() override { 33496d29f6b273340efa59f1077d9338688c685f1bjoshualitt return SkString("lcdoverlap"); 34496d29f6b273340efa59f1077d9338688c685f1bjoshualitt } 35496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 36496d29f6b273340efa59f1077d9338688c685f1bjoshualitt void onOnceBeforeDraw() override { 37496d29f6b273340efa59f1077d9338688c685f1bjoshualitt // build text blob 38496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkTextBlobBuilder builder; 39496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 40496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkPaint paint; 41496d29f6b273340efa59f1077d9338688c685f1bjoshualitt sk_tool_utils::set_portable_typeface(&paint); 42496d29f6b273340efa59f1077d9338688c685f1bjoshualitt paint.setTextSize(32); 43496d29f6b273340efa59f1077d9338688c685f1bjoshualitt const char* text = "able was I ere I saw elba"; 44496d29f6b273340efa59f1077d9338688c685f1bjoshualitt paint.setAntiAlias(true); 45496d29f6b273340efa59f1077d9338688c685f1bjoshualitt paint.setSubpixelText(true); 46496d29f6b273340efa59f1077d9338688c685f1bjoshualitt paint.setLCDRenderText(true); 47496d29f6b273340efa59f1077d9338688c685f1bjoshualitt sk_tool_utils::add_to_text_blob(&builder, text, paint, 0, 0); 4837283c28aa5bea2204c18956e74f83b238d7a891fmalita fBlob = builder.make(); 49496d29f6b273340efa59f1077d9338688c685f1bjoshualitt } 50496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 51496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } 52496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 53374772bd61951f01bf84fe17bf53d8867681c9aereed void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkBlendMode mode, 54374772bd61951f01bf84fe17bf53d8867681c9aereed SkBlendMode mode2) { 55496d29f6b273340efa59f1077d9338688c685f1bjoshualitt const SkColor colors[] { 56496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SK_ColorRED, 57496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SK_ColorGREEN, 58496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SK_ColorBLUE, 59496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SK_ColorYELLOW, 60496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SK_ColorCYAN, 61496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SK_ColorMAGENTA, 62496d29f6b273340efa59f1077d9338688c685f1bjoshualitt }; 63496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 64496d29f6b273340efa59f1077d9338688c685f1bjoshualitt for (size_t i = 0; i < SK_ARRAY_COUNT(colors); i++) { 65496d29f6b273340efa59f1077d9338688c685f1bjoshualitt canvas->save(); 66496d29f6b273340efa59f1077d9338688c685f1bjoshualitt canvas->translate(x, y); 67496d29f6b273340efa59f1077d9338688c685f1bjoshualitt canvas->rotate(360.0f / SK_ARRAY_COUNT(colors) * i); 68496d29f6b273340efa59f1077d9338688c685f1bjoshualitt canvas->translate(-fBlob->bounds().width() / 2.0f + 0.5f, 0); 69496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 70496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkPaint textPaint; 71496d29f6b273340efa59f1077d9338688c685f1bjoshualitt textPaint.setColor(colors[i]); 72374772bd61951f01bf84fe17bf53d8867681c9aereed textPaint.setBlendMode(i % 2 == 0 ? mode : mode2); 73496d29f6b273340efa59f1077d9338688c685f1bjoshualitt canvas->drawTextBlob(fBlob, 0, 0, textPaint); 74496d29f6b273340efa59f1077d9338688c685f1bjoshualitt canvas->restore(); 75496d29f6b273340efa59f1077d9338688c685f1bjoshualitt } 76496d29f6b273340efa59f1077d9338688c685f1bjoshualitt } 77496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 78496d29f6b273340efa59f1077d9338688c685f1bjoshualitt void onDraw(SkCanvas* canvas) override { 79496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkScalar offsetX = kWidth / 4.0f; 80496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkScalar offsetY = kHeight / 4.0f; 81374772bd61951f01bf84fe17bf53d8867681c9aereed drawTestCase(canvas, offsetX, offsetY, SkBlendMode::kSrc, SkBlendMode::kSrc); 82374772bd61951f01bf84fe17bf53d8867681c9aereed drawTestCase(canvas, 3 * offsetX, offsetY, SkBlendMode::kSrcOver, SkBlendMode::kSrcOver); 83374772bd61951f01bf84fe17bf53d8867681c9aereed drawTestCase(canvas, offsetX, 3 * offsetY, SkBlendMode::kHardLight, 84374772bd61951f01bf84fe17bf53d8867681c9aereed SkBlendMode::kLuminosity); 85374772bd61951f01bf84fe17bf53d8867681c9aereed drawTestCase(canvas, 3 * offsetX, 3 * offsetY, SkBlendMode::kSrcOver, SkBlendMode::kSrc); 86496d29f6b273340efa59f1077d9338688c685f1bjoshualitt } 87496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 88496d29f6b273340efa59f1077d9338688c685f1bjoshualittprivate: 89496d29f6b273340efa59f1077d9338688c685f1bjoshualitt SkScalar fTextHeight; 9037283c28aa5bea2204c18956e74f83b238d7a891fmalita sk_sp<SkTextBlob> fBlob; 91496d29f6b273340efa59f1077d9338688c685f1bjoshualitt typedef skiagm::GM INHERITED; 92496d29f6b273340efa59f1077d9338688c685f1bjoshualitt}; 93496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 94496d29f6b273340efa59f1077d9338688c685f1bjoshualitt////////////////////////////////////////////////////////////////////////////// 95496d29f6b273340efa59f1077d9338688c685f1bjoshualitt 96496d29f6b273340efa59f1077d9338688c685f1bjoshualittDEF_GM( return new LcdOverlapGM; ) 97496d29f6b273340efa59f1077d9338688c685f1bjoshualitt} 98