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