17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2013 Google Inc.
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "gm.h"
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergernamespace skiagm {
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger// Draw various width thin rects at 1/8 horizontal pixel increments
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass ThinRectsGM : public GM {
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    ThinRectsGM() {
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        this->setBGColor(0xFF000000);
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual SkString onShortName() SK_OVERRIDE {
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkString("thinrects");
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual SkISize onISize() SK_OVERRIDE {
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return make_isize(240, 320);
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint white;
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        white.setColor(SK_ColorWHITE);
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        white.setAntiAlias(true);
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint green;
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        green.setColor(SK_ColorGREEN);
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        green.setAntiAlias(true);
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < 8; ++i) {
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->translate(i*0.125f, i*40.0f);
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                DrawVertRects(canvas, white);
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->translate(40.0f, 0.0f);
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                DrawVertRects(canvas, green);
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->translate(80.0f, i*40.0f + i*0.125f);
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                DrawHorizRects(canvas, white);
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->translate(40.0f, 0.0f);
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                DrawHorizRects(canvas, green);
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->translate(160.0f + i*0.125f,
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  i*40.0f + i*0.125f);
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                DrawSquares(canvas, white);
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->translate(40.0f, 0.0f);
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                DrawSquares(canvas, green);
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static void DrawVertRects(SkCanvas* canvas, const SkPaint& p) {
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        static const SkRect vertRects[] = {
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1,  1,    5.0f, 21 }, // 4 pix wide
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 8,  1,   10.0f, 21 }, // 2 pix wide
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 13, 1,   14.0f, 21 }, // 1 pix wide
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 17, 1,   17.5f, 21 }, // 1/2 pix wide
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 21, 1,  21.25f, 21 }, // 1/4 pix wide
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 25, 1, 25.125f, 21 }, // 1/8 pix wide
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 29, 1,   29.0f, 21 }  // 0 pix wide
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        };
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (size_t j = 0; j < SK_ARRAY_COUNT(vertRects); ++j) {
797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(vertRects[j], p);
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static void DrawHorizRects(SkCanvas* canvas, const SkPaint& p) {
847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        static const SkRect horizRects[] = {
857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 1,  21,    5.0f }, // 4 pix high
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 8,  21,   10.0f }, // 2 pix high
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 13, 21,   14.0f }, // 1 pix high
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 17, 21,   17.5f }, // 1/2 pix high
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 21, 21,  21.25f }, // 1/4 pix high
907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 25, 21, 25.125f }, // 1/8 pix high
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1, 29, 21,   29.0f }  // 0 pix high
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        };
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (size_t j = 0; j < SK_ARRAY_COUNT(horizRects); ++j) {
957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(horizRects[j], p);
967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    static void DrawSquares(SkCanvas* canvas, const SkPaint& p) {
1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        static const SkRect squares[] = {
1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 1,  1,     5.0f,    5.0f }, // 4 pix
1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 8,  8,    10.0f,   10.0f }, // 2 pix
1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 13, 13,   14.0f,   14.0f }, // 1 pix
1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 17, 17,   17.5f,   17.5f }, // 1/2 pix
1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 21, 21,  21.25f,  21.25f }, // 1/4 pix
1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 25, 25, 25.125f, 25.125f }, // 1/8 pix
1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            { 29, 29,   29.0f,   29.0f }  // 0 pix
1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        };
1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (size_t j = 0; j < SK_ARRAY_COUNT(squares); ++j) {
1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(squares[j], p);
1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef GM INHERITED;
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic GM* MyFactory(void*) { return new ThinRectsGM; }
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic GMRegistry reg(MyFactory);
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
124