1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/*
3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2011 Google Inc.
4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger *
5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file.
7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */
8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkAAClip_DEFINED
10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkAAClip_DEFINED
11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkBlitter.h"
13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkRegion.h"
14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAAClip {
16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic:
17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClip();
18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClip(const SkAAClip&);
19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    ~SkAAClip();
20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClip& operator=(const SkAAClip&);
22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    friend bool operator==(const SkAAClip&, const SkAAClip&);
23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    friend bool operator!=(const SkAAClip& a, const SkAAClip& b) {
24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return !(a == b);
25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void swap(SkAAClip&);
28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool isEmpty() const { return NULL == fRunHead; }
30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkIRect& getBounds() const { return fBounds; }
31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setEmpty();
33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setRect(const SkIRect&);
34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setRect(const SkRect&, bool doAA = true);
35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setPath(const SkPath&, const SkRegion* clip = NULL, bool doAA = true);
36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool setRegion(const SkRegion&);
37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool set(const SkAAClip&);
38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkAAClip&, const SkAAClip&, SkRegion::Op);
40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // Helpers for op()
42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkIRect&, SkRegion::Op);
43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkRect&, SkRegion::Op, bool doAA);
44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool op(const SkAAClip&, SkRegion::Op);
45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool translate(int dx, int dy, SkAAClip* dst) const;
47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool translate(int dx, int dy) {
48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return this->translate(dx, dy, this);
49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    /**
52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     *  Allocates a mask the size of the aaclip, and expands its data into
53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     *  the mask, using kA8_Format
54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger     */
55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void copyToMask(SkMask*) const;
56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // called internally
58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool quickContains(int left, int top, int right, int bottom) const;
60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool quickContains(const SkIRect& r) const {
61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        return this->quickContains(r.fLeft, r.fTop, r.fRight, r.fBottom);
62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const uint8_t* findRow(int y, int* lastYForRow) const;
65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const uint8_t* findX(const uint8_t data[], int x, int* initialCount) const;
66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    class Iter;
68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    struct RunHead;
69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    struct YOffset;
70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    class Builder;
71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG
73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void validate() const;
74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else
75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void validate() const {}
76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate:
79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkIRect  fBounds;
80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    RunHead* fRunHead;
81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void freeRuns();
83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool trimBounds();
84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool trimTopBottom();
85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    bool trimLeftRight();
86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    friend class Builder;
88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    class BuilderBlitter;
89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    friend class BuilderBlitter;
90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAAClipBlitter : public SkBlitter {
95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic:
96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAAClipBlitter() : fScanlineScratch(NULL) {}
97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual ~SkAAClipBlitter();
98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void init(SkBlitter* blitter, const SkAAClip* aaclip) {
100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        SkASSERT(aaclip && !aaclip->isEmpty());
101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fBlitter = blitter;
102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fAAClip = aaclip;
103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        fAAClipBounds = aaclip->getBounds();
104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    }
105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual void blitH(int x, int y, int width) SK_OVERRIDE;
107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual void blitAntiH(int x, int y, const SkAlpha[],
108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger                           const int16_t runs[]) SK_OVERRIDE;
109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual void blitV(int x, int y, int height, SkAlpha alpha) SK_OVERRIDE;
110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual void blitRect(int x, int y, int width, int height) SK_OVERRIDE;
111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual void blitMask(const SkMask&, const SkIRect& clip) SK_OVERRIDE;
112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    virtual const SkBitmap* justAnOpaqueColor(uint32_t* value) SK_OVERRIDE;
113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate:
115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkBlitter*      fBlitter;
116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    const SkAAClip* fAAClip;
117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkIRect         fAAClipBounds;
118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    // point into fScanlineScratch
120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    int16_t*        fRuns;
121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAlpha*        fAA;
122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    enum {
124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger        kSize = 32 * 32
125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    };
126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    SkAutoSMalloc<kSize> fGrayMaskScratch;  // used for blitMask
127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void* fScanlineScratch;  // enough for a mask at 32bit, or runs+aa
128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger    void ensureRunsAndAA();
130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger};
131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger
132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif
133