\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 Refaktorisierung: \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 z.B. \mbox{getHeight()} oder \mbox{getWidth()}, die vom direkten Zugriff auf allgemeine Bildinformationen abstrahieren.\\ Die gemäß Aufgabenstellungen verlangten Befehle zur Bildbearbeiten, wurden in abstrakten Interfaceklasse CBitmap als ``protected'' generisch für alle Bildformate implementiert. Mit dieser Vorgehensweise war es möglich, die zu unterstützenden Dateiformate auf ihre Eigenheiten zu beschränken, diese zu realisieren und allgemeinen Code wieder zu verwenden. Unterklassen sind CWindowsBitmap aus Aufgabenstellung 1 und für das neu hinzugekommene Format Pixmap die Klasse CPixmap. \\ \parskip 12pt Die abstrakte Interfaceklasse \mbox{CPixelFormat} wurde aus Beispiel 1 übernommen und enthält nun 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 die Datenstruktur \mbox{RGBPIXEL} eingeführt, welche zur Übergabe der Farbwerte der einzelnen Pixel dient. Unterklassen sind \mbox{CPixelformat\_BRG24} aus Beispiel 1 sowie die neuen Formate \mbox{CPixelformat\_BRG55} 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 sicherstellen. \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 hinzugekommen sind Funktionalitäten zur Verwaltung von Farbtabellen. Dabei wurde ebenfalls ein generisches Konzept gewählt, welches Unterschiede in der Farbindizierung ausgleichen soll. Erwähnt sei, dass in der Implementierung der Klasse CPixmap vorerst nur Farbwerte in hexadezimaler Form sowie der Pixmap eigene Darstellungsmodus ``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 ``\mbox{std::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 Datenstruktur \mbox{RGBPIXEL}, für die dynamisch Speicher alloziert werden muss, organisiert. Die Freigabe dieser Ressourcen erfolgt wieder im Destruktor von \mbox{CBitmap}.\\ \subsection{Fehlerbehandlung} Die Fehlerbehandlung erfolgt nach wie vor über die Übersetzung der Exceptions \mbox{CPixelFormat::PixelFormatError}, \mbox{CFile::FileError}, \mbox{CScriptParser::ParserError} und dem ``try-catch'' Block im Hauptprogramm. Die Header und Pixeldaten werden beim Einlesen rudimentär, aber gemäß der Spezifikation, auf Korrektheit überprüft. Im Fehlerfall wird eine Exception 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 Bilddaten für das Format Pixmap werden die Pixel und Indizes der Farbtabelle wieder in korrekte Identifier zurückkonvertiert. %================================================================== \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 Bildoperationen 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}