STE-Industries: utilities testing
Main.cpp
Go to the documentation of this file.
1 # include "Graphic.h"
2 # include "Bitmap.h"
3 # include "RandomGenerator.h"
4 # include "FileException.h"
5 # include "IntegerException.h"
6 # include "FloatException.h"
7 # include "NameException.h"
8 # include "ParameterDescriptor.h"
11 # include "Thread.h"
12 
13 # include <stdlib.h>
14 # include <stdio.h>
15 # include <string.h>
16 # include <ctype.h>
17 # include <errno.h>
18 # include <time.h>
19 # include <unistd.h>
20 # include <math.h>
21 
22 using namespace GraphicSpace;
23 
26 static constexpr unsigned int MAJOR_VERSION_NUMBER = 1;
27 
30 static constexpr unsigned int MINOR_VERSION_NUMBER = 1;
31 
34 static constexpr const char* const OpenWriteText = "w";
35 
38 static constexpr const char* IMAGE_SIZE_FORMAT =
39  "Width = %" PRIuFAST32 ", Height = %" PRIuFAST32 ", Size = %" PRIuFAST32
40  "\n";
41 
44 static constexpr const char* BITS_PER_PIXEL_FORMAT =
45  "Bits per pixel = %u\n";
46 
49 static constexpr const char* FILE_SIZE_FORMAT = "File size = %lu\n";
50 
54 static constexpr const char* RESOLUTION_FORMAT =
55  "Horizontal resolution = %" PRIuFAST32 ", Vertical resolution = %"
56  PRIuFAST32 "\n";
57 
60 static constexpr const char* VERSION_FORMAT =
61  "Termite-Retinex correction program, version %u.%u\n\n";
62 
65 static constexpr const char* USAGE_FORMAT =
66  "Usage: Graphic <Input Pathname> <Output Pathname> { <Options> }\n"
67  "where Options can be:\n";
68 
71 static constexpr const char* INVALID_OPTION_FORMAT =
72  "Invalid option %s\n";
73 
77 static constexpr const char* READING_FORMAT = "Reading %s\n";
78 
82 static constexpr const char* END_READING_FORMAT =
83  "End of reading; elapsed time = %lu\n";
84 
87 static constexpr const char* CORRECTING_MESSAGE =
88  "Correcting the image with %u thread(s)\n";
89 
93 static constexpr const char* END_CORRECTION_FORMAT =
94  "End of correction; elapsed time = %lu\n";
95 
99 static constexpr const char* WRITING_FORMAT = "Writing %s\n";
100 
104 static constexpr const char* END_WRITING_FORMAT =
105  "End of writing; elapsed time = %lu\n";
106 
110  {
111  1, 100, 100, 1.0, 0.5, 0.5, false, Bitmap::ChoiceType::MAXIMUM, false,
112  false
113  };
114 
122  {
124  ("-Threads", 1, Bitmap::MAXIMUM_NUMBER_OF_THREADS,
128  ("-Termites", 1, Bitmap::MAXIMUM_NUMBER_OF_TERMITES,
132  ("-Steps", 1, Bitmap::MAXIMUM_NUMBER_OF_STEPS,
144  new EnumeratedParameterDescriptor<bool>("-Randomize",
150  new EnumeratedParameterDescriptor<bool>("-TruncatePath",
156  };
157 
158 static void Randomize(const Bitmap::CorrectionParameters& Parameters,
159  Bitmap& CurrentBitmap) noexcept;
160 
161 static void WriteProperties(const Bitmap& CurrentBitmap, const char* Path)
162  noexcept(false);
163 
164 static void Usage(void) noexcept(false);
165 
166 static void Application(const char* InputPathname,
167  const char* OutputPathname,
168  const Bitmap::CorrectionParameters& Parameters)
169  noexcept(false);
170 
186 
187 static void Randomize(const Bitmap::CorrectionParameters& Parameters,
188  Bitmap& CurrentBitmap) noexcept
189  {
190  register unsigned int Index;
191  time_t Time;
192  tm TimeData;
193 
194  Time = time(nullptr);
195  TimeData = *gmtime(&Time);
196 
197  uint_fast32_t Seed [RandomGenerator::NUMBER_OF_GENERATORS + 1] =
198  {
199  0,
200  static_cast<uint_fast32_t>(TimeData.tm_sec),
201  static_cast<uint_fast32_t>(TimeData.tm_min),
202  static_cast<uint_fast32_t>(TimeData.tm_hour),
203  static_cast<uint_fast32_t>(TimeData.tm_mday),
204  static_cast<uint_fast32_t>(TimeData.tm_mon),
205  static_cast<uint_fast32_t>(TimeData.tm_year),
206  static_cast<uint_fast32_t>(TimeData.tm_wday),
207  static_cast<uint_fast32_t>(TimeData.tm_yday),
208  static_cast<uint_fast32_t>(clock()),
209  static_cast<uint_fast32_t>(time(nullptr)),
210  static_cast<uint_fast32_t>(getpid()),
211  static_cast<uint_fast32_t>(getppid()),
212  static_cast<uint_fast32_t>(getuid()),
213  static_cast<uint_fast32_t>(getgid()),
214  static_cast<uint_fast32_t>(reinterpret_cast<intptr_t>(Seed)),
215  static_cast<uint_fast32_t>(reinterpret_cast<intptr_t>(stdin)),
216  static_cast<uint_fast32_t>(reinterpret_cast<intptr_t>
217  (Randomize)),
218  static_cast<uint_fast32_t>(reinterpret_cast<intptr_t>(&Time)),
219  static_cast<uint_fast32_t>(reinterpret_cast<intptr_t>
220  (&DefaultParameters)),
221  static_cast<uint_fast32_t>(Parameters.Termites),
222  static_cast<uint_fast32_t>(Parameters.Steps),
223  static_cast<uint_fast32_t>(lrintf(Parameters.RepulsionStep *
224  static_cast<float>(UINT_FAST32_MAX))),
225  static_cast<uint_fast32_t>(lrintf(Parameters.Alpha *
226  static_cast<float>(UINT_FAST32_MAX))),
227  static_cast<uint_fast32_t>(lrintf(Parameters.Beta *
228  static_cast<float>(UINT_FAST32_MAX))),
229  static_cast<uint_fast32_t>(CurrentBitmap.GetWidth()),
230  static_cast<uint_fast32_t>(CurrentBitmap.GetHeight()),
231  1,
232  2,
233  3
234  };
235  for (Index = 1; Index < NumberOfElements(Seed); ++Index)
236  Seed [0] ^= Seed [Index];
237  for (Index = 1; Index < NumberOfElements(Seed); ++Index)
238  Seed [Index] ^= Seed [0] ^ Index;
239  CurrentBitmap.Randomize(Seed);
240  }
241 
268 
269 static void WriteProperties(const Bitmap& CurrentBitmap, const char* Path)
270  noexcept(false)
271  {
272  FILE* OutputFile;
273 
274  if (Path == nullptr)
275  OutputFile = stdout;
276  else
277  if ((OutputFile = fopen(Path, OpenWriteText)) == nullptr)
279  Path);
280  if (fprintf(OutputFile, IMAGE_SIZE_FORMAT, CurrentBitmap.GetWidth(),
281  CurrentBitmap.GetHeight(), CurrentBitmap.GetSize()) < 0)
283  if (fprintf(OutputFile, BITS_PER_PIXEL_FORMAT,
284  CurrentBitmap.GetBitsPerPixel()) < 0)
286  if (fprintf(OutputFile, FILE_SIZE_FORMAT,
287  static_cast<unsigned long>(Bitmap::HEADER_SIZE +
288  Bitmap::DIB_HEADER_SIZE + CurrentBitmap.ComputeLineSize() *
289  CurrentBitmap.GetHeight())) < 0)
291  if (fprintf(OutputFile, RESOLUTION_FORMAT,
292  CurrentBitmap.GetHorizontalResolution(),
293  CurrentBitmap.GetVerticalResolution()) < 0)
295  if (Path != nullptr)
296  if (fclose(OutputFile) != 0)
298  Path);
299  }
300 
316 
317 static void Usage(void) noexcept(false)
318  {
319  register unsigned int Index;
320 
321  if (printf(USAGE_FORMAT) < 0)
324  for (Index = 0; Index < NumberOfElements(DescriptorTable); ++Index)
325  DescriptorTable [Index]->PrintUsage(DefaultParameters);
326  exit(EXIT_FAILURE);
327  }
328 
434 
435 void Application(const char* InputPathName, const char* OutputPathName,
436  const Bitmap::CorrectionParameters& Parameters) noexcept(false)
437  {
438  time_t StartTime;
439  Bitmap SourceBitmap;
440  Bitmap CorrectedBitmap;
441 
442  StartTime = time(nullptr);
443  if (printf(READING_FORMAT, InputPathName) < 0)
445  STANDARD_OUTPUT));
446  SourceBitmap.ReadFile(InputPathName);
447  if (printf(END_READING_FORMAT,
448  static_cast<unsigned long>(time(nullptr) - StartTime)) < 0)
450  STANDARD_OUTPUT));
451  if (not Parameters.Quiet)
452  WriteProperties(SourceBitmap, nullptr);
453  if (printf(CORRECTING_MESSAGE, Parameters.Threads) < 0)
455  STANDARD_OUTPUT));
456  if (Parameters.RandomizeFlag)
457  Randomize(Parameters, SourceBitmap);
458  CorrectedBitmap = SourceBitmap.Correct(Parameters);
459  if (printf(END_CORRECTION_FORMAT,
460  static_cast<unsigned long>(time(nullptr) - StartTime)) < 0)
462  STANDARD_OUTPUT));
463  if (printf(WRITING_FORMAT, OutputPathName) < 0)
465  STANDARD_OUTPUT));
466  CorrectedBitmap.WriteFile(OutputPathName);
467  if (printf(END_WRITING_FORMAT,
468  static_cast<unsigned long>(time(nullptr) - StartTime)) < 0)
470  STANDARD_OUTPUT));
471  }
472 
492 
493 int main(int argc, char* argv [])
494  {
495  register unsigned int Index;
496  register size_t Length;
497  register const char* Pointer;
498  const char* InputPathName;
499  const char* OutputPathName;
501  Parameters(DefaultParameters);
502 
503  try
504  {
510  if (argc < 3)
511  Usage();
512  InputPathName = *++argv;
513  OutputPathName = *++argv;
514  while (*++argv != nullptr)
515  {
516  if ((Pointer = strchr(*argv,
518  nullptr)
519  {
520  IgnoreValue(fprintf(stderr,
521  INVALID_OPTION_FORMAT, *argv));
522  Usage();
523  break;
524  }
525  Length = static_cast<size_t>(Pointer - *argv);
526  for (Index = 0;
528  ++Index)
529  {
530  if (Length != strlen(DescriptorTable [Index]->
531  GetName()))
532  continue;
533  if (strncmp(*argv, DescriptorTable [Index]->
534  GetName(), Length) != 0)
535  continue;
536  DescriptorTable [Index]->
537  Assign(Pointer, Parameters);
538  break;
539  }
540  if (Index == NumberOfElements(DescriptorTable))
541  {
542  IgnoreValue(fprintf(stderr,
543  INVALID_OPTION_FORMAT, *argv));
544  Usage();
545  break;
546  }
547  }
548  Application(InputPathName, OutputPathName, Parameters);
550  }
551  catch (FileException Exception)
552  {
553  Exception.Write(stderr);
554  exit(EXIT_FAILURE);
555  }
557  {
558  Exception.Write(stderr);
559  Usage();
560  exit(EXIT_FAILURE);
561  }
562  catch (FloatException Exception)
563  {
564  Exception.Write(stderr);
565  Usage();
566  exit(EXIT_FAILURE);
567  }
568  catch (NameException Exception)
569  {
570  Exception.Write(stderr);
571  exit(EXIT_FAILURE);
572  }
573  return EXIT_SUCCESS;
574  }
CORRECTING_MESSAGE
static constexpr const char * CORRECTING_MESSAGE
Definition: Main.cpp:87
GraphicSpace::EnumeratedParameterDescriptor
Definition: EnumeratedParameterDescriptor.h:37
VERSION_FORMAT
static constexpr const char * VERSION_FORMAT
Definition: Main.cpp:60
GraphicSpace::IntegerExceptionType::INVALID_NUMBER_OF_TERMITES
@ INVALID_NUMBER_OF_TERMITES
Invalid number of termites parameter.
GraphicSpace::Bitmap::HEADER_SIZE
static constexpr unsigned int HEADER_SIZE
Definition: Bitmap.h:46
GraphicSpace::Bitmap::CorrectionParameters::Threads
unsigned int Threads
Definition: Bitmap.h:187
GraphicSpace::RandomGenerator::NUMBER_OF_GENERATORS
static constexpr unsigned int NUMBER_OF_GENERATORS
Definition: RandomGenerator.h:37
GraphicSpace::Exception::Write
virtual void Write(FILE *OutputFile) const noexcept PURE_VIRTUAL
GraphicSpace::EnumeratedExceptionType::INVALID_RANDOMIZE_PARAMETER
@ INVALID_RANDOMIZE_PARAMETER
Invalid Randomize parameter.
USAGE_FORMAT
static constexpr const char * USAGE_FORMAT
Definition: Main.cpp:65
GraphicSpace::Bitmap::CorrectionParameters::Beta
float Beta
Definition: Bitmap.h:207
WriteProperties
static void WriteProperties(const Bitmap &CurrentBitmap, const char *Path) noexcept(false)
Definition: Main.cpp:269
GraphicSpace::Exception
Definition: Exception.h:29
Bitmap.h
END_READING_FORMAT
static constexpr const char * END_READING_FORMAT
Definition: Main.cpp:82
NumberOfElements
#define NumberOfElements(Array)
Definition: Graphic.h:65
GraphicSpace::Bitmap::CorrectionParameters::Steps
unsigned int Steps
Definition: Bitmap.h:195
NumericParameterDescriptor.h
GraphicSpace::ParameterDescriptor
Definition: ParameterDescriptor.h:31
GraphicSpace::Bitmap::ChoiceType::MAXIMUM
@ MAXIMUM
The step with maximum probability is chosen.
READING_FORMAT
static constexpr const char * READING_FORMAT
Definition: Main.cpp:77
Graphic.h
GraphicSpace::Bitmap::Correct
Bitmap Correct(register const CorrectionParameters &Parameters) noexcept(false)
Definition: Bitmap.cpp:1076
FILE_SIZE_FORMAT
static constexpr const char * FILE_SIZE_FORMAT
Definition: Main.cpp:49
GraphicSpace::IntegerException
Definition: IntegerException.h:92
END_WRITING_FORMAT
static constexpr const char * END_WRITING_FORMAT
Definition: Main.cpp:104
GraphicSpace::EnumeratedExceptionType::INVALID_PATH_CHOICE_PARAMETER
@ INVALID_PATH_CHOICE_PARAMETER
Invalid Pathchoice parameter.
GraphicSpace::Bitmap::CorrectionParameters::Alpha
float Alpha
Definition: Bitmap.h:203
GraphicSpace::FloatException
Definition: FloatException.h:56
GraphicSpace::EnumeratedExceptionType::INVALID_TRUNCATE_PATH_PARAMETER
@ INVALID_TRUNCATE_PATH_PARAMETER
Invalid TruncatePath parameter.
GraphicSpace::Bitmap::WriteFile
void WriteFile(const char *Path) noexcept(false)
Definition: Bitmap.cpp:973
GraphicSpace::IntegerExceptionType::INVALID_NUMBER_OF_STEPS
@ INVALID_NUMBER_OF_STEPS
Invalid number of steps parameter.
GraphicSpace::FloatExceptionType::INVALID_REPULSION_STEP
@ INVALID_REPULSION_STEP
Invalid repulsion step parameter.
GraphicSpace::FileExceptionType::FILE_WRITE_ERROR
@ FILE_WRITE_ERROR
main
int main(int argc, char *argv[])
Definition: Main.cpp:493
NameException.h
GraphicSpace::Bitmap::CorrectionParameters::RandomizeFlag
bool RandomizeFlag
Definition: Bitmap.h:212
GraphicSpace::Bitmap::MAXIMUM_NUMBER_OF_THREADS
static constexpr unsigned int MAXIMUM_NUMBER_OF_THREADS
Definition: Bitmap.h:140
GraphicSpace::Bitmap::ReadFile
void ReadFile(const char *Path) noexcept(false)
Definition: Bitmap.cpp:824
FileException.h
GraphicSpace::Bitmap::CorrectionParameters::Termites
unsigned int Termites
Definition: Bitmap.h:191
MAJOR_VERSION_NUMBER
static constexpr unsigned int MAJOR_VERSION_NUMBER
Definition: Main.cpp:26
RESOLUTION_FORMAT
static constexpr const char * RESOLUTION_FORMAT
Definition: Main.cpp:54
Thread.h
GraphicSpace::Bitmap::MAXIMUM_NUMBER_OF_STEPS
static constexpr unsigned int MAXIMUM_NUMBER_OF_STEPS
Definition: Bitmap.h:151
GraphicSpace::FileExceptionType::FILE_CLOSE_ERROR
@ FILE_CLOSE_ERROR
BITS_PER_PIXEL_FORMAT
static constexpr const char * BITS_PER_PIXEL_FORMAT
Definition: Main.cpp:44
GraphicSpace::Bitmap::DIB_HEADER_SIZE
static constexpr unsigned int DIB_HEADER_SIZE
Definition: Bitmap.h:63
INVALID_OPTION_FORMAT
static constexpr const char * INVALID_OPTION_FORMAT
Definition: Main.cpp:71
GraphicSpace::Thread::Initialize
static void Initialize(void) noexcept(false)
Definition: Thread.cpp:79
GraphicSpace::Bitmap::CorrectionParameters::ChoiceKind
ChoiceType ChoiceKind
Definition: Bitmap.h:216
STANDARD_OUTPUT
static constexpr const char * STANDARD_OUTPUT
Definition: Graphic.h:35
Randomize
static void Randomize(const Bitmap::CorrectionParameters &Parameters, Bitmap &CurrentBitmap) noexcept
Definition: Main.cpp:187
OpenWriteText
static constexpr const char *const OpenWriteText
Definition: Main.cpp:34
Application
static void Application(const char *InputPathname, const char *OutputPathname, const Bitmap::CorrectionParameters &Parameters) noexcept(false)
Definition: Main.cpp:435
GraphicSpace::FileExceptionType::FILE_OPEN_ERROR
@ FILE_OPEN_ERROR
DefaultParameters
static const Bitmap::CorrectionParameters DefaultParameters
Definition: Main.cpp:109
GraphicSpace::Thread::Finalize
static void Finalize(void) noexcept
Definition: Thread.cpp:115
GraphicSpace::Bitmap::CorrectionParameters::RepulsionStep
float RepulsionStep
Definition: Bitmap.h:199
DescriptorTable
const ParameterDescriptor *const DescriptorTable[]
Definition: Main.cpp:121
GraphicSpace::Bitmap::CorrectionParameters
Definition: Bitmap.h:182
GraphicSpace::ParameterDescriptor::EQUAL_CHARACTER
static constexpr char EQUAL_CHARACTER
Definition: ParameterDescriptor.h:63
GraphicSpace
Definition: Bitmap.cpp:29
RandomGenerator.h
GraphicSpace::FileException
Definition: FileException.h:60
MINOR_VERSION_NUMBER
static constexpr unsigned int MINOR_VERSION_NUMBER
Definition: Main.cpp:30
GraphicSpace::NumericParameterDescriptor
Definition: NumericParameterDescriptor.h:41
FloatException.h
GraphicSpace::Bitmap::CorrectionParameters::TruncatePath
bool TruncatePath
Definition: Bitmap.h:221
GraphicSpace::Bitmap::CorrectionParameters::Quiet
bool Quiet
Definition: Bitmap.h:226
END_CORRECTION_FORMAT
static constexpr const char * END_CORRECTION_FORMAT
Definition: Main.cpp:93
GraphicSpace::Bitmap::MAXIMUM_NUMBER_OF_TERMITES
static constexpr unsigned int MAXIMUM_NUMBER_OF_TERMITES
Definition: Bitmap.h:145
GraphicSpace::FileExceptionType
FileExceptionType
Definition: FileException.h:34
IntegerException.h
Usage
static void Usage(void) noexcept(false)
Definition: Main.cpp:317
IMAGE_SIZE_FORMAT
static constexpr const char * IMAGE_SIZE_FORMAT
Definition: Main.cpp:38
WRITING_FORMAT
static constexpr const char * WRITING_FORMAT
Definition: Main.cpp:99
GraphicSpace::EnumeratedExceptionType::INVALID_QUIET_PARAMETER
@ INVALID_QUIET_PARAMETER
Invalid Quiet parameter.
IgnoreValue
#define IgnoreValue(Expression)
Definition: Graphic.h:55
GraphicSpace::Bitmap
Definition: Bitmap.h:32
GraphicSpace::NameException
Definition: NameException.h:50
ParameterDescriptor.h
GraphicSpace::IntegerExceptionType::INVALID_NUMBER_OF_THREADS
@ INVALID_NUMBER_OF_THREADS
Invalid number of threads parameter.
EnumeratedParameterDescriptor.h