20 #ifndef GNASH_SNAPPINGRANGE_H
21 #define GNASH_SNAPPINGRANGE_H
29 #include <boost/cstdint.hpp>
74 template<
typename T>
inline bool snaptest(
75 const geometry::Range2d<T>& range1,
76 const geometry::Range2d<T>& range2,
const float snapFactor);
87 template<
typename U>
friend std::ostream&
operator<<(std::ostream& os,
100 template <
typename U>
127 _snapFactor = factor;
146 _rangesLimit = limit;
156 _snapFactor = from._snapFactor;
157 _singleMode = from._singleMode;
167 _snapFactor(snapFactor)
171 if (snaptest(r, _rt, _snapFactor)) {
179 const float _snapFactor;
196 GrowBy(
const float factor) : _factor(factor) {}
256 if (range.
isNull())
return;
259 if (_ranges.empty()) _ranges.resize(1);
260 _ranges[0].expandTo(range);
264 ExpandToIfSnap exp(range, _snapFactor);
265 if (
visit(exp))
return;
268 _ranges.push_back(range);
284 std::for_each(_ranges.begin(), _ranges.end(), GrowBy(amount));
293 std::for_each(_ranges.begin(), _ranges.end(), Scale(factor));
306 _ranges[0].setWorld();
311 return ((
size()==1) && (_ranges.front().isWorld()));
316 return _ranges.empty();
322 return _ranges.size();
329 return _ranges[index];
339 int rcount = _ranges.size();
341 for (
int rno=0; rno<rcount; rno++)
356 return std::find_if(_ranges.begin(), _ranges.end(), IntersectsRange(r))
364 return std::find_if(_ranges.begin(), _ranges.end(), ContainsPoint(x, y))
376 return std::find_if(_ranges.begin(), _ranges.end(), ContainsRange(r))
395 if (
isNull() )
return false;
396 if ( o.
isNull() )
return false;
406 for (
unsigned rno=0, rcount=o.
size(); rno<rcount; rno++)
438 std::vector<SnappingRanges2d<T> > list;
439 list.reserve(o.
size());
442 for (
unsigned rno=0, rcount=o.
size(); rno<rcount; rno++) {
445 list.push_back(*
this);
448 list.back().intersect(o.
getRange(rno));
454 for (
size_type lno=0, lcount=list.size(); lno<lcount; lno++) {
484 for (
int rno=_ranges.size()-1; rno>=0; rno--) {
489 _ranges.erase(_ranges.begin() + rno);
491 _ranges[rno] = newrange;
500 if (_singleMode)
return;
508 int rcount = _ranges.size();
512 for (
int i=0;
i<rcount;
i++) {
514 for (
int j=
i+1;
j<rcount;
j++) {
516 if (snaptest(_ranges[
i], _ranges[
j], _snapFactor)) {
518 _ranges[
i].expandTo(_ranges[j]);
520 _ranges.erase(_ranges.begin() +
j);
533 if (_ranges.size() > _rangesLimit) {
557 template<
class V>
inline bool visit(
V& visitor)
const
559 typename RangeList::iterator it,
e;
560 for (it = _ranges.begin(), e = _ranges.end(); it !=
e; ++it) {
561 if (!visitor(*it))
break;
563 return it != _ranges.end();
573 template<
class V>
inline void visitAll(
V& visitor)
const
575 for_each(_ranges.begin(), _ranges.end(), visitor);
583 void combineRangesLazy()
const {
589 void finalize()
const {
615 operator<< (std::ostream& os, const SnappingRanges2d<T>&
r)
617 if (
r.isNull() )
return os <<
"NULL";
618 if (
r.isWorld() )
return os <<
"WORLD";
622 const R& ranges =
r._ranges;
624 std::copy(ranges.begin(), ranges.end(),
625 std::ostream_iterator<typename R::value_type>(os,
","));