#include "scene_rle.h" #include #include #include #include #include #include #include #include #include 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 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() { }