git-svn-id: http://skia.googlecode.com/svn/trunk@1106 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2011-04-11 19:01:12 +00:00
Родитель 5877ffd5ea
Коммит ad91799832
3 изменённых файлов: 93 добавлений и 75 удалений

Просмотреть файл

@ -36,8 +36,7 @@
/** Swap the two bytes in the low 16bits of the parameters.
e.g. 0x1234 -> 0x3412
*/
inline uint16_t SkEndianSwap16(U16CPU value)
{
static inline uint16_t SkEndianSwap16(U16CPU value) {
SkASSERT(value == (uint16_t)value);
return (uint16_t)((value >> 8) | (value << 8));
}
@ -45,12 +44,10 @@ inline uint16_t SkEndianSwap16(U16CPU value)
/** Vector version of SkEndianSwap16(), which swaps the
low two bytes of each value in the array.
*/
inline void SkEndianSwap16s(uint16_t array[], int count)
{
static inline void SkEndianSwap16s(uint16_t array[], int count) {
SkASSERT(count == 0 || array != NULL);
while (--count >= 0)
{
while (--count >= 0) {
*array = SkEndianSwap16(*array);
array += 1;
}
@ -59,8 +56,7 @@ inline void SkEndianSwap16s(uint16_t array[], int count)
/** Reverse all 4 bytes in a 32bit value.
e.g. 0x12345678 -> 0x78563412
*/
inline uint32_t SkEndianSwap32(uint32_t value)
{
static inline uint32_t SkEndianSwap32(uint32_t value) {
return ((value & 0xFF) << 24) |
((value & 0xFF00) << 8) |
((value & 0xFF0000) >> 8) |
@ -70,12 +66,10 @@ inline uint32_t SkEndianSwap32(uint32_t value)
/** Vector version of SkEndianSwap16(), which swaps the
bytes of each value in the array.
*/
inline void SkEndianSwap32s(uint32_t array[], int count)
{
static inline void SkEndianSwap32s(uint32_t array[], int count) {
SkASSERT(count == 0 || array != NULL);
while (--count >= 0)
{
while (--count >= 0) {
*array = SkEndianSwap32(*array);
array += 1;
}

Просмотреть файл

@ -32,7 +32,8 @@ typedef SkPoint SkXRay;
one of the endpoints' y coordinates, indicating that another query y
coordinate is preferred for robustness.
*/
bool SkXRayCrossesLine(const SkXRay& pt, const SkPoint pts[2], bool* ambiguous = NULL);
bool SkXRayCrossesLine(const SkXRay& pt, const SkPoint pts[2],
bool* ambiguous = NULL);
/** Given a quadratic equation Ax^2 + Bx + C = 0, return 0, 1, 2 roots for the
equation.
@ -44,8 +45,10 @@ int SkFindUnitQuadRoots(SkScalar A, SkScalar B, SkScalar C, SkScalar roots[2]);
/** Set pt to the point on the src quadratic specified by t. t must be
0 <= t <= 1.0
*/
void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tangent = NULL);
void SkEvalQuadAtHalf(const SkPoint src[3], SkPoint* pt, SkVector* tangent = NULL);
void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt,
SkVector* tangent = NULL);
void SkEvalQuadAtHalf(const SkPoint src[3], SkPoint* pt,
SkVector* tangent = NULL);
/** Given a src quadratic bezier, chop it at the specified t value,
where 0 < t < 1, and return the two new quadratics in dst:
@ -92,7 +95,7 @@ int SkChopQuadAtMaxCurvature(const SkPoint src[3], SkPoint dst[5]);
*/
SK_API void SkConvertQuadToCubic(const SkPoint src[3], SkPoint dst[4]);
////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/** Convert from parametric from (pts) to polynomial coefficients
coeff[0]*T^3 + coeff[1]*T^2 + coeff[2]*T + coeff[3]
@ -102,14 +105,16 @@ void SkGetCubicCoeff(const SkPoint pts[4], SkScalar cx[4], SkScalar cy[4]);
/** Set pt to the point on the src cubic specified by t. t must be
0 <= t <= 1.0
*/
void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* locOrNull, SkVector* tangentOrNull, SkVector* curvatureOrNull);
void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* locOrNull,
SkVector* tangentOrNull, SkVector* curvatureOrNull);
/** Given a src cubic bezier, chop it at the specified t value,
where 0 < t < 1, and return the two new cubics in dst:
dst[0..3] and dst[3..6]
*/
void SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], SkScalar t);
void SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], const SkScalar t[], int t_count);
void SkChopCubicAt(const SkPoint src[4], SkPoint dst[7], const SkScalar t[],
int t_count);
/** Given a src cubic bezier, chop it at the specified t == 1/2,
The new cubics are returned in dst[0..3] and dst[3..6]
@ -125,7 +130,8 @@ void SkChopCubicAtHalf(const SkPoint src[4], SkPoint dst[7]);
1 0 < tValues[0] < 1
2 0 < tValues[0] < tValues[1] < 1
*/
int SkFindCubicExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar d, SkScalar tValues[2]);
int SkFindCubicExtrema(SkScalar a, SkScalar b, SkScalar c, SkScalar d,
SkScalar tValues[2]);
/** Given 4 points on a cubic bezier, chop it into 1, 2, 3 beziers such that
the resulting beziers are monotonic in Y. This is called by the scan converter.
@ -149,7 +155,8 @@ int SkFindCubicInflections(const SkPoint src[4], SkScalar tValues[2]);
int SkChopCubicAtInflections(const SkPoint src[4], SkPoint dst[10]);
int SkFindCubicMaxCurvature(const SkPoint src[4], SkScalar tValues[3]);
int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13], SkScalar tValues[3] = NULL);
int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13],
SkScalar tValues[3] = NULL);
/** Given a monotonic cubic bezier, determine whether an xray intersects the
cubic.
@ -163,7 +170,8 @@ int SkChopCubicAtMaxCurvature(const SkPoint src[4], SkPoint dst[13], SkScalar tV
coordinates, indicating that another query y coordinate is preferred
for robustness.
*/
bool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4], bool* ambiguous = NULL);
bool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4],
bool* ambiguous = NULL);
/** Given an arbitrary cubic bezier, return the number of times an xray crosses
the cubic. Valid return values are [0..3]
@ -177,9 +185,10 @@ bool SkXRayCrossesMonotonicCubic(const SkXRay& pt, const SkPoint cubic[4], bool*
coordinates or at a tangent point, indicating that another query y
coordinate is preferred for robustness.
*/
int SkNumXRayCrossingsForCubic(const SkXRay& pt, const SkPoint cubic[4], bool* ambiguous = NULL);
int SkNumXRayCrossingsForCubic(const SkXRay& pt, const SkPoint cubic[4],
bool* ambiguous = NULL);
///////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
enum SkRotationDirection {
kCW_SkRotationDirection,
@ -197,7 +206,7 @@ enum SkRotationDirection {
matrix, if not null, is appled to the points before they are returned.
*/
int SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop, SkRotationDirection,
const SkMatrix* matrix, SkPoint quadPoints[]);
int SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop,
SkRotationDirection, const SkMatrix*, SkPoint quadPoints[]);
#endif

Просмотреть файл

@ -26,28 +26,33 @@
class SkPath;
/** \class SkShader
SkShader is the based class for objects that return horizontal spans of colors during drawing.
A subclass of SkShader is installed in a SkPaint calling paint.setShader(shader). After that
any object (other than a bitmap) that is drawn with that paint will get its color(s) from the
shader.
*/
*
* SkShader is the based class for objects that return horizontal spans of
* colors during drawing. A subclass of SkShader is installed in a SkPaint
* calling paint.setShader(shader). After that any object (other than a bitmap)
* that is drawn with that paint will get its color(s) from the shader.
*/
class SK_API SkShader : public SkFlattenable {
public:
SkShader();
virtual ~SkShader();
/** Return true if the shader has a non-identity local matrix.
@param localM Optional: If not null, return the shader's local matrix
@return true if the shader has a non-identity local matrix.
*/
/**
* Return true if the shader has a non-identity local matrix.
* @param localM Optional: If not null, return the shader's local matrix
* @return true if the shader has a non-identity local matrix.
*/
bool getLocalMatrix(SkMatrix* localM) const;
/** Set the shader's local matrix.
@param localM The shader's new local matrix.
*/
/**
* Set the shader's local matrix.
* @param localM The shader's new local matrix.
*/
void setLocalMatrix(const SkMatrix& localM);
/** Reset the shader's local matrix to identity.
*/
/**
* Reset the shader's local matrix to identity.
*/
void resetLocalMatrix();
enum TileMode {
@ -89,59 +94,69 @@ public:
kConstInY16_Flag = 0x10
};
/** Called sometimes before drawing with this shader.
Return the type of alpha your shader will return.
The default implementation returns 0. Your subclass should override if it can
(even sometimes) report a non-zero value, since that will enable various blitters
to perform faster.
*/
/**
* Called sometimes before drawing with this shader. Return the type of
* alpha your shader will return. The default implementation returns 0.
* Your subclass should override if it can (even sometimes) report a
* non-zero value, since that will enable various blitters to perform
* faster.
*/
virtual uint32_t getFlags() { return 0; }
/** Return the alpha associated with the data returned by shadeSpan16(). If
kHasSpan16_Flag is not set, this value is meaningless.
*/
/**
* Return the alpha associated with the data returned by shadeSpan16(). If
* kHasSpan16_Flag is not set, this value is meaningless.
*/
virtual uint8_t getSpan16Alpha() const { return fPaintAlpha; }
/** Called once before drawing, with the current paint and
device matrix. Return true if your shader supports these
parameters, or false if not. If false is returned, nothing
will be drawn.
*/
/**
* Called once before drawing, with the current paint and device matrix.
* Return true if your shader supports these parameters, or false if not.
* If false is returned, nothing will be drawn.
*/
virtual bool setContext(const SkBitmap& device, const SkPaint& paint,
const SkMatrix& matrix);
/** Called for each span of the object being drawn. Your subclass
should set the appropriate colors (with premultiplied alpha) that
correspond to the specified device coordinates.
*/
/**
* Called for each span of the object being drawn. Your subclass should
* set the appropriate colors (with premultiplied alpha) that correspond
* to the specified device coordinates.
*/
virtual void shadeSpan(int x, int y, SkPMColor[], int count) = 0;
/** Called only for 16bit devices when getFlags() returns
kOpaqueAlphaFlag | kHasSpan16_Flag
*/
/**
* Called only for 16bit devices when getFlags() returns
* kOpaqueAlphaFlag | kHasSpan16_Flag
*/
virtual void shadeSpan16(int x, int y, uint16_t[], int count);
/** Similar to shadeSpan, but only returns the alpha-channel for a span.
The default implementation calls shadeSpan() and then extracts the alpha
values from the returned colors.
*/
/**
* Similar to shadeSpan, but only returns the alpha-channel for a span.
* The default implementation calls shadeSpan() and then extracts the alpha
* values from the returned colors.
*/
virtual void shadeSpanAlpha(int x, int y, uint8_t alpha[], int count);
/** Helper function that returns true if this shader's shadeSpan16() method can
be called.
*/
/**
* Helper function that returns true if this shader's shadeSpan16() method
* can be called.
*/
bool canCallShadeSpan16() {
return SkShader::CanCallShadeSpan16(this->getFlags());
}
/** Helper to check the flags to know if it is legal to call shadeSpan16()
*/
/**
* Helper to check the flags to know if it is legal to call shadeSpan16()
*/
static bool CanCallShadeSpan16(uint32_t flags) {
return (flags & kHasSpan16_Flag) != 0;
}
/** Called before a session using the shader begins. Some shaders override
this to defer some of their work (like calling bitmap.lockPixels()).
Must be balanced by a call to endSession.
*/
/**
* Called before a session using the shader begins. Some shaders override
* this to defer some of their work (like calling bitmap.lockPixels()).
* Must be balanced by a call to endSession.
*/
virtual void beginSession();
virtual void endSession();
@ -195,7 +210,7 @@ public:
about the first point.
*/
virtual BitmapType asABitmap(SkBitmap* outTexture, SkMatrix* outMatrix,
TileMode xy[2], SkScalar* twoPointRadialParams) const;
TileMode xy[2], SkScalar* twoPointRadialParams) const;
/**
* If the shader subclass can be represented as a gradient, asAGradient