File indexing completed on 2024-06-16 04:38:18
0001 /* 0002 SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar> 0003 SPDX-FileCopyrightText: 2010-2022 Mladen Milinkovic <max@smoothware.net> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #ifndef MICRODVDOUTPUTFORMAT_H 0009 #define MICRODVDOUTPUTFORMAT_H 0010 0011 #include "formats/outputformat.h" 0012 #include "core/richtext/richdocument.h" 0013 #include "core/subtitleiterator.h" 0014 0015 namespace SubtitleComposer { 0016 class MicroDVDOutputFormat : public OutputFormat 0017 { 0018 friend class FormatManager; 0019 0020 public: 0021 virtual ~MicroDVDOutputFormat() {} 0022 0023 protected: 0024 0025 QString dumpSubtitles(const Subtitle &subtitle, bool primary) const override 0026 { 0027 QString ret; 0028 0029 double framesPerSecond = subtitle.framesPerSecond(); 0030 ret += m_lineBuilder 0031 .arg(1) 0032 .arg(1) 0033 .arg(QString::number(framesPerSecond, 'f', 3)); 0034 0035 for(SubtitleIterator it(subtitle); it.current(); ++it) { 0036 const SubtitleLine *line = it.current(); 0037 0038 const RichString &text = (primary ? line->primaryDoc() : line->secondaryDoc())->toRichText(); 0039 QString subtitle; 0040 0041 int prevStyle = 0; 0042 QRgb prevColor = 0; 0043 for(int i = 0, sz = text.length(); i < sz; i++) { 0044 int curStyle = text.styleFlagsAt(i); 0045 QRgb curColor = (curStyle &RichString::Color) != 0 ? text.styleColorAt(i) : 0; 0046 curStyle &= RichString::Bold | RichString::Italic | RichString::Underline; 0047 if(prevStyle != curStyle) 0048 subtitle += m_stylesMap[curStyle]; 0049 if(prevColor != curColor) 0050 subtitle += "{c:" + (curColor != 0 ? "$" + QColor(qBlue(curColor), qGreen(curColor), qRed(curColor)).name().mid(1).toLower() : "") + "}"; 0051 0052 const QChar ch = text.at(i); 0053 if(ch == '\n' || ch == '\r') 0054 subtitle += '|'; 0055 else 0056 subtitle += ch; 0057 0058 prevStyle = curStyle; 0059 prevColor = curColor; 0060 } 0061 0062 ret += m_lineBuilder 0063 .arg(static_cast<long>((line->showTime().toMillis() / 1000.0) * framesPerSecond + 0.5)) 0064 .arg(static_cast<long>((line->hideTime().toMillis() / 1000.0) * framesPerSecond + 0.5)) 0065 .arg(subtitle); 0066 } 0067 return ret; 0068 } 0069 0070 MicroDVDOutputFormat() : 0071 OutputFormat(QStringLiteral("MicroDVD"), QStringList() << QStringLiteral("sub") << QStringLiteral("txt")), 0072 m_lineBuilder(QStringLiteral("{%1}{%2}%3\n")) 0073 { 0074 m_stylesMap[0] = QStringLiteral("{y:}"); 0075 m_stylesMap[RichString::Bold] = QStringLiteral("{y:b}"); 0076 m_stylesMap[RichString::Italic] = QStringLiteral("{y:i}"); 0077 m_stylesMap[RichString::Underline] = QStringLiteral("{y:u}"); 0078 m_stylesMap[RichString::Bold | RichString::Italic] = QStringLiteral("{y:b,i}"); 0079 m_stylesMap[RichString::Bold | RichString::Underline] = QStringLiteral("{y:u,b}"); 0080 m_stylesMap[RichString::Italic | RichString::Underline] = QStringLiteral("{y:u,i}"); 0081 m_stylesMap[RichString::Bold | RichString::Italic | RichString::Underline] = QStringLiteral("{y:u,b,i}"); 0082 } 0083 0084 const QString m_lineBuilder; 0085 mutable QMap<int, QString> m_stylesMap; 0086 }; 0087 } 0088 0089 #endif