code style
git-svn-id: http://skia.googlecode.com/svn/trunk@1160 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
6b919c3537
commit
3334c3a1fa
@ -28,8 +28,8 @@ SkCornerPathEffect::~SkCornerPathEffect()
|
||||
{
|
||||
}
|
||||
|
||||
static bool ComputeStep(const SkPoint& a, const SkPoint& b, SkScalar radius, SkPoint* step)
|
||||
{
|
||||
static bool ComputeStep(const SkPoint& a, const SkPoint& b, SkScalar radius,
|
||||
SkPoint* step) {
|
||||
SkScalar dist = SkPoint::Distance(a, b);
|
||||
|
||||
step->set(b.fX - a.fX, b.fY - a.fY);
|
||||
@ -37,17 +37,17 @@ static bool ComputeStep(const SkPoint& a, const SkPoint& b, SkScalar radius, SkP
|
||||
if (dist <= radius * 2) {
|
||||
step->scale(SK_ScalarHalf);
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
step->scale(SkScalarDiv(radius, dist));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool SkCornerPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
|
||||
{
|
||||
if (fRadius == 0)
|
||||
bool SkCornerPathEffect::filterPath(SkPath* dst, const SkPath& src,
|
||||
SkScalar* width) {
|
||||
if (fRadius == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SkPath::Iter iter(src, false);
|
||||
SkPath::Verb verb, prevVerb = (SkPath::Verb)-1;
|
||||
@ -65,97 +65,91 @@ bool SkCornerPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* wi
|
||||
|
||||
for (;;) {
|
||||
switch (verb = iter.next(pts)) {
|
||||
case SkPath::kMove_Verb:
|
||||
// close out the previous (open) contour
|
||||
if (SkPath::kLine_Verb == prevVerb) {
|
||||
dst->lineTo(lastCorner);
|
||||
}
|
||||
closed = iter.isClosedContour();
|
||||
if (closed) {
|
||||
moveTo = pts[0];
|
||||
prevIsValid = false;
|
||||
}
|
||||
else {
|
||||
dst->moveTo(pts[0]);
|
||||
prevIsValid = true;
|
||||
}
|
||||
break;
|
||||
case SkPath::kLine_Verb:
|
||||
{
|
||||
case SkPath::kMove_Verb:
|
||||
// close out the previous (open) contour
|
||||
if (SkPath::kLine_Verb == prevVerb) {
|
||||
dst->lineTo(lastCorner);
|
||||
}
|
||||
closed = iter.isClosedContour();
|
||||
if (closed) {
|
||||
moveTo = pts[0];
|
||||
prevIsValid = false;
|
||||
} else {
|
||||
dst->moveTo(pts[0]);
|
||||
prevIsValid = true;
|
||||
}
|
||||
break;
|
||||
case SkPath::kLine_Verb: {
|
||||
bool drawSegment = ComputeStep(pts[0], pts[1], fRadius, &step);
|
||||
// prev corner
|
||||
if (!prevIsValid) {
|
||||
dst->moveTo(moveTo + step);
|
||||
prevIsValid = true;
|
||||
}
|
||||
else {
|
||||
dst->quadTo(pts[0].fX, pts[0].fY, pts[0].fX + step.fX, pts[0].fY + step.fY);
|
||||
} else {
|
||||
dst->quadTo(pts[0].fX, pts[0].fY, pts[0].fX + step.fX,
|
||||
pts[0].fY + step.fY);
|
||||
}
|
||||
if (drawSegment) {
|
||||
dst->lineTo(pts[1].fX - step.fX, pts[1].fY - step.fY);
|
||||
}
|
||||
lastCorner = pts[1];
|
||||
prevIsValid = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SkPath::kQuad_Verb:
|
||||
// TBD - just replicate the curve for now
|
||||
if (!prevIsValid)
|
||||
{
|
||||
dst->moveTo(pts[0]);
|
||||
prevIsValid = true;
|
||||
}
|
||||
dst->quadTo(pts[1], pts[2]);
|
||||
lastCorner = pts[2];
|
||||
firstStep.set(0, 0);
|
||||
break;
|
||||
case SkPath::kCubic_Verb:
|
||||
if (!prevIsValid)
|
||||
{
|
||||
dst->moveTo(pts[0]);
|
||||
prevIsValid = true;
|
||||
}
|
||||
// TBD - just replicate the curve for now
|
||||
dst->cubicTo(pts[1], pts[2], pts[3]);
|
||||
lastCorner = pts[3];
|
||||
firstStep.set(0, 0);
|
||||
break;
|
||||
case SkPath::kClose_Verb:
|
||||
if (firstStep.fX || firstStep.fY)
|
||||
dst->quadTo(lastCorner.fX, lastCorner.fY,
|
||||
lastCorner.fX + firstStep.fX,
|
||||
lastCorner.fY + firstStep.fY);
|
||||
dst->close();
|
||||
break;
|
||||
case SkPath::kDone_Verb:
|
||||
goto DONE;
|
||||
case SkPath::kQuad_Verb:
|
||||
// TBD - just replicate the curve for now
|
||||
if (!prevIsValid) {
|
||||
dst->moveTo(pts[0]);
|
||||
prevIsValid = true;
|
||||
}
|
||||
dst->quadTo(pts[1], pts[2]);
|
||||
lastCorner = pts[2];
|
||||
firstStep.set(0, 0);
|
||||
break;
|
||||
case SkPath::kCubic_Verb:
|
||||
if (!prevIsValid) {
|
||||
dst->moveTo(pts[0]);
|
||||
prevIsValid = true;
|
||||
}
|
||||
// TBD - just replicate the curve for now
|
||||
dst->cubicTo(pts[1], pts[2], pts[3]);
|
||||
lastCorner = pts[3];
|
||||
firstStep.set(0, 0);
|
||||
break;
|
||||
case SkPath::kClose_Verb:
|
||||
if (firstStep.fX || firstStep.fY) {
|
||||
dst->quadTo(lastCorner.fX, lastCorner.fY,
|
||||
lastCorner.fX + firstStep.fX,
|
||||
lastCorner.fY + firstStep.fY);
|
||||
}
|
||||
dst->close();
|
||||
break;
|
||||
case SkPath::kDone_Verb:
|
||||
goto DONE;
|
||||
}
|
||||
|
||||
if (SkPath::kMove_Verb == prevVerb)
|
||||
if (SkPath::kMove_Verb == prevVerb) {
|
||||
firstStep = step;
|
||||
}
|
||||
prevVerb = verb;
|
||||
}
|
||||
DONE:
|
||||
return true;
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkCornerPathEffect::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkCornerPathEffect::getFactory() {
|
||||
return CreateProc;
|
||||
}
|
||||
|
||||
void SkCornerPathEffect::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
{
|
||||
void SkCornerPathEffect::flatten(SkFlattenableWriteBuffer& buffer) {
|
||||
buffer.writeScalar(fRadius);
|
||||
}
|
||||
|
||||
SkFlattenable* SkCornerPathEffect::CreateProc(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkFlattenable* SkCornerPathEffect::CreateProc(SkFlattenableReadBuffer& buffer) {
|
||||
return SkNEW_ARGS(SkCornerPathEffect, (buffer));
|
||||
}
|
||||
|
||||
SkCornerPathEffect::SkCornerPathEffect(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkCornerPathEffect::SkCornerPathEffect(SkFlattenableReadBuffer& buffer) {
|
||||
fRadius = buffer.readScalar();
|
||||
}
|
||||
|
||||
|
@ -19,24 +19,24 @@
|
||||
#include "SkBuffer.h"
|
||||
#include "SkPathMeasure.h"
|
||||
|
||||
static inline int is_even(int x)
|
||||
{
|
||||
static inline int is_even(int x) {
|
||||
return (~x) << 31;
|
||||
}
|
||||
|
||||
static SkScalar FindFirstInterval(const SkScalar intervals[], SkScalar phase, int32_t* index)
|
||||
{
|
||||
static SkScalar FindFirstInterval(const SkScalar intervals[], SkScalar phase,
|
||||
int32_t* index) {
|
||||
int i;
|
||||
|
||||
for (i = 0; phase > intervals[i]; i++)
|
||||
for (i = 0; phase > intervals[i]; i++) {
|
||||
phase -= intervals[i];
|
||||
}
|
||||
*index = i;
|
||||
return intervals[i] - phase;
|
||||
}
|
||||
|
||||
SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count, SkScalar phase, bool scaleToFit)
|
||||
: fScaleToFit(scaleToFit)
|
||||
{
|
||||
SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count,
|
||||
SkScalar phase, bool scaleToFit)
|
||||
: fScaleToFit(scaleToFit) {
|
||||
SkASSERT(intervals);
|
||||
SkASSERT(count > 1 && SkAlign2(count) == count);
|
||||
|
||||
@ -44,46 +44,44 @@ SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count, SkScal
|
||||
fCount = count;
|
||||
|
||||
SkScalar len = 0;
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
for (int i = 0; i < count; i++) {
|
||||
SkASSERT(intervals[i] >= 0);
|
||||
fIntervals[i] = intervals[i];
|
||||
len += intervals[i];
|
||||
}
|
||||
fIntervalLength = len;
|
||||
|
||||
if (len > 0) // we don't handle 0 length dash arrays
|
||||
{
|
||||
if (phase < 0)
|
||||
{
|
||||
if (len > 0) { // we don't handle 0 length dash arrays
|
||||
if (phase < 0) {
|
||||
phase = -phase;
|
||||
if (phase > len)
|
||||
if (phase > len) {
|
||||
phase = SkScalarMod(phase, len);
|
||||
}
|
||||
phase = len - phase;
|
||||
}
|
||||
else if (phase >= len)
|
||||
} else if (phase >= len) {
|
||||
phase = SkScalarMod(phase, len);
|
||||
}
|
||||
|
||||
SkASSERT(phase >= 0 && phase < len);
|
||||
fInitialDashLength = FindFirstInterval(intervals, phase, &fInitialDashIndex);
|
||||
|
||||
SkASSERT(fInitialDashLength >= 0);
|
||||
SkASSERT(fInitialDashIndex >= 0 && fInitialDashIndex < fCount);
|
||||
}
|
||||
else
|
||||
} else {
|
||||
fInitialDashLength = -1; // signal bad dash intervals
|
||||
}
|
||||
}
|
||||
|
||||
SkDashPathEffect::~SkDashPathEffect()
|
||||
{
|
||||
SkDashPathEffect::~SkDashPathEffect() {
|
||||
sk_free(fIntervals);
|
||||
}
|
||||
|
||||
bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
|
||||
{
|
||||
bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src,
|
||||
SkScalar* width) {
|
||||
// we do nothing if the src wants to be filled, or if our dashlength is 0
|
||||
if (*width < 0 || fInitialDashLength < 0)
|
||||
if (*width < 0 || fInitialDashLength < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SkPathMeasure meas(src, false);
|
||||
const SkScalar* intervals = fIntervals;
|
||||
@ -95,12 +93,10 @@ bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* widt
|
||||
int index = fInitialDashIndex;
|
||||
SkScalar scale = SK_Scalar1;
|
||||
|
||||
if (fScaleToFit)
|
||||
{
|
||||
if (fIntervalLength >= length)
|
||||
if (fScaleToFit) {
|
||||
if (fIntervalLength >= length) {
|
||||
scale = SkScalarDiv(length, fIntervalLength);
|
||||
else
|
||||
{
|
||||
} else {
|
||||
SkScalar div = SkScalarDiv(length, fIntervalLength);
|
||||
int n = SkScalarFloor(div);
|
||||
scale = SkScalarDiv(length, n * fIntervalLength);
|
||||
@ -110,12 +106,10 @@ bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* widt
|
||||
SkScalar distance = 0;
|
||||
SkScalar dlen = SkScalarMul(fInitialDashLength, scale);
|
||||
|
||||
while (distance < length)
|
||||
{
|
||||
while (distance < length) {
|
||||
SkASSERT(dlen >= 0);
|
||||
addedSegment = false;
|
||||
if (is_even(index) && dlen > 0 && !skipFirstSegment)
|
||||
{
|
||||
if (is_even(index) && dlen > 0 && !skipFirstSegment) {
|
||||
addedSegment = true;
|
||||
meas.getSegment(distance, distance + dlen, dst, true);
|
||||
}
|
||||
@ -127,27 +121,28 @@ bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* widt
|
||||
// wrap around our intervals array if necessary
|
||||
index += 1;
|
||||
SkASSERT(index <= fCount);
|
||||
if (index == fCount)
|
||||
if (index == fCount) {
|
||||
index = 0;
|
||||
}
|
||||
|
||||
// fetch our next dlen
|
||||
dlen = SkScalarMul(intervals[index], scale);
|
||||
}
|
||||
|
||||
// extend if we ended on a segment and we need to join up with the (skipped) initial segment
|
||||
if (meas.isClosed() && is_even(fInitialDashIndex) && fInitialDashLength > 0)
|
||||
if (meas.isClosed() && is_even(fInitialDashIndex) &&
|
||||
fInitialDashLength > 0) {
|
||||
meas.getSegment(0, SkScalarMul(fInitialDashLength, scale), dst, !addedSegment);
|
||||
}
|
||||
} while (meas.nextContour());
|
||||
return true;
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkDashPathEffect::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkDashPathEffect::getFactory() {
|
||||
return fInitialDashLength < 0 ? NULL : CreateProc;
|
||||
}
|
||||
|
||||
void SkDashPathEffect::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
{
|
||||
void SkDashPathEffect::flatten(SkFlattenableWriteBuffer& buffer) {
|
||||
SkASSERT(fInitialDashLength >= 0);
|
||||
|
||||
buffer.write32(fCount);
|
||||
@ -158,13 +153,11 @@ void SkDashPathEffect::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
buffer.writeMul4(fIntervals, fCount * sizeof(fIntervals[0]));
|
||||
}
|
||||
|
||||
SkFlattenable* SkDashPathEffect::CreateProc(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkFlattenable* SkDashPathEffect::CreateProc(SkFlattenableReadBuffer& buffer) {
|
||||
return SkNEW_ARGS(SkDashPathEffect, (buffer));
|
||||
}
|
||||
|
||||
SkDashPathEffect::SkDashPathEffect(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkDashPathEffect::SkDashPathEffect(SkFlattenableReadBuffer& buffer) {
|
||||
fCount = buffer.readS32();
|
||||
fInitialDashIndex = buffer.readS32();
|
||||
fInitialDashLength = buffer.readScalar();
|
||||
|
@ -20,8 +20,7 @@
|
||||
#include "SkPathMeasure.h"
|
||||
#include "SkRandom.h"
|
||||
|
||||
static void Perterb(SkPoint* p, const SkVector& tangent, SkScalar scale)
|
||||
{
|
||||
static void Perterb(SkPoint* p, const SkVector& tangent, SkScalar scale) {
|
||||
SkVector normal = tangent;
|
||||
normal.rotateCCW();
|
||||
normal.setLength(scale);
|
||||
@ -34,8 +33,8 @@ SkDiscretePathEffect::SkDiscretePathEffect(SkScalar segLength, SkScalar deviatio
|
||||
{
|
||||
}
|
||||
|
||||
bool SkDiscretePathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar* width)
|
||||
{
|
||||
bool SkDiscretePathEffect::filterPath(SkPath* dst, const SkPath& src,
|
||||
SkScalar* width) {
|
||||
bool doFill = *width < 0;
|
||||
|
||||
SkPathMeasure meas(src, doFill);
|
||||
@ -48,58 +47,49 @@ bool SkDiscretePathEffect::filterPath(SkPath* dst, const SkPath& src, SkScalar*
|
||||
do {
|
||||
SkScalar length = meas.getLength();
|
||||
|
||||
if (fSegLength * (2 + doFill) > length)
|
||||
{
|
||||
if (fSegLength * (2 + doFill) > length) {
|
||||
meas.getSegment(0, length, dst, true); // to short for us to mangle
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
int n = SkScalarRound(SkScalarDiv(length, fSegLength));
|
||||
SkScalar delta = length / n;
|
||||
SkScalar distance = 0;
|
||||
|
||||
if (meas.isClosed())
|
||||
{
|
||||
if (meas.isClosed()) {
|
||||
n -= 1;
|
||||
distance += delta/2;
|
||||
}
|
||||
meas.getPosTan(distance, &p, &v);
|
||||
Perterb(&p, v, SkScalarMul(rand.nextSScalar1(), scale));
|
||||
dst->moveTo(p);
|
||||
while (--n >= 0)
|
||||
{
|
||||
while (--n >= 0) {
|
||||
distance += delta;
|
||||
meas.getPosTan(distance, &p, &v);
|
||||
Perterb(&p, v, SkScalarMul(rand.nextSScalar1(), scale));
|
||||
dst->lineTo(p);
|
||||
}
|
||||
if (meas.isClosed())
|
||||
if (meas.isClosed()) {
|
||||
dst->close();
|
||||
}
|
||||
}
|
||||
} while (meas.nextContour());
|
||||
return true;
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkDiscretePathEffect::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkDiscretePathEffect::getFactory() {
|
||||
return CreateProc;
|
||||
}
|
||||
|
||||
SkFlattenable* SkDiscretePathEffect::CreateProc(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkFlattenable* SkDiscretePathEffect::CreateProc(SkFlattenableReadBuffer& buffer) {
|
||||
return SkNEW_ARGS(SkDiscretePathEffect, (buffer));
|
||||
}
|
||||
|
||||
void SkDiscretePathEffect::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
{
|
||||
void SkDiscretePathEffect::flatten(SkFlattenableWriteBuffer& buffer) {
|
||||
buffer.writeScalar(fSegLength);
|
||||
buffer.writeScalar(fPerterb);
|
||||
}
|
||||
|
||||
SkDiscretePathEffect::SkDiscretePathEffect(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkDiscretePathEffect::SkDiscretePathEffect(SkFlattenableReadBuffer& buffer) {
|
||||
fSegLength = buffer.readScalar();
|
||||
fPerterb = buffer.readScalar();
|
||||
}
|
||||
|
||||
|
||||
|
@ -17,8 +17,7 @@
|
||||
|
||||
#include "SkEmbossMask.h"
|
||||
|
||||
static inline int nonzero_to_one(int x)
|
||||
{
|
||||
static inline int nonzero_to_one(int x) {
|
||||
#if 0
|
||||
return x != 0;
|
||||
#else
|
||||
@ -26,8 +25,7 @@ static inline int nonzero_to_one(int x)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int neq_to_one(int x, int max)
|
||||
{
|
||||
static inline int neq_to_one(int x, int max) {
|
||||
#if 0
|
||||
return x != max;
|
||||
#else
|
||||
@ -36,8 +34,7 @@ static inline int neq_to_one(int x, int max)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int neq_to_mask(int x, int max)
|
||||
{
|
||||
static inline int neq_to_mask(int x, int max) {
|
||||
#if 0
|
||||
return -(x != max);
|
||||
#else
|
||||
@ -46,8 +43,7 @@ static inline int neq_to_mask(int x, int max)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline unsigned div255(unsigned x)
|
||||
{
|
||||
static inline unsigned div255(unsigned x) {
|
||||
SkASSERT(x <= (255*255));
|
||||
return x * ((1 << 24) / 255) >> 24;
|
||||
}
|
||||
@ -60,28 +56,27 @@ static inline unsigned div255(unsigned x)
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void SkEmbossMask_BuildTable()
|
||||
{
|
||||
void SkEmbossMask_BuildTable() {
|
||||
// build it 0..127 x 0..127, so we use 2^15 - 1 in the numerator for our "fixed" table
|
||||
|
||||
FILE* file = ::fopen("SkEmbossMask_Table.h", "w");
|
||||
SkASSERT(file);
|
||||
::fprintf(file, "#include \"SkTypes.h\"\n\n");
|
||||
::fprintf(file, "static const U16 gInvSqrtTable[128 * 128] = {\n");
|
||||
for (int dx = 0; dx <= 255/2; dx++)
|
||||
{
|
||||
for (int dy = 0; dy <= 255/2; dy++)
|
||||
{
|
||||
for (int dx = 0; dx <= 255/2; dx++) {
|
||||
for (int dy = 0; dy <= 255/2; dy++) {
|
||||
if ((dy & 15) == 0)
|
||||
::fprintf(file, "\t");
|
||||
|
||||
uint16_t value = SkToU16((1 << 15) / SkSqrt32(dx * dx + dy * dy + kDelta*kDelta/4));
|
||||
|
||||
::fprintf(file, "0x%04X", value);
|
||||
if (dx * 128 + dy < 128*128-1)
|
||||
if (dx * 128 + dy < 128*128-1) {
|
||||
::fprintf(file, ", ");
|
||||
if ((dy & 15) == 15)
|
||||
}
|
||||
if ((dy & 15) == 15) {
|
||||
::fprintf(file, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
::fprintf(file, "};\n#define kDeltaUsedToBuildTable\t%d\n", kDelta);
|
||||
@ -90,8 +85,7 @@ void SkEmbossMask_BuildTable()
|
||||
|
||||
#endif
|
||||
|
||||
void SkEmbossMask::Emboss(SkMask* mask, const SkEmbossMaskFilter::Light& light)
|
||||
{
|
||||
void SkEmbossMask::Emboss(SkMask* mask, const SkEmbossMaskFilter::Light& light) {
|
||||
SkASSERT(kDelta == kDeltaUsedToBuildTable);
|
||||
|
||||
SkASSERT(mask->fFormat == SkMask::k3D_Format);
|
||||
@ -114,14 +108,11 @@ void SkEmbossMask::Emboss(SkMask* mask, const SkEmbossMaskFilter::Light& light)
|
||||
int maxx = mask->fBounds.width() - 1;
|
||||
|
||||
int prev_row = 0;
|
||||
for (int y = 0; y <= maxy; y++)
|
||||
{
|
||||
for (int y = 0; y <= maxy; y++) {
|
||||
int next_row = neq_to_mask(y, maxy) & rowBytes;
|
||||
|
||||
for (int x = 0; x <= maxx; x++)
|
||||
{
|
||||
if (alpha[x])
|
||||
{
|
||||
for (int x = 0; x <= maxx; x++) {
|
||||
if (alpha[x]) {
|
||||
int nx = alpha[x + neq_to_one(x, maxx)] - alpha[x - nonzero_to_one(x)];
|
||||
int ny = alpha[x + next_row] - alpha[x - prev_row];
|
||||
|
||||
@ -129,8 +120,7 @@ void SkEmbossMask::Emboss(SkMask* mask, const SkEmbossMaskFilter::Light& light)
|
||||
int mul = ambient;
|
||||
int add = 0;
|
||||
|
||||
if (numer > 0) // preflight when numer/denom will be <= 0
|
||||
{
|
||||
if (numer > 0) { // preflight when numer/denom will be <= 0
|
||||
#if 0
|
||||
int denom = SkSqrt32(nx * nx + ny * ny + kDelta*kDelta);
|
||||
SkFixed dot = numer / denom;
|
||||
@ -150,8 +140,7 @@ void SkEmbossMask::Emboss(SkMask* mask, const SkEmbossMaskFilter::Light& light)
|
||||
// hilite = R * Eye(0, 0, 1)
|
||||
|
||||
int hilite = (2 * dot - lz_dot8) * lz_dot8 >> 8;
|
||||
if (hilite > 0)
|
||||
{
|
||||
if (hilite > 0) {
|
||||
// pin hilite to 255, since our fast math is also a little sloppy
|
||||
hilite = SkClampMax(hilite, 255);
|
||||
|
||||
@ -160,8 +149,9 @@ void SkEmbossMask::Emboss(SkMask* mask, const SkEmbossMaskFilter::Light& light)
|
||||
// and then possibly cache a 256 table for a given specular
|
||||
// value in the light, and just pass that in to this function.
|
||||
add = hilite;
|
||||
for (int i = specular >> 4; i > 0; --i)
|
||||
for (int i = specular >> 4; i > 0; --i) {
|
||||
add = div255(add * hilite);
|
||||
}
|
||||
}
|
||||
}
|
||||
multiply[x] = SkToU8(mul);
|
||||
|
@ -21,22 +21,27 @@
|
||||
#include "SkEmbossMask.h"
|
||||
#include "SkBuffer.h"
|
||||
|
||||
static inline int pin2byte(int n) {
|
||||
if (n < 0) {
|
||||
n = 0;
|
||||
} else if (n > 0xFF) {
|
||||
n = 0xFF;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
SkMaskFilter* SkBlurMaskFilter::CreateEmboss(const SkScalar direction[3],
|
||||
SkScalar ambient, SkScalar specular,
|
||||
SkScalar blurRadius)
|
||||
{
|
||||
if (direction == NULL)
|
||||
SkScalar blurRadius) {
|
||||
if (direction == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// ambient should be 0...1 as a scalar
|
||||
int am = SkScalarToFixed(ambient) >> 8;
|
||||
if (am < 0) am = 0;
|
||||
else if (am > 0xFF) am = 0xFF;
|
||||
int am = pin2byte(SkScalarToFixed(ambient) >> 8);
|
||||
|
||||
// specular should be 0..15.99 as a scalar
|
||||
int sp = SkScalarToFixed(specular) >> 12;
|
||||
if (sp < 0) sp = 0;
|
||||
else if (sp > 0xFF) sp = 0xFF;
|
||||
int sp = pin2byte(SkScalarToFixed(specular) >> 12);
|
||||
|
||||
SkEmbossMaskFilter::Light light;
|
||||
|
||||
@ -47,41 +52,43 @@ SkMaskFilter* SkBlurMaskFilter::CreateEmboss(const SkScalar direction[3],
|
||||
return SkNEW_ARGS(SkEmbossMaskFilter, (light, blurRadius));
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
static void normalize(SkScalar v[3])
|
||||
{
|
||||
static void normalize(SkScalar v[3]) {
|
||||
SkScalar mag = SkScalarSquare(v[0]) + SkScalarSquare(v[1]) + SkScalarSquare(v[2]);
|
||||
mag = SkScalarSqrt(mag);
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int i = 0; i < 3; i++) {
|
||||
v[i] = SkScalarDiv(v[i], mag);
|
||||
}
|
||||
}
|
||||
|
||||
SkEmbossMaskFilter::SkEmbossMaskFilter(const Light& light, SkScalar blurRadius)
|
||||
: fLight(light), fBlurRadius(blurRadius)
|
||||
{
|
||||
: fLight(light), fBlurRadius(blurRadius) {
|
||||
normalize(fLight.fDirection);
|
||||
}
|
||||
|
||||
SkMask::Format SkEmbossMaskFilter::getFormat()
|
||||
{
|
||||
SkMask::Format SkEmbossMaskFilter::getFormat() {
|
||||
return SkMask::k3D_Format;
|
||||
}
|
||||
|
||||
bool SkEmbossMaskFilter::filterMask(SkMask* dst, const SkMask& src, const SkMatrix& matrix, SkIPoint* margin)
|
||||
{
|
||||
bool SkEmbossMaskFilter::filterMask(SkMask* dst, const SkMask& src,
|
||||
const SkMatrix& matrix, SkIPoint* margin) {
|
||||
SkScalar radius = matrix.mapRadius(fBlurRadius);
|
||||
|
||||
if (!SkBlurMask::Blur(dst, src, radius, SkBlurMask::kInner_Style, SkBlurMask::kLow_Quality))
|
||||
if (!SkBlurMask::Blur(dst, src, radius, SkBlurMask::kInner_Style,
|
||||
SkBlurMask::kLow_Quality)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
dst->fFormat = SkMask::k3D_Format;
|
||||
if (margin)
|
||||
if (margin) {
|
||||
margin->set(SkScalarCeil(radius), SkScalarCeil(radius));
|
||||
}
|
||||
|
||||
if (src.fImage == NULL)
|
||||
if (src.fImage == NULL) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// create a larger buffer for the other two channels (should force fBlur to do this for us)
|
||||
|
||||
@ -98,7 +105,8 @@ bool SkEmbossMaskFilter::filterMask(SkMask* dst, const SkMask& src, const SkMatr
|
||||
|
||||
// run the light direction through the matrix...
|
||||
Light light = fLight;
|
||||
matrix.mapVectors((SkVector*)(void*)light.fDirection, (SkVector*)(void*)fLight.fDirection, 1);
|
||||
matrix.mapVectors((SkVector*)(void*)light.fDirection,
|
||||
(SkVector*)(void*)fLight.fDirection, 1);
|
||||
|
||||
// now restore the length of the XY component
|
||||
// cast to SkVector so we can call setLength (this double cast silences alias warnings)
|
||||
@ -115,25 +123,22 @@ bool SkEmbossMaskFilter::filterMask(SkMask* dst, const SkMask& src, const SkMatr
|
||||
return true;
|
||||
}
|
||||
|
||||
SkFlattenable* SkEmbossMaskFilter::CreateProc(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkFlattenable* SkEmbossMaskFilter::CreateProc(SkFlattenableReadBuffer& buffer) {
|
||||
return SkNEW_ARGS(SkEmbossMaskFilter, (buffer));
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkEmbossMaskFilter::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkEmbossMaskFilter::getFactory() {
|
||||
return CreateProc;
|
||||
}
|
||||
|
||||
SkEmbossMaskFilter::SkEmbossMaskFilter(SkFlattenableReadBuffer& buffer) : SkMaskFilter(buffer)
|
||||
{
|
||||
SkEmbossMaskFilter::SkEmbossMaskFilter(SkFlattenableReadBuffer& buffer)
|
||||
: SkMaskFilter(buffer) {
|
||||
buffer.read(&fLight, sizeof(fLight));
|
||||
SkASSERT(fLight.fPad == 0); // for the font-cache lookup to be clean
|
||||
fBlurRadius = buffer.readScalar();
|
||||
}
|
||||
|
||||
void SkEmbossMaskFilter::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
{
|
||||
void SkEmbossMaskFilter::flatten(SkFlattenableWriteBuffer& buffer) {
|
||||
this->INHERITED::flatten(buffer);
|
||||
|
||||
fLight.fPad = 0; // for the font-cache lookup to be clean
|
||||
|
@ -1,21 +1,21 @@
|
||||
#include "SkKernel33MaskFilter.h"
|
||||
#include "SkColorPriv.h"
|
||||
|
||||
SkMask::Format SkKernel33ProcMaskFilter::getFormat()
|
||||
{
|
||||
SkMask::Format SkKernel33ProcMaskFilter::getFormat() {
|
||||
return SkMask::kA8_Format;
|
||||
}
|
||||
|
||||
bool SkKernel33ProcMaskFilter::filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, SkIPoint* margin)
|
||||
{
|
||||
bool SkKernel33ProcMaskFilter::filterMask(SkMask* dst, const SkMask& src,
|
||||
const SkMatrix&, SkIPoint* margin) {
|
||||
// margin???
|
||||
dst->fImage = NULL;
|
||||
dst->fBounds = src.fBounds;
|
||||
dst->fBounds.inset(-1, -1);
|
||||
dst->fFormat = SkMask::kA8_Format;
|
||||
|
||||
if (NULL == src.fImage)
|
||||
if (NULL == src.fImage) {
|
||||
return true;
|
||||
}
|
||||
|
||||
dst->fRowBytes = dst->fBounds.width();
|
||||
size_t size = dst->computeImageSize();
|
||||
@ -39,28 +39,26 @@ bool SkKernel33ProcMaskFilter::filterMask(SkMask* dst, const SkMask& src, const
|
||||
|
||||
unsigned scale = fPercent256;
|
||||
|
||||
for (int y = -1; y <= h; y++)
|
||||
{
|
||||
for (int y = -1; y <= h; y++) {
|
||||
uint8_t* dstRow = dstImage;
|
||||
for (int x = -1; x <= w; x++)
|
||||
{
|
||||
for (int x = -1; x <= w; x++) {
|
||||
memset(storage, 0, sizeof(storage));
|
||||
uint8_t* storagePtr = &storage[0][0];
|
||||
|
||||
for (int ky = y - 1; ky <= y + 1; ky++)
|
||||
{
|
||||
for (int ky = y - 1; ky <= y + 1; ky++) {
|
||||
const uint8_t* srcRow = srcImage + ky * srcRB; // may be out-of-range
|
||||
for (int kx = x - 1; kx <= x + 1; kx++)
|
||||
{
|
||||
if ((unsigned)ky < (unsigned)h && (unsigned)kx < (unsigned)w)
|
||||
for (int kx = x - 1; kx <= x + 1; kx++) {
|
||||
if ((unsigned)ky < (unsigned)h && (unsigned)kx < (unsigned)w) {
|
||||
*storagePtr = srcRow[kx];
|
||||
}
|
||||
storagePtr++;
|
||||
}
|
||||
}
|
||||
int value = this->computeValue(srcRows);
|
||||
|
||||
if (scale < 256)
|
||||
if (scale < 256) {
|
||||
value = SkAlphaBlend(value, srcRows[1][1], scale);
|
||||
}
|
||||
*dstRow++ = SkToU8(value);
|
||||
}
|
||||
dstImage += dst->fRowBytes;
|
||||
@ -68,57 +66,53 @@ bool SkKernel33ProcMaskFilter::filterMask(SkMask* dst, const SkMask& src, const
|
||||
return true;
|
||||
}
|
||||
|
||||
void SkKernel33ProcMaskFilter::flatten(SkFlattenableWriteBuffer& wb)
|
||||
{
|
||||
void SkKernel33ProcMaskFilter::flatten(SkFlattenableWriteBuffer& wb) {
|
||||
this->INHERITED::flatten(wb);
|
||||
wb.write32(fPercent256);
|
||||
}
|
||||
|
||||
SkKernel33ProcMaskFilter::SkKernel33ProcMaskFilter(SkFlattenableReadBuffer& rb)
|
||||
: SkMaskFilter(rb)
|
||||
{
|
||||
: SkMaskFilter(rb) {
|
||||
fPercent256 = rb.readS32();
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
uint8_t SkKernel33MaskFilter::computeValue(uint8_t* const* srcRows)
|
||||
{
|
||||
uint8_t SkKernel33MaskFilter::computeValue(uint8_t* const* srcRows) {
|
||||
int value = 0;
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
for (int j = 0; j < 3; j++)
|
||||
for (int i = 0; i < 3; i++) {
|
||||
for (int j = 0; j < 3; j++) {
|
||||
value += fKernel[i][j] * srcRows[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
value >>= fShift;
|
||||
|
||||
if (value < 0)
|
||||
if (value < 0) {
|
||||
value = 0;
|
||||
else if (value > 255)
|
||||
} else if (value > 255) {
|
||||
value = 255;
|
||||
}
|
||||
return (uint8_t)value;
|
||||
}
|
||||
|
||||
void SkKernel33MaskFilter::flatten(SkFlattenableWriteBuffer& wb)
|
||||
{
|
||||
void SkKernel33MaskFilter::flatten(SkFlattenableWriteBuffer& wb) {
|
||||
this->INHERITED::flatten(wb);
|
||||
wb.writeMul4(fKernel, 9 * sizeof(int));
|
||||
wb.write32(fShift);
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkKernel33MaskFilter::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkKernel33MaskFilter::getFactory() {
|
||||
return Create;
|
||||
}
|
||||
|
||||
SkFlattenable* SkKernel33MaskFilter::Create(SkFlattenableReadBuffer& rb)
|
||||
{
|
||||
SkFlattenable* SkKernel33MaskFilter::Create(SkFlattenableReadBuffer& rb) {
|
||||
return new SkKernel33MaskFilter(rb);
|
||||
}
|
||||
|
||||
SkKernel33MaskFilter::SkKernel33MaskFilter(SkFlattenableReadBuffer& rb)
|
||||
: SkKernel33ProcMaskFilter(rb)
|
||||
{
|
||||
: SkKernel33ProcMaskFilter(rb) {
|
||||
rb.read(fKernel, 9 * sizeof(int));
|
||||
fShift = rb.readS32();
|
||||
}
|
||||
|
@ -35,8 +35,7 @@ SkLayerRasterizer::SkLayerRasterizer() : fLayers(sizeof(SkLayerRasterizer_Rec))
|
||||
{
|
||||
}
|
||||
|
||||
SkLayerRasterizer::~SkLayerRasterizer()
|
||||
{
|
||||
SkLayerRasterizer::~SkLayerRasterizer() {
|
||||
SkDeque::F2BIter iter(fLayers);
|
||||
SkLayerRasterizer_Rec* rec;
|
||||
|
||||
@ -44,35 +43,34 @@ SkLayerRasterizer::~SkLayerRasterizer()
|
||||
rec->fPaint.~SkPaint();
|
||||
}
|
||||
|
||||
void SkLayerRasterizer::addLayer(const SkPaint& paint, SkScalar dx, SkScalar dy)
|
||||
{
|
||||
void SkLayerRasterizer::addLayer(const SkPaint& paint, SkScalar dx,
|
||||
SkScalar dy) {
|
||||
SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers.push_back();
|
||||
|
||||
new (&rec->fPaint) SkPaint(paint);
|
||||
rec->fOffset.set(dx, dy);
|
||||
}
|
||||
|
||||
static bool compute_bounds(const SkDeque& layers, const SkPath& path, const SkMatrix& matrix,
|
||||
const SkIRect* clipBounds, SkIRect* bounds)
|
||||
{
|
||||
static bool compute_bounds(const SkDeque& layers, const SkPath& path,
|
||||
const SkMatrix& matrix,
|
||||
const SkIRect* clipBounds, SkIRect* bounds) {
|
||||
SkDeque::F2BIter iter(layers);
|
||||
SkLayerRasterizer_Rec* rec;
|
||||
|
||||
bounds->set(SK_MaxS32, SK_MaxS32, SK_MinS32, SK_MinS32);
|
||||
|
||||
while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL)
|
||||
{
|
||||
while ((rec = (SkLayerRasterizer_Rec*)iter.next()) != NULL) {
|
||||
const SkPaint& paint = rec->fPaint;
|
||||
SkPath fillPath, devPath;
|
||||
const SkPath* p = &path;
|
||||
|
||||
if (paint.getPathEffect() || paint.getStyle() != SkPaint::kFill_Style)
|
||||
{
|
||||
if (paint.getPathEffect() || paint.getStyle() != SkPaint::kFill_Style) {
|
||||
paint.getFillPath(path, &fillPath);
|
||||
p = &fillPath;
|
||||
}
|
||||
if (p->isEmpty())
|
||||
if (p->isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// apply the matrix and offset
|
||||
{
|
||||
@ -82,9 +80,11 @@ static bool compute_bounds(const SkDeque& layers, const SkPath& path, const SkMa
|
||||
}
|
||||
|
||||
SkMask mask;
|
||||
if (!SkDraw::DrawToMask(devPath, clipBounds, paint.getMaskFilter(), &matrix,
|
||||
&mask, SkMask::kJustComputeBounds_CreateMode))
|
||||
if (!SkDraw::DrawToMask(devPath, clipBounds, paint.getMaskFilter(),
|
||||
&matrix, &mask,
|
||||
SkMask::kJustComputeBounds_CreateMode)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bounds->join(mask.fBounds);
|
||||
}
|
||||
@ -93,19 +93,17 @@ static bool compute_bounds(const SkDeque& layers, const SkPath& path, const SkMa
|
||||
|
||||
bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
|
||||
const SkIRect* clipBounds,
|
||||
SkMask* mask, SkMask::CreateMode mode)
|
||||
{
|
||||
if (fLayers.empty())
|
||||
SkMask* mask, SkMask::CreateMode mode) {
|
||||
if (fLayers.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (SkMask::kJustRenderImage_CreateMode != mode)
|
||||
{
|
||||
if (SkMask::kJustRenderImage_CreateMode != mode) {
|
||||
if (!compute_bounds(fLayers, path, matrix, clipBounds, &mask->fBounds))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (SkMask::kComputeBoundsAndRenderImage_CreateMode == mode)
|
||||
{
|
||||
if (SkMask::kComputeBoundsAndRenderImage_CreateMode == mode) {
|
||||
mask->fFormat = SkMask::kA8_Format;
|
||||
mask->fRowBytes = mask->fBounds.width();
|
||||
size_t size = mask->computeImageSize();
|
||||
@ -116,8 +114,7 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
|
||||
memset(mask->fImage, 0, size);
|
||||
}
|
||||
|
||||
if (SkMask::kJustComputeBounds_CreateMode != mode)
|
||||
{
|
||||
if (SkMask::kJustComputeBounds_CreateMode != mode) {
|
||||
SkBitmap device;
|
||||
SkDraw draw;
|
||||
SkMatrix translatedMatrix; // this translates us to our local pixels
|
||||
@ -153,14 +150,12 @@ bool SkLayerRasterizer::onRasterize(const SkPath& path, const SkMatrix& matrix,
|
||||
|
||||
/////////// Routines for flattening /////////////////
|
||||
|
||||
static void paint_read(SkPaint* paint, SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
static void paint_read(SkPaint* paint, SkFlattenableReadBuffer& buffer) {
|
||||
paint->setAntiAlias(buffer.readBool());
|
||||
paint->setStyle((SkPaint::Style)buffer.readU8());
|
||||
paint->setAlpha(buffer.readU8());
|
||||
|
||||
if (paint->getStyle() != SkPaint::kFill_Style)
|
||||
{
|
||||
if (paint->getStyle() != SkPaint::kFill_Style) {
|
||||
paint->setStrokeWidth(buffer.readScalar());
|
||||
paint->setStrokeMiter(buffer.readScalar());
|
||||
paint->setStrokeCap((SkPaint::Cap)buffer.readU8());
|
||||
@ -173,14 +168,12 @@ static void paint_read(SkPaint* paint, SkFlattenableReadBuffer& buffer)
|
||||
SkSafeUnref(paint->setXfermode((SkXfermode*)buffer.readFlattenable()));
|
||||
}
|
||||
|
||||
static void paint_write(const SkPaint& paint, SkFlattenableWriteBuffer& buffer)
|
||||
{
|
||||
static void paint_write(const SkPaint& paint, SkFlattenableWriteBuffer& buffer) {
|
||||
buffer.writeBool(paint.isAntiAlias());
|
||||
buffer.write8(paint.getStyle());
|
||||
buffer.write8(paint.getAlpha());
|
||||
|
||||
if (paint.getStyle() != SkPaint::kFill_Style)
|
||||
{
|
||||
if (paint.getStyle() != SkPaint::kFill_Style) {
|
||||
buffer.writeScalar(paint.getStrokeWidth());
|
||||
buffer.writeScalar(paint.getStrokeMiter());
|
||||
buffer.write8(paint.getStrokeCap());
|
||||
@ -194,12 +187,10 @@ static void paint_write(const SkPaint& paint, SkFlattenableWriteBuffer& buffer)
|
||||
}
|
||||
|
||||
SkLayerRasterizer::SkLayerRasterizer(SkFlattenableReadBuffer& buffer)
|
||||
: SkRasterizer(buffer), fLayers(sizeof(SkLayerRasterizer_Rec))
|
||||
{
|
||||
: SkRasterizer(buffer), fLayers(sizeof(SkLayerRasterizer_Rec)) {
|
||||
int count = buffer.readS32();
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
for (int i = 0; i < count; i++) {
|
||||
SkLayerRasterizer_Rec* rec = (SkLayerRasterizer_Rec*)fLayers.push_back();
|
||||
|
||||
#if 0
|
||||
@ -213,8 +204,7 @@ SkLayerRasterizer::SkLayerRasterizer(SkFlattenableReadBuffer& buffer)
|
||||
}
|
||||
}
|
||||
|
||||
void SkLayerRasterizer::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
{
|
||||
void SkLayerRasterizer::flatten(SkFlattenableWriteBuffer& buffer) {
|
||||
this->INHERITED::flatten(buffer);
|
||||
|
||||
buffer.write32(fLayers.count());
|
||||
@ -222,8 +212,7 @@ void SkLayerRasterizer::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
SkDeque::F2BIter iter(fLayers);
|
||||
const SkLayerRasterizer_Rec* rec;
|
||||
|
||||
while ((rec = (const SkLayerRasterizer_Rec*)iter.next()) != NULL)
|
||||
{
|
||||
while ((rec = (const SkLayerRasterizer_Rec*)iter.next()) != NULL) {
|
||||
#if 0
|
||||
rec->fPaint.flatten(buffer);
|
||||
#else
|
||||
@ -234,13 +223,11 @@ void SkLayerRasterizer::flatten(SkFlattenableWriteBuffer& buffer)
|
||||
}
|
||||
}
|
||||
|
||||
SkFlattenable* SkLayerRasterizer::CreateProc(SkFlattenableReadBuffer& buffer)
|
||||
{
|
||||
SkFlattenable* SkLayerRasterizer::CreateProc(SkFlattenableReadBuffer& buffer) {
|
||||
return SkNEW_ARGS(SkLayerRasterizer, (buffer));
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkLayerRasterizer::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkLayerRasterizer::getFactory() {
|
||||
return CreateProc;
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
Copyright 2011 Google Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "SkPaintFlagsDrawFilter.h"
|
||||
#include "SkPaint.h"
|
||||
|
||||
|
@ -1,36 +1,45 @@
|
||||
/*
|
||||
Copyright 2011 Google Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "SkPixelXorXfermode.h"
|
||||
#include "SkColorPriv.h"
|
||||
|
||||
// we always return an opaque color, 'cause I don't know what to do with
|
||||
// the alpha-component and still return a valid premultiplied color.
|
||||
SkPMColor SkPixelXorXfermode::xferColor(SkPMColor src, SkPMColor dst)
|
||||
{
|
||||
SkPMColor SkPixelXorXfermode::xferColor(SkPMColor src, SkPMColor dst) {
|
||||
SkPMColor res = src ^ dst ^ fOpColor;
|
||||
res |= (SK_A32_MASK << SK_A32_SHIFT); // force it to be opaque
|
||||
return res;
|
||||
}
|
||||
|
||||
void SkPixelXorXfermode::flatten(SkFlattenableWriteBuffer& wb)
|
||||
{
|
||||
void SkPixelXorXfermode::flatten(SkFlattenableWriteBuffer& wb) {
|
||||
this->INHERITED::flatten(wb);
|
||||
wb.write32(fOpColor);
|
||||
}
|
||||
|
||||
SkPixelXorXfermode::SkPixelXorXfermode(SkFlattenableReadBuffer& rb)
|
||||
: SkXfermode(rb)
|
||||
{
|
||||
: SkXfermode(rb) {
|
||||
fOpColor = rb.readU32();
|
||||
}
|
||||
|
||||
SkFlattenable::Factory SkPixelXorXfermode::getFactory()
|
||||
{
|
||||
SkFlattenable::Factory SkPixelXorXfermode::getFactory() {
|
||||
return Create;
|
||||
}
|
||||
|
||||
SkFlattenable* SkPixelXorXfermode::Create(SkFlattenableReadBuffer& rb)
|
||||
{
|
||||
SkFlattenable* SkPixelXorXfermode::Create(SkFlattenableReadBuffer& rb) {
|
||||
return SkNEW_ARGS(SkPixelXorXfermode, (rb));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
Copyright 2011 Google Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "SkPorterDuff.h"
|
||||
#include "SkXfermode.h"
|
||||
|
||||
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
Copyright 2011 Google Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "SkRectShape.h"
|
||||
#include "SkCanvas.h"
|
||||
|
||||
|
@ -1,3 +1,19 @@
|
||||
/*
|
||||
Copyright 2011 Google Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "SkTableMaskFilter.h"
|
||||
|
||||
SkTableMaskFilter::SkTableMaskFilter() {
|
||||
|
@ -20,63 +20,56 @@
|
||||
|
||||
bool SkTransparentShader::setContext(const SkBitmap& device,
|
||||
const SkPaint& paint,
|
||||
const SkMatrix& matrix)
|
||||
{
|
||||
const SkMatrix& matrix) {
|
||||
fDevice = &device;
|
||||
fAlpha = paint.getAlpha();
|
||||
|
||||
return this->INHERITED::setContext(device, paint, matrix);
|
||||
}
|
||||
|
||||
uint32_t SkTransparentShader::getFlags()
|
||||
{
|
||||
uint32_t SkTransparentShader::getFlags() {
|
||||
uint32_t flags = this->INHERITED::getFlags();
|
||||
|
||||
switch (fDevice->getConfig()) {
|
||||
case SkBitmap::kRGB_565_Config:
|
||||
flags |= kHasSpan16_Flag;
|
||||
if (fAlpha == 255)
|
||||
flags |= kOpaqueAlpha_Flag;
|
||||
break;
|
||||
case SkBitmap::kARGB_8888_Config:
|
||||
case SkBitmap::kARGB_4444_Config:
|
||||
if (fAlpha == 255 && fDevice->isOpaque())
|
||||
flags |= kOpaqueAlpha_Flag;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case SkBitmap::kRGB_565_Config:
|
||||
flags |= kHasSpan16_Flag;
|
||||
if (fAlpha == 255)
|
||||
flags |= kOpaqueAlpha_Flag;
|
||||
break;
|
||||
case SkBitmap::kARGB_8888_Config:
|
||||
case SkBitmap::kARGB_4444_Config:
|
||||
if (fAlpha == 255 && fDevice->isOpaque())
|
||||
flags |= kOpaqueAlpha_Flag;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
void SkTransparentShader::shadeSpan(int x, int y, SkPMColor span[], int count)
|
||||
{
|
||||
void SkTransparentShader::shadeSpan(int x, int y, SkPMColor span[], int count) {
|
||||
unsigned scale = SkAlpha255To256(fAlpha);
|
||||
|
||||
switch (fDevice->getConfig()) {
|
||||
case SkBitmap::kARGB_8888_Config:
|
||||
if (scale == 256)
|
||||
memcpy(span, fDevice->getAddr32(x, y), count * sizeof(SkPMColor));
|
||||
else
|
||||
{
|
||||
const SkPMColor* src = fDevice->getAddr32(x, y);
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
span[i] = SkAlphaMulQ(src[i], scale);
|
||||
}
|
||||
break;
|
||||
case SkBitmap::kRGB_565_Config:
|
||||
{
|
||||
const uint16_t* src = fDevice->getAddr16(x, y);
|
||||
if (scale == 256)
|
||||
{
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
span[i] = SkPixel16ToPixel32(src[i]);
|
||||
case SkBitmap::kARGB_8888_Config:
|
||||
if (scale == 256) {
|
||||
memcpy(span, fDevice->getAddr32(x, y), count * sizeof(SkPMColor));
|
||||
} else {
|
||||
const SkPMColor* src = fDevice->getAddr32(x, y);
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
span[i] = SkAlphaMulQ(src[i], scale);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
case SkBitmap::kRGB_565_Config: {
|
||||
const uint16_t* src = fDevice->getAddr16(x, y);
|
||||
if (scale == 256) {
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
span[i] = SkPixel16ToPixel32(src[i]);
|
||||
}
|
||||
} else {
|
||||
unsigned alpha = fAlpha;
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
{
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
uint16_t c = src[i];
|
||||
unsigned r = SkPacked16ToR32(c);
|
||||
unsigned g = SkPacked16ToG32(c);
|
||||
@ -88,55 +81,48 @@ void SkTransparentShader::shadeSpan(int x, int y, SkPMColor span[], int count)
|
||||
SkAlphaMul(b, scale));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SkBitmap::kARGB_4444_Config:
|
||||
{
|
||||
case SkBitmap::kARGB_4444_Config: {
|
||||
const uint16_t* src = fDevice->getAddr16(x, y);
|
||||
if (scale == 256)
|
||||
{
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
if (scale == 256) {
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
span[i] = SkPixel4444ToPixel32(src[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
} else {
|
||||
unsigned scale16 = scale >> 4;
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
{
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
uint32_t c = SkExpand_4444(src[i]) * scale16;
|
||||
span[i] = SkCompact_8888(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SkBitmap::kIndex8_Config:
|
||||
SkASSERT(!"index8 not supported as a destination device");
|
||||
break;
|
||||
case SkBitmap::kA8_Config:
|
||||
{
|
||||
const uint8_t* src = fDevice->getAddr8(x, y);
|
||||
if (scale == 256)
|
||||
{
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
span[i] = SkPackARGB32(src[i], 0, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = count - 1; i >= 0; --i)
|
||||
span[i] = SkPackARGB32(SkAlphaMul(src[i], scale), 0, 0, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SkBitmap::kA1_Config:
|
||||
SkASSERT(!"kA1_Config umimplemented at this time");
|
||||
break;
|
||||
default: // to avoid warnings
|
||||
break;
|
||||
case SkBitmap::kIndex8_Config:
|
||||
SkASSERT(!"index8 not supported as a destination device");
|
||||
break;
|
||||
case SkBitmap::kA8_Config: {
|
||||
const uint8_t* src = fDevice->getAddr8(x, y);
|
||||
if (scale == 256) {
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
span[i] = SkPackARGB32(src[i], 0, 0, 0);
|
||||
}
|
||||
} else {
|
||||
for (int i = count - 1; i >= 0; --i) {
|
||||
span[i] = SkPackARGB32(SkAlphaMul(src[i], scale), 0, 0, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SkBitmap::kA1_Config:
|
||||
SkASSERT(!"kA1_Config umimplemented at this time");
|
||||
break;
|
||||
default: // to avoid warnings
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SkTransparentShader::shadeSpan16(int x, int y, uint16_t span[], int count)
|
||||
{
|
||||
void SkTransparentShader::shadeSpan16(int x, int y, uint16_t span[], int count) {
|
||||
SkASSERT(fDevice->getConfig() == SkBitmap::kRGB_565_Config);
|
||||
|
||||
memcpy(span, fDevice->getAddr16(x, y), count << 1);
|
||||
|
Loading…
Reference in New Issue
Block a user