X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbox.cc;h=6569493419da6a66c44077feab15ea5297c46ee9;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=6f8bf3439496eadd80957e6f92615494fa2a8752;hpb=c5402461ab1d1cdbaa684b0e55d4851f0e28e37a;p=lilypond.git diff --git a/lily/box.cc b/lily/box.cc index 6f8bf34394..6569493419 100644 --- a/lily/box.cc +++ b/lily/box.cc @@ -1,56 +1,86 @@ /* - box.cc -- implement Box + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1996--2015 Han-Wen Nienhuys - (c) 1996--2000 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "box.hh" -#include "array.hh" void Box::translate (Offset o) { - for (Axis i=X_AXIS; i < NO_AXES; incr(i)) - interval_a_[i] += o[i]; + for (Axis i = X_AXIS; i < NO_AXES; incr (i)) + if (!is_empty (i)) + interval_a_[i] += o[i]; } void Box::unite (Box b) { - for (Axis i=X_AXIS; i < NO_AXES; incr(i)) + for (Axis i = X_AXIS; i < NO_AXES; incr (i)) interval_a_[i].unite (b[i]); } -/** - Initialize to empty. - */ -Box::Box() -{ +Real +Box::area () const +{ + return interval_a_[X_AXIS].length () + * interval_a_[Y_AXIS].length (); +} + +Box::Box () +{ } void Box::set_empty () { interval_a_[X_AXIS].set_empty (); - interval_a_[Y_AXIS].set_empty (); + interval_a_[Y_AXIS].set_empty (); +} + +bool +Box::is_empty () const +{ + return is_empty (X_AXIS) && is_empty (Y_AXIS); +} + +bool +Box::is_empty (Axis a) const +{ + Interval empty; + empty.set_empty (); + return interval_a_[a][LEFT] == empty[LEFT] + && interval_a_[a][RIGHT] == empty[RIGHT]; } Box::Box (Interval ix, Interval iy) { - x() = ix; - y() = iy; + x () = ix; + y () = iy; } Interval & -Box::operator[] (Axis a) +Box::operator [] (Axis a) { return interval_a_[a]; } Interval -Box::operator[] (Axis a)const +Box::operator [] (Axis a) const { return interval_a_[a]; } @@ -61,3 +91,46 @@ Box::scale (Real s) interval_a_[X_AXIS] *= s; interval_a_[Y_AXIS] *= s; } + +void +Box::add_point (Offset o) +{ + interval_a_[X_AXIS].add_point (o[X_AXIS]); + interval_a_[Y_AXIS].add_point (o[Y_AXIS]); +} + +Offset +Box::center () const +{ + return Offset (interval_a_[X_AXIS].center (), + interval_a_[Y_AXIS].center ()); +} + +void +Box::widen (Real x, Real y) +{ + interval_a_[X_AXIS].widen (x); + interval_a_[Y_AXIS].widen (y); +} + +void +Box::intersect (Box b) +{ + interval_a_[X_AXIS].intersect (b[X_AXIS]); + interval_a_[Y_AXIS].intersect (b[Y_AXIS]); +} + +// for debugging + +void +Box::print () +{ + printf ("X left %4.4f right %4.4f Y down %4.4f up %4.4f\n", + interval_a_[X_AXIS][LEFT], interval_a_[X_AXIS][RIGHT], + interval_a_[Y_AXIS][DOWN], interval_a_[Y_AXIS][UP]); +} + +/****************************************************************/ + + +const char * const Box::type_p_name_ = "ly:box?";