18cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org/*
2fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Copyright 2010 Google Inc.
38cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org *
4fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * Use of this source code is governed by a BSD-style license that can be
5fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com * found in the LICENSE file.
68cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org */
78cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org
88f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkBlitter.h"
98cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org#include "SkPath.h"
108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "SkRegion.h"
118cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org#include "SkScan.h"
128f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h"
138cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org
148cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.orgstruct FakeBlitter : public SkBlitter {
157df9e4a87d84415391c167ea54cd389d4b423c2dherb    FakeBlitter()
167df9e4a87d84415391c167ea54cd389d4b423c2dherb        : m_blitCount(0) { }
178cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org
187df9e4a87d84415391c167ea54cd389d4b423c2dherb    void blitH(int x, int y, int width) override {
197df9e4a87d84415391c167ea54cd389d4b423c2dherb        m_blitCount++;
207df9e4a87d84415391c167ea54cd389d4b423c2dherb    }
218cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org
227df9e4a87d84415391c167ea54cd389d4b423c2dherb    void blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) override {
237df9e4a87d84415391c167ea54cd389d4b423c2dherb      SkDEBUGFAIL("blitAntiH not implemented");
247df9e4a87d84415391c167ea54cd389d4b423c2dherb    }
257df9e4a87d84415391c167ea54cd389d4b423c2dherb
267df9e4a87d84415391c167ea54cd389d4b423c2dherb    int m_blitCount;
278cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org};
288cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org
298cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org// http://code.google.com/p/skia/issues/detail?id=87
30d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// Lines which is not clipped by boundary based clipping,
318cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org// but skipped after tessellation, should be cleared by the blitter.
32e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(FillPathInverse, reporter) {
337df9e4a87d84415391c167ea54cd389d4b423c2dherb    FakeBlitter blitter;
347df9e4a87d84415391c167ea54cd389d4b423c2dherb    SkIRect clip;
357df9e4a87d84415391c167ea54cd389d4b423c2dherb    SkPath path;
367df9e4a87d84415391c167ea54cd389d4b423c2dherb    int height = 100;
377df9e4a87d84415391c167ea54cd389d4b423c2dherb    int width  = 200;
387df9e4a87d84415391c167ea54cd389d4b423c2dherb    int expected_lines = 5;
397df9e4a87d84415391c167ea54cd389d4b423c2dherb    clip.set(0, height - expected_lines, width, height);
407df9e4a87d84415391c167ea54cd389d4b423c2dherb    path.moveTo(0.0f, 0.0f);
417df9e4a87d84415391c167ea54cd389d4b423c2dherb    path.quadTo(SkIntToScalar(width/2), SkIntToScalar(height),
4242639cddc33746b351bbf07c540711eefffe191acaryclark@google.com              SkIntToScalar(width), 0.0f);
437df9e4a87d84415391c167ea54cd389d4b423c2dherb    path.close();
447df9e4a87d84415391c167ea54cd389d4b423c2dherb    path.setFillType(SkPath::kInverseWinding_FillType);
457df9e4a87d84415391c167ea54cd389d4b423c2dherb    SkScan::FillPath(path, clip, &blitter);
468cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org
477df9e4a87d84415391c167ea54cd389d4b423c2dherb    REPORTER_ASSERT(reporter, blitter.m_blitCount == expected_lines);
488cfdf01ff953b47fdd5c29ebd54fea8a7a9be83eagl@chromium.org}
49