Skip to content

Commit a11a200

Browse files
benwafflecbjeukendrup
authored andcommitted
Embed pdf inside mscz
1 parent ece9d0e commit a11a200

File tree

3 files changed

+70
-0
lines changed

3 files changed

+70
-0
lines changed

src/engraving/infrastructure/mscwriter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@ void MscWriter::writeThumbnailFile(const ByteArray& data)
183183
addFileData(u"Thumbnails/thumbnail.png", data);
184184
}
185185

186+
void MscWriter::writePdfFile(const ByteArray& data)
187+
{
188+
addFileData(u"preview.pdf", data);
189+
}
190+
186191
void MscWriter::addImageFile(const String& fileName, const ByteArray& data)
187192
{
188193
addFileData(u"Pictures/" + fileName, data);

src/engraving/infrastructure/mscwriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class MscWriter
6363
void addExcerptFile(const muse::String& excerptFileName, const muse::ByteArray& data);
6464
void writeChordListFile(const muse::ByteArray& data);
6565
void writeThumbnailFile(const muse::ByteArray& data);
66+
void writePdfFile(const muse::ByteArray& data);
6667
void addImageFile(const muse::String& fileName, const muse::ByteArray& data);
6768
void writeAudioFile(const muse::ByteArray& data);
6869
void writeAudioSettingsJsonFile(const muse::ByteArray& data, const muse::io::path_t& pathPrefix = "");

src/engraving/rw/mscsaver.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,69 @@
2828
#include "dom/imageStore.h"
2929
#include "dom/audio.h"
3030

31+
#include "draw/painter.h"
32+
3133
#include "rwregister.h"
3234
#include "inoutdata.h"
3335

3436
#include "log.h"
3537

38+
#ifndef NO_QT_SUPPORT
39+
#include <QPdfWriter>
40+
#endif
41+
3642
using namespace mu;
3743
using namespace muse;
3844
using namespace muse::io;
45+
using namespace draw;
3946
using namespace mu::engraving;
4047
using namespace mu::engraving::rw;
4148

49+
#ifndef NO_QT_SUPPORT
50+
static void writePdfPreview(MasterScore* score, io::IODevice* pdfBuf)
51+
{
52+
QByteArray qdata;
53+
QBuffer buf(&qdata);
54+
buf.open(QIODevice::WriteOnly);
55+
56+
QPdfWriter pdfWriter(&buf);
57+
58+
pdfWriter.setResolution(mu::engraving::DPI);
59+
pdfWriter.setCreator(QString("MuseScore Studio Version: ") + QString(score->appVersion()));
60+
pdfWriter.setPageMargins(QMarginsF());
61+
62+
SizeF size = score->renderer()->pageSizeInch(score);
63+
pdfWriter.setPageLayout(QPageLayout(QPageSize(size.toQSizeF(), QPageSize::Inch), QPageLayout::Orientation::Portrait, QMarginsF()));
64+
65+
QString title = score->metaTag(u"workTitle");
66+
if (title.isEmpty()) {
67+
title = score->name();
68+
}
69+
pdfWriter.setTitle(title);
70+
71+
Painter painter(&pdfWriter, "pdfwriter");
72+
73+
rendering::IScoreRenderer::PaintOptions opt;
74+
opt.deviceDpi = pdfWriter.logicalDpiX();
75+
opt.onNewPage = [&pdfWriter]() { pdfWriter.newPage(); };
76+
opt.printPageBackground = true;
77+
opt.isSetViewport = true;
78+
opt.isMultiPage = false;
79+
opt.isPrinting = true;
80+
opt.onPaintPageSheet = [](Painter* painter, const Page* page, const RectF& pageRect) {
81+
UNUSED(page);
82+
painter->fillRect(pageRect, Color::WHITE);
83+
};
84+
85+
score->renderer()->paintScore(&painter, score, opt);
86+
87+
painter.endDraw();
88+
89+
pdfBuf->write(qdata);
90+
}
91+
92+
#endif
93+
4294
bool MscSaver::writeMscz(MasterScore* score, MscWriter& mscWriter, bool onlySelection, bool doCreateThumbnail)
4395
{
4496
TRACEFUNC;
@@ -147,6 +199,18 @@ bool MscSaver::writeMscz(MasterScore* score, MscWriter& mscWriter, bool onlySele
147199
}
148200
}
149201

202+
// Write PDF file, used for macOS Quick Look
203+
// TODO: do we always want this? e.g. when is doCreateThumbnail false?
204+
#ifndef NO_QT_SUPPORT
205+
{
206+
ByteArray pdfData;
207+
Buffer pdfBuf(&pdfData);
208+
pdfBuf.open(IODevice::WriteOnly);
209+
writePdfPreview(score, &pdfBuf);
210+
mscWriter.writePdfFile(pdfData);
211+
}
212+
#endif
213+
150214
// Write audio
151215
{
152216
if (score->audio()) {

0 commit comments

Comments
 (0)