From 0fcb2075e0b39f9d3555b04ab687fcb02ebc7f4e Mon Sep 17 00:00:00 2001 From: David Given Date: Fri, 29 Nov 2024 22:30:33 +0100 Subject: [PATCH] Move filesystem_track_ordering from ImageReaderProto/ImageWriterProto to ImgInputOutputProto; it now only applies to img files. Make it honour the appropriate track layout setting too. --- lib/algorithms/readerwriter.cc | 2 +- lib/imagereader/imagereader.cc | 23 ----------------------- lib/imagereader/imagereader.h | 7 +------ lib/imagereader/imagereader.proto | 15 ++++++++------- lib/imagereader/imgimagereader.cc | 9 +++++++-- lib/imagewriter/imagewriter.cc | 24 ------------------------ lib/imagewriter/imagewriter.h | 5 +---- lib/imagewriter/imagewriter.proto | 6 +----- lib/imagewriter/imgimagewriter.cc | 10 +++++++++- lib/vfs/imagesectorinterface.cc | 4 ++-- src/fe-write.cc | 2 +- src/formats/apple2.textpb | 24 ++++++++++++++++++------ src/gui/imagerpanel.cc | 4 ++-- 13 files changed, 51 insertions(+), 84 deletions(-) diff --git a/lib/algorithms/readerwriter.cc b/lib/algorithms/readerwriter.cc index f21f7a59..681887f2 100644 --- a/lib/algorithms/readerwriter.cc +++ b/lib/algorithms/readerwriter.cc @@ -734,7 +734,7 @@ void readDiskCommand( if (globalConfig()->decoder().has_write_csv_to()) writer.writeCsv( *diskflux->image, globalConfig()->decoder().write_csv_to()); - writer.writeMappedImage(*diskflux->image); + writer.writeImage(*diskflux->image); } void rawReadDiskCommand(FluxSource& fluxsource, FluxSink& fluxsink) diff --git a/lib/imagereader/imagereader.cc b/lib/imagereader/imagereader.cc index 19aa8179..03b1e56b 100644 --- a/lib/imagereader/imagereader.cc +++ b/lib/imagereader/imagereader.cc @@ -63,26 +63,3 @@ std::unique_ptr ImageReader::create(const ImageReaderProto& config) } ImageReader::ImageReader(const ImageReaderProto& config): _config(config) {} - -std::unique_ptr ImageReader::readMappedImage() -{ - auto rawImage = readImage(); - - if (!_config.filesystem_track_order()) - return rawImage; - - log("READER: converting from filesystem sector order to disk order"); - std::set> sectors; - for (const auto& e : *rawImage) - { - auto trackLayout = - Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide); - auto newSector = std::make_shared(); - *newSector = *e; - newSector->logicalSector = - trackLayout->filesystemToNaturalSectorMap.at(e->logicalSector); - sectors.insert(newSector); - } - - return std::make_unique(sectors); -} diff --git a/lib/imagereader/imagereader.h b/lib/imagereader/imagereader.h index 70d63d8a..0cc48fcc 100644 --- a/lib/imagereader/imagereader.h +++ b/lib/imagereader/imagereader.h @@ -51,15 +51,10 @@ class ImageReader return _extraConfig; } - /* Directly reads the image. */ + /* Reads the image. */ virtual std::unique_ptr readImage() = 0; - /* Reads the image, and then applies any optional mapping to go from - * filesystem ordering to disk ordering. */ - - std::unique_ptr readMappedImage(); - protected: const ImageReaderProto& _config; ConfigProto _extraConfig; diff --git a/lib/imagereader/imagereader.proto b/lib/imagereader/imagereader.proto index 7b838f01..6622d8c7 100644 --- a/lib/imagereader/imagereader.proto +++ b/lib/imagereader/imagereader.proto @@ -2,7 +2,12 @@ syntax = "proto2"; import "lib/config/common.proto"; -message ImgInputOutputProto {} +message ImgInputOutputProto { + optional bool filesystem_sector_order = 1 [ + (help) = "read/write sector image in filesystem order", + default = false + ]; +} message DiskCopyInputProto {} message ImdInputProto {} @@ -15,16 +20,12 @@ message FdiInputProto {} message D88InputProto {} message NfdInputProto {} -// NEXT_TAG: 15 +// NEXT_TAG: 14 message ImageReaderProto { optional string filename = 1 [ (help) = "filename of input sector image" ]; - optional bool filesystem_track_order = 13 [ - (help) = "read/write sector image in filesystem order", - default = false - ]; - optional ImageReaderWriterType type = 14 + optional ImageReaderWriterType type = 13 [default = IMAGETYPE_NOT_SET, (help) = "input image type"]; optional ImgInputOutputProto img = 2; diff --git a/lib/imagereader/imgimagereader.cc b/lib/imagereader/imgimagereader.cc index d9ba43ed..2246f303 100644 --- a/lib/imagereader/imgimagereader.cc +++ b/lib/imagereader/imgimagereader.cc @@ -31,9 +31,11 @@ class ImgImageReader : public ImageReader "IMG: bad configuration; did you remember to set the " "tracks, sides and trackdata fields in the layout?"); + bool in_filesystem_order = _config.img().filesystem_sector_order(); std::unique_ptr image(new Image); - for (const auto& p : - Layout::getTrackOrdering(layout.filesystem_track_order())) + for (const auto& p : Layout::getTrackOrdering( + in_filesystem_order ? layout.filesystem_track_order() + : layout.image_track_order())) { int track = p.first; int side = p.second; @@ -47,6 +49,9 @@ class ImgImageReader : public ImageReader Bytes data(trackLayout->sectorSize); inputFile.read((char*)data.begin(), data.size()); + if (in_filesystem_order) + sectorId = + trackLayout->filesystemToNaturalSectorMap.at(sectorId); const auto& sector = image->put(track, side, sectorId); sector->status = Sector::OK; sector->data = data; diff --git a/lib/imagewriter/imagewriter.cc b/lib/imagewriter/imagewriter.cc index 50bd14fc..bb6601be 100644 --- a/lib/imagewriter/imagewriter.cc +++ b/lib/imagewriter/imagewriter.cc @@ -173,27 +173,3 @@ void ImageWriter::printMap(const Image& image) << std::endl; } } - -void ImageWriter::writeMappedImage(const Image& image) -{ - if (_config.filesystem_track_order()) - { - log("WRITER: converting from disk sector order to filesystem order"); - - std::set> sectors; - for (const auto& e : image) - { - auto trackLayout = - Layout::getLayoutOfTrack(e->logicalTrack, e->logicalSide); - auto newSector = std::make_shared(); - *newSector = *e; - newSector->logicalSector = - trackLayout->naturalToFilesystemSectorMap.at(e->logicalSector); - sectors.insert(newSector); - } - - writeImage(Image(sectors)); - } - else - writeImage(image); -} diff --git a/lib/imagewriter/imagewriter.h b/lib/imagewriter/imagewriter.h index 79c49bb1..e2f9f16d 100644 --- a/lib/imagewriter/imagewriter.h +++ b/lib/imagewriter/imagewriter.h @@ -37,11 +37,8 @@ class ImageWriter void writeCsv(const Image& sectors, const std::string& filename); /* Writes a raw image. */ - virtual void writeImage(const Image& sectors) = 0; - /* Writes an image applying any optional mapping from disk sector numbering - * to filesystem sector numbering. */ - void writeMappedImage(const Image& sectors); + virtual void writeImage(const Image& sectors) = 0; protected: const ImageWriterProto& _config; diff --git a/lib/imagewriter/imagewriter.proto b/lib/imagewriter/imagewriter.proto index a8370912..8b8d05a1 100644 --- a/lib/imagewriter/imagewriter.proto +++ b/lib/imagewriter/imagewriter.proto @@ -67,12 +67,8 @@ message ImdOutputProto message ImageWriterProto { optional string filename = 1 [ (help) = "filename of output sector image" ]; - optional bool filesystem_track_order = 10 [ - (help) = "read/write sector image in filesystem order", - default = false - ]; - optional ImageReaderWriterType type = 11 + optional ImageReaderWriterType type = 10 [ default = IMAGETYPE_NOT_SET, (help) = "image writer type" ]; optional ImgInputOutputProto img = 2; diff --git a/lib/imagewriter/imgimagewriter.cc b/lib/imagewriter/imgimagewriter.cc index b4678fbd..1215b3d0 100644 --- a/lib/imagewriter/imgimagewriter.cc +++ b/lib/imagewriter/imgimagewriter.cc @@ -31,8 +31,12 @@ class ImgImageWriter : public ImageWriter if (!outputFile.is_open()) error("cannot open output file"); + bool in_filesystem_order = _config.img().filesystem_sector_order(); for (const auto& p : Layout::getTrackOrdering( - layout.filesystem_track_order(), tracks, sides)) + in_filesystem_order ? layout.filesystem_track_order() + : layout.image_track_order(), + tracks, + sides)) { int track = p.first; int side = p.second; @@ -40,6 +44,10 @@ class ImgImageWriter : public ImageWriter auto trackLayout = Layout::getLayoutOfTrack(track, side); for (int sectorId : trackLayout->naturalSectorOrder) { + if (in_filesystem_order) + sectorId = + trackLayout->filesystemToNaturalSectorMap.at(sectorId); + const auto& sector = image.get(track, side, sectorId); if (sector) sector->data.slice(0, trackLayout->sectorSize) diff --git a/lib/vfs/imagesectorinterface.cc b/lib/vfs/imagesectorinterface.cc index 87d8df15..c8f0e460 100644 --- a/lib/vfs/imagesectorinterface.cc +++ b/lib/vfs/imagesectorinterface.cc @@ -44,14 +44,14 @@ class ImageSectorInterface : public SectorInterface void flushChanges() override { - _writer->writeMappedImage(*_image); + _writer->writeImage(*_image); _changed = false; } void discardChanges() override { if (_reader) - _image = _reader->readMappedImage(); + _image = _reader->readImage(); else { _image = std::make_shared(); diff --git a/src/fe-write.cc b/src/fe-write.cc index d9e0a854..8492032f 100644 --- a/src/fe-write.cc +++ b/src/fe-write.cc @@ -68,7 +68,7 @@ int mainWrite(int argc, const char* argv[]) flags.parseFlagsWithConfigFiles(argc, argv, formats); auto reader = ImageReader::create(globalConfig()); - std::shared_ptr image = reader->readMappedImage(); + std::shared_ptr image = reader->readImage(); auto encoder = Arch::createEncoder(globalConfig()); auto fluxSink = FluxSink::create(globalConfig()); diff --git a/src/formats/apple2.textpb b/src/formats/apple2.textpb index 0a91d459..32e4a8bf 100644 --- a/src/formats/apple2.textpb +++ b/src/formats/apple2.textpb @@ -137,11 +137,15 @@ option_group { config { image_reader { - filesystem_track_order: true + img { + filesystem_sector_order: true + } } image_writer { - filesystem_track_order: true + img { + filesystem_sector_order: true + } } filesystem { @@ -180,11 +184,15 @@ option_group { config { image_reader { - filesystem_track_order: true + img { + filesystem_sector_order: true + } } image_writer { - filesystem_track_order: true + img { + filesystem_sector_order: true + } } filesystem { @@ -222,11 +230,15 @@ option_group { config { image_reader { - filesystem_track_order: true + img { + filesystem_sector_order: true + } } image_writer { - filesystem_track_order: true + img { + filesystem_sector_order: true + } } filesystem { diff --git a/src/gui/imagerpanel.cc b/src/gui/imagerpanel.cc index 45aefa5b..7dae4029 100644 --- a/src/gui/imagerpanel.cc +++ b/src/gui/imagerpanel.cc @@ -142,7 +142,7 @@ class ImagerPanelImpl : public ImagerPanelGen, public ImagerPanel, JobQueue [this]() { auto image = - GetContext().GetImageReader()->readMappedImage(); + GetContext().GetImageReader()->readImage(); auto* encoder = GetContext().GetEncoder(); auto* fluxSink = GetContext().GetFluxSink(); @@ -260,7 +260,7 @@ class ImagerPanelImpl : public ImagerPanelGen, public ImagerPanel, JobQueue QueueJob( [image, this]() { - GetContext().GetImageWriter()->writeMappedImage(*image); + GetContext().GetImageWriter()->writeImage(*image); }); } catch (const ErrorException& e)