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 #include "gm.h"
      9 #include "sk_tool_utils.h"
     10 
     11 #include "Resources.h"
     12 #include "SkCanvas.h"
     13 #include "SkGradientShader.h"
     14 #include "SkRandomScalerContext.h"
     15 #include "SkStream.h"
     16 #include "SkSurface.h"
     17 #include "SkTextBlob.h"
     18 #include "SkTypeface.h"
     19 
     20 #if SK_SUPPORT_GPU
     21 
     22 #include "GrContext.h"
     23 
     24 namespace skiagm {
     25 class TextBlobRandomFont : public GM {
     26 public:
     27     // This gm tests that textblobs can be translated and scaled with a font that returns random
     28     // but deterministic masks
     29     TextBlobRandomFont() { }
     30 
     31 protected:
     32     void onOnceBeforeDraw() override {
     33         SkTextBlobBuilder builder;
     34 
     35         const char* text = "The quick brown fox jumps over the lazy dog.";
     36 
     37         // make textbloben
     38         SkPaint paint;
     39         paint.setTextSize(32);
     40         paint.setLCDRenderText(true);
     41 
     42         // Setup our random scaler context
     43         sk_sp<SkTypeface> orig(sk_tool_utils::create_portable_typeface(
     44                                    "sans-serif", SkFontStyle::Bold()));
     45         if (nullptr == orig) {
     46             orig = SkTypeface::MakeDefault();
     47         }
     48         paint.setTypeface(sk_make_sp<SkRandomTypeface>(orig, paint, false));
     49 
     50         SkRect bounds;
     51         paint.measureText(text, strlen(text), &bounds);
     52         sk_tool_utils::add_to_text_blob(&builder, text, paint, 0, 0);
     53 
     54         // A8
     55         const char* bigtext1 = "The quick brown fox";
     56         const char* bigtext2 = "jumps over the lazy dog.";
     57         paint.setTextSize(160);
     58         paint.setSubpixelText(false);
     59         paint.setLCDRenderText(false);
     60         paint.measureText(bigtext1, strlen(bigtext1), &bounds);
     61         SkScalar offset = bounds.height();
     62         sk_tool_utils::add_to_text_blob(&builder, bigtext1, paint, 0, offset);
     63 
     64         paint.measureText(bigtext2, strlen(bigtext2), &bounds);
     65         offset += bounds.height();
     66         sk_tool_utils::add_to_text_blob(&builder, bigtext2, paint, 0, offset);
     67 
     68         // color emoji
     69         if (sk_sp<SkTypeface> origEmoji = sk_tool_utils::emoji_typeface()) {
     70             const char* emojiText = sk_tool_utils::emoji_sample_text();
     71             paint.measureText(emojiText, strlen(emojiText), &bounds);
     72             offset += bounds.height();
     73             paint.setTypeface(sk_make_sp<SkRandomTypeface>(origEmoji, paint, false));
     74             sk_tool_utils::add_to_text_blob(&builder, emojiText, paint, 0, offset);
     75         }
     76 
     77         // build
     78         fBlob = builder.make();
     79     }
     80 
     81     SkString onShortName() override {
     82         return SkString("textblobrandomfont");
     83     }
     84 
     85     SkISize onISize() override {
     86         return SkISize::Make(kWidth, kHeight);
     87     }
     88 
     89     void onDraw(SkCanvas* canvas) override {
     90         // This GM exists to test a specific feature of the GPU backend.
     91         if (nullptr == canvas->getGrContext()) {
     92             skiagm::GM::DrawGpuOnlyMessage(canvas);
     93             return;
     94         }
     95 
     96         canvas->drawColor(sk_tool_utils::color_to_565(SK_ColorWHITE));
     97 
     98         SkImageInfo info = SkImageInfo::Make(kWidth, kHeight, canvas->imageInfo().colorType(),
     99                                              kPremul_SkAlphaType,
    100                                              canvas->imageInfo().refColorSpace());
    101         SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
    102         auto surface(sk_tool_utils::makeSurface(canvas, info, &props));
    103         if (surface) {
    104             SkPaint paint;
    105             paint.setAntiAlias(true);
    106 
    107             SkCanvas* c = surface->getCanvas();
    108 
    109             int stride = SkScalarCeilToInt(fBlob->bounds().height());
    110             int yOffset = stride / 8;
    111             for (int i = 0; i < 1; i++) {
    112                 // fiddle the canvas to force regen of textblobs
    113                 canvas->rotate(i % 2 ? 0.0f : -0.05f);
    114                 canvas->drawTextBlob(fBlob, 10.0f, SkIntToScalar(yOffset), paint);
    115                 yOffset += stride;
    116 
    117                 // This will draw as black boxes
    118                 c->drawTextBlob(fBlob, 10, SkIntToScalar(yOffset), paint);
    119                 surface->draw(canvas, 0, 0, nullptr);
    120 
    121                 // free gpu resources and verify
    122                 yOffset += stride;
    123                 canvas->getGrContext()->freeGpuResources();
    124                 canvas->drawTextBlob(fBlob, 10, SkIntToScalar(yOffset), paint);
    125 
    126                 yOffset += stride;
    127             }
    128 
    129         } else {
    130             const char* text = "This test requires a surface";
    131             size_t len = strlen(text);
    132             SkPaint paint;
    133             canvas->drawText(text, len, 10, 100, paint);
    134         }
    135     }
    136 
    137 private:
    138     sk_sp<SkTextBlob> fBlob;
    139 
    140     static constexpr int kWidth = 2000;
    141     static constexpr int kHeight = 1600;
    142 
    143     typedef GM INHERITED;
    144 };
    145 
    146 //////////////////////////////////////////////////////////////////////////////
    147 
    148 DEF_GM(return new TextBlobRandomFont;)
    149 }
    150 #endif
    151