MuseScore/libmscore/mscore.cpp

521 lines
19 KiB
C++
Raw Normal View History

2012-05-26 14:26:10 +02:00
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2011 Werner Schweer
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
2012-07-16 15:49:24 +02:00
#include "config.h"
#include "musescoreCore.h"
2012-05-26 14:26:10 +02:00
#include "style.h"
#include "mscore.h"
#include "sequencer.h"
#include "element.h"
#include "dynamic.h"
#include "accidental.h"
2012-05-26 14:26:10 +02:00
#include "figuredbass.h"
#include "stafftype.h"
2012-08-04 15:46:43 +02:00
#include "note.h"
2012-09-12 11:16:36 +02:00
#include "spanner.h"
2012-09-17 15:37:31 +02:00
#include "volta.h"
2012-09-17 17:35:49 +02:00
#include "ottava.h"
2012-09-17 18:09:30 +02:00
#include "trill.h"
2013-02-25 14:56:34 +01:00
#include "repeat.h"
#include "jump.h"
#include "marker.h"
2013-10-05 23:13:33 +02:00
#include "layoutbreak.h"
#include "hairpin.h"
#include "glissando.h"
2014-03-18 15:53:52 +01:00
#include "page.h"
2014-04-25 18:43:25 +02:00
#include "slur.h"
#include "lyrics.h"
#include "accidental.h"
#include "notedot.h"
#include "tie.h"
#include "staff.h"
#include "beam.h"
2014-04-25 18:43:25 +02:00
#include "timesig.h"
#include "part.h"
#include "measure.h"
#include "score.h"
#include "keysig.h"
#include "harmony.h"
#include "cursor.h"
#include "stafftext.h"
#include "mscoreview.h"
2014-04-25 19:11:33 +02:00
#include "plugins.h"
#include "chord.h"
#include "hook.h"
#include "stem.h"
2015-03-19 10:28:01 +01:00
#include "stemslash.h"
2015-04-07 10:26:33 +02:00
#include "fraction.h"
2015-04-22 21:22:06 +02:00
#include "excerpt.h"
2016-03-05 15:31:26 +01:00
#include "spatium.h"
#include "barline.h"
2012-05-26 14:26:10 +02:00
2013-05-13 18:49:17 +02:00
namespace Ms {
bool MScore::debugMode = false;
bool MScore::testMode = false;
2016-06-02 12:50:00 +02:00
// #ifndef NDEBUG
bool MScore::showSegmentShapes = false;
bool MScore::showMeasureShapes = false;
bool MScore::noHorizontalStretch = false;
bool MScore::noVerticalStretch = false;
bool MScore::showBoundingRect = false;
bool MScore::showCorruptedMeasures = true;
bool MScore::useFallbackFont = true;
2016-06-02 12:50:00 +02:00
// #endif
bool MScore::saveTemplateMode = false;
2014-02-28 11:14:43 +01:00
bool MScore::noGui = false;
2012-05-26 14:26:10 +02:00
MStyle* MScore::_defaultStyleForParts;
2012-05-26 14:26:10 +02:00
QString MScore::_globalShare;
int MScore::_vRaster;
int MScore::_hRaster;
bool MScore::_verticalOrientation = false;
2015-12-11 14:30:54 +01:00
qreal MScore::verticalPageGap = 5.0;
qreal MScore::horizontalPageGapEven = 1.0;
qreal MScore::horizontalPageGapOdd = 50.0;
2012-05-26 14:26:10 +02:00
QColor MScore::selectColor[VOICES];
QColor MScore::defaultColor;
QColor MScore::layoutBreakColor;
2013-07-04 21:07:38 +02:00
QColor MScore::frameMarginColor;
2012-05-26 14:26:10 +02:00
QColor MScore::bgColor;
QColor MScore::dropColor;
bool MScore::warnPitchRange;
bool MScore::playRepeats;
bool MScore::panPlayback;
qreal MScore::nudgeStep;
qreal MScore::nudgeStep10;
qreal MScore::nudgeStep50;
2012-05-26 14:26:10 +02:00
int MScore::defaultPlayDuration;
2017-01-05 11:23:47 +01:00
2012-05-26 14:26:10 +02:00
QString MScore::lastError;
int MScore::division = 480; // 3840; // pulses per quarter note (PPQ) // ticks per beat
2012-05-26 14:26:10 +02:00
int MScore::sampleRate = 44100;
int MScore::mtcType;
bool MScore::noExcerpts = false;
bool MScore::noImages = false;
bool MScore::pdfPrinting = false;
bool MScore::svgPrinting = false;
2016-09-03 17:45:59 +02:00
double MScore::pixelRatio = 0.8; // DPI / logicalDPI
MPaintDevice* MScore::_paintDevice;
2014-04-25 18:43:25 +02:00
#ifdef SCRIPT_INTERFACE
QQmlEngine* MScore::_qml = 0;
#endif
2012-05-26 14:26:10 +02:00
Sequencer* MScore::seq = 0;
MuseScoreCore* MuseScoreCore::mscoreCore;
2012-05-26 14:26:10 +02:00
extern void initDrumset();
2013-11-11 16:53:03 +01:00
extern void initScoreFonts();
2014-04-25 19:11:33 +02:00
extern QString mscoreGlobalShare;
2012-05-26 14:26:10 +02:00
#define TR(a) QT_TRANSLATE_NOOP("error", a)
std::vector<MScoreError> MScore::errorList {
{ MS_NO_ERROR, 0, 0 },
{ NO_NOTE_SELECTED, "s1", TR("No note selected:\nPlease select a note and retry\n") },
{ NO_CHORD_REST_SELECTED, "s2", TR("No chord/rest selected:\nPlease select a chord or rest and retry") },
{ NO_LYRICS_SELECTED, "s3", TR("No note or lyrics selected:\nPlease select a note or lyrics and retry") },
{ NO_NOTE_REST_SELECTED, "s4", TR("No note or rest selected:\nPlease select a note or rest and retry") },
{ NO_NOTE_SLUR_SELECTED, "s5", TR("No note or slur selected:\nPlease select a note or slur and retry") },
{ NO_STAFF_SELECTED, "s6", TR("No staff selected:\nPlease select one or more staves and retry\n") },
{ NO_NOTE_FIGUREDBASS_SELECTED, "s7", TR("No note or figured bass selected:\nPlease select a note or figured bass and retry") },
{ CANNOT_INSERT_TUPLET, "t1", TR("Cannot insert chord/rest in tuplet") },
{ CANNOT_SPLIT_TUPLET, "t2", TR("Cannot split tuplet") },
{ CANNOT_SPLIT_MEASURE_FIRST_BEAT, "m1", TR("Cannot split measure here:\n" "First beat of measure") },
{ CANNOT_SPLIT_MEASURE_TUPLET, "m2", TR("Cannot split measure here:\n" "Cannot split tuplet") },
{ NO_DEST, "p1", TR("No destination to paste") },
{ DEST_TUPLET, "p2", TR("Cannot paste into tuplet") },
{ TUPLET_CROSSES_BAR, "p3", TR("Tuplet cannot cross barlines") },
{ DEST_LOCAL_TIME_SIGNATURE, "p4", TR("Cannot paste in local time signature") },
{ DEST_TREMOLO, "p5", TR("Cannot paste in tremolo") },
{ NO_MIME, "p6", TR("Nothing to paste") },
{ DEST_NO_CR, "p7", TR("Destination is not a chord or rest") },
{ CANNOT_CHANGE_LOCAL_TIMESIG, "l1", TR("Cannot change local time signature:\nMeasure is not empty") },
};
#undef TR
2016-11-28 18:25:27 +01:00
MsError MScore::_error { MS_NO_ERROR };
2016-03-02 13:20:19 +01:00
//---------------------------------------------------------
// Direction
//---------------------------------------------------------
2017-06-22 12:42:14 +02:00
Direction toDirection(const QString& s)
2016-03-02 13:20:19 +01:00
{
2017-06-22 12:42:14 +02:00
Direction val;
2016-03-02 13:20:19 +01:00
if (s == "up")
2017-06-22 12:42:14 +02:00
val = Direction::UP;
2016-03-02 13:20:19 +01:00
else if (s == "down")
2017-06-22 12:42:14 +02:00
val = Direction::DOWN;
2016-03-02 13:20:19 +01:00
else if (s == "auto")
2017-06-22 12:42:14 +02:00
val = Direction::AUTO;
2016-03-02 13:20:19 +01:00
else
2017-06-22 12:42:14 +02:00
val = Direction(s.toInt());
return val;
2016-03-02 13:20:19 +01:00
}
//---------------------------------------------------------
// Direction::toString
//---------------------------------------------------------
2017-06-22 12:42:14 +02:00
const char* toString(Direction val)
2016-03-02 13:20:19 +01:00
{
switch (val) {
2017-06-22 12:42:14 +02:00
case Direction::AUTO: return "auto";
case Direction::UP: return "up";
case Direction::DOWN: return "down";
2016-03-02 13:20:19 +01:00
}
__builtin_unreachable();
}
//---------------------------------------------------------
// fillComboBox
//---------------------------------------------------------
2017-06-22 12:42:14 +02:00
void fillComboBoxDirection(QComboBox* cb)
2016-03-02 13:20:19 +01:00
{
cb->clear();
2017-06-22 12:42:14 +02:00
cb->addItem(qApp->translate("Direction", "auto"), QVariant::fromValue<Direction>(Direction::AUTO));
cb->addItem(qApp->translate("Direction", "up"), QVariant::fromValue<Direction>(Direction::UP));
cb->addItem(qApp->translate("Direction", "down"), QVariant::fromValue<Direction>(Direction::DOWN));
2016-03-02 13:20:19 +01:00
}
2017-06-26 18:09:56 +02:00
//---------------------------------------------------------
// doubleToSpatium
//---------------------------------------------------------
static Spatium doubleToSpatium(double d)
{
return Spatium(d);
}
2016-03-05 15:31:26 +01:00
2012-05-26 14:26:10 +02:00
//---------------------------------------------------------
// init
//---------------------------------------------------------
void MScore::init()
{
2016-03-05 15:31:26 +01:00
if (!QMetaType::registerConverter<Spatium, double>(&Spatium::toDouble))
qFatal("registerConverter Spatium::toDouble failed");
if (!QMetaType::registerConverter<double, Spatium>(&doubleToSpatium))
2017-01-16 20:51:12 +01:00
qFatal("registerConverter doubleToSpatium failed");
2017-06-26 18:09:56 +02:00
// if (!QMetaType::registerComparators<Spatium>())
// qFatal("registerComparators for Spatium failed");
2016-03-05 15:31:26 +01:00
2012-07-13 16:11:39 +02:00
#ifdef SCRIPT_INTERFACE
2016-03-02 13:20:19 +01:00
qRegisterMetaType<Note::ValueType> ("ValueType");
qRegisterMetaType<MScore::DirectionH>("DirectionH");
qRegisterMetaType<Element::Placement>("Placement");
2016-03-02 13:20:19 +01:00
qRegisterMetaType<Spanner::Anchor> ("Anchor");
qRegisterMetaType<NoteHead::Group> ("NoteHeadGroup");
qRegisterMetaType<NoteHead::Type>("NoteHeadType");
2017-03-08 13:12:26 +01:00
qRegisterMetaType<SegmentType>("SegmentType");
2012-08-11 01:15:22 +02:00
qRegisterMetaType<FiguredBassItem::Modifier>("Modifier");
qRegisterMetaType<FiguredBassItem::Parenthesis>("Parenthesis");
qRegisterMetaType<FiguredBassItem::ContLine>("ContLine");
qRegisterMetaType<Volta::Type>("VoltaType");
2017-03-08 14:18:34 +01:00
qRegisterMetaType<OttavaType>("OttavaType");
2014-06-25 14:07:43 +02:00
qRegisterMetaType<Trill::Type>("TrillType");
qRegisterMetaType<Dynamic::Range>("DynamicRange");
qRegisterMetaType<Jump::Type>("JumpType");
qRegisterMetaType<Marker::Type>("MarkerType");
qRegisterMetaType<Beam::Mode>("BeamMode");
qRegisterMetaType<HairpinType>("HairpinType");
qRegisterMetaType<Lyrics::Syllabic>("Syllabic");
qRegisterMetaType<LayoutBreak::Type>("LayoutBreakType");
qRegisterMetaType<Glissando::Type>("GlissandoType");
//classed enumerations
2017-01-16 20:51:12 +01:00
// qRegisterMetaType<MSQE_StyledPropertyListIdx::E>("StyledPropertyListIdx");
2017-01-05 11:23:47 +01:00
// qRegisterMetaType<MSQE_BarLineType::E>("BarLineType");
2012-07-13 16:11:39 +02:00
#endif
qRegisterMetaType<Fraction>("Fraction");
2012-07-13 16:11:39 +02:00
#ifdef Q_OS_WIN
2012-05-26 14:26:10 +02:00
QDir dir(QCoreApplication::applicationDirPath() + QString("/../" INSTALL_NAME));
_globalShare = dir.absolutePath() + "/";
#elif defined(Q_OS_IOS)
2012-05-26 14:26:10 +02:00
{
extern QString resourcePath();
_globalShare = resourcePath();
}
2013-11-06 15:58:05 +01:00
#elif defined(Q_OS_MAC)
2012-05-26 14:26:10 +02:00
QDir dir(QCoreApplication::applicationDirPath() + QString("/../Resources"));
_globalShare = dir.absolutePath() + "/";
#else
// Try relative path (needed for portable AppImage and non-standard installations)
QDir dir(QCoreApplication::applicationDirPath() + QString("/../share/" INSTALL_NAME));
if (dir.exists())
_globalShare = dir.absolutePath() + "/";
else // Fall back to default location (e.g. if binary has moved relative to share)
_globalShare = QString( INSTPREFIX "/share/" INSTALL_NAME);
2012-05-26 14:26:10 +02:00
#endif
2012-11-20 23:07:37 +01:00
2014-09-09 00:33:51 +02:00
selectColor[0].setNamedColor("#1259d0"); //blue
selectColor[1].setNamedColor("#009234"); //green
selectColor[2].setNamedColor("#c04400"); //orange
selectColor[3].setNamedColor("#70167a"); //purple
2012-05-26 14:26:10 +02:00
defaultColor = Qt::black;
2014-09-09 00:33:51 +02:00
dropColor = QColor("#1778db");
2012-05-26 14:26:10 +02:00
defaultPlayDuration = 300; // ms
warnPitchRange = true;
2012-07-31 16:54:00 +02:00
playRepeats = true;
panPlayback = true;
2012-07-31 16:54:00 +02:00
lastError = "";
2014-08-31 19:22:21 +02:00
layoutBreakColor = QColor("#5999db");
frameMarginColor = QColor("#5999db");
bgColor.setNamedColor("#dddddd");
2012-05-26 14:26:10 +02:00
2017-01-05 11:23:47 +01:00
//
// initialize styles
//
_baseStyle.precomputeValues();
2017-01-17 09:58:32 +01:00
QSettings s;
QString defStyle = s.value("defaultStyle").toString();
2017-03-31 13:03:15 +02:00
if (!(MScore::testMode || defStyle.isEmpty())) {
2017-01-17 09:58:32 +01:00
QFile f(defStyle);
if (f.open(QIODevice::ReadOnly)) {
2017-03-15 13:35:27 +01:00
qDebug("load default style <%s>", qPrintable(defStyle));
2017-01-17 09:58:32 +01:00
_defaultStyle.load(&f);
f.close();
}
}
_defaultStyle.precomputeValues();
2017-01-05 11:23:47 +01:00
QString partStyle = s.value("partStyle").toString();
2017-03-31 13:03:15 +02:00
if (!(MScore::testMode || partStyle.isEmpty())) {
2017-01-05 11:23:47 +01:00
QFile f(partStyle);
if (f.open(QIODevice::ReadOnly)) {
2017-03-15 13:35:27 +01:00
qDebug("load default style for parts <%s>", qPrintable(partStyle));
_defaultStyleForParts = new MStyle(_defaultStyle);
_defaultStyleForParts->load(&f);
_defaultStyleForParts->precomputeValues();
}
2017-01-05 11:23:47 +01:00
}
2012-05-26 14:26:10 +02:00
//
// load internal fonts
//
//
// do not load application specific fonts
// for MAC, they are in Resources/fonts
//
#if !defined(Q_OS_MAC) && !defined(Q_OS_IOS)
2012-05-26 14:26:10 +02:00
static const char* fonts[] = {
2016-10-26 20:36:47 +02:00
":/fonts/musejazz/MuseJazzText.otf",
2014-01-16 12:33:23 +01:00
":/fonts/FreeSans.ttf",
":/fonts/FreeSerif.ttf",
2014-01-16 12:33:23 +01:00
":/fonts/FreeSerifBold.ttf",
":/fonts/FreeSerifItalic.ttf",
":/fonts/FreeSerifBoldItalic.ttf",
2014-01-16 12:33:23 +01:00
":/fonts/mscoreTab.ttf",
":/fonts/mscore-BC.ttf",
2014-07-23 12:35:56 +02:00
":/fonts/bravura/BravuraText.otf",
":/fonts/gootville/GootvilleText.otf",
2014-07-23 17:08:48 +02:00
":/fonts/mscore/MScoreText.ttf",
2012-05-26 14:26:10 +02:00
};
for (unsigned i = 0; i < sizeof(fonts)/sizeof(*fonts); ++i) {
2014-01-16 12:33:23 +01:00
QString s(fonts[i]);
2012-05-26 14:26:10 +02:00
if (-1 == QFontDatabase::addApplicationFont(s)) {
2014-07-17 11:15:59 +02:00
if (!MScore::testMode)
qDebug("Mscore: fatal error: cannot load internal font <%s>", qPrintable(s));
if (!MScore::debugMode && !MScore::testMode)
2012-05-26 14:26:10 +02:00
exit(-1);
}
}
#endif
2013-11-06 15:58:05 +01:00
initScoreFonts();
2014-04-30 10:08:38 +02:00
StaffType::initStaffTypes();
2012-05-26 14:26:10 +02:00
initDrumset();
FiguredBass::readConfigFile(0);
2016-01-04 14:48:58 +01:00
#ifdef DEBUG_SHAPES
testShapes();
#endif
2012-05-26 14:26:10 +02:00
}
2014-01-30 13:10:45 +01:00
//---------------------------------------------------------
// defaultStyleForPartsHasChanged
//---------------------------------------------------------
void MScore::defaultStyleForPartsHasChanged()
{
2017-01-05 11:23:47 +01:00
// TODO ??
// delete _defaultStyleForParts;
// _defaultStyleForParts = 0;
2014-01-30 13:10:45 +01:00
}
//---------------------------------------------------------
// errorMessage
//---------------------------------------------------------
const char* MScore::errorMessage()
{
for (MScoreError& e : errorList) {
if (e.no == _error)
return e.txt;
}
return "unknown error";
}
//---------------------------------------------------------
// errorGroup
//---------------------------------------------------------
const char* MScore::errorGroup()
{
for (MScoreError& e : errorList) {
if (e.no == _error)
return e.group;
}
return "";
}
#ifdef SCRIPT_INTERFACE
2014-04-25 18:43:25 +02:00
//---------------------------------------------------------
// qml
//---------------------------------------------------------
QQmlEngine* MScore::qml()
{
if (_qml == 0) {
//-----------some qt bindings
_qml = new QQmlEngine;
2017-02-27 09:38:24 +01:00
2014-04-25 18:43:25 +02:00
#ifdef Q_OS_WIN
QStringList importPaths;
QDir dir(QCoreApplication::applicationDirPath() + QString("/../qml"));
importPaths.append(dir.absolutePath());
_qml->setImportPathList(importPaths);
#endif
#ifdef Q_OS_MAC
QStringList importPaths;
QDir dir(mscoreGlobalShare + QString("/qml"));
importPaths.append(dir.absolutePath());
_qml->setImportPathList(importPaths);
#endif
2017-03-08 13:12:26 +01:00
const char* enumErr = "You can't create an enumeration";
2017-06-28 15:18:59 +02:00
qmlRegisterType<MsProcess> ("MuseScore", 3, 0, "QProcess");
qmlRegisterType<FileIO, 1> ("FileIO", 3, 0, "FileIO");
2014-04-25 18:43:25 +02:00
//-----------mscore bindings
2017-06-28 15:18:59 +02:00
qmlRegisterUncreatableMetaObject(Ms::staticMetaObject, "MuseScore", 3, 0, "Ms", enumErr);
// qmlRegisterUncreatableType<Direction>("MuseScore", 3, 0, "Direction", QObject::tr(enumErr));
2016-03-02 13:20:19 +01:00
2017-06-28 15:18:59 +02:00
qmlRegisterType<MScore> ("MuseScore", 3, 0, "MScore");
qmlRegisterType<MsScoreView>("MuseScore", 3, 0, "ScoreView");
2017-02-27 09:38:24 +01:00
2017-06-28 15:18:59 +02:00
qmlRegisterType<Score> ("MuseScore", 3, 0, "Score");
qmlRegisterType<Cursor> ("MuseScore", 3, 0, "Cursor");
qmlRegisterType<ElementW> ("MuseScore", 3, 0, "Element");
2017-02-27 09:38:24 +01:00
qRegisterMetaType<ElementW*>("ElementWrapper*");
#if 0
2014-04-25 18:43:25 +02:00
qmlRegisterType<Segment> ("MuseScore", 1, 0, "Segment");
qmlRegisterType<Chord> ("MuseScore", 1, 0, "Chord");
qmlRegisterType<Note> ("MuseScore", 1, 0, "Note");
qmlRegisterType<NoteHead> ("MuseScore", 1, 0, "NoteHead");
2014-04-25 18:43:25 +02:00
qmlRegisterType<Accidental> ("MuseScore", 1, 0, "Accidental");
qmlRegisterType<Rest> ("MuseScore", 1, 0, "Rest");
qmlRegisterType<Measure> ("MuseScore", 1, 0, "Measure");
qmlRegisterType<StaffText> ("MuseScore", 1, 0, "StaffText");
qmlRegisterType<Part> ("MuseScore", 1, 0, "Part");
qmlRegisterType<Staff> ("MuseScore", 1, 0, "Staff");
qmlRegisterType<Harmony> ("MuseScore", 1, 0, "Harmony");
qmlRegisterType<TimeSig> ("MuseScore", 1, 0, "TimeSig");
qmlRegisterType<KeySig> ("MuseScore", 1, 0, "KeySig");
qmlRegisterType<Slur> ("MuseScore", 1, 0, "Slur");
qmlRegisterType<Tie> ("MuseScore", 1, 0, "Tie");
qmlRegisterType<NoteDot> ("MuseScore", 1, 0, "NoteDot");
qmlRegisterType<FiguredBass>("MuseScore", 1, 0, "FiguredBass");
qmlRegisterType<Text> ("MuseScore", 1, 0, "MText");
qmlRegisterType<Lyrics> ("MuseScore", 1, 0, "Lyrics");
qmlRegisterType<FiguredBassItem>("MuseScore", 1, 0, "FiguredBassItem");
qmlRegisterType<LayoutBreak>("MuseScore", 1, 0, "LayoutBreak");
qmlRegisterType<Hook> ("MuseScore", 1, 0, "Hook");
qmlRegisterType<Stem> ("MuseScore", 1, 0, "Stem");
2015-03-19 10:28:01 +01:00
qmlRegisterType<StemSlash> ("MuseScore", 1, 0, "StemSlash");
qmlRegisterType<Beam> ("MuseScore", 1, 0, "Beam");
2015-04-22 21:22:06 +02:00
qmlRegisterType<Excerpt> ("MuseScore", 1, 0, "Excerpt");
qmlRegisterType<BarLine> ("MuseScore", 1, 0, "BarLine");
2014-04-25 18:43:25 +02:00
//classed enumerations
qmlRegisterUncreatableType<MSQE_StyledPropertyListIdx>("MuseScore", 1, 0, "StyledPropertyListIdx", QObject::tr("You can't create an enum"));
2017-03-08 13:12:26 +01:00
qmlRegisterUncreatableType<MSQE_BarLineType>("MuseScore", 1, 0, "BarLineType", enumErr);
2014-04-25 18:43:25 +02:00
//-----------virtual classes
qmlRegisterType<ChordRest>();
qmlRegisterType<SlurTie>();
qmlRegisterType<Spanner>();
#endif
2017-06-28 15:18:59 +02:00
qmlRegisterType<FractionWrapper> ("MuseScore", 3, 1, "Fraction");
2017-02-27 09:38:24 +01:00
qRegisterMetaType<FractionWrapper*>("FractionWrapper*");
2014-04-25 18:43:25 +02:00
}
return _qml;
}
2016-09-03 17:45:59 +02:00
//---------------------------------------------------------
// paintDevice
//---------------------------------------------------------
MPaintDevice* MScore::paintDevice()
{
if (!_paintDevice)
_paintDevice = new MPaintDevice();
return _paintDevice;
}
//---------------------------------------------------------
// metric
//---------------------------------------------------------
2016-09-03 17:45:59 +02:00
int MPaintDevice::metric(PaintDeviceMetric m) const
{
switch (m) {
case QPaintDevice::PdmDpiY:
return int(DPI);
default:
printf("debug: metric %d\n", int(m));
return 1;
}
return 0;
}
//---------------------------------------------------------
// paintEngine
//---------------------------------------------------------
2016-09-03 17:45:59 +02:00
QPaintEngine* MPaintDevice::paintEngine() const
{
printf("paint engine\n");
return 0;
}
#endif
2013-05-13 18:49:17 +02:00
}