ShapeDistanceFinder.hpp 2.6 KB

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