/* 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