\documentclass[12pt,a4paper,titlepage,oneside]{article} \usepackage[utf8]{inputenc} \usepackage{oop_prot} \usepackage{url} \usepackage{pdfpages} \usepackage{booktabs} \title{Beispiel 2} \author{ Günther Neuwirth, \matrnr 0626638\\ {\small e0626638@student.tuwien.ac.at}\\ Manuel Mausz, \matrnr 0728348\\ {\small manuel-tu@mausz.at}\\ } \begin{document} % create titlepage \maketitle \parindent 0pt \tableofcontents \newpage %------------------------------------------------------------------ %------------------------------------------------------------------ \section{Aufgabenstellung - Beispiel 2} \includegraphics[width=\textwidth,page=1]{../angabe.pdf} \includegraphics[width=\textwidth,page=2]{../angabe.pdf} \includegraphics[width=\textwidth,page=3]{../angabe.pdf} %------------------------------------------------------------------ %------------------------------------------------------------------ \newpage \section{Beispiel 2} \subsection{Design}\label{Design} Abbildung~\ref{fig:classdiagram1} zeigt das Klassendiagramm der Aufgabe. \parskip 30pt Refaktorisirung: \parskip 12pt Notwendigerweise und wie verlangt wurde die Klasse \mbox{CBitmap} zu einer abstrakten Interfaceklasse umgewandelt. Diese stellt nun die Oberklasse der zu unterstützenden Dateiformate dar und enthält verschieden virtuelle Methoden, die von ihren Unterklassen zu implementieren sind. Dazu gehören, die schon aus Beispiel 1, bekannten Methoden \mbox{read()} und \mbox{write()}, welche das Einlesen und Schreiben der Bilddaten realisieren. Hinzugekommen sind nun verschiedene ``getter'' Methoden, wie zB.: \mbox{getHeight()} oder \mbox{getWidth()}, die vom direkten Zugriff auf die Bild-Informationen im jeweiligen Header-Speicher, der als ``struct'' deklariert wurde, abstrahieren.\\ Die Methoden, zur Realisierung der einzelnen in den Aufgabenstellungen verlangten Befehle, wurden als ``protected'', in der zugehörigen cbitmap.cpp Datei, generisch implementiert. Mit dieser Vorgehensweise war es möglich, die zu unterstützenden Dateiformate, auf ihre Eigenheiten beschränkt, zu realisieren und Code wieder zu verwenden. Unterklassen sind CWindowsBitmap aus Aufgabenstellung 1 und das neu hinzugekommene Format Pixmap. \\ \parskip 12pt Die abstrakte Interfaceklasse \mbox{CPixelFormat} wurde aus Beispiel 1 übernommen und enthält genauso, neben \mbox{getPixel()} und \mbox{setPixel()}, zusätzliche virtuelle Methoden, die von den Unterklassen zu implementieren sind und Informationen zu den, von ihnen zu verarbeitenden Pixelcodierung, bereitstellen. Weiters wurde eine Datenstruktur als Type, namens \mbox{RGBPIXEL}, eingeführt, welche zur Übergabe der Farbwerte, der einzelnen Pixel, dient. Unterklassen sind \mbox{CPixelformat\_brg24} aus Aufgabenstellung 1, sowie die neuen Formate \mbox{CPixelformat\_brg555} und \mbox{CPixelformat\_Indexed8}. \\ \parskip 30pt Asserts: \parskip 12pt Beim einlesen und bearbeiten von Bilddaten wurden Zusicherungen deklariert, welche die Größe und Existenz der Bilddaten validieren. \newpage %================================================================== \begin{figure}[htb] \begin{center} \epsfxsize=0.9\textwidth\epsfbox{imgsynth2.png} \end{center} \caption{Klassendiagramm 1} \label{fig:classdiagram1} \end{figure} %================================================================== \newpage \subsection{Verwaltung der Ressourcen} Die Vorgehensweise bei der Ressourcenverwaltung wurde größtenteils von Aufgabe 1 übernommen. Neu dazugekommen sind Funktionalitäten zur Verwaltung von Farbtabellen. Dabei wurde ebenfalls ein generisches Konzept entwickelt, welches Unterschiede in der Farb-Indizierung ausgleichen soll. Erwähnt sei, dass in der Implementierung der Klasse CPixmap vorerst nur Farbwerte in hexadezimaler Form, sowie der Pixmap eigene Darstellungs-Modus ``c'' unterstützt werden. Beim Einlesen der Pixeldaten, welche die Indizes der zugeordneten Farbwert darstellen, werden diese mit internen, allgemeineren Indizes, der Form 0,1,2 .. n ausgetauscht. Die Farbtabelle wird in einer ``map'', welche im abstrakten Interface CBitmap deklariert ist und die internen Indizes als Schlüssel erwartet, abgelegt. Farbwerte werden dabei in der, in Abschnitt 2.1 erwähnten Datenstrucktur \mbox{RGBPIXEL} organisiert, für die dynamisch Speicher alloziert wird. Die Freigabe dieser Ressourcen erfolgt wieder im Destruktor von \mbox{CBitmap}. \\ \subsection{Fehlerbehandlung} Die Fehlerbehandlung erfolgt nach wie vor über \mbox{CPixelFormat::PixelFormatError}, \mbox{CFile::FileError}, \mbox{CScriptParser::ParserError} und dem ``try-catch'' Block im Hauptprogramm. Die Header und Pixeldaten werden beim einlesn, gemäß der Spezifikation, auf Korrektheit überprüft. Im Fehlerfall wird eine Exeception geworfen, eine Fehlerbeschreibung über stderr ausgegeben und das Programm beendet. \subsection{Implementierung} Im Folgenden werden einige Implementierungauszüge, der geforderten Funktionen, gezeigt. Siehe auch Punkt~\ref{Design} und Abbildung~\ref{fig:classdiagram1} sowie Punkt~\ref{Listings}. Im Falle eines Bildes mit Farbtabelle ist es nur notwendig, die Farbwerte in der Tabelle zu ändern. Die Farbtabelle ist in folgender Form in der abstrakten Interfaceklasse \mbox{CBitmap} deklariert. %================================================================== \begin{lstlisting}{} std::map m_colortable; \end{lstlisting} %================================================================== \newpage Beim schreiben der \mbox{CPixmap} Bilddaten werden die Pixel und Indizes der Farbtabelle wieder in Characters zurückkonveriert. %================================================================== \begin{lstlisting}{} #define PIXMAP_COLORCHARS ".#abcdefghijklmnopqrstuvwxyzABCD" \ "EFGHIJKLMNOPQRSTUVWXYZ0123456789" \end{lstlisting} %==== invert(): Beispiel für die Invertierung eines Farbwertes in einer Rastergrafik. %================================================================== \begin{lstlisting}{} pixel.red = max.red - pixel.red; \end{lstlisting} %==== brightness(params): Beispiel für die veränderung der Helligkeit eines Bildpunktes. %================================================================== \begin{lstlisting}{} pixel.red = min(max.red, static_cast(pixel.red * factor)); \end{lstlisting} %==== \section{Projektverlauf} \subsection{Probleme und Fallstricke} Die Schwierigkeit bestand darin, einen Weg zu finden Bildformate mit Farbtabellen gleichermaßen zu behandeln, wie jene, die die Farbwerte direkt im Bildspeicher halten. Durch die virtuelle Methode \mbox{const bool hasColorTable()} in der abstrakten Interfaceklasse \mbox{CBitmap} ist es möglich die Abarbeitung von Operationen auf den Bilddaten entsprechend zu delegieren. \subsection{Arbeitsaufwand} \begin{tabular}{ll} \toprule Entwicklungsschritt / Meilenstein & Arbeitsaufwand in Stunden\\ \hline Erstes Design & 2 Stunden\\ \hline Refaktorisierung & 6 Stunden\\ \hline Implementierung (und Anpassung des Designs) & 5 Tag\\ \hline Dokumentation (Doxygen) und Überprüfung aller\\ Anforderungen gemäß der Programmierrichtlinien & 3 Stunden\\ \hline Erstellung des Protokolls & 3 Stunden\\ \bottomrule \end{tabular} %------------------------------------------------------------------ %------------------------------------------------------------------ \newpage \section{Listings}\label{Listings} \subsection{imgsynth2.cpp} \lstinputlisting{../imgsynth2/imgsynth2.cpp} \newpage \subsection{cscriptparser.h} \lstinputlisting{../imgsynth2/cscriptparser.h} \newpage \subsection{cscriptparser.cpp} \lstinputlisting{../imgsynth2/cscriptparser.cpp} \newpage \subsection{cfile.h} \lstinputlisting{../imgsynth2/cfile.h} \newpage \subsection{cbitmap.h} \lstinputlisting{../imgsynth2/cbitmap.h} \newpage \subsection{cbitmap.cpp} \lstinputlisting{../imgsynth2/cbitmap.cpp} \newpage \subsection{cwindowsbitmap.h} \lstinputlisting{../imgsynth2/cwindowsbitmap.h} \newpage \subsection{cwindowsbitmap.cpp} \lstinputlisting{../imgsynth2/cwindowsbitmap.cpp} \newpage \subsection{cpixmap.h} \lstinputlisting{../imgsynth2/cpixmap.h} \newpage \subsection{cpixmap.cpp} \lstinputlisting{../imgsynth2/cpixmap.cpp} \newpage \subsection{cpixelformat.h} \lstinputlisting{../imgsynth2/cpixelformat.h} \newpage \subsection{cpixelformat\_bgr24.h} \lstinputlisting{../imgsynth2/cpixelformat_bgr24.h} \newpage \subsection{cpixelformat\_bgr24.cpp} \lstinputlisting{../imgsynth2/cpixelformat_bgr24.cpp} \newpage \subsection{cpixelformat\_bgr555.h} \lstinputlisting{../imgsynth2/cpixelformat_bgr555.h} \newpage \subsection{cpixelformat\_bgr555.cpp} \lstinputlisting{../imgsynth2/cpixelformat_bgr555.cpp} \newpage \subsection{cpixelformat\_indexed8.h} \lstinputlisting{../imgsynth2/cpixelformat_indexed8.h} \newpage \subsection{cpixelformat\_indexed8.cpp} \lstinputlisting{../imgsynth2/cpixelformat_indexed8.cpp} \end{document}