1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkColor.h"
9cb93a386Sopenharmony_ci#include "include/core/SkRect.h"
10cb93a386Sopenharmony_ci#include "include/core/SkTypes.h"
11cb93a386Sopenharmony_ci#include "src/core/SkBlitter.h"
12cb93a386Sopenharmony_ci#include "src/core/SkMask.h"
13cb93a386Sopenharmony_ci#include "tests/Test.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_ci#include <string.h>
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ciclass TestBlitter : public SkBlitter {
18cb93a386Sopenharmony_cipublic:
19cb93a386Sopenharmony_ci    TestBlitter(SkIRect bounds, skiatest::Reporter* reporter)
20cb93a386Sopenharmony_ci        : fBounds(bounds)
21cb93a386Sopenharmony_ci        , fReporter(reporter) { }
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci    void blitH(int x, int y, int width) override {
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_ci        REPORTER_ASSERT(fReporter, x >= fBounds.fLeft && x < fBounds.fRight);
26cb93a386Sopenharmony_ci        REPORTER_ASSERT(fReporter, y >= fBounds.fTop && y < fBounds.fBottom);
27cb93a386Sopenharmony_ci        int right = x + width;
28cb93a386Sopenharmony_ci        REPORTER_ASSERT(fReporter, right > fBounds.fLeft && right <= fBounds.fRight);
29cb93a386Sopenharmony_ci    }
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ci    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
32cb93a386Sopenharmony_ci        SkDEBUGFAIL("blitAntiH not implemented");
33cb93a386Sopenharmony_ci    }
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_ciprivate:
36cb93a386Sopenharmony_ci    SkIRect fBounds;
37cb93a386Sopenharmony_ci    skiatest::Reporter* fReporter;
38cb93a386Sopenharmony_ci};
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci// Exercise all clips compared with different widths of bitMask. Make sure that no buffer
41cb93a386Sopenharmony_ci// overruns happen.
42cb93a386Sopenharmony_ciDEF_TEST(BlitAndClip, reporter) {
43cb93a386Sopenharmony_ci    const int originX = 100;
44cb93a386Sopenharmony_ci    const int originY = 100;
45cb93a386Sopenharmony_ci    for (int width = 1; width <= 32; width++) {
46cb93a386Sopenharmony_ci        const int height = 2;
47cb93a386Sopenharmony_ci        int rowBytes = (width + 7) >> 3;
48cb93a386Sopenharmony_ci        uint8_t* bits = new uint8_t[rowBytes * height];
49cb93a386Sopenharmony_ci        memset(bits, 0xAA, rowBytes * height);
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci        SkIRect b = {originX, originY, originX + width, originY + height};
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci        SkMask mask;
54cb93a386Sopenharmony_ci        mask.fFormat = SkMask::kBW_Format;
55cb93a386Sopenharmony_ci        mask.fBounds = b;
56cb93a386Sopenharmony_ci        mask.fImage = (uint8_t*)bits;
57cb93a386Sopenharmony_ci        mask.fRowBytes = rowBytes;
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci        TestBlitter tb(mask.fBounds, reporter);
60cb93a386Sopenharmony_ci
61cb93a386Sopenharmony_ci        for (int top = b.fTop; top < b.fBottom; top++) {
62cb93a386Sopenharmony_ci            for (int bottom = top + 1; bottom <= b.fBottom; bottom++) {
63cb93a386Sopenharmony_ci                for (int left = b.fLeft; left < b.fRight; left++) {
64cb93a386Sopenharmony_ci                    for (int right = left + 1; right <= b.fRight; right++) {
65cb93a386Sopenharmony_ci                        SkIRect clipRect = {left, top, right, bottom};
66cb93a386Sopenharmony_ci                        tb.blitMask(mask, clipRect);
67cb93a386Sopenharmony_ci                    }
68cb93a386Sopenharmony_ci                }
69cb93a386Sopenharmony_ci            }
70cb93a386Sopenharmony_ci        }
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ci        delete [] bits;
73cb93a386Sopenharmony_ci    }
74cb93a386Sopenharmony_ci}
75