rays 0.1.13 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.doc/ext/rays/camera.cpp +171 -0
  3. data/.doc/ext/rays/color.cpp +2 -3
  4. data/.doc/ext/rays/color_space.cpp +22 -14
  5. data/.doc/ext/rays/font.cpp +30 -0
  6. data/.doc/ext/rays/image.cpp +1 -1
  7. data/.doc/ext/rays/native.cpp +4 -4
  8. data/.doc/ext/rays/painter.cpp +83 -0
  9. data/.doc/ext/rays/point.cpp +14 -0
  10. data/.doc/ext/rays/polygon.cpp +33 -7
  11. data/.doc/ext/rays/polyline.cpp +12 -6
  12. data/.doc/ext/rays/rays.cpp +105 -1
  13. data/LICENSE +21 -0
  14. data/Rakefile +3 -0
  15. data/VERSION +1 -1
  16. data/ext/rays/bitmap.cpp +1 -1
  17. data/ext/rays/camera.cpp +186 -0
  18. data/ext/rays/color.cpp +2 -3
  19. data/ext/rays/color_space.cpp +22 -14
  20. data/ext/rays/extconf.rb +1 -1
  21. data/ext/rays/font.cpp +35 -2
  22. data/ext/rays/image.cpp +2 -2
  23. data/ext/rays/native.cpp +4 -4
  24. data/ext/rays/painter.cpp +94 -3
  25. data/ext/rays/point.cpp +16 -0
  26. data/ext/rays/polygon.cpp +34 -6
  27. data/ext/rays/polyline.cpp +11 -5
  28. data/ext/rays/rays.cpp +105 -1
  29. data/include/rays/camera.h +74 -0
  30. data/include/rays/color_space.h +4 -2
  31. data/include/rays/defs.h +33 -0
  32. data/include/rays/exception.h +6 -2
  33. data/include/rays/image.h +1 -1
  34. data/include/rays/painter.h +38 -0
  35. data/include/rays/polygon.h +35 -1
  36. data/include/rays/polyline.h +7 -1
  37. data/include/rays/ruby/camera.h +41 -0
  38. data/include/rays/ruby/rays.h +8 -0
  39. data/lib/rays.rb +2 -2
  40. data/lib/rays/camera.rb +24 -0
  41. data/lib/rays/image.rb +1 -1
  42. data/lib/rays/painter.rb +23 -1
  43. data/lib/rays/polygon.rb +8 -0
  44. data/rays.gemspec +2 -2
  45. data/src/color_space.cpp +2 -2
  46. data/src/image.cpp +1 -1
  47. data/src/ios/bitmap.h +23 -0
  48. data/src/ios/bitmap.mm +32 -11
  49. data/src/ios/camera.mm +517 -0
  50. data/src/ios/font.mm +2 -2
  51. data/src/ios/helper.h +2 -2
  52. data/src/osx/bitmap.h +23 -0
  53. data/src/osx/bitmap.mm +28 -10
  54. data/src/osx/camera.mm +452 -0
  55. data/src/osx/font.mm +2 -2
  56. data/src/painter.cpp +100 -10
  57. data/src/polygon.cpp +203 -37
  58. data/src/polyline.cpp +4 -2
  59. data/src/polyline.h +3 -1
  60. data/test/test_font.rb +5 -0
  61. data/test/test_painter.rb +65 -5
  62. data/test/test_painter_shape.rb +48 -3
  63. data/test/test_point.rb +8 -0
  64. data/test/test_polyline.rb +26 -0
  65. metadata +20 -9
@@ -71,8 +71,8 @@ namespace Rays
71
71
  RawFont::RawFont (const char* name, coord size)
72
72
  {
73
73
  self->font = name
74
- ? CTFontCreateWithName(cfstring(name).get(), size, NULL)
75
- : CTFontCreateUIFontForLanguage(kCTFontUIFontSystem, size, NULL);
74
+ ? CTFontCreateWithName(cfstring(name).get(), size, NULL)
75
+ : CTFontCreateUIFontForLanguage(kCTFontUIFontSystem, size, NULL);
76
76
  }
77
77
 
78
78
  RawFont::~RawFont ()
@@ -48,6 +48,12 @@ namespace Rays
48
48
 
49
49
  coord stroke_width;
50
50
 
51
+ CapType stroke_cap;
52
+
53
+ JoinType stroke_join;
54
+
55
+ coord miter_limit;
56
+
51
57
  uint nsegment;
52
58
 
53
59
  Bounds clip;
@@ -62,6 +68,9 @@ namespace Rays
62
68
  colors[FILL] .reset(1, 1);
63
69
  colors[STROKE] .reset(1, 0);
64
70
  stroke_width = 0;
71
+ stroke_cap = CAP_DEFAULT;
72
+ stroke_join = JOIN_DEFAULT;
73
+ miter_limit = JOIN_DEFAULT_MITER_LIMIT;
65
74
  nsegment = 0;
66
75
  clip .reset(-1);
67
76
  font = default_font();
@@ -641,6 +650,11 @@ namespace Rays
641
650
 
642
651
  self->opengl_state.push();
643
652
 
653
+ //glEnable(GL_CULL_FACE);
654
+ glEnable(GL_BLEND);
655
+ glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
656
+ OpenGL_check_error(__FILE__, __LINE__);
657
+
644
658
  FrameBuffer& fb = self->frame_buffer;
645
659
  if (fb) FrameBuffer_bind(fb.id());
646
660
 
@@ -649,6 +663,7 @@ namespace Rays
649
663
  glViewport(
650
664
  (int) (vp.x * density), (int) (vp.y * density),
651
665
  (int) (vp.width * density), (int) (vp.height * density));
666
+ OpenGL_check_error(__FILE__, __LINE__);
652
667
 
653
668
  coord x1 = vp.x, x2 = vp.x + vp.width;
654
669
  coord y1 = vp.y, y2 = vp.y + vp.height;
@@ -656,20 +671,13 @@ namespace Rays
656
671
  if (z1 == 0 && z2 == 0) {z1 = -100; z2 = 200;}
657
672
  if (!fb) std::swap(y1, y2);
658
673
 
659
- self->state.init();
660
-
661
674
  self->position_matrix.reset(1);
662
675
  self->position_matrix *= to_rays(glm::ortho(x1, x2, y1, y2));
663
676
  //self->position_matrix.translate(0.375f, 0.375f);
664
677
 
665
- //glEnable(GL_CULL_FACE);
666
- glEnable(GL_BLEND);
667
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
668
- OpenGL_check_error(__FILE__, __LINE__);
678
+ self->update_clip();
669
679
 
670
680
  self->painting = true;
671
-
672
- no_clip();
673
681
  }
674
682
 
675
683
  void
@@ -847,6 +855,52 @@ namespace Rays
847
855
  center, radius, hole_radius, angle_from, angle_to, nsegment()));
848
856
  }
849
857
 
858
+ void
859
+ Painter::curve (
860
+ coord x1, coord y1, coord x2, coord y2,
861
+ coord x3, coord y3, coord x4, coord y4,
862
+ bool loop)
863
+ {
864
+ polygon(create_curve(x1, y1, x2, y2, x3, y3, x4, y4, loop));
865
+ }
866
+
867
+ void
868
+ Painter::curve (
869
+ const Point& p1, const Point& p2, const Point& p3, const Point& p4,
870
+ bool loop)
871
+ {
872
+ polygon(create_curve(p1, p2, p3, p4, loop));
873
+ }
874
+
875
+ void
876
+ Painter::curve (const Point* points, size_t size, bool loop)
877
+ {
878
+ polygon(create_curve(points, size, loop));
879
+ }
880
+
881
+ void
882
+ Painter::bezier (
883
+ coord x1, coord y1, coord x2, coord y2,
884
+ coord x3, coord y3, coord x4, coord y4,
885
+ bool loop)
886
+ {
887
+ polygon(create_bezier(x1, y1, x2, y2, x3, y3, x4, y4, loop));
888
+ }
889
+
890
+ void
891
+ Painter::bezier (
892
+ const Point& p1, const Point& p2, const Point& p3, const Point& p4,
893
+ bool loop)
894
+ {
895
+ polygon(create_bezier(p1, p2, p3, p4, loop));
896
+ }
897
+
898
+ void
899
+ Painter::bezier (const Point* points, size_t size, bool loop)
900
+ {
901
+ polygon(create_bezier(points, size, loop));
902
+ }
903
+
850
904
  static void
851
905
  draw_image (
852
906
  Painter* painter, const Image& image,
@@ -1202,6 +1256,42 @@ namespace Rays
1202
1256
  return self->state.stroke_width;
1203
1257
  }
1204
1258
 
1259
+ void
1260
+ Painter::set_stroke_cap (CapType cap)
1261
+ {
1262
+ self->state.stroke_cap = cap;
1263
+ }
1264
+
1265
+ CapType
1266
+ Painter::stroke_cap () const
1267
+ {
1268
+ return self->state.stroke_cap;
1269
+ }
1270
+
1271
+ void
1272
+ Painter::set_stroke_join (JoinType join)
1273
+ {
1274
+ self->state.stroke_join = join;
1275
+ }
1276
+
1277
+ JoinType
1278
+ Painter::stroke_join () const
1279
+ {
1280
+ return self->state.stroke_join;
1281
+ }
1282
+
1283
+ void
1284
+ Painter::set_miter_limit (coord limit)
1285
+ {
1286
+ self->state.miter_limit = limit;
1287
+ }
1288
+
1289
+ coord
1290
+ Painter::miter_limit () const
1291
+ {
1292
+ return self->state.miter_limit;
1293
+ }
1294
+
1205
1295
  void
1206
1296
  Painter::set_nsegment (int nsegment)
1207
1297
  {
@@ -1279,7 +1369,7 @@ namespace Rays
1279
1369
  void
1280
1370
  Painter::push_state ()
1281
1371
  {
1282
- self->state_stack.push_back(self->state);
1372
+ self->state_stack.emplace_back(self->state);
1283
1373
  }
1284
1374
 
1285
1375
  void
@@ -1370,7 +1460,7 @@ namespace Rays
1370
1460
  void
1371
1461
  Painter::push_matrix ()
1372
1462
  {
1373
- self->position_matrix_stack.push_back(self->position_matrix);
1463
+ self->position_matrix_stack.emplace_back(self->position_matrix);
1374
1464
  }
1375
1465
 
1376
1466
  void
@@ -5,6 +5,7 @@
5
5
  #include <assert.h>
6
6
  #include <utility>
7
7
  #include <poly2tri.h>
8
+ #include <Splines.h>
8
9
  #include "xot/util.h"
9
10
  #include "rays/color.h"
10
11
  #include "rays/exception.h"
@@ -13,7 +14,7 @@
13
14
  #include "painter.h"
14
15
 
15
16
 
16
- using namespace ClipperLib;
17
+ namespace clip = ClipperLib;
17
18
 
18
19
 
19
20
  namespace Rays
@@ -155,6 +156,10 @@ namespace Rays
155
156
 
156
157
  if (!polygon || polygon.empty()) return;
157
158
 
159
+ CapType cap = painter->stroke_cap();
160
+ JoinType join = painter->stroke_join();
161
+ coord ml = painter->miter_limit();
162
+
158
163
  bool has_loop = false;
159
164
  for (const auto& polyline : polygon)
160
165
  {
@@ -168,7 +173,7 @@ namespace Rays
168
173
  }
169
174
 
170
175
  Polygon stroke;
171
- if (!polyline.expand(&stroke, stroke_width / 2))
176
+ if (!polyline.expand(&stroke, stroke_width / 2, cap, join, ml))
172
177
  continue;
173
178
 
174
179
  Polygon_fill(stroke, painter, color);
@@ -177,7 +182,7 @@ namespace Rays
177
182
  if (has_loop)
178
183
  {
179
184
  Polygon hole;
180
- if (polygon.expand(&hole, -stroke_width))
185
+ if (polygon.expand(&hole, -stroke_width, cap, join, ml))
181
186
  Polygon_fill(polygon - hole, painter, color);
182
187
  }
183
188
  }
@@ -251,11 +256,11 @@ namespace Rays
251
256
 
252
257
  static void
253
258
  add_polygon_to_clipper (
254
- Clipper* clipper, const Polygon& polygon, PolyType type)
259
+ clip::Clipper* clipper, const Polygon& polygon, clip::PolyType type)
255
260
  {
256
261
  assert(clipper);
257
262
 
258
- Path path;
263
+ clip::Path path;
259
264
  for (const auto& line : polygon)
260
265
  {
261
266
  if (!line) continue;
@@ -267,42 +272,72 @@ namespace Rays
267
272
  }
268
273
  }
269
274
 
270
- static EndType
271
- get_end_type (const Polyline& polyline, bool fill)
275
+ static clip::JoinType
276
+ get_join_type (JoinType join)
277
+ {
278
+ switch (join)
279
+ {
280
+ case JOIN_MITER: return clip::jtMiter;
281
+ case JOIN_ROUND: return clip::jtRound;
282
+ case JOIN_SQUARE: return clip::jtSquare;
283
+ default:
284
+ argument_error(__FILE__, __LINE__, "invalid join type -- %d", join);
285
+ }
286
+
287
+ return clip::jtMiter;// to avoid compiler warning
288
+ }
289
+
290
+ static clip::EndType
291
+ get_end_type (const Polyline& polyline, CapType cap, bool fill)
272
292
  {
273
293
  if (polyline.loop())
274
- return fill ? etClosedPolygon : etClosedLine;
275
- else
276
- return etOpenButt;
294
+ return fill ? clip::etClosedPolygon : clip::etClosedLine;
295
+ else switch (cap)
296
+ {
297
+ case CAP_BUTT: return clip::etOpenButt;
298
+ case CAP_ROUND: return clip::etOpenRound;
299
+ case CAP_SQUARE: return clip::etOpenSquare;
300
+ default:
301
+ argument_error(__FILE__, __LINE__, "invalid cap type -- %d", cap);
302
+ }
303
+
304
+ return clip::etOpenButt;// to avoid compiler warning
277
305
  }
278
306
 
279
307
  static bool
280
308
  add_polyline_to_offsetter (
281
- ClipperOffset* offsetter, const Polyline& polyline, bool hole, bool fill)
309
+ clip::ClipperOffset* offsetter, const Polyline& polyline,
310
+ CapType cap, JoinType join, bool hole, bool fill)
282
311
  {
283
312
  assert(offsetter);
284
313
 
285
314
  if (!polyline) return false;
286
315
 
287
- Path path;
316
+ clip::Path path;
288
317
  Polyline_get_path(&path, polyline, hole);
289
- offsetter->AddPath(path, jtMiter, get_end_type(polyline, fill));
318
+ offsetter->AddPath(
319
+ path, get_join_type(join), get_end_type(polyline, cap, fill));
290
320
  return true;
291
321
  }
292
322
 
293
323
  static bool
294
- add_polygon_to_offsetter (ClipperOffset* offsetter, const Polygon& polygon)
324
+ add_polygon_to_offsetter (
325
+ clip::ClipperOffset* offsetter, const Polygon& polygon,
326
+ CapType cap, JoinType join)
295
327
  {
296
328
  assert(offsetter);
297
329
 
298
330
  bool added = false;
299
331
  for (const auto& line : polygon.self->lines)
300
- added |= add_polyline_to_offsetter(offsetter, line, line.hole(), true);
332
+ {
333
+ added |= add_polyline_to_offsetter(
334
+ offsetter, line, cap, join, line.hole(), true);
335
+ }
301
336
  return added;
302
337
  }
303
338
 
304
339
  static bool
305
- append_outline (Polygon* polygon, const PolyNode& node)
340
+ append_outline (Polygon* polygon, const clip::PolyNode& node)
306
341
  {
307
342
  assert(polygon);
308
343
 
@@ -319,7 +354,7 @@ namespace Rays
319
354
  }
320
355
 
321
356
  static void
322
- append_hole (Polygon* polygon, const PolyNode& node)
357
+ append_hole (Polygon* polygon, const clip::PolyNode& node)
323
358
  {
324
359
  assert(polygon);
325
360
 
@@ -338,7 +373,7 @@ namespace Rays
338
373
  }
339
374
 
340
375
  static void
341
- get_polygon (Polygon* polygon, const PolyNode& node)
376
+ get_polygon (Polygon* polygon, const clip::PolyNode& node)
342
377
  {
343
378
  assert(polygon);
344
379
 
@@ -350,15 +385,16 @@ namespace Rays
350
385
  }
351
386
 
352
387
  static Polygon
353
- clip_polygons (const Polygon& subject, const Polygon& clip, ClipType type)
388
+ clip_polygons (
389
+ const Polygon& subject, const Polygon& clip, clip::ClipType type)
354
390
  {
355
- Clipper c;
391
+ clip::Clipper c;
356
392
  c.StrictlySimple(true);
357
393
 
358
- add_polygon_to_clipper(&c, subject, ptSubject);
359
- add_polygon_to_clipper(&c, clip, ptClip);
394
+ add_polygon_to_clipper(&c, subject, clip::ptSubject);
395
+ add_polygon_to_clipper(&c, clip, clip::ptClip);
360
396
 
361
- PolyTree tree;
397
+ clip::PolyTree tree;
362
398
  c.Execute(type, tree);
363
399
  assert(tree.Contour.empty());
364
400
 
@@ -369,16 +405,19 @@ namespace Rays
369
405
  }
370
406
 
371
407
  static bool
372
- expand_polygon (Polygon* result, const Polygon& polygon, coord width)
408
+ expand_polygon (
409
+ Polygon* result, const Polygon& polygon,
410
+ coord width, CapType cap, JoinType join, coord miter_limit)
373
411
  {
374
412
  if (width == 0)
375
413
  return false;
376
414
 
377
- ClipperOffset co;
378
- if (!add_polygon_to_offsetter(&co, polygon))
415
+ clip::ClipperOffset co;
416
+ co.MiterLimit = miter_limit;
417
+ if (!add_polygon_to_offsetter(&co, polygon, cap, join))
379
418
  return false;
380
419
 
381
- PolyTree tree;
420
+ clip::PolyTree tree;
382
421
  co.Execute(tree, to_clipper(width));
383
422
  assert(tree.Contour.empty());
384
423
 
@@ -387,16 +426,19 @@ namespace Rays
387
426
  }
388
427
 
389
428
  bool
390
- Polyline_expand (Polygon* result, const Polyline& polyline, coord width)
429
+ Polyline_expand (
430
+ Polygon* result, const Polyline& polyline,
431
+ coord width, CapType cap, JoinType join, coord miter_limit)
391
432
  {
392
433
  if (width == 0)
393
434
  return false;
394
435
 
395
- ClipperOffset co;
396
- if (!add_polyline_to_offsetter(&co, polyline, false, false))
436
+ clip::ClipperOffset co;
437
+ co.MiterLimit = miter_limit;
438
+ if (!add_polyline_to_offsetter(&co, polyline, cap, join, false, false))
397
439
  return false;
398
440
 
399
- PolyTree tree;
441
+ clip::PolyTree tree;
400
442
  co.Execute(tree, to_clipper(width));
401
443
  assert(tree.Contour.empty());
402
444
 
@@ -865,6 +907,128 @@ namespace Rays
865
907
  hole_radius * 2, angle_from, angle_to, nsegment);
866
908
  }
867
909
 
910
+ static inline const SplineLib::Vec3f&
911
+ to_splinelib (const Point& val)
912
+ {
913
+ return *(const SplineLib::Vec3f*) &val;
914
+ }
915
+
916
+ static inline const Point&
917
+ to_rays (const SplineLib::Vec3f& val)
918
+ {
919
+ return *(const Point*) &val;
920
+ }
921
+
922
+ enum SplineType {BEZIER, HERMITE, CATMULLROM};
923
+
924
+ typedef SplineLib::cSpline3 (*SplineFun) (
925
+ const SplineLib::Vec3f&, const SplineLib::Vec3f&,
926
+ const SplineLib::Vec3f&, const SplineLib::Vec3f&);
927
+
928
+ static SplineFun
929
+ get_spline_fun (SplineType type)
930
+ {
931
+ switch (type)
932
+ {
933
+ case BEZIER: return SplineLib::BezierSpline;
934
+ case HERMITE: return SplineLib::HermiteSpline;
935
+ case CATMULLROM: return SplineLib::CatmullRomSpline;
936
+ default:
937
+ argument_error(__FILE__, __LINE__, "unknown spline type %d.", type);
938
+ }
939
+ }
940
+
941
+ static Polygon
942
+ create_spline (
943
+ SplineType type,
944
+ const Point* points, size_t size, bool loop,
945
+ uint nsegment = 16)
946
+ {
947
+ if (size % 4 != 0)
948
+ argument_error(__FILE__, __LINE__);
949
+
950
+ size_t count = size / 4;
951
+ auto spline_fun = get_spline_fun(type);
952
+
953
+ std::vector<Point> result;
954
+ result.reserve(nsegment * count);
955
+ for (size_t i = 0; i < count; ++i)
956
+ {
957
+ SplineLib::cSpline3 spline = spline_fun(
958
+ to_splinelib(points[i * 4 + 0]),
959
+ to_splinelib(points[i * 4 + 1]),
960
+ to_splinelib(points[i * 4 + 2]),
961
+ to_splinelib(points[i * 4 + 3]));
962
+ for (uint j = 0; j <= nsegment; ++j)
963
+ {
964
+ float t = (float) j / nsegment;
965
+ result.emplace_back(to_rays(SplineLib::Position(spline, t)));
966
+ }
967
+ }
968
+
969
+ return create_line(&result[0], result.size(), loop);
970
+ }
971
+
972
+ Polygon
973
+ create_curve (
974
+ coord x1, coord y1, coord x2, coord y2,
975
+ coord x3, coord y3, coord x4, coord y4,
976
+ bool loop)
977
+ {
978
+ const Point points[] = {
979
+ Point(x1, y1),
980
+ Point(x2, y2),
981
+ Point(x3, y3),
982
+ Point(x4, y4)
983
+ };
984
+ return create_spline(CATMULLROM, points, 4, loop);
985
+ }
986
+
987
+ Polygon
988
+ create_curve (
989
+ const Point& p1, const Point& p2, const Point& p3, const Point& p4,
990
+ bool loop)
991
+ {
992
+ const Point points[] = {p1, p2, p3, p4};
993
+ return create_spline(CATMULLROM, points, 4, loop);
994
+ }
995
+
996
+ Polygon
997
+ create_curve (const Point* points, size_t size, bool loop)
998
+ {
999
+ return create_spline(CATMULLROM, points, size, loop);
1000
+ }
1001
+
1002
+ Polygon
1003
+ create_bezier (
1004
+ coord x1, coord y1, coord x2, coord y2,
1005
+ coord x3, coord y3, coord x4, coord y4,
1006
+ bool loop)
1007
+ {
1008
+ const Point points[] = {
1009
+ Point(x1, y1),
1010
+ Point(x2, y2),
1011
+ Point(x3, y3),
1012
+ Point(x4, y4)
1013
+ };
1014
+ return create_spline(BEZIER, points, 4, loop);
1015
+ }
1016
+
1017
+ Polygon
1018
+ create_bezier (
1019
+ const Point& p1, const Point& p2, const Point& p3, const Point& p4,
1020
+ bool loop)
1021
+ {
1022
+ const Point points[] = {p1, p2, p3, p4};
1023
+ return create_spline(BEZIER, points, 4, loop);
1024
+ }
1025
+
1026
+ Polygon
1027
+ create_bezier (const Point* points, size_t size, bool loop)
1028
+ {
1029
+ return create_spline(BEZIER, points, size, loop);
1030
+ }
1031
+
868
1032
  void
869
1033
  Polygon_fill (const Polygon& polygon, Painter* painter, const Color& color)
870
1034
  {
@@ -935,9 +1099,11 @@ namespace Rays
935
1099
  }
936
1100
 
937
1101
  bool
938
- Polygon::expand (Polygon* result, coord width) const
1102
+ Polygon::expand (
1103
+ Polygon* result,
1104
+ coord width, CapType cap, JoinType join, coord miter_limit) const
939
1105
  {
940
- return expand_polygon(result, *this, width);
1106
+ return expand_polygon(result, *this, width, cap, join, miter_limit);
941
1107
  }
942
1108
 
943
1109
  Bounds
@@ -1029,7 +1195,7 @@ namespace Rays
1029
1195
  {
1030
1196
  if (lhs.self == rhs.self) return Polygon();
1031
1197
 
1032
- return clip_polygons(lhs, rhs, ctDifference);
1198
+ return clip_polygons(lhs, rhs, clip::ctDifference);
1033
1199
  }
1034
1200
 
1035
1201
  Polygon
@@ -1037,7 +1203,7 @@ namespace Rays
1037
1203
  {
1038
1204
  if (lhs.self == rhs.self) return lhs;
1039
1205
 
1040
- return clip_polygons(lhs, rhs, ctIntersection);
1206
+ return clip_polygons(lhs, rhs, clip::ctIntersection);
1041
1207
  }
1042
1208
 
1043
1209
  Polygon
@@ -1045,7 +1211,7 @@ namespace Rays
1045
1211
  {
1046
1212
  if (lhs.self == rhs.self) return lhs;
1047
1213
 
1048
- return clip_polygons(lhs, rhs, ctUnion);
1214
+ return clip_polygons(lhs, rhs, clip::ctUnion);
1049
1215
  }
1050
1216
 
1051
1217
  Polygon
@@ -1053,7 +1219,7 @@ namespace Rays
1053
1219
  {
1054
1220
  if (lhs.self == rhs.self) return Polygon();
1055
1221
 
1056
- return clip_polygons(lhs, rhs, ctXor);
1222
+ return clip_polygons(lhs, rhs, clip::ctXor);
1057
1223
  }
1058
1224
 
1059
1225