<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.ccc-mannheim.de/mediawiki/index.php?action=history&amp;feed=atom&amp;title=FullCircle%2FLibFullCircle</id>
	<title>FullCircle/LibFullCircle - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://www.ccc-mannheim.de/mediawiki/index.php?action=history&amp;feed=atom&amp;title=FullCircle%2FLibFullCircle"/>
	<link rel="alternate" type="text/html" href="https://www.ccc-mannheim.de/mediawiki/index.php?title=FullCircle/LibFullCircle&amp;action=history"/>
	<updated>2026-05-07T15:18:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in C3MAWiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://www.ccc-mannheim.de/mediawiki/index.php?title=FullCircle/LibFullCircle&amp;diff=192&amp;oldid=prev</id>
		<title>Scytale: /* Installation */ FullCircle</title>
		<link rel="alternate" type="text/html" href="https://www.ccc-mannheim.de/mediawiki/index.php?title=FullCircle/LibFullCircle&amp;diff=192&amp;oldid=prev"/>
		<updated>2012-10-13T21:06:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Installation: &lt;/span&gt; FullCircle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Kategorie:FullCircle]]&lt;br /&gt;
[[Kategorie:Öffentlich]]&lt;br /&gt;
Die libfullcircle stellt die Definition des Datenformats und einige C++-Tools bereit, um mit den Daten zu arbeiten. Die Bibliothek ist im Moment noch nicht vollstaendig, da sie nur das Speichern in Dateien unterstuetzt. Das Grundkonzept ist folgendes:&lt;br /&gt;
&lt;br /&gt;
* Ein &amp;#039;&amp;#039;&amp;#039;Frame&amp;#039;&amp;#039;&amp;#039; beschreibt eine Seite von Lightbox-Farben. Der Frame hat eine festgelegte Dimension und legt für jeden Pixel fest, welche Farbe (RGB) er hat.&lt;br /&gt;
* Ein &amp;#039;&amp;#039;&amp;#039;Sprite&amp;#039;&amp;#039;&amp;#039; ist ein Frame mit schwarzem Hintergrund, auf dem eine (statische) Grafik in anderen Farben dargestellt ist. &lt;br /&gt;
* Eine &amp;#039;&amp;#039;&amp;#039;Sequenz&amp;#039;&amp;#039;&amp;#039; ist eine Abfolge von Frames (mit konstanter Dimension). Die Sequenz hat eine Framerate, d.h. die Sequenz legt fest, mit welcher Geschwindigkeit die Frames abgespielt werden.&lt;br /&gt;
* Animationen werden durch die Kombination von Sequenzen erstellt. Im Prinzip kann man sich das wie verschiedene Videoschnipsel in einer Video-Editing-Software vorstellen:&lt;br /&gt;
** Einzelne Sequenzen können aneinandergehängt werden (&amp;lt;&amp;lt;-Operator)&lt;br /&gt;
** Sequenzen können überlagert werden (+-Operator). Dabei werden die einzelnen Frames einfach addiert, d.h. ein schwarzer Pixel (RGB=0,0,0) bewirkt, dass der Pixel sich nach der Farbe des anderen Frames richtet. Wenn durch die Addition der Farbwert größer 255 wird, dann bleibt der Farbwert 255 (alles darüber wird quasi abgeschnitten).&lt;br /&gt;
** Sprites (oder Frames) werden bewegt, indem sie durch ein FrameDisplacement verschoben werden. Spezifikation fehlt noch. (TODO: MD)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mitarbeit ===&lt;br /&gt;
&lt;br /&gt;
Eure Mithilfe bei der Entwicklung der Bibliothek ist wichtig. Jeder mit einem Sesam-Account kann auch committen, *wenn er in der Gruppe git ist*. @Admins: Bitte darauf achten, die Leute in diese Gruppe zu stecken.&lt;br /&gt;
&lt;br /&gt;
Damit die Benutzung der Bibliothek jederzeit möglich ist, bitte die folgenden Regeln beachten (battle-proven, machen wir in mySmartGrid auch so):&lt;br /&gt;
&lt;br /&gt;
* Der Master-Branch ist der stabile Zweig der Entwicklung. Wenn man ein git clone macht, ist man in diesem Branch. *Hier bitte nichts committen!*&lt;br /&gt;
* Für den aktuellen Entwicklungs-Zwischenstand gibt es den branch &amp;quot;development&amp;quot;. Nach einem git clone kann man den mit git checkout -t development auschecken.&lt;br /&gt;
* Jeder möge sich bitte für seine Entwicklung einen Entwicklungsbranch machen - Goniums ist md-dev.&lt;br /&gt;
&lt;br /&gt;
Die einzelnen Entwicklungsbranches werden dann - wenn sie stabil sind - in development gemerged. Wenn development stabil ist, wird dieser Branch in Master gemerged. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Für alle Features der Basisbibliothek muss es Testcases geben! Die entsprechende Infrastruktur ist in &amp;#039;tests&amp;#039; zu finden.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Offene Arbeitspakete ===&lt;br /&gt;
&lt;br /&gt;
Die libfullcircle soll auch Routinen enthalten, um z.B. Text in einen Frame zu schreiben. Die folgenden Subseiten diskutieren diese Features:&lt;br /&gt;
&lt;br /&gt;
* [[FullCircle/LibFullCircle/Sprites]]&lt;br /&gt;
** [[FullCircle/LibFullCircle/FontRendering]] kann die Sprite-Infrastruktur benutzen&lt;br /&gt;
* Einfache Operationen auf Sequenzen, die wiederum auf Operationen auf Frames basieren.&lt;br /&gt;
** &amp;lt;&amp;lt;-Operator (Anhängen) -&amp;gt; DONE&lt;br /&gt;
** Plus-Operator (Überlagern) -&amp;gt; [DONE --[[Benutzer:Ollo|Ollo]] ([[Benutzer Diskussion:Ollo|Diskussion]]) 15:53, 16. Jun. 2012 (CEST)]&lt;br /&gt;
* Füllen eines Frames [DONE im branch development --[[Benutzer:Ollo|Ollo]] ([[Benutzer Diskussion:Ollo|Diskussion]]) 18:07, 3. Jun. 2012 (CEST)]&lt;br /&gt;
** fill_whole(color:RGB_t)&lt;br /&gt;
** fill_fade_horizontal(from:RGB_t, to:RGB_t)&lt;br /&gt;
** fill_fade_vertical(from:RGB_t, to:RGB_t)&lt;br /&gt;
* Converter XPM&lt;br /&gt;
** Mehree XPM-Dateien in eine Sequenz konvertieren. -- Das würde ich auf Operationen auf Sequenzen bzw. Frames abbilden. --[[Benutzer:Gonium|Gonium]] ([[Benutzer Diskussion:Gonium|Diskussion]]) 14:35, 6. Jun. 2012 (CEST)&lt;br /&gt;
* Generator für Perlin-Noise (http://www.flipcode.com/archives/Perlin_Noise_Class.shtml)&lt;br /&gt;
* ... (gerne hier Wünsche einfügen!)&lt;br /&gt;
&lt;br /&gt;
=== WTF ist das mit diesen shared_ptrn? ===&lt;br /&gt;
&lt;br /&gt;
In C++ muss man sich um die Speicherverwaltung selbst kümmern. Wenn ich also z.B. in einer Klasse ein Objekt erstelle und das Objekt nach außen gebe (z.B. als Return-Wert), dann ist nicht klar, wer jetzt der Owner des Objekts ist (sprich: Wer gibt den Speicher wieder frei? Das empfangende Objekt könnte dies tun, weiß aber nicht, ob das erzeugende Objekt das Return-Objekt noch braucht. Umgekehrt genauso.) Die Boost-shared_ptr sind ein Weg aus diesem Dilemma. Das ist ein Template, welches mitzählt, wieviele Objekte gerade Zugriff auf ein Objekt haben. Im fullcircle-Code sieht das so aus:&lt;br /&gt;
&lt;br /&gt;
* Jede Klasse definiert einen shared_ptr auf sich selbst. Das sieht so aus: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  class Frame {&lt;br /&gt;
    public:&lt;br /&gt;
      typedef std::tr1::shared_ptr&amp;lt;Frame&amp;gt; Ptr;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Man kann dann ein neues Objekt als shared_ptr anlegen, indem man folgendes macht:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  fullcircle::Frame::Ptr frame(new fullcircle::Frame(10,5));&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Das Objekt frame hat den Typ &amp;#039;fullcircle::Frame::Ptr&amp;#039;, ist also keine Instanz von &amp;#039;fullcircle::Frame&amp;#039;. Es ist quasi der Wächter, welcher überwacht, wieviele Objekte eine Referenz auf das darunter liegende Frame-Objekt haben. Das Frame-Objekt &amp;#039;fullcircle::Frame(10,5)&amp;#039; wird erzeugt und direkt als Konstruktor-Parameter dem Ptr übergeben. Das ist wichtig, weil so keine Memory-Allokationen am shared_ptr vorbei gemacht werden können. (Wenn das Spanisch ist: Einfach genau so benutzen.) Der Ptr liegt dabei immer auf dem Stack, d.h. wird innerhalb einer Methode angelegt oder als return-value irgendwo zwischengespeichert.&lt;br /&gt;
&lt;br /&gt;
* Der shared_ptr verhält sich wie ein Pointer auf das Objekt, welches er bewacht. Um z.B. den Frame auf der Konsole auszugeben, benutze ich &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  frame-&amp;gt;dump_frame(std::cout);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Der Pfeil-Operator auf dem Ptr-Objekt ist dabei so verbogen, dass ich die Methode &amp;#039;dump_frame&amp;#039; auf dem zugrunde liegenden Objekt aufrufe.&lt;br /&gt;
&lt;br /&gt;
* Das Memory-Management ist nun ganz einfach: Wenn der Ptr aus dem Scope läuft (z.B. weil die Methode verlassen wird), dann prüft der Destruktor des Ptr-Objekts, ob das Objekt noch sonstwo benutzt wird. Falls dies nicht der Fall ist, wird der Destruktor des zugrunde liegenden Objekts aufgerufen. Andernfalls hat ja sonst noch jemand einen Ptr auf das Objekt - es muss also weiter leben und wird nicht gelöscht.&lt;br /&gt;
&lt;br /&gt;
* Wichtig: Ein Ptr wird immer kopiert, sonst kann das Reference Counting nicht funktionieren. Daher bitte nie eine const-Referenz oder so benutzen, um einen Ptr zurückzuliefern. Also: Immer&lt;br /&gt;
&lt;br /&gt;
Frame::Ptr operator+(Frame::Ptr rhs);&lt;br /&gt;
&lt;br /&gt;
sowas verwenden: Die RHS kommt als normale Kopie in die Methode rein, und der Return-Wert ist auch ein normaler Ptr.&lt;br /&gt;
&lt;br /&gt;
Für mehr Infos und ein Beispiel empfehle ich den [http://www.heise.de/ix/artikel/Schubkraft-506826.html Artikel von Rüdiger Berlich].&lt;br /&gt;
&lt;br /&gt;
=== Git-Repository ===&lt;br /&gt;
&lt;br /&gt;
Liegt auf sesam.&lt;br /&gt;
&lt;br /&gt;
  $ git clone ssh://sesam/home/git/repo/libfullcircle.git&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Die Software wurde auf Mac OS (10.7) sowie Ubuntu (12.04) uebersetzt. Sie benoetigt folgende Bibliotheken/Programme:&lt;br /&gt;
&lt;br /&gt;
* cmake&lt;br /&gt;
* boost &amp;gt;= 1.48.0&lt;br /&gt;
* QT4&lt;br /&gt;
* Protocol Buffers (protobuf)&lt;br /&gt;
* hiredis&lt;br /&gt;
&lt;br /&gt;
Das sind alles Dinge, die fuer fast alle Plattformen ueber einen Paketmanager installiert werden koennen. Ich habe derzeit allerdings nur Entwicklungsmaschinen, auf denen schon alles installiert ist. Aus dem Kopf heraus:&lt;br /&gt;
&lt;br /&gt;
  # Ubuntu&lt;br /&gt;
  sudo apt-get install libqt4-dev protobuf-compiler libprotobuf-dev libboost1.48-all-dev cmake build-essential libhiredis-dev&lt;br /&gt;
&lt;br /&gt;
(bzw. mit Boost 1.49 direkt von den Quellen [[Diskussion:FullCircle/LibFullCircle]]) und &lt;br /&gt;
&lt;br /&gt;
  # Mac mit homebrew&lt;br /&gt;
  brew install qt4 protobuf boost hiredis&lt;br /&gt;
&lt;br /&gt;
Bei Gonium ist installiert:&lt;br /&gt;
&lt;br /&gt;
    $ brew info boost&lt;br /&gt;
    boost 1.49.0&lt;br /&gt;
    http://www.boost.org&lt;br /&gt;
    /usr/local/Cellar/boost/1.47.0 (8615 files, 306M)&lt;br /&gt;
    https://github.com/mxcl/homebrew/commits/master/Library/Formula/boost.rb&lt;br /&gt;
&lt;br /&gt;
    $ brew info qt&lt;br /&gt;
    qt 4.8.1&lt;br /&gt;
    http://qt.nokia.com/&lt;br /&gt;
    /usr/local/Cellar/qt/4.8.1 (2747 files, 194M) *&lt;br /&gt;
    https://github.com/mxcl/homebrew/commits/master/Library/Formula/qt.rb&lt;br /&gt;
&lt;br /&gt;
    $ brew info protobuf&lt;br /&gt;
    protobuf 2.4.1&lt;br /&gt;
    http://code.google.com/p/protobuf/&lt;br /&gt;
    /usr/local/Cellar/protobuf/2.4.1 (62 files, 5.9M) *&lt;br /&gt;
    https://github.com/mxcl/homebrew/commits/master/Library/Formula/protobuf.rb&lt;br /&gt;
&lt;br /&gt;
    $ brew info hiredis&lt;br /&gt;
    hiredis: stable 0.10.1, HEAD&lt;br /&gt;
    https://github.com/antirez/hiredis&lt;br /&gt;
    /usr/local/Cellar/hiredis/0.10.1 (10 files, 268K) *&lt;br /&gt;
    https://github.com/mxcl/homebrew/commits/master/Library/Formula/hiredis.rb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: Bitte verifizieren und ggf. anpassen.&lt;br /&gt;
&lt;br /&gt;
Der [[FullCircle/LibFullCircle/Buildvorgang]] unter Mac OS X nochmal zur Fehlersuche.&lt;br /&gt;
&lt;br /&gt;
=== Nutzungsbeispiel anhand eines Inputmoduls ===&lt;br /&gt;
&lt;br /&gt;
TODO: Kleines Beispiel-Inputmodul als separates Repository erstellen - dieses kann dann als Vorlage fuer die Input-Module benutzt werden.&lt;br /&gt;
&lt;br /&gt;
In src/fc-simpledemo.cpp ist ein kleiner C++-Code zum Erstellen einer Sequenz abgelegt. Er kann mit&lt;br /&gt;
&lt;br /&gt;
  $ make&lt;br /&gt;
&lt;br /&gt;
übersetzt und dann mit &lt;br /&gt;
&lt;br /&gt;
  $ ./build/src/fc-simpledemo -s sequence.fcs&lt;br /&gt;
&lt;br /&gt;
aufgerufen werden. Dann legt er eine Sequenz von 100 Frames in sequence.fcs ab. Der Code, der die Sequenz erzeugt, sieht so aus:&lt;br /&gt;
&lt;br /&gt;
  fullcircle::RGB_t white;&lt;br /&gt;
  white.red = white.green = white.blue = 255;&lt;br /&gt;
  fullcircle::RGB_t red;&lt;br /&gt;
  red.red = 255; red.green = red.blue = 0;&lt;br /&gt;
  fullcircle::Sequence::Ptr seq(new fullcircle::Sequence(2,10,5));&lt;br /&gt;
  for( uint32_t frameID = 0; frameID &amp;lt; 100; ++frameID) {&lt;br /&gt;
    fullcircle::Frame::Ptr frame(new fullcircle::Frame(10,5));&lt;br /&gt;
    uint16_t xpos=frameID % 10;&lt;br /&gt;
    uint16_t ypos=frameID % 5;&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot; Frame &amp;quot; &amp;lt;&amp;lt; frameID &lt;br /&gt;
      &amp;lt;&amp;lt; &amp;quot; Xpos: &amp;quot; &amp;lt;&amp;lt; xpos &lt;br /&gt;
      &amp;lt;&amp;lt; &amp;quot; Ypos: &amp;quot; &amp;lt;&amp;lt; ypos &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    frame-&amp;gt;set_pixel(xpos, ypos, red);&lt;br /&gt;
    frame-&amp;gt;set_pixel(0, 0, white);&lt;br /&gt;
    seq-&amp;gt;add_frame(frame);&lt;br /&gt;
    frame-&amp;gt;dump_frame(std::cout);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Die Sequenz kann dann mit&lt;br /&gt;
&lt;br /&gt;
  std::fstream output(sequence.c_str(), &lt;br /&gt;
          std::ios::out | std::ios::trunc | std::ios::binary);&lt;br /&gt;
  seq-&amp;gt;save(output, &amp;quot;Testcase: check_sequence_storage&amp;quot;, &amp;quot;current&amp;quot;);&lt;br /&gt;
  output.close();&lt;br /&gt;
&lt;br /&gt;
gespeichert werden.&lt;/div&gt;</summary>
		<author><name>Scytale</name></author>
	</entry>
</feed>