diff --git a/Resources/Templates/default.lyt b/Resources/Templates/default.lyt index 6681e41..32833eb 100644 --- a/Resources/Templates/default.lyt +++ b/Resources/Templates/default.lyt @@ -9,7 +9,7 @@ } \paper { - #(set-paper-size "<{PAPERSIZE}>") + #(set-paper-size <{PAPERSIZE}>) indent = 0.0\cm pagenumber = no page-top-space = #.1 diff --git a/Sources/VLLilypondDocument.mm b/Sources/VLLilypondDocument.mm index e2b732a..112ab3e 100644 --- a/Sources/VLLilypondDocument.mm +++ b/Sources/VLLilypondDocument.mm @@ -11,6 +11,8 @@ #import "VLLilypondDocument.h" #import "VLLilypondWriter.h" +#import + @interface NSMutableString (VLLilypond) - (void) substituteMacro:(NSString *)macro withValue:(NSString *)value; @@ -103,6 +105,14 @@ @end +static NSSize sPaperSizes[] = { + {842.0f, 1191.0f}, {595.0f, 842.0f}, {421.0f, 595.0f}, {298.0f, 421.0f}, + {612.0f, 1008.0f}, {612.0f, 792.0f}, {792.0f, 1224.0f} +}; +static const char * sPaperNames[] = { + "a3", "a4", "a5", "a6", "letter", "legal", "11x17", 0 +}; + @implementation VLDocument (Lilypond) - (NSData *)lilypondDataWithError:(NSError **)outError @@ -116,13 +126,36 @@ NSStringEncoding enc = NSUTF8StringEncoding; NSMutableString * ly = [NSMutableString stringWithContentsOfFile:tmpl encoding:enc error:outError]; + NSPrintInfo * pi = [self printInfo]; + NSSize sz = [pi paperSize]; + int bestPaper = -1; + float bestDist = 1e10f; + + if ([pi orientation] == NSLandscapeOrientation) + std::swap(sz.width, sz.height); + + for (int paper = 0; sPaperNames[paper]; ++paper) { + float dist = hypotf(sz.width - sPaperSizes[paper].width, + sz.height- sPaperSizes[paper].height); + if (dist < bestDist) { + bestPaper = paper; + bestDist = dist; + } + } + + NSString * paper = [NSString stringWithFormat: + [pi orientation] == NSLandscapeOrientation ? @"\"%s\" 'landscape" : @"\"%s\"", + sPaperNames[bestPaper]]; + float scaling= [[[pi dictionary] objectForKey:NSPrintScalingFactor] + floatValue]; + [ly substituteMacro:@"TITLE" withValue:songTitle]; [ly substituteMacro:@"POET" withValue:songLyricist]; [ly substituteMacro:@"COMPOSER" withValue:songComposer]; [ly substituteMacro:@"ARRANGER" withValue:songArranger]; [ly substituteMacro:@"VLVERSION" withValue: [bndl objectForInfoDictionaryKey:@"CFBundleVersion"]]; - [ly substituteMacro:@"PAPERSIZE" withValue:@"letter"]; + [ly substituteMacro:@"PAPERSIZE" withValue:paper]; [ly substituteMacro:@"FORMATTING" withValue:@"ragged-last-bottom = ##f"]; [ly substituteMacro:@"VLVERSION" withValue: [bndl objectForInfoDictionaryKey:@"CFBundleVersion"]]; @@ -131,7 +164,7 @@ [ly substituteMacro:@"LYRICSIZE" withValue: [NSString stringWithFormat:@"%.1f", lyricSize]]; [ly substituteMacro:@"STAFFSIZE" withValue: - [NSString stringWithFormat:@"%.1f", staffSize]]; + [NSString stringWithFormat:@"%.1f", staffSize*scaling]]; [ly substituteMacro:@"CHORDS" withValue: [NSString stringWithUTF8String:writer.Chords().c_str()]]; [ly substituteMacro:@"NOTES" withValue: diff --git a/Sources/VLXMLDocument.mm b/Sources/VLXMLDocument.mm index 1a2e95a..0c611ab 100644 --- a/Sources/VLXMLDocument.mm +++ b/Sources/VLXMLDocument.mm @@ -15,6 +15,8 @@ - (NSFileWrapper *)XMLFileWrapperWithError:(NSError **)outError flat:(BOOL)flat; { + static NSArray * sPropertyKeys = nil; + NSFileWrapper * contents = [self fileWrapperWithFilter:@"VLMusicXMLType" error:outError]; if (!contents) { @@ -30,6 +32,17 @@ [wrap addFileWrapper:contents]; if (vcsWrapper) [wrap addFileWrapper:vcsWrapper]; + NSData * pd = [NSArchiver archivedDataWithRootObject: + [self printInfo]]; + [wrap addRegularFileWithContents:pd preferredFilename:@"PrintInfo"]; + if (!sPropertyKeys) + sPropertyKeys = [[NSArray alloc] initWithObjects: + @"staffSize", @"chordSize", @"lyricSize", nil]; + NSData * prop = [NSPropertyListSerialization dataFromPropertyList: + [self dictionaryWithValuesForKeys:sPropertyKeys] + format:NSPropertyListXMLFormat_v1_0 + errorDescription:nil]; + [wrap addRegularFileWithContents:prop preferredFilename:@"Properties"]; return wrap; } @@ -44,7 +57,7 @@ ) [vcsWrapper retain]; // - // Read properties dictionary for backward compatibility + // Read properties dictionary // NSFileWrapper * prop = [wrappers objectForKey:@"Properties"]; if (prop) { @@ -57,6 +70,17 @@ format:nil errorDescription:nil]]; [undoMgr enableUndoRegistration]; } + // + // Read print info + NSFileWrapper * print = [wrappers objectForKey:@"PrintInfo"]; + if (print) { + NSUndoManager * undoMgr = [self undoManager]; + [undoMgr disableUndoRegistration]; + NSPrintInfo * pi = [NSUnarchiver unarchiveObjectWithData: + [print regularFileContents]]; + [self setPrintInfo:pi]; + [undoMgr enableUndoRegistration]; + } return [self readFromFileWrapper:[wrappers objectForKey:@"Song"] withFilter:@"VLMusicXMLType" error:outError]; } else {