1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
\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<uint32_t, CPixelFormat::RGBPIXEL *> 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<uint32_t>(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}
|