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