blob: 981bd29573cc9981d0c7a8b2e5621201ec82e3d4 [file] [log] [blame]
caryclark@google.com07393ca2013-04-08 11:47:37 +00001/*
2* Copyright 2013 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
caryclark@google.com07393ca2013-04-08 11:47:37 +00007#include "SkOpContour.h"
caryclark54359292015-03-26 07:52:43 -07008#include "SkOpTAllocator.h"
caryclark@google.com07393ca2013-04-08 11:47:37 +00009#include "SkPathWriter.h"
caryclark54359292015-03-26 07:52:43 -070010#include "SkReduceOrder.h"
commit-bot@chromium.orgb76d3b62013-04-22 19:55:19 +000011#include "SkTSort.h"
caryclark@google.com07393ca2013-04-08 11:47:37 +000012
caryclark27c015d2016-09-23 05:47:20 -070013SkOpSegment* SkOpContour::addCurve(SkPath::Verb verb, const SkPoint pts[4], SkScalar weight) {
caryclark55888e42016-07-18 10:01:36 -070014 SkChunkAlloc* allocator = this->globalState()->allocator();
caryclark54359292015-03-26 07:52:43 -070015 switch (verb) {
16 case SkPath::kLine_Verb: {
17 SkPoint* ptStorage = SkOpTAllocator<SkPoint>::AllocateArray(allocator, 2);
18 memcpy(ptStorage, pts, sizeof(SkPoint) * 2);
caryclark55888e42016-07-18 10:01:36 -070019 return appendSegment().addLine(ptStorage, this);
caryclark54359292015-03-26 07:52:43 -070020 } break;
21 case SkPath::kQuad_Verb: {
22 SkPoint* ptStorage = SkOpTAllocator<SkPoint>::AllocateArray(allocator, 3);
23 memcpy(ptStorage, pts, sizeof(SkPoint) * 3);
caryclark55888e42016-07-18 10:01:36 -070024 return appendSegment().addQuad(ptStorage, this);
caryclark54359292015-03-26 07:52:43 -070025 } break;
caryclark1049f122015-04-20 08:31:59 -070026 case SkPath::kConic_Verb: {
caryclark27c015d2016-09-23 05:47:20 -070027 SkPoint* ptStorage = SkOpTAllocator<SkPoint>::AllocateArray(allocator, 3);
28 memcpy(ptStorage, pts, sizeof(SkPoint) * 3);
29 return appendSegment().addConic(ptStorage, weight, this);
caryclark1049f122015-04-20 08:31:59 -070030 } break;
caryclark54359292015-03-26 07:52:43 -070031 case SkPath::kCubic_Verb: {
32 SkPoint* ptStorage = SkOpTAllocator<SkPoint>::AllocateArray(allocator, 4);
33 memcpy(ptStorage, pts, sizeof(SkPoint) * 4);
caryclark55888e42016-07-18 10:01:36 -070034 return appendSegment().addCubic(ptStorage, this);
caryclark54359292015-03-26 07:52:43 -070035 } break;
36 default:
37 SkASSERT(0);
caryclark@google.com7eaa53d2013-10-02 14:49:34 +000038 }
halcanary96fcdcc2015-08-27 07:41:13 -070039 return nullptr;
caryclark@google.com07393ca2013-04-08 11:47:37 +000040}
41
caryclark@google.com07393ca2013-04-08 11:47:37 +000042void SkOpContour::toPath(SkPathWriter* path) const {
caryclark54359292015-03-26 07:52:43 -070043 const SkOpSegment* segment = &fHead;
44 do {
caryclarkef784fb2015-10-30 12:03:06 -070045 SkAssertResult(segment->addCurveTo(segment->head(), segment->tail(), path));
caryclark54359292015-03-26 07:52:43 -070046 } while ((segment = segment->next()));
caryclarkeed356d2016-09-14 07:18:20 -070047 path->finishContour();
48 path->assemble();
caryclark@google.com07393ca2013-04-08 11:47:37 +000049}
50
caryclark5b5ddd72015-05-18 05:12:56 -070051void SkOpContour::toReversePath(SkPathWriter* path) const {
caryclark5b5ddd72015-05-18 05:12:56 -070052 const SkOpSegment* segment = fTail;
53 do {
caryclarkef784fb2015-10-30 12:03:06 -070054 SkAssertResult(segment->addCurveTo(segment->tail(), segment->head(), path));
caryclark5b5ddd72015-05-18 05:12:56 -070055 } while ((segment = segment->prev()));
caryclarkeed356d2016-09-14 07:18:20 -070056 path->finishContour();
57 path->assemble();
caryclark5b5ddd72015-05-18 05:12:56 -070058}
59
caryclark54359292015-03-26 07:52:43 -070060SkOpSegment* SkOpContour::undoneSegment(SkOpSpanBase** startPtr, SkOpSpanBase** endPtr) {
61 SkOpSegment* segment = &fHead;
62 do {
63 if (segment->done()) {
caryclark@google.com07393ca2013-04-08 11:47:37 +000064 continue;
65 }
caryclark54359292015-03-26 07:52:43 -070066 segment->undoneSpan(startPtr, endPtr);
67 return segment;
68 } while ((segment = segment->next()));
halcanary96fcdcc2015-08-27 07:41:13 -070069 return nullptr;
caryclark@google.com07393ca2013-04-08 11:47:37 +000070}