зеркало из https://github.com/mozilla/moz-skia.git
Remove scaleToFit from DashPathEffect
BUG=skia: R=reed@google.com, bsalomon@google.com, scroggo@google.com Author: egdaniel@google.com Review URL: https://codereview.chromium.org/216493005 git-svn-id: http://skia.googlecode.com/svn/trunk@13999 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Родитель
07421a52d4
Коммит
35c03fbf10
|
@ -263,7 +263,7 @@ public:
|
|||
fDoAA = doAA;
|
||||
|
||||
SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) };
|
||||
fPathEffect.reset(SkDashPathEffect::Create(vals, 2, SK_Scalar1, false));
|
||||
fPathEffect.reset(SkDashPathEffect::Create(vals, 2, SK_Scalar1));
|
||||
}
|
||||
|
||||
protected:
|
||||
|
|
|
@ -202,7 +202,7 @@ protected:
|
|||
|
||||
SkScalar intervals[2] = { dashLength, dashLength };
|
||||
|
||||
p.setPathEffect(SkDashPathEffect::Create(intervals, 2, phase, false))->unref();
|
||||
p.setPathEffect(SkDashPathEffect::Create(intervals, 2, phase))->unref();
|
||||
|
||||
SkPoint pts[2];
|
||||
|
||||
|
|
|
@ -37,8 +37,8 @@ public:
|
|||
Note: only affects stroked paths.
|
||||
*/
|
||||
static SkDashPathEffect* Create(const SkScalar intervals[], int count,
|
||||
SkScalar phase, bool scaleToFit = false) {
|
||||
return SkNEW_ARGS(SkDashPathEffect, (intervals, count, phase, scaleToFit));
|
||||
SkScalar phase) {
|
||||
return SkNEW_ARGS(SkDashPathEffect, (intervals, count, phase));
|
||||
}
|
||||
virtual ~SkDashPathEffect();
|
||||
|
||||
|
@ -60,8 +60,7 @@ protected:
|
|||
#ifdef SK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS
|
||||
public:
|
||||
#endif
|
||||
SkDashPathEffect(const SkScalar intervals[], int count, SkScalar phase,
|
||||
bool scaleToFit = false);
|
||||
SkDashPathEffect(const SkScalar intervals[], int count, SkScalar phase);
|
||||
|
||||
private:
|
||||
SkScalar* fIntervals;
|
||||
|
@ -70,7 +69,6 @@ private:
|
|||
SkScalar fInitialDashLength;
|
||||
int32_t fInitialDashIndex;
|
||||
SkScalar fIntervalLength;
|
||||
bool fScaleToFit;
|
||||
|
||||
typedef SkPathEffect INHERITED;
|
||||
};
|
||||
|
|
|
@ -35,8 +35,7 @@ static SkScalar FindFirstInterval(const SkScalar intervals[], SkScalar phase,
|
|||
}
|
||||
|
||||
SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count,
|
||||
SkScalar phase, bool scaleToFit)
|
||||
: fScaleToFit(scaleToFit) {
|
||||
SkScalar phase) {
|
||||
SkASSERT(intervals);
|
||||
SkASSERT(count > 1 && SkAlign2(count) == count);
|
||||
|
||||
|
@ -256,7 +255,6 @@ bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src,
|
|||
bool addedSegment = false;
|
||||
SkScalar length = meas.getLength();
|
||||
int index = fInitialDashIndex;
|
||||
SkScalar scale = SK_Scalar1;
|
||||
|
||||
// Since the path length / dash length ratio may be arbitrarily large, we can exert
|
||||
// significant memory pressure while attempting to build the filtered path. To avoid this,
|
||||
|
@ -273,20 +271,10 @@ bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src,
|
|||
return false;
|
||||
}
|
||||
|
||||
if (fScaleToFit) {
|
||||
if (fIntervalLength >= length) {
|
||||
scale = SkScalarDiv(length, fIntervalLength);
|
||||
} else {
|
||||
SkScalar div = SkScalarDiv(length, fIntervalLength);
|
||||
int n = SkScalarFloorToInt(div);
|
||||
scale = SkScalarDiv(length, n * fIntervalLength);
|
||||
}
|
||||
}
|
||||
|
||||
// Using double precision to avoid looping indefinitely due to single precision rounding
|
||||
// (for extreme path_length/dash_length ratios). See test_infinite_dash() unittest.
|
||||
double distance = 0;
|
||||
double dlen = SkScalarMul(fInitialDashLength, scale);
|
||||
double dlen = fInitialDashLength;
|
||||
|
||||
while (distance < length) {
|
||||
SkASSERT(dlen >= 0);
|
||||
|
@ -318,13 +306,13 @@ bool SkDashPathEffect::filterPath(SkPath* dst, const SkPath& src,
|
|||
}
|
||||
|
||||
// fetch our next dlen
|
||||
dlen = SkScalarMul(intervals[index], scale);
|
||||
dlen = intervals[index];
|
||||
}
|
||||
|
||||
// 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) {
|
||||
meas.getSegment(0, SkScalarMul(fInitialDashLength, scale), dst, !addedSegment);
|
||||
meas.getSegment(0, fInitialDashLength, dst, !addedSegment);
|
||||
++segCount;
|
||||
}
|
||||
} while (meas.nextContour());
|
||||
|
@ -362,13 +350,6 @@ bool SkDashPathEffect::asPoints(PointData* results,
|
|||
return false;
|
||||
}
|
||||
|
||||
// TODO: this next test could be eased up. The rescaling should not impact
|
||||
// the equality of the ons & offs. However, we would need to remove the
|
||||
// integer intervals restriction first
|
||||
if (fScaleToFit) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SkPoint pts[2];
|
||||
|
||||
if (!src.isLine(pts)) {
|
||||
|
@ -538,7 +519,8 @@ void SkDashPathEffect::flatten(SkWriteBuffer& buffer) const {
|
|||
buffer.writeInt(fInitialDashIndex);
|
||||
buffer.writeScalar(fInitialDashLength);
|
||||
buffer.writeScalar(fIntervalLength);
|
||||
buffer.writeBool(fScaleToFit);
|
||||
// Dummy write to stay compatible with old skps. Write will be removed in follow up patch.
|
||||
buffer.writeBool(false);
|
||||
buffer.writeScalarArray(fIntervals, fCount);
|
||||
}
|
||||
|
||||
|
@ -550,7 +532,7 @@ SkDashPathEffect::SkDashPathEffect(SkReadBuffer& buffer) : INHERITED(buffer) {
|
|||
fInitialDashIndex = buffer.readInt();
|
||||
fInitialDashLength = buffer.readScalar();
|
||||
fIntervalLength = buffer.readScalar();
|
||||
fScaleToFit = buffer.readBool();
|
||||
buffer.readBool(); // dummy read to stay compatible with old skps
|
||||
|
||||
fCount = buffer.getArrayCount();
|
||||
size_t allocSize = sizeof(SkScalar) * fCount;
|
||||
|
|
|
@ -204,7 +204,7 @@ static void test_crbug_124652() {
|
|||
large values can "swamp" small ones.
|
||||
*/
|
||||
SkScalar intervals[2] = {837099584, 33450};
|
||||
SkAutoTUnref<SkDashPathEffect> dash(SkDashPathEffect::Create(intervals, 2, -10, false));
|
||||
SkAutoTUnref<SkDashPathEffect> dash(SkDashPathEffect::Create(intervals, 2, -10));
|
||||
}
|
||||
|
||||
static void test_bigcubic() {
|
||||
|
|
Загрузка…
Ссылка в новой задаче