1394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni/*
2394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni * Copyright 2017 Google Inc.
3394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni *
4394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni * Use of this source code is governed by a BSD-style license that can be
5394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni * found in the LICENSE file.
6394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni */
7394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
8ab244f045a0740fa6106ed21a4e5824cd09f84f3Florin Malita#include "SkBitmap.h"
9394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni#include "SkCanvas.h"
10394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni#include "SkHighContrastFilter.h"
11394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni#include "Test.h"
12394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
13394d414452a5d654731b0b5a3669f8e2420048b3Dominic MazzoniDEF_TEST(HighContrastFilter_FilterImage, reporter) {
14394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkHighContrastConfig config;
15394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
16394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
17394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    int w = 10, h = 10;
18394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkBitmap filterResult, paintResult;
19394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
20394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    filterResult.allocN32Pixels(w, h);
21394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkCanvas canvasFilter(filterResult);
22394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    canvasFilter.clear(0x00000000);
23394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
24394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    paintResult.allocN32Pixels(w, h);
25394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkCanvas canvasPaint(paintResult);
26394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    canvasPaint.clear(0x00000000);
27394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
28394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkPaint paint;
29394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    paint.setColor(SK_ColorBLUE);
30394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkRect r = SkRect::MakeLTRB(SkIntToScalar(2), SkIntToScalar(2),
31394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni                                SkIntToScalar(8), SkIntToScalar(8));
32394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    canvasPaint.drawRect(r, paint);
33394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
34394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    paint.setColorFilter(SkHighContrastFilter::Make(config));
35394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    canvasFilter.drawRect(r, paint);
36394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
37394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    for (int y = r.top(); y < r.bottom(); ++y) {
38394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni        for (int x = r.left(); x < r.right(); ++x) {
39394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni            SkColor paintColor = paintResult.getColor(x, y);
40394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni            SkColor filterColor = filterResult.getColor(x, y);
41394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni            REPORTER_ASSERT(
42394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni                reporter, filterColor ==
43394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni                paint.getColorFilter()->filterColor(paintColor));
44394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni        }
45394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    }
46394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni}
47394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
48394d414452a5d654731b0b5a3669f8e2420048b3Dominic MazzoniDEF_TEST(HighContrastFilter_SanityCheck, reporter) {
49394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkHighContrastConfig config;
50394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
51394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    sk_sp<SkColorFilter> filter = SkHighContrastFilter::Make(config);
52394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
53394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkColor white_inverted = filter->filterColor(SK_ColorWHITE);
54394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, white_inverted == SK_ColorBLACK);
55394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
56394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkColor black_inverted = filter->filterColor(SK_ColorBLACK);
57394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, black_inverted == SK_ColorWHITE);
58394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni}
59394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
60394d414452a5d654731b0b5a3669f8e2420048b3Dominic MazzoniDEF_TEST(HighContrastFilter_InvalidInputs, reporter) {
61394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    SkHighContrastConfig config;
62394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, config.isValid());
63394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
64394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    // Valid invert style
65394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertBrightness;
66394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, config.isValid());
67394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertLightness;
68394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, config.isValid());
69394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    sk_sp<SkColorFilter> filter = SkHighContrastFilter::Make(config);
70394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, filter);
71394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
72394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    // Invalid invert style
73394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fInvertStyle = static_cast<SkHighContrastConfig::InvertStyle>(999);
74394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, !config.isValid());
75394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    filter = SkHighContrastFilter::Make(config);
76394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, !filter);
77394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
78394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    // Valid contrast
79394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fInvertStyle = SkHighContrastConfig::InvertStyle::kInvertBrightness;
80394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fContrast = 0.5f;
81394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, config.isValid());
82394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    filter = SkHighContrastFilter::Make(config);
83394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, filter);
84394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni
85394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    // Invalid contrast
86394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    config.fContrast = 1.1f;
87394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, !config.isValid());
88394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    filter = SkHighContrastFilter::Make(config);
89394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni    REPORTER_ASSERT(reporter, !filter);
90394d414452a5d654731b0b5a3669f8e2420048b3Dominic Mazzoni}
91