From fe43cb641d0365217cd56cc0d776945056fab139 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Fri, 30 Jun 2006 23:37:30 +0000 Subject: [PATCH] Attachments seem to work for mod3 files Originally committed to SVN as r441. --- core/ass_attachment.cpp | 55 ++++++++++++++++++++++++++++++++++++++--- core/ass_attachment.h | 12 ++++++--- core/ass_entry.cpp | 2 +- core/ass_file.cpp | 27 +++++++++++--------- 4 files changed, 78 insertions(+), 18 deletions(-) diff --git a/core/ass_attachment.cpp b/core/ass_attachment.cpp index a262d88ce..cc4800616 100644 --- a/core/ass_attachment.cpp +++ b/core/ass_attachment.cpp @@ -69,7 +69,7 @@ AssEntry *AssAttachment::Clone() { //////////// // Get data -const void *AssAttachment::GetData() { +const DataVec &AssAttachment::GetData() { return data->GetData(); } @@ -88,6 +88,55 @@ void AssAttachment::Finish() { } +///////////////////////////////////// +// Get encoded data to write on file +const wxString AssAttachment::GetEntryData() { + // Get data + const DataVec &dat = data->GetData(); + int pos = 0; + int size = dat.size(); + int written = 0; + unsigned char src[3]; + unsigned char dst[4]; + + // Write header + wxString entryData; + if (group == _T("[Fonts]")) entryData = _T("fontname: "); + else entryData = _T("filename: "); + entryData += filename + _T("\r\n"); + + // Read three bytes + while (pos+3 <= size) { + // Read source + src[0] = dat[pos]; + src[1] = dat[pos+1]; + src[2] = dat[pos+2]; + pos += 3; + + // Codify + dst[0] = src[0] >> 2; + dst[1] = ((src[0] & 0x3) << 4) | ((src[1] & 0xF0) >> 4); + dst[2] = ((src[1] & 0xF) << 2) | ((src[2] & 0xC0) >> 6); + dst[3] = src[2] & 0x3F; + + // Convert to text + for (int i=0;i<4;i++) { + entryData += wxChar(dst[i]+33); + written++; + + // Line break + if (written == 80) { + written = 0; + entryData += _T("\r\n"); + } + } + } + + // Return + return entryData; +} + + /////////////////// Attachment ////////////////// /////////////// @@ -104,8 +153,8 @@ AttachData::~AttachData() { //////////// // Get data -const void *AttachData::GetData() { - return (void*) &data[0]; +const DataVec &AttachData::GetData() { + return data; } diff --git a/core/ass_attachment.h b/core/ass_attachment.h index f49aef7db..1a568123f 100644 --- a/core/ass_attachment.h +++ b/core/ass_attachment.h @@ -44,18 +44,23 @@ #include +/////////// +// Typedef +typedef std::vector DataVec; + + /////////////////// // Attachment data class AttachData { private: - std::vector data; + DataVec data; wxString buffer; public: AttachData(); ~AttachData(); - const void *GetData(); + const DataVec &GetData(); void AddData(wxString data); void Finish(); }; @@ -69,11 +74,12 @@ private: public: wxString filename; - const void *GetData(); + const DataVec &GetData(); void AddData(wxString data); void Finish(); + const wxString GetEntryData(); ASS_EntryType GetType() { return ENTRY_ATTACHMENT; } AssEntry *Clone(); diff --git a/core/ass_entry.cpp b/core/ass_entry.cpp index b9a2fb0f5..32cfb2de1 100644 --- a/core/ass_entry.cpp +++ b/core/ass_entry.cpp @@ -111,7 +111,7 @@ wxString AssEntry::GetSSAText() { if (group.Lower() == _T("[events]")) return wxString(_T("Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text")); if (group.Lower() == _T("[v4+ styles]")) return wxString(_T("Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding")); } - return data; + return GetEntryData(); } diff --git a/core/ass_file.cpp b/core/ass_file.cpp index 08c3294ec..31f553781 100644 --- a/core/ass_file.cpp +++ b/core/ass_file.cpp @@ -273,13 +273,14 @@ int AssFile::AddLine (wxString data,wxString group,int lasttime,bool &IsSSA) { // Attachment else if (group == _T("[Fonts]") || group == _T("[Graphics]")) { // Check if it's valid data - bool validData = data.Length() > 0; - for (size_t i=0;i 0) && (dataLen <= 80); + for (size_t i=0;i= 97) validData = false; } // Is the filename line? - bool isFilename = data.Left(10) == _T("filename: "); + bool isFilename = (data.Left(10) == _T("fontname: ") && group == _T("[Fonts]")) || (data.Left(10) == _T("filename: ") && group == _T("[Graphics]")); // The attachment file is static, since it is built through several calls to this // After it's done building, it's reset to NULL @@ -292,15 +293,16 @@ int AssFile::AddLine (wxString data,wxString group,int lasttime,bool &IsSSA) { attach = NULL; } - // Valid data - if (validData) { - // Create attachment if needed - if (!attach) { - attach = new AssAttachment(data.Mid(10)); - attach->StartMS = lasttime; - attach->group = group; - } + // Create attachment if needed + if (isFilename) { + attach = new AssAttachment(data.Mid(10)); + attach->StartMS = lasttime; + attach->group = group; + return lasttime; + } + // Valid data? + if (validData) { // Insert data attach->AddData(data); @@ -310,6 +312,9 @@ int AssFile::AddLine (wxString data,wxString group,int lasttime,bool &IsSSA) { entry = attach; attach = NULL; } + + // Not done + else return lasttime; } }