summaryrefslogtreecommitdiff
path: root/lyt/textbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lyt/textbox.cpp')
-rw-r--r--lyt/textbox.cpp115
1 files changed, 115 insertions, 0 deletions
diff --git a/lyt/textbox.cpp b/lyt/textbox.cpp
new file mode 100644
index 0000000..06aed4e
--- /dev/null
+++ b/lyt/textbox.cpp
@@ -0,0 +1,115 @@
+#include "textbox.h"
+#include "layout.h"
+#include "common.h"
+
+
+LYTTextBox::LYTTextBox(LYTLayout &layout) : LYTPane(layout) {
+}
+
+
+void LYTTextBox::dumpToDebug(bool showHeading) {
+ if (showHeading)
+ qDebug() << "LYTTextBox" << name << "@" << (void*)this;
+
+ LYTPane::dumpToDebug(false);
+
+ qDebug() << "- Text:" << text;
+ qDebug() << "- Buffer Length:" << bufferLength;
+ qDebug() << "- Material:" << materialName << "- Font:" << fontName;
+ qDebug() << "- Alignment:" << alignment << "- Alignment Override:" << alignmentOverride;
+ qDebug() << "- Colours:" << colour1 << "--" << colour2;
+ qDebug() << "- Font Size:" << fontSizeX << "x" << fontSizeY;
+ qDebug() << "- Char Space:" << charSpace << "- Line Space:" << lineSpace;
+}
+
+
+
+void LYTTextBox::writeToDataStream(QDataStream &out) {
+ LYTPane::writeToDataStream(out);
+
+ // lengths are stored in bytes (including zero terminator) not characters
+ out << (quint16)((bufferLength + 1) * 2);
+ out << (quint16)((text.length() + 1) * 2);
+
+ // calculate the material and font numbers
+ int materialNum = m_layout.materials.keys().indexOf(materialName);
+ int fontNum = m_layout.m_fontRefs.indexOf(fontName);
+
+ out << (quint16)materialNum;
+ out << (quint16)fontNum;
+
+ out << (quint8)alignment;
+ out << (quint8)alignmentOverride;
+
+ out.skipRawData(2); // padding
+
+ out << (quint32)0x74; // fixed offset to textbox contents
+
+ WriteRGBA8Color(colour1, out);
+ WriteRGBA8Color(colour2, out);
+
+ out << (float)fontSizeX;
+ out << (float)fontSizeY;
+ out << (float)charSpace;
+ out << (float)lineSpace;
+
+ // write the textbox contents
+ const ushort *convertedText = text.utf16();
+ for (int i = 0; i < text.length(); i++)
+ out << (quint16)convertedText[i];
+}
+
+
+void LYTTextBox::readFromDataStream(QDataStream &in) {
+ qint64 saveStartPos = in.device()->pos();
+
+ LYTPane::readFromDataStream(in);
+
+ // the lengths are stored in bytes (not characters) and count the
+ // zero terminator, and strings are UTF-16 (I think) so we need
+ // to take it off here
+ in >> (quint16&)bufferLength;
+ bufferLength >>= 1;
+ bufferLength--;
+
+ quint16 stringLength;
+ in >> (quint16&)stringLength;
+ stringLength >>= 1;
+ stringLength--;
+
+ // read the material and font names
+ quint16 materialNum, fontNum;
+ in >> (quint16&)materialNum;
+ in >> (quint16&)fontNum;
+
+ materialName = m_layout.materials.keys().at(materialNum);
+ fontName = m_layout.m_fontRefs.at(fontNum);
+
+ in >> (quint8&)alignment;
+ in >> (quint8&)alignmentOverride;
+
+ in.skipRawData(2); // padding
+
+ quint32 stringOffset;
+ in >> (quint32&)stringOffset;
+
+ ReadRGBA8Color(colour1, in);
+ ReadRGBA8Color(colour2, in);
+
+ in >> (float&)fontSizeX;
+ in >> (float&)fontSizeY;
+ in >> (float&)charSpace;
+ in >> (float&)lineSpace;
+
+ // read the textbox contents
+ // subtract 8 to account for BinaryBlockHeader or whatever it's called
+ in.device()->seek(saveStartPos + stringOffset - 8);
+
+ ushort *rawText = new ushort[stringLength];
+
+ for (int i = 0; i < stringLength; i++)
+ in >> (quint16&)rawText[i];
+
+ text.setUtf16(rawText, stringLength);
+ delete[] rawText;
+}