2013-01-27 12:07:28 -08:00
|
|
|
#include "journalbooks.hpp"
|
|
|
|
|
2017-07-24 13:25:01 +02:00
|
|
|
#include "../mwbase/environment.hpp"
|
|
|
|
#include "../mwbase/windowmanager.hpp"
|
|
|
|
|
2017-11-21 12:31:23 +04:00
|
|
|
#include <components/misc/utf8stream.hpp>
|
2017-11-21 09:32:35 +04:00
|
|
|
|
2017-07-24 13:25:01 +02:00
|
|
|
#include "textcolours.hpp"
|
|
|
|
|
2013-01-27 12:07:28 -08:00
|
|
|
namespace
|
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddContent
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-06 16:04:28 +02:00
|
|
|
MWGui::BookTypesetter::Ptr mTypesetter;
|
|
|
|
MWGui::BookTypesetter::Style* mBodyStyle;
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
AddContent(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* body_style)
|
2013-05-01 10:28:59 +02:00
|
|
|
: mTypesetter(typesetter)
|
|
|
|
, mBodyStyle(body_style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddSpan : AddContent
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-06 16:04:28 +02:00
|
|
|
AddSpan(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* body_style)
|
2013-05-01 10:28:59 +02:00
|
|
|
: AddContent(typesetter, body_style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void operator()(intptr_t topicId, size_t begin, size_t end)
|
|
|
|
{
|
2013-05-06 16:04:28 +02:00
|
|
|
MWGui::BookTypesetter::Style* style = mBodyStyle;
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2017-07-24 13:25:01 +02:00
|
|
|
const MWGui::TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours();
|
2013-01-27 12:07:28 -08:00
|
|
|
if (topicId)
|
2017-07-24 13:25:01 +02:00
|
|
|
style = mTypesetter->createHotStyle(mBodyStyle, textColours.journalLink, textColours.journalLinkOver,
|
|
|
|
textColours.journalLinkPressed, topicId);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->write(style, begin, end);
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddEntry
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-06 16:04:28 +02:00
|
|
|
MWGui::BookTypesetter::Ptr mTypesetter;
|
|
|
|
MWGui::BookTypesetter::Style* mBodyStyle;
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
AddEntry(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* body_style)
|
2013-05-01 10:28:59 +02:00
|
|
|
: mTypesetter(typesetter)
|
|
|
|
, mBodyStyle(body_style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
void operator()(MWGui::JournalViewModel::Entry const& entry)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->addContent(entry.body());
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
entry.visitSpans(AddSpan(mTypesetter, mBodyStyle));
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddJournalEntry : AddEntry
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
bool mAddHeader;
|
2013-05-06 16:04:28 +02:00
|
|
|
MWGui::BookTypesetter::Style* mHeaderStyle;
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
AddJournalEntry(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* body_style,
|
|
|
|
MWGui::BookTypesetter::Style* header_style, bool add_header)
|
2013-05-01 10:28:59 +02:00
|
|
|
: AddEntry(typesetter, body_style)
|
2015-04-30 19:24:27 -05:00
|
|
|
, mAddHeader(add_header)
|
|
|
|
, mHeaderStyle(header_style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
void operator()(MWGui::JournalViewModel::JournalEntry const& entry)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
if (mAddHeader)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->write(mHeaderStyle, entry.timestamp());
|
|
|
|
mTypesetter->lineBreak();
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
AddEntry::operator()(entry);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2017-08-03 20:27:14 +04:00
|
|
|
mTypesetter->sectionBreak(30);
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddTopicEntry : AddEntry
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
intptr_t mContentId;
|
2013-05-06 16:04:28 +02:00
|
|
|
MWGui::BookTypesetter::Style* mHeaderStyle;
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
AddTopicEntry(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* body_style,
|
|
|
|
MWGui::BookTypesetter::Style* header_style, intptr_t contentId)
|
2015-04-30 19:24:27 -05:00
|
|
|
: AddEntry(typesetter, body_style)
|
|
|
|
, mContentId(contentId)
|
|
|
|
, mHeaderStyle(header_style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
void operator()(MWGui::JournalViewModel::TopicEntry const& entry)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->write(mBodyStyle, entry.source());
|
|
|
|
mTypesetter->write(mBodyStyle, 0, 3); // begin
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
AddEntry::operator()(entry);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->selectContent(mContentId);
|
|
|
|
mTypesetter->write(mBodyStyle, 2, 3); // end quote
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2017-08-03 20:27:14 +04:00
|
|
|
mTypesetter->sectionBreak(30);
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddTopicName : AddContent
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-06 16:04:28 +02:00
|
|
|
AddTopicName(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* style)
|
2013-05-01 10:28:59 +02:00
|
|
|
: AddContent(typesetter, style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
void operator()(MWGui::JournalViewModel::Utf8Span topicName)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->write(mBodyStyle, topicName);
|
2017-08-03 20:27:14 +04:00
|
|
|
mTypesetter->sectionBreak();
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
struct AddQuestName : AddContent
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-06 16:04:28 +02:00
|
|
|
AddQuestName(MWGui::BookTypesetter::Ptr typesetter, MWGui::BookTypesetter::Style* style)
|
2013-05-01 10:28:59 +02:00
|
|
|
: AddContent(typesetter, style)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
void operator()(MWGui::JournalViewModel::Utf8Span topicName)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
mTypesetter->write(mBodyStyle, topicName);
|
2017-08-03 20:27:14 +04:00
|
|
|
mTypesetter->sectionBreak();
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2013-05-06 16:04:28 +02:00
|
|
|
namespace MWGui
|
|
|
|
{
|
|
|
|
|
2023-01-29 21:31:21 +01:00
|
|
|
MWGui::BookTypesetter::Utf8Span to_utf8_span(std::string_view text)
|
2014-03-17 14:15:52 +01:00
|
|
|
{
|
|
|
|
typedef MWGui::BookTypesetter::Utf8Point point;
|
|
|
|
|
2023-01-29 21:31:21 +01:00
|
|
|
point begin = reinterpret_cast<point>(text.data());
|
2014-03-17 14:15:52 +01:00
|
|
|
|
2023-01-29 21:31:21 +01:00
|
|
|
return MWGui::BookTypesetter::Utf8Span(begin, begin + text.length());
|
2014-03-17 14:15:52 +01:00
|
|
|
}
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
typedef TypesetBook::Ptr book;
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2017-11-22 08:32:38 +04:00
|
|
|
JournalBooks::JournalBooks(JournalViewModel::Ptr model, ToUTF8::FromType encoding)
|
2018-09-04 12:19:50 +04:00
|
|
|
: mModel(model)
|
|
|
|
, mEncoding(encoding)
|
|
|
|
, mIndexPagesCount(0)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
book JournalBooks::createEmptyJournalBook()
|
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
BookTypesetter::Ptr typesetter = createTypesetter();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-06-06 22:13:30 +02:00
|
|
|
BookTypesetter::Style* header = typesetter->createStyle("", MyGUI::Colour(0.60f, 0.00f, 0.00f));
|
|
|
|
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::Black);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
|
|
|
typesetter->write(header, to_utf8_span("You have no journal entries!"));
|
|
|
|
typesetter->lineBreak();
|
|
|
|
typesetter->write(
|
|
|
|
body, to_utf8_span("You should have gone though the starting quest and got an initial quest."));
|
|
|
|
|
|
|
|
return typesetter->complete();
|
|
|
|
}
|
|
|
|
|
|
|
|
book JournalBooks::createJournalBook()
|
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
BookTypesetter::Ptr typesetter = createTypesetter();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-06-06 22:13:30 +02:00
|
|
|
BookTypesetter::Style* header = typesetter->createStyle("", MyGUI::Colour(0.60f, 0.00f, 0.00f));
|
|
|
|
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::Black);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2014-06-03 00:16:32 +02:00
|
|
|
mModel->visitJournalEntries("", AddJournalEntry(typesetter, body, header, true));
|
2013-01-27 12:07:28 -08:00
|
|
|
|
|
|
|
return typesetter->complete();
|
|
|
|
}
|
|
|
|
|
|
|
|
book JournalBooks::createTopicBook(uintptr_t topicId)
|
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
BookTypesetter::Ptr typesetter = createTypesetter();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-06-06 22:13:30 +02:00
|
|
|
BookTypesetter::Style* header = typesetter->createStyle("", MyGUI::Colour(0.60f, 0.00f, 0.00f));
|
|
|
|
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::Black);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
mModel->visitTopicName(topicId, AddTopicName(typesetter, header));
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
intptr_t contentId = typesetter->addContent(to_utf8_span(", \""));
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
mModel->visitTopicEntries(topicId, AddTopicEntry(typesetter, body, header, contentId));
|
2013-01-27 12:07:28 -08:00
|
|
|
|
|
|
|
return typesetter->complete();
|
|
|
|
}
|
|
|
|
|
2023-01-29 21:31:21 +01:00
|
|
|
book JournalBooks::createQuestBook(std::string_view questName)
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2013-05-01 10:28:59 +02:00
|
|
|
BookTypesetter::Ptr typesetter = createTypesetter();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-06-06 22:13:30 +02:00
|
|
|
BookTypesetter::Style* header = typesetter->createStyle("", MyGUI::Colour(0.60f, 0.00f, 0.00f));
|
|
|
|
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::Black);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2014-06-03 00:16:32 +02:00
|
|
|
AddQuestName addName(typesetter, header);
|
2023-01-29 21:31:21 +01:00
|
|
|
addName(to_utf8_span(questName));
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2014-06-03 00:16:32 +02:00
|
|
|
mModel->visitJournalEntries(questName, AddJournalEntry(typesetter, body, header, false));
|
2013-01-27 12:07:28 -08:00
|
|
|
|
|
|
|
return typesetter->complete();
|
|
|
|
}
|
|
|
|
|
2018-09-04 12:19:50 +04:00
|
|
|
book JournalBooks::createTopicIndexBook()
|
2017-11-20 22:25:53 +04:00
|
|
|
{
|
2017-11-22 08:32:38 +04:00
|
|
|
bool isRussian = (mEncoding == ToUTF8::WINDOWS_1251);
|
2017-11-20 22:25:53 +04:00
|
|
|
|
2018-09-04 12:19:50 +04:00
|
|
|
BookTypesetter::Ptr typesetter = isRussian ? createCyrillicJournalIndex() : createLatinJournalIndex();
|
2017-11-20 22:25:53 +04:00
|
|
|
|
|
|
|
return typesetter->complete();
|
|
|
|
}
|
|
|
|
|
2018-09-04 12:19:50 +04:00
|
|
|
BookTypesetter::Ptr JournalBooks::createLatinJournalIndex()
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
2018-06-18 13:43:39 +04:00
|
|
|
BookTypesetter::Ptr typesetter = BookTypesetter::create(92, 260);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
typesetter->setSectionAlignment(BookTypesetter::AlignCenter);
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2018-06-18 13:43:39 +04:00
|
|
|
// Latin journal index always has two columns for now.
|
2018-09-04 12:19:50 +04:00
|
|
|
mIndexPagesCount = 2;
|
2018-06-18 13:43:39 +04:00
|
|
|
|
2017-11-22 09:06:54 +04:00
|
|
|
char ch = 'A';
|
2023-01-29 21:31:21 +01:00
|
|
|
std::string buffer;
|
2017-11-22 09:06:54 +04:00
|
|
|
|
2017-11-20 22:25:53 +04:00
|
|
|
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::Black);
|
|
|
|
for (int i = 0; i < 26; ++i)
|
|
|
|
{
|
2023-01-29 21:31:21 +01:00
|
|
|
buffer = "( ";
|
|
|
|
buffer += ch;
|
|
|
|
buffer += " )";
|
2022-09-22 21:26:05 +03:00
|
|
|
|
2017-11-20 22:25:53 +04:00
|
|
|
const MWGui::TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours();
|
|
|
|
BookTypesetter::Style* style = typesetter->createHotStyle(body, textColours.journalTopic,
|
|
|
|
textColours.journalTopicOver, textColours.journalTopicPressed, (Utf8Stream::UnicodeChar)ch);
|
|
|
|
|
|
|
|
if (i == 13)
|
|
|
|
typesetter->sectionBreak();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2017-11-20 22:25:53 +04:00
|
|
|
typesetter->write(style, to_utf8_span(buffer));
|
|
|
|
typesetter->lineBreak();
|
|
|
|
|
|
|
|
ch++;
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2017-11-22 09:06:54 +04:00
|
|
|
|
|
|
|
return typesetter;
|
2017-11-20 22:25:53 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
BookTypesetter::Ptr JournalBooks::createCyrillicJournalIndex()
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2017-11-20 22:25:53 +04:00
|
|
|
BookTypesetter::Ptr typesetter = BookTypesetter::create(92, 260);
|
|
|
|
|
2018-06-18 13:43:39 +04:00
|
|
|
typesetter->setSectionAlignment(BookTypesetter::AlignCenter);
|
2017-11-20 22:25:53 +04:00
|
|
|
|
|
|
|
BookTypesetter::Style* body = typesetter->createStyle("", MyGUI::Colour::Black);
|
|
|
|
|
|
|
|
int fontHeight = MWBase::Environment::get().getWindowManager()->getFontHeight();
|
2017-11-22 09:06:54 +04:00
|
|
|
|
2018-06-18 13:43:39 +04:00
|
|
|
// for small font size split alphabet to two columns (2x15 characers), for big font size split it to three
|
|
|
|
// colums (3x10 characters).
|
|
|
|
int sectionBreak = 10;
|
|
|
|
mIndexPagesCount = 3;
|
|
|
|
if (fontHeight < 18)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2018-06-18 13:43:39 +04:00
|
|
|
sectionBreak = 15;
|
|
|
|
mIndexPagesCount = 2;
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2018-06-18 13:43:39 +04:00
|
|
|
|
|
|
|
unsigned char ch[3] = { 0xd0, 0x90, 0x00 }; // CYRILLIC CAPITAL A is a 0xd090 in UTF-8
|
|
|
|
|
2023-01-29 21:31:21 +01:00
|
|
|
std::string buffer;
|
|
|
|
|
2021-05-15 10:45:39 -04:00
|
|
|
for (int i = 0; i < 32; ++i)
|
|
|
|
{
|
2023-01-29 21:31:21 +01:00
|
|
|
buffer = "( ";
|
|
|
|
buffer += ch[0];
|
|
|
|
buffer += ch[1];
|
|
|
|
buffer += " )";
|
2017-11-22 09:06:54 +04:00
|
|
|
|
|
|
|
Utf8Stream stream((char*)ch);
|
2018-05-24 12:53:06 +04:00
|
|
|
Utf8Stream::UnicodeChar first = stream.peek();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2017-11-22 09:06:54 +04:00
|
|
|
const MWGui::TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours();
|
2018-05-24 12:53:06 +04:00
|
|
|
BookTypesetter::Style* style = typesetter->createHotStyle(
|
|
|
|
body, textColours.journalTopic, textColours.journalTopicOver, textColours.journalTopicPressed, first);
|
2017-11-21 12:31:23 +04:00
|
|
|
|
2017-07-24 13:25:01 +02:00
|
|
|
ch[1]++;
|
2017-08-04 20:21:13 +04:00
|
|
|
|
2017-12-04 22:10:22 +04:00
|
|
|
// Words can not be started with these characters
|
2017-08-04 20:21:13 +04:00
|
|
|
if (i == 26 || i == 28)
|
2017-12-04 22:10:22 +04:00
|
|
|
continue;
|
|
|
|
|
2017-08-04 20:21:13 +04:00
|
|
|
if (i % sectionBreak == 0)
|
|
|
|
typesetter->sectionBreak();
|
2013-01-27 12:07:28 -08:00
|
|
|
|
2018-06-18 13:43:39 +04:00
|
|
|
typesetter->write(style, to_utf8_span(buffer));
|
2013-01-27 12:07:28 -08:00
|
|
|
typesetter->lineBreak();
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2013-01-27 12:07:28 -08:00
|
|
|
|
|
|
|
return typesetter;
|
|
|
|
}
|
|
|
|
|
2013-05-01 10:28:59 +02:00
|
|
|
BookTypesetter::Ptr JournalBooks::createTypesetter()
|
2013-01-27 12:07:28 -08:00
|
|
|
{
|
|
|
|
// TODO: determine page size from layout...
|
2017-08-03 20:27:14 +04:00
|
|
|
return BookTypesetter::create(240, 320);
|
2013-01-27 12:07:28 -08:00
|
|
|
}
|
2013-05-06 16:04:28 +02:00
|
|
|
|
|
|
|
}
|