2
0

ShapeDistanceFinder.hpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include "ShapeDistanceFinder.h"
  2. #include <cstddef>
  3. namespace msdfgen {
  4. template <class ContourCombiner>
  5. ShapeDistanceFinder<ContourCombiner>::ShapeDistanceFinder(const Shape &shape) : shape(shape), contourCombiner(shape), shapeEdgeCache(shape.edgeCount()) { }
  6. template <class ContourCombiner>
  7. typename ShapeDistanceFinder<ContourCombiner>::DistanceType ShapeDistanceFinder<ContourCombiner>::distance(const Point2 &origin) {
  8. contourCombiner.reset(origin);
  9. #ifdef MSDFGEN_USE_CPP11
  10. typename ContourCombiner::EdgeSelectorType::EdgeCache *edgeCache = shapeEdgeCache.data();
  11. #else
  12. typename ContourCombiner::EdgeSelectorType::EdgeCache *edgeCache = shapeEdgeCache.empty() ? NULL : &shapeEdgeCache[0];
  13. #endif
  14. for (std::vector<Contour>::const_iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour) {
  15. if (!contour->edges.empty()) {
  16. typename ContourCombiner::EdgeSelectorType &edgeSelector = contourCombiner.edgeSelector(int(contour-shape.contours.begin()));
  17. const EdgeSegment *prevEdge = contour->edges.size() >= 2 ? *(contour->edges.end()-2) : *contour->edges.begin();
  18. const EdgeSegment *curEdge = contour->edges.back();
  19. for (std::vector<EdgeHolder>::const_iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge) {
  20. const EdgeSegment *nextEdge = *edge;
  21. edgeSelector.addEdge(*edgeCache++, prevEdge, curEdge, nextEdge);
  22. prevEdge = curEdge;
  23. curEdge = nextEdge;
  24. }
  25. }
  26. }
  27. return contourCombiner.distance();
  28. }
  29. template <class ContourCombiner>
  30. typename ShapeDistanceFinder<ContourCombiner>::DistanceType ShapeDistanceFinder<ContourCombiner>::oneShotDistance(const Shape &shape, const Point2 &origin) {
  31. ContourCombiner contourCombiner(shape);
  32. contourCombiner.reset(origin);
  33. for (std::vector<Contour>::const_iterator contour = shape.contours.begin(); contour != shape.contours.end(); ++contour) {
  34. if (!contour->edges.empty()) {
  35. typename ContourCombiner::EdgeSelectorType &edgeSelector = contourCombiner.edgeSelector(int(contour-shape.contours.begin()));
  36. const EdgeSegment *prevEdge = contour->edges.size() >= 2 ? *(contour->edges.end()-2) : *contour->edges.begin();
  37. const EdgeSegment *curEdge = contour->edges.back();
  38. for (std::vector<EdgeHolder>::const_iterator edge = contour->edges.begin(); edge != contour->edges.end(); ++edge) {
  39. const EdgeSegment *nextEdge = *edge;
  40. typename ContourCombiner::EdgeSelectorType::EdgeCache dummy;
  41. edgeSelector.addEdge(dummy, prevEdge, curEdge, nextEdge);
  42. prevEdge = curEdge;
  43. curEdge = nextEdge;
  44. }
  45. }
  46. }
  47. return contourCombiner.distance();
  48. }
  49. }