rendered paste body#include "scene_rle.h"
#include <sstream>
#include <vector>
#include <starlight/gfx/font.h>
#include <starlight/gfx/rectangle.h>
#include <starlight/gfx/textobject.h>
#include <starlight/sdl/keyframe.h>
#include <starlight/sdl/sequence.h>
#include <starlight/sdl/easingfunctioncollection.h>
#include <starlight/sdl/lineartweener.h>
const float opaque[] = {1.0f, 1.0f, 1.0f, 1.0f};
const float transparent[] = {1.0f, 1.0f, 1.0f, 0.0f};
TPSceneRle::TPSceneRle(starlight::FontManager &fontmgr, const std::string &src)
: TPSceneBase()
{
outlen_ = 0;
float pos[3];
float scale[3] = {1.0f, 1.0f, 1.0f};
starlight::TextRenderer renderer(fontmgr, 25, starlight::Color(1.0f, 1.0f, 1.0f, 1.0f));
renderer.font(_u("Bitstream Vera Sans Mono"));
renderer << src;
starlight::TextObject *tobj = new starlight::TextObject;
renderer.render(*tobj);
starlight::Sequence *textseq = addSequence(0);
textseq->insertObject(0, tobj);
pos[0] = 30.0f, pos[1] = 90.0f, pos[2] = 0.0f;
textseq->insertKeyFrame(0, starlight::KeyFrame(pos, 0L, 0L, 0L));
renderer = starlight::TextRenderer(fontmgr, 30, starlight::Color(1.0f, 1.0f, 1.0f, 1.0f));
renderer.font(_u("Arial Black"));
renderer << "Demonstration: Run-length encoding";
starlight::TextObject *xobj = new starlight::TextObject;
renderer.render(*xobj);
starlight::Sequence *titleseq = addSequence(100);
titleseq->insertObject(0, xobj);
pos[0] = 10.0f, pos[1] = 10.0f;
titleseq->insertKeyFrame(0, starlight::KeyFrame(pos, 0L, 0L, 0L));
std::string::const_iterator it = src.begin();
std::string::const_iterator begin = it;
std::string::const_iterator end;
int nc = 0;
int curframe = 1;
int seqno = 0;
int length;
int slength = 0;
starlight::Sequence *barseq = 0L;
starlight::Rectangle *pointer;
float ht = 30.0f, vt = 170.0f;
std::vector<starlight::Sequence *> seqc;
/* logic loop */
do {
++it;
if (*it != *begin || it - begin == 255) {
end = it - 1;
if (nc) {
pos[0] = (float)(begin - src.begin()) * 15.0f + 30.0f, pos[1] = 90.0f;
scale[0] = (float)(end - begin + 1);
starlight::KeyFrame k(pos, scale, 0L, 0L);
k.setTweener(starlight::KeyFrame::Position, &starlight::defaultTweenerVec3, &starlight::easingSquare);
k.setTweener(starlight::KeyFrame::Scale, &starlight::defaultTweenerVec3, &starlight::easingSquare);
barseq->insertKeyFrame(curframe += 15, k);
textseq->insertFrames(15);
titleseq->insertFrames(15);
addStep(curframe);
} else {
barseq = addSequence(-1);
pointer = new starlight::Rectangle(15, 30, starlight::Color(0.75f, 0.1f, 0.0f, 1.0f));
barseq->insertObject(curframe, pointer);
pos[0] = 30.0f, pos[1] = 90.0f;
scale[0] = (float)(end - begin + 1);
starlight::KeyFrame k(pos, scale, 0L, transparent);
k.setTweener(starlight::KeyFrame::Position, &starlight::defaultTweenerVec3, &starlight::easingSquare);
k.setTweener(starlight::KeyFrame::Scale, &starlight::defaultTweenerVec3, &starlight::easingSquare);
k.setTweener(starlight::KeyFrame::Color, &starlight::defaultTweenerVec3, &starlight::easingSquare);
barseq->insertKeyFrame(curframe, k);
k = starlight::KeyFrame(pos, scale, 0L, opaque);
k.setTweener(starlight::KeyFrame::Position, &starlight::defaultTweenerVec3, &starlight::easingSquare);
k.setTweener(starlight::KeyFrame::Scale, &starlight::defaultTweenerVec3, &starlight::easingSquare);
barseq->insertKeyFrame(curframe += 15, k);
textseq->insertFrames(16);
titleseq->insertFrames(16);
addStep(curframe);
}
for (int i = 0; i < seqno; ++i)
seqc[i]->insertFrames(15);
starlight::Sequence *xs = addSequence(seqno++ + 10);
seqc.push_back(xs);
starlight::TextObject *xo = new starlight::TextObject;
xs->insertObject(curframe - 14, xo);
std::string fragment = src.substr(begin - src.begin(), end - begin + 1);
renderFragment(fontmgr, *xo, fragment);
pos[0] = ht, pos[1] = vt;
starlight::KeyFrame k(pos, 0L, 0L, transparent);
k.setTweener(starlight::KeyFrame::Color, &starlight::defaultTweenerVec3, &starlight::easingSquare);
xs->insertKeyFrame(curframe - 14, k);
xs->insertKeyFrame(curframe, starlight::KeyFrame(pos, 0L, 0L, opaque));
ht += xo->getRealWidth();
if (ht > 770.0f)
ht = 30.0f, vt += 30.0f;
begin = it;
++nc;
}
} while (it != src.end());
std::ostringstream cratio;
cratio << "Compression ratio: " << (100.0f - ((float)outlen_ / src.length() * 100.0f)) << "%";
renderer = starlight::TextRenderer(fontmgr, 25, starlight::Color(1.0f, 1.0f, 1.0f, 1.0f));
renderer << cratio.str();
starlight::TextObject *qobj = new starlight::TextObject;
renderer.render(*qobj);
starlight::Sequence *tseq = addSequence(4);
tseq->insertObject(curframe, qobj);
pos[0] = 50.0f, pos[1] = 500.0f;
starlight::KeyFrame kf(pos, 0L, 0L, transparent);
kf.setTweener(starlight::KeyFrame::Color, &starlight::defaultTweenerVec3, &starlight::easingSquare);
tseq->insertKeyFrame(curframe - 15, kf);
tseq->insertKeyFrame(curframe, starlight::KeyFrame(pos, 0L, 0L, opaque));
addStep(0);
}
void TPSceneRle::renderFragment(starlight::FontManager &fontmgr, starlight::TextObject &textObj, std::string str)
{
starlight::TextRenderer renderer(fontmgr, 25, starlight::Color(1.0f, 1.0f, 1.0f, 1.0f));
renderer.font(_u("Bitstream Vera Sans Mono"));
if (str.length() < 3) {
renderer.color(starlight::Color::WHITE);
renderer << str;
outlen_ += str.length();
} else {
std::ostringstream os;
os << str.length();
renderer.color(starlight::Color(0.0f, 0.45f, 0.9f, 1.0f));
renderer << "#";
renderer.color(starlight::Color(0.25f, 0.9f, 0.1f, 1.0f));
renderer << os.str();
renderer.color(starlight::Color(1.0f, 0.8f, 0.7f, 1.0f));
renderer << str.substr(1, 1);
outlen_ += 3;
}
renderer.render(textObj);
}
TPSceneRle::~TPSceneRle()
{
}