MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / PiuRegionCombine

Function PiuRegionCombine

modules/piu/MC/piuRegion.c:37–344  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

35}
36
37PiuBoolean PiuRegionCombine(PiuRegion* region0, PiuRegion* region1, PiuRegion* region2, PiuCoordinate op)
38{
39 PiuCoordinate* current0 = (*region0)->data;
40 PiuCoordinate* limit0 = current0 + (*region0)->available;
41 PiuCoordinate left0, top0, right0, bottom0;
42 PiuCoordinate* span0 = C_NULL;;
43 PiuCoordinate segmentCount0;
44
45 PiuCoordinate* current1 = (*region1)->data;
46 PiuCoordinate* limit1 = current1 + *current1;
47 PiuCoordinate left1, top1, right1, bottom1;
48 PiuCoordinate* span1 = NULL;
49 PiuCoordinate segmentCount1 = 0;
50 PiuCoordinate* segment1;
51 PiuCoordinate* segmentLimit1;
52
53 PiuCoordinate* current2 = (*region2)->data;
54 PiuCoordinate* limit2 = current2 + *current2;
55 PiuCoordinate left2, top2, right2, bottom2;
56 PiuCoordinate* span2 = NULL;
57 PiuCoordinate segmentCount2 = 0;
58 PiuCoordinate* segment2;
59 PiuCoordinate* segmentLimit2;
60
61 PiuCoordinate* former = NULL;
62 PiuCoordinate test, c, y, flag, old, x;
63
64 current1++;
65 left1 = *current1++;
66 top1 = *current1++;
67 right1 = left1 + *current1++;
68 bottom1 = top1 + *current1++;
69 current2++;
70 left2 = *current2++;
71 top2 = *current2++;
72 right2 = left2 + *current2++;
73 bottom2 = top2 + *current2++;
74
75 if (current1 == limit1)
76 return (op & 1) ? PiuRegionEmpty(region0) : PiuRegionCopy(region0, region2);
77 if (current2 == limit2)
78 return (op & 2) ? PiuRegionEmpty(region0) : PiuRegionCopy(region0, region1);
79 if (op & 3) {
80 if ((right2 <= left1) || (right1 <= left2) || (bottom2 <= top1) || (bottom1 <= top2))
81 return (op & 2) ? PiuRegionEmpty(region0) : PiuRegionCopy(region0, region1);
82 left0 = (right1 > right2) ? right1 : right2;
83 right0 = (left1 > left2) ? left2 : left1;
84 }
85 else {
86 left0 = (left1 > left2) ? left2 : left1;
87 right0 = (right1 > right2) ? right1 : right2;
88 }
89 current0 += 5;
90
91 if (*current1 < *current2) {
92 if (op & 2) {
93 while ((current1 < limit1) && (*current1 < *current2)) {
94 current1++;

Callers 5

PiuViewCombineFunction · 0.85
PiuViewCombineRegionFunction · 0.85
PiuDie_andFunction · 0.85
PiuDie_orFunction · 0.85
PiuDie_subFunction · 0.85

Calls 4

PiuRegionEmptyFunction · 0.85
PiuRegionCopyFunction · 0.85
SpanMinMaxFunction · 0.85
SpanEqualsFunction · 0.85

Tested by

no test coverage detected