lottie/vector: refactor VPathMesure to handle offset .
[platform/core/uifw/lottie-player.git] / src / vector / vpathmesure.cpp
1 #include "vpathmesure.h"
2 #include "vbezier.h"
3 #include "vdasher.h"
4
5 V_BEGIN_NAMESPACE
6
7 VPath oneSegment(float start, float end, const VPath & path)
8 {
9     if (start > end) {
10         std::swap(start, end);
11     }
12     float   array[5] = {0.0f, start, end - start, 1000, 0.0f};
13     VDasher dasher(array, 5);
14     return dasher.dashed(path);
15 }
16
17 VPath VPathMesure::trim(const VPath &path)
18 {
19     if (vCompare(mStart, mEnd)) return VPath();
20
21     if ((vCompare(mStart, 0.0f) && (vCompare(mEnd, 1.0f))) ||
22         (vCompare(mStart, 1.0f) && (vCompare(mEnd, 0.0f)))) return path;
23
24     if (vIsZero(mOffset)) {
25         float length = path.length();
26         return oneSegment(length * mStart, length * mEnd, path);
27     } else {
28         float length = path.length();
29         float offset = fmod(mOffset, length);
30         float start = length * mStart;
31         float end  = length * mEnd;
32         start += offset;
33         end +=offset;
34
35         if (start < 0 && end < 0) {
36             return oneSegment(length + start, length + end, path);
37         } else if (start > 0 && end > 0) {
38             if (start > length && end > length)
39                 return oneSegment(start - length, end - length, path);
40             else if (start < length && end < length)
41                 return oneSegment(start, end, path);
42             else {
43                 float len1 = start > end ? start - length : end - length;
44                 float start2 = start < end ? start : end;
45                 float gap1 = start2 - len1;
46                 float   array[5] = {len1, gap1, length - start2, 1000, 0.0f};
47                 VDasher dasher(array, 5);
48                 return dasher.dashed(path);
49             }
50         } else {
51             float len1 = start > end ? start : end;
52             float start2 = start < end ? length + start : length + end;
53             float gap1 = start2 - len1;
54             float   array[5] = {len1, gap1, length - start2, 1000, 0.0f};
55             VDasher dasher(array, 5);
56             return dasher.dashed(path);
57         }
58     }
59 }
60
61 V_END_NAMESPACE