1cc0e3110bde60201882a2c512a5cdd73c838f351reed/*
2cc0e3110bde60201882a2c512a5cdd73c838f351reed * Copyright 2014 Google Inc.
3cc0e3110bde60201882a2c512a5cdd73c838f351reed *
4cc0e3110bde60201882a2c512a5cdd73c838f351reed * Use of this source code is governed by a BSD-style license that can be
5cc0e3110bde60201882a2c512a5cdd73c838f351reed * found in the LICENSE file.
6cc0e3110bde60201882a2c512a5cdd73c838f351reed */
7cc0e3110bde60201882a2c512a5cdd73c838f351reed
8cc0e3110bde60201882a2c512a5cdd73c838f351reed#include "gm.h"
9cc0e3110bde60201882a2c512a5cdd73c838f351reed#include "SkBlurMaskFilter.h"
10cc0e3110bde60201882a2c512a5cdd73c838f351reed#include "SkCanvas.h"
11cc0e3110bde60201882a2c512a5cdd73c838f351reed#include "SkColorFilter.h"
12cc0e3110bde60201882a2c512a5cdd73c838f351reed
13cc0e3110bde60201882a2c512a5cdd73c838f351reed#include "SkColorFilter.h"
14cc0e3110bde60201882a2c512a5cdd73c838f351reedstatic SkBitmap make_bm() {
15cc0e3110bde60201882a2c512a5cdd73c838f351reed    SkBitmap bm;
16cc0e3110bde60201882a2c512a5cdd73c838f351reed    bm.allocN32Pixels(100, 100);
17cc0e3110bde60201882a2c512a5cdd73c838f351reed
18cc0e3110bde60201882a2c512a5cdd73c838f351reed    SkCanvas canvas(bm);
19cc0e3110bde60201882a2c512a5cdd73c838f351reed    canvas.clear(0);
20cc0e3110bde60201882a2c512a5cdd73c838f351reed    SkPaint paint;
21cc0e3110bde60201882a2c512a5cdd73c838f351reed    paint.setAntiAlias(true);
22cc0e3110bde60201882a2c512a5cdd73c838f351reed    canvas.drawCircle(50, 50, 50, paint);
23cc0e3110bde60201882a2c512a5cdd73c838f351reed    return bm;
24cc0e3110bde60201882a2c512a5cdd73c838f351reed}
25cc0e3110bde60201882a2c512a5cdd73c838f351reed
26cc0e3110bde60201882a2c512a5cdd73c838f351reedclass EmbossGM : public skiagm::GM {
27cc0e3110bde60201882a2c512a5cdd73c838f351reedpublic:
28cc0e3110bde60201882a2c512a5cdd73c838f351reed    EmbossGM() {
29cc0e3110bde60201882a2c512a5cdd73c838f351reed    }
30cc0e3110bde60201882a2c512a5cdd73c838f351reed
31cc0e3110bde60201882a2c512a5cdd73c838f351reedprotected:
32cc0e3110bde60201882a2c512a5cdd73c838f351reed    virtual SkString onShortName() SK_OVERRIDE {
33cc0e3110bde60201882a2c512a5cdd73c838f351reed        return SkString("emboss");
34cc0e3110bde60201882a2c512a5cdd73c838f351reed    }
35cc0e3110bde60201882a2c512a5cdd73c838f351reed
36cc0e3110bde60201882a2c512a5cdd73c838f351reed    virtual SkISize onISize() SK_OVERRIDE {
37cc0e3110bde60201882a2c512a5cdd73c838f351reed        return SkISize::Make(600, 120);
38cc0e3110bde60201882a2c512a5cdd73c838f351reed    }
39cc0e3110bde60201882a2c512a5cdd73c838f351reed
40cc0e3110bde60201882a2c512a5cdd73c838f351reed    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
41cc0e3110bde60201882a2c512a5cdd73c838f351reed        SkPaint paint;
42cc0e3110bde60201882a2c512a5cdd73c838f351reed        SkBitmap bm = make_bm();
43cc0e3110bde60201882a2c512a5cdd73c838f351reed        canvas->drawBitmap(bm, 10, 10, &paint);
44cc0e3110bde60201882a2c512a5cdd73c838f351reed
45cc0e3110bde60201882a2c512a5cdd73c838f351reed        const SkScalar dir[] = { 1, 1, 1 };
46cc0e3110bde60201882a2c512a5cdd73c838f351reed        paint.setMaskFilter(SkBlurMaskFilter::CreateEmboss(3, dir, 0.3f, 0.1f))->unref();
47cc0e3110bde60201882a2c512a5cdd73c838f351reed        canvas->translate(bm.width() + SkIntToScalar(10), 0);
48cc0e3110bde60201882a2c512a5cdd73c838f351reed        canvas->drawBitmap(bm, 10, 10, &paint);
49cc0e3110bde60201882a2c512a5cdd73c838f351reed
50cc0e3110bde60201882a2c512a5cdd73c838f351reed        // this combination of emboss+colorfilter used to crash -- so we exercise it to
51cc0e3110bde60201882a2c512a5cdd73c838f351reed        // confirm that we have a fix.
52cc0e3110bde60201882a2c512a5cdd73c838f351reed        paint.setColorFilter(SkColorFilter::CreateModeFilter(0xFFFF0000, SkXfermode::kSrcATop_Mode))->unref();
53cc0e3110bde60201882a2c512a5cdd73c838f351reed        canvas->translate(bm.width() + SkIntToScalar(10), 0);
54cc0e3110bde60201882a2c512a5cdd73c838f351reed        canvas->drawBitmap(bm, 10, 10, &paint);
55cc0e3110bde60201882a2c512a5cdd73c838f351reed    }
56cc0e3110bde60201882a2c512a5cdd73c838f351reed
57cc0e3110bde60201882a2c512a5cdd73c838f351reedprivate:
58cc0e3110bde60201882a2c512a5cdd73c838f351reed    typedef skiagm::GM INHERITED;
59cc0e3110bde60201882a2c512a5cdd73c838f351reed};
60cc0e3110bde60201882a2c512a5cdd73c838f351reed
61cc0e3110bde60201882a2c512a5cdd73c838f351reedDEF_GM( return SkNEW(EmbossGM); )
62