All pastes #807038 Raw Edit

Untitled

public text v1 · immutable
·published 2007-12-06 04:27 UTC
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()
{
	
}