]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/output-def.cc
Merge remote-tracking branch 'origin/translation' into staging
[lilypond.git] / lily / output-def.cc
index 4a1ce211ba741336a20d11d77a01c66e5a7ff62a..898d1b102e770fca72e6e5ca9034520b078d8d60 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  music-output-def.cc -- implement Output_def
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  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 <http://www.gnu.org/licenses/>.
 */
 
 #include "output-def.hh"
@@ -31,7 +42,7 @@ Output_def::Output_def ()
 
   smobify_self ();
 
-  scope_ = ly_make_anonymous_module (false);
+  scope_ = ly_make_module (false);
 }
 
 Output_def::Output_def (Output_def const &s)
@@ -41,7 +52,7 @@ Output_def::Output_def (Output_def const &s)
   smobify_self ();
 
   input_origin_ = s.input_origin_;
-  scope_ = ly_make_anonymous_module (false);
+  scope_ = ly_make_module (false);
   if (ly_is_module (s.scope_))
     ly_module_copy (scope_, s.scope_);
 }
@@ -118,7 +129,7 @@ Output_def::lookup_variable (SCM sym) const
 }
 
 SCM
-Output_def::c_variable (string s) const
+Output_def::c_variable (const string &s) const
 {
   return lookup_variable (ly_symbol2scm (s.c_str ()));
 }
@@ -135,13 +146,24 @@ Output_def::normalize ()
   Real paper_width;
   SCM scm_paper_width = c_variable ("paper-width");
 
+  bool twosided = to_boolean (c_variable ("two-sided"));
+  // We don't distinguish between outer-margin / left-margin and so on
+  // until page-stencil positioning in page.scm
   Real left_margin, left_margin_default;
-  SCM scm_left_margin_default = c_variable ("left-margin-default");
-  SCM scm_left_margin = c_variable ("left-margin");
+  SCM scm_left_margin_default = (twosided
+                                 ? c_variable ("outer-margin-default-scaled")
+                                 : c_variable ("left-margin-default-scaled"));
+  SCM scm_left_margin = (twosided
+                         ? c_variable ("outer-margin")
+                         : c_variable ("left-margin"));
 
   Real right_margin, right_margin_default;
-  SCM scm_right_margin_default = c_variable ("right-margin-default");
-  SCM scm_right_margin = c_variable ("right-margin");
+  SCM scm_right_margin_default = (twosided
+                                  ? c_variable ("inner-margin-default-scaled")
+                                  : c_variable ("right-margin-default-scaled"));
+  SCM scm_right_margin = (twosided
+                          ? c_variable ("inner-margin")
+                          : c_variable ("right-margin"));
 
   if (scm_paper_width == SCM_UNDEFINED
       || scm_left_margin_default == SCM_UNDEFINED
@@ -162,14 +184,18 @@ Output_def::normalize ()
     = paper_width - left_margin_default - right_margin_default;
   SCM scm_line_width = c_variable ("line-width");
 
+  Real binding_offset = 0;
+  if (twosided)
+    binding_offset = robust_scm2double (c_variable ("binding-offset"), 0);
+
   if (scm_line_width == SCM_UNDEFINED)
     {
       left_margin = ((scm_left_margin == SCM_UNDEFINED)
-                    ? left_margin_default
-                    : scm_to_double (scm_left_margin));
+                     ? left_margin_default
+                     : scm_to_double (scm_left_margin));
       right_margin = ((scm_right_margin == SCM_UNDEFINED)
-                     ? right_margin_default
-                     : scm_to_double (scm_right_margin));
+                      ? right_margin_default
+                      : scm_to_double (scm_right_margin)) + binding_offset;
       line_width = paper_width - left_margin - right_margin;
     }
   else
@@ -177,15 +203,15 @@ Output_def::normalize ()
       line_width = scm_to_double (scm_line_width);
       if (scm_left_margin == SCM_UNDEFINED)
         {
-         // Vertically center systems if only line-width is given
-         if (scm_right_margin == SCM_UNDEFINED)
+          // Vertically center systems if only line-width is given
+          if (scm_right_margin == SCM_UNDEFINED)
             {
               left_margin = (paper_width - line_width) / 2;
               right_margin = left_margin;
             }
           else
             {
-              right_margin = scm_to_double (scm_right_margin);
+              right_margin = scm_to_double (scm_right_margin) + binding_offset;
               left_margin = paper_width - line_width - right_margin;
             }
         }
@@ -194,7 +220,7 @@ Output_def::normalize ()
           left_margin = scm_to_double (scm_left_margin);
           right_margin = ((scm_right_margin == SCM_UNDEFINED)
                            ? (paper_width - line_width - left_margin)
-                           : scm_to_double (scm_right_margin));
+                           : scm_to_double (scm_right_margin)) + binding_offset;
         }
     }