| Index: skia/effects/SkCornerPathEffect.cpp
|
| ===================================================================
|
| --- skia/effects/SkCornerPathEffect.cpp (revision 16859)
|
| +++ skia/effects/SkCornerPathEffect.cpp (working copy)
|
| @@ -1,157 +0,0 @@
|
| -/* libs/graphics/effects/SkCornerPathEffect.cpp
|
| -**
|
| -** 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.
|
| -*/
|
| -
|
| -#include "SkCornerPathEffect.h"
|
| -#include "SkPath.h"
|
| -#include "SkPoint.h"
|
| -#include "SkBuffer.h"
|
| -
|
| -SkCornerPathEffect::SkCornerPathEffect(SkScalar radius) : fRadius(radius)
|
| -{
|
| -}
|
| -
|
| -SkCornerPathEffect::~SkCornerPathEffect()
|
| -{
|
| -}
|
| -
|
| -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);
|
| -
|
| - if (dist <= radius * 2) {
|
| - step->scale(SK_ScalarHalf);
|
| - return false;
|
| - }
|
| - else {
|
| - step->scale(SkScalarDiv(radius, dist));
|
| - return true;
|
| - }
|
| -}
|
| -
|
| -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;
|
| - SkPoint pts[4];
|
| -
|
| - bool closed;
|
| - SkPoint moveTo, lastCorner;
|
| - SkVector firstStep, step;
|
| - bool prevIsValid = true;
|
| -
|
| - // to avoid warnings
|
| - moveTo.set(0, 0);
|
| - firstStep.set(0, 0);
|
| - lastCorner.set(0, 0);
|
| -
|
| - for (;;) {
|
| - switch (verb = iter.next(pts)) {
|
| - case SkPath::kMove_Verb:
|
| - 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);
|
| - }
|
| - if (drawSegment) {
|
| - dst->lineTo(pts[1].fX - step.fX, pts[1].fY - step.fY);
|
| - }
|
| - lastCorner = pts[1];
|
| - prevIsValid = true;
|
| - }
|
| - 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;
|
| - }
|
| -
|
| - if (SkPath::kMove_Verb == prevVerb)
|
| - firstStep = step;
|
| - prevVerb = verb;
|
| - }
|
| -DONE:
|
| - return true;
|
| -}
|
| -
|
| -SkFlattenable::Factory SkCornerPathEffect::getFactory()
|
| -{
|
| - return CreateProc;
|
| -}
|
| -
|
| -void SkCornerPathEffect::flatten(SkFlattenableWriteBuffer& buffer)
|
| -{
|
| - buffer.writeScalar(fRadius);
|
| -}
|
| -
|
| -SkFlattenable* SkCornerPathEffect::CreateProc(SkFlattenableReadBuffer& buffer)
|
| -{
|
| - return SkNEW_ARGS(SkCornerPathEffect, (buffer));
|
| -}
|
| -
|
| -SkCornerPathEffect::SkCornerPathEffect(SkFlattenableReadBuffer& buffer)
|
| -{
|
| - fRadius = buffer.readScalar();
|
| -}
|
| -
|
|
|