Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2015 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 
      9 /*
     10  * Tests overlapping LCD text
     11  */
     12 
     13 #include "gm.h"
     14 #include "sk_tool_utils.h"
     15 #include "SkCanvas.h"
     16 #include "SkSurface.h"
     17 #include "SkTextBlob.h"
     18 
     19 namespace skiagm {
     20 
     21 constexpr int kWidth = 750;
     22 constexpr int kHeight = 750;
     23 
     24 class LcdOverlapGM : public skiagm::GM {
     25 public:
     26     LcdOverlapGM() {
     27         const int kPointSize = 25;
     28         fTextHeight = SkIntToScalar(kPointSize);
     29     }
     30 
     31 protected:
     32     SkString onShortName() override {
     33         return SkString("lcdoverlap");
     34     }
     35 
     36     void onOnceBeforeDraw() override {
     37         // build text blob
     38         SkTextBlobBuilder builder;
     39 
     40         SkFont font(sk_tool_utils::create_portable_typeface(), 32);
     41         const char* text = "able was I ere I saw elba";
     42         font.setSubpixel(true);
     43         font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
     44         // If we use SkTextBlob::MakeFromText, we get very different positioning ... why?
     45         sk_tool_utils::add_to_text_blob(&builder, text, font, 0, 0);
     46         fBlob = builder.make();
     47     }
     48 
     49     SkISize onISize() override { return SkISize::Make(kWidth, kHeight); }
     50 
     51     void drawTestCase(SkCanvas* canvas, SkScalar x, SkScalar y, SkBlendMode mode,
     52                       SkBlendMode mode2) {
     53         const SkColor colors[] {
     54                 SK_ColorRED,
     55                 SK_ColorGREEN,
     56                 SK_ColorBLUE,
     57                 SK_ColorYELLOW,
     58                 SK_ColorCYAN,
     59                 SK_ColorMAGENTA,
     60         };
     61 
     62         for (size_t i = 0; i < SK_ARRAY_COUNT(colors); i++) {
     63             canvas->save();
     64             canvas->translate(x, y);
     65             canvas->rotate(360.0f / SK_ARRAY_COUNT(colors) * i);
     66             canvas->translate(-fBlob->bounds().width() / 2.0f + 0.5f, 0);
     67 
     68             SkPaint textPaint;
     69             textPaint.setColor(colors[i]);
     70             textPaint.setBlendMode(i % 2 == 0 ? mode : mode2);
     71             canvas->drawTextBlob(fBlob, 0, 0, textPaint);
     72             canvas->restore();
     73         }
     74     }
     75 
     76     void onDraw(SkCanvas* canvas) override {
     77         SkScalar offsetX = kWidth / 4.0f;
     78         SkScalar offsetY = kHeight / 4.0f;
     79         drawTestCase(canvas, offsetX, offsetY,  SkBlendMode::kSrc, SkBlendMode::kSrc);
     80         drawTestCase(canvas, 3 * offsetX, offsetY,  SkBlendMode::kSrcOver, SkBlendMode::kSrcOver);
     81         drawTestCase(canvas, offsetX, 3 * offsetY,  SkBlendMode::kHardLight,
     82                      SkBlendMode::kLuminosity);
     83         drawTestCase(canvas, 3 * offsetX, 3 * offsetY,  SkBlendMode::kSrcOver, SkBlendMode::kSrc);
     84     }
     85 
     86 private:
     87     SkScalar fTextHeight;
     88     sk_sp<SkTextBlob> fBlob;
     89     typedef skiagm::GM INHERITED;
     90 };
     91 
     92 //////////////////////////////////////////////////////////////////////////////
     93 
     94 DEF_GM( return new LcdOverlapGM; )
     95 }
     96