mirror of https://github.com/axmolengine/axmol.git
94 lines
2.7 KiB
C
94 lines
2.7 KiB
C
/* libs/graphics/sgl/SkEdge.h
|
|
**
|
|
** Copyright 2006, The Android Open Source Project
|
|
**
|
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
|
** you may not use this file except in compliance with the License.
|
|
** You may obtain a copy of the License at
|
|
**
|
|
** http://www.apache.org/licenses/LICENSE-2.0
|
|
**
|
|
** Unless required by applicable law or agreed to in writing, software
|
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
** See the License for the specific language governing permissions and
|
|
** limitations under the License.
|
|
*/
|
|
|
|
#ifndef SkEdge_DEFINED
|
|
#define SkEdge_DEFINED
|
|
|
|
#include "SkRect.h"
|
|
|
|
struct SkEdge {
|
|
enum Type {
|
|
kLine_Type,
|
|
kQuad_Type,
|
|
kCubic_Type
|
|
};
|
|
|
|
SkEdge* fNext;
|
|
SkEdge* fPrev;
|
|
|
|
SkFixed fX;
|
|
SkFixed fDX;
|
|
int32_t fFirstY;
|
|
int32_t fLastY;
|
|
int8_t fCurveCount; // only used by kQuad(+) and kCubic(-)
|
|
uint8_t fCurveShift; // appled to all Dx/DDx/DDDx except for fCubicDShift exception
|
|
uint8_t fCubicDShift; // applied to fCDx and fCDy only in cubic
|
|
int8_t fWinding; // 1 or -1
|
|
|
|
int setLine(const SkPoint& p0, const SkPoint& p1, const SkIRect* clip,
|
|
int shiftUp);
|
|
inline int updateLine(SkFixed ax, SkFixed ay, SkFixed bx, SkFixed by);
|
|
void chopLineWithClip(const SkIRect& clip);
|
|
|
|
inline bool intersectsClip(const SkIRect& clip) const {
|
|
SkASSERT(fFirstY < clip.fBottom);
|
|
return fLastY >= clip.fTop;
|
|
}
|
|
|
|
#ifdef SK_DEBUG
|
|
void dump() const {
|
|
#ifdef SK_CAN_USE_FLOAT
|
|
SkDebugf("edge: firstY:%d lastY:%d x:%g dx:%g w:%d\n", fFirstY, fLastY, SkFixedToFloat(fX), SkFixedToFloat(fDX), fWinding);
|
|
#else
|
|
SkDebugf("edge: firstY:%d lastY:%d x:%x dx:%x w:%d\n", fFirstY, fLastY, fX, fDX, fWinding);
|
|
#endif
|
|
}
|
|
|
|
void validate() const {
|
|
SkASSERT(fPrev && fNext);
|
|
SkASSERT(fPrev->fNext == this);
|
|
SkASSERT(fNext->fPrev == this);
|
|
|
|
SkASSERT(fFirstY <= fLastY);
|
|
SkASSERT(SkAbs32(fWinding) == 1);
|
|
}
|
|
#endif
|
|
};
|
|
|
|
struct SkQuadraticEdge : public SkEdge {
|
|
SkFixed fQx, fQy;
|
|
SkFixed fQDx, fQDy;
|
|
SkFixed fQDDx, fQDDy;
|
|
SkFixed fQLastX, fQLastY;
|
|
|
|
int setQuadratic(const SkPoint pts[3], int shiftUp);
|
|
int updateQuadratic();
|
|
};
|
|
|
|
struct SkCubicEdge : public SkEdge {
|
|
SkFixed fCx, fCy;
|
|
SkFixed fCDx, fCDy;
|
|
SkFixed fCDDx, fCDDy;
|
|
SkFixed fCDDDx, fCDDDy;
|
|
SkFixed fCLastX, fCLastY;
|
|
|
|
int setCubic(const SkPoint pts[4], const SkIRect* clip, int shiftUp);
|
|
int updateCubic();
|
|
};
|
|
|
|
#endif
|