Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2011 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 "SkCanvas.h"
     10 #include "SkPath.h"
     11 
     12 namespace skiagm {
     13 
     14 /** Draw a 2px border around the target, then red behind the target;
     15     set the clip to match the target, then draw >> the target in blue.
     16 */
     17 
     18 void draw (SkCanvas* canvas, SkRect& target, int x, int y) {
     19     SkPaint borderPaint;
     20     borderPaint.setColor(SkColorSetRGB(0x0, 0xDD, 0x0));
     21     borderPaint.setAntiAlias(true);
     22     SkPaint backgroundPaint;
     23     backgroundPaint.setColor(SkColorSetRGB(0xDD, 0x0, 0x0));
     24     backgroundPaint.setAntiAlias(true);
     25     SkPaint foregroundPaint;
     26     foregroundPaint.setColor(SkColorSetRGB(0x0, 0x0, 0xDD));
     27     foregroundPaint.setAntiAlias(true);
     28 
     29     canvas->save();
     30     canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
     31     target.inset(SkIntToScalar(-2), SkIntToScalar(-2));
     32     canvas->drawRect(target, borderPaint);
     33     target.inset(SkIntToScalar(2), SkIntToScalar(2));
     34     canvas->drawRect(target, backgroundPaint);
     35     canvas->clipRect(target, SkRegion::kIntersect_Op, true);
     36     target.inset(SkIntToScalar(-4), SkIntToScalar(-4));
     37     canvas->drawRect(target, foregroundPaint);
     38     canvas->restore();
     39 }
     40 
     41 void draw_square (SkCanvas* canvas, int x, int y) {
     42     SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 10 * SK_Scalar1));
     43     draw(canvas, target, x, y);
     44 }
     45 
     46 void draw_column (SkCanvas* canvas, int x, int y) {
     47     SkRect target (SkRect::MakeWH(1 * SK_Scalar1, 10 * SK_Scalar1));
     48     draw(canvas, target, x, y);
     49 }
     50 
     51 void draw_bar (SkCanvas* canvas, int x, int y) {
     52     SkRect target (SkRect::MakeWH(10 * SK_Scalar1, 1 * SK_Scalar1));
     53     draw(canvas, target, x, y);
     54 }
     55 
     56 void draw_rect_tests (SkCanvas* canvas) {
     57     draw_square(canvas, 10, 10);
     58     draw_column(canvas, 30, 10);
     59     draw_bar(canvas, 10, 30);
     60 }
     61 
     62 /**
     63    Test a set of clipping problems discovered while writing blitAntiRect,
     64    and test all the code paths through the clipping blitters.
     65    Each region should show as a blue center surrounded by a 2px green
     66    border, with no red.
     67 */
     68 
     69 class AAClipGM : public GM {
     70 public:
     71     AAClipGM() {
     72 
     73     }
     74 
     75 protected:
     76     virtual SkString onShortName() {
     77         return SkString("aaclip");
     78     }
     79 
     80     virtual SkISize onISize() {
     81         return make_isize(640, 480);
     82     }
     83 
     84     virtual void onDraw(SkCanvas* canvas) {
     85         // Initial pixel-boundary-aligned draw
     86         draw_rect_tests(canvas);
     87 
     88         // Repeat 4x with .2, .4, .6, .8 px offsets
     89         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
     90         canvas->translate(SkIntToScalar(50), 0);
     91         draw_rect_tests(canvas);
     92 
     93         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
     94         canvas->translate(SkIntToScalar(50), 0);
     95         draw_rect_tests(canvas);
     96 
     97         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
     98         canvas->translate(SkIntToScalar(50), 0);
     99         draw_rect_tests(canvas);
    100 
    101         canvas->translate(SK_Scalar1 / 5, SK_Scalar1 / 5);
    102         canvas->translate(SkIntToScalar(50), 0);
    103         draw_rect_tests(canvas);
    104     }
    105 
    106 private:
    107     typedef GM INHERITED;
    108 };
    109 
    110 //////////////////////////////////////////////////////////////////////////////
    111 
    112 static GM* MyFactory(void*) { return new AAClipGM; }
    113 static GMRegistry reg(MyFactory);
    114 
    115 }
    116