mirror of
https://github.com/davidgiven/fluxengine.git
synced 2025-10-31 11:17:01 -07:00
Refactor all the image writing stuff into a ImageWriter subclass hierarchy with
a factory based on extension.
This commit is contained in:
112
lib/image.cc
112
lib/image.cc
@@ -1,10 +1,11 @@
|
||||
#include "globals.h"
|
||||
#include "image.h"
|
||||
#include "sector.h"
|
||||
#include "sectorset.h"
|
||||
#include "fmt/format.h"
|
||||
#include "flags.h"
|
||||
#include "dataspec.h"
|
||||
#include "sector.h"
|
||||
#include "sectorset.h"
|
||||
#include "imagewriter/imagewriter.h"
|
||||
#include "fmt/format.h"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
@@ -49,105 +50,8 @@ void readSectorsFromFile(SectorSet& sectors, const ImageSpec& spec)
|
||||
|
||||
void writeSectorsToFile(const SectorSet& sectors, const ImageSpec& spec)
|
||||
{
|
||||
unsigned numCylinders = spec.cylinders;
|
||||
unsigned numHeads = spec.heads;
|
||||
unsigned numSectors = spec.sectors;
|
||||
unsigned numBytes = spec.bytes;
|
||||
if (!spec.initialised)
|
||||
{
|
||||
sectors.calculateSize(numCylinders, numHeads, numSectors, numBytes);
|
||||
std::cout << "Autodetecting output geometry\n";
|
||||
}
|
||||
|
||||
/* Emit the map. */
|
||||
|
||||
int badSectors = 0;
|
||||
int missingSectors = 0;
|
||||
int totalSectors = 0;
|
||||
std::cout << "H.SS Tracks --->" << std::endl;
|
||||
for (int head = 0; head < numHeads; head++)
|
||||
{
|
||||
for (int sectorId = 0; sectorId < numSectors; sectorId++)
|
||||
{
|
||||
std::cout << fmt::format("{}.{:2} ", head, sectorId);
|
||||
for (int track = 0; track < numCylinders; track++)
|
||||
{
|
||||
Sector* sector = sectors.get(track, head, sectorId);
|
||||
if (!sector)
|
||||
{
|
||||
std::cout << 'X';
|
||||
missingSectors++;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (sector->status)
|
||||
{
|
||||
case Sector::OK:
|
||||
std::cout << '.';
|
||||
break;
|
||||
|
||||
case Sector::BAD_CHECKSUM:
|
||||
std::cout << 'B';
|
||||
badSectors++;
|
||||
break;
|
||||
|
||||
case Sector::CONFLICT:
|
||||
std::cout << 'C';
|
||||
badSectors++;
|
||||
break;
|
||||
|
||||
default:
|
||||
std::cout << '?';
|
||||
break;
|
||||
}
|
||||
}
|
||||
totalSectors++;
|
||||
}
|
||||
std::cout << std::endl;
|
||||
}
|
||||
}
|
||||
int goodSectors = totalSectors - missingSectors - badSectors;
|
||||
if (totalSectors == 0)
|
||||
std::cout << "No sectors in output; skipping analysis" << std::endl;
|
||||
else
|
||||
{
|
||||
std::cout << "Good sectors: " << goodSectors << "/" << totalSectors
|
||||
<< " (" << (100*goodSectors/totalSectors) << "%)"
|
||||
<< std::endl;
|
||||
std::cout << "Missing sectors: " << missingSectors << "/" << totalSectors
|
||||
<< " (" << (100*missingSectors/totalSectors) << "%)"
|
||||
<< std::endl;
|
||||
std::cout << "Bad sectors: " << badSectors << "/" << totalSectors
|
||||
<< " (" << (100*badSectors/totalSectors) << "%)"
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
size_t headSize = numSectors * numBytes;
|
||||
size_t trackSize = headSize * numHeads;
|
||||
|
||||
std::cout << fmt::format("{} tracks, {} heads, {} sectors, {} bytes per sector, {} kB total",
|
||||
numCylinders, numHeads,
|
||||
numSectors, numBytes,
|
||||
numCylinders * trackSize / 1024)
|
||||
<< std::endl;
|
||||
|
||||
std::ofstream outputFile(spec.filename, std::ios::out | std::ios::binary);
|
||||
if (!outputFile.is_open())
|
||||
Error() << "cannot open output file";
|
||||
|
||||
for (int track = 0; track < numCylinders; track++)
|
||||
{
|
||||
for (int head = 0; head < numHeads; head++)
|
||||
{
|
||||
for (int sectorId = 0; sectorId < numSectors; sectorId++)
|
||||
{
|
||||
auto sector = sectors.get(track, head, sectorId);
|
||||
if (sector)
|
||||
{
|
||||
outputFile.seekp(sector->logicalTrack*trackSize + sector->logicalSide*headSize + sector->logicalSector*numBytes, std::ios::beg);
|
||||
outputFile.write((const char*) sector->data.cbegin(), sector->data.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
std::unique_ptr<ImageWriter> writer(ImageWriter::create(sectors, spec));
|
||||
writer->adjustGeometry();
|
||||
writer->printMap();
|
||||
writer->writeImage();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user