This commit is contained in:
Christophe Meneboeuf 2022-06-18 14:53:44 +02:00
parent 7239fff361
commit 7ce9055272
5 changed files with 80 additions and 83 deletions

View File

@ -22,7 +22,7 @@ This repository contains three "PC" projects:
* **Picture**: a program to convert a RGB png to a binary or an ASM excerpt, that can be loaded to the HIRES memory pages of an Apple II. An optional **live preview** can be displayed: its window will simulate an RGB monitor and will show the result, including color clashing and artifacts. * **Picture**: a program to convert a RGB png to a binary or an ASM excerpt, that can be loaded to the HIRES memory pages of an Apple II. An optional **live preview** can be displayed: its window will simulate an RGB monitor and will show the result, including color clashing and artifacts.
* Source image must be 140x192. Pixels are anamorphic: they will be displayed twice wider than tall. * Source image must be 140x192. Pixels are anamorphic: they will be displayed twice wider than tall.
* Source image must contains six colors : BLACK, WHITE, ORANGE, GREEN, BLUE and PURPLE. The color may be approximation of the Apple II 6 colors. Please refer to the provided pic. * Source image must contains six colors : BLACK, WHITE, ORANGE, GREEN, BLUE and PURPLE. The color may be approximation of the Apple II 6 colors. Please refer to the provided pic.
* **Tile**: given a RGB png tile sheet that satisfies the same requirements as above, it extracts a 14x16 tile and converts it to ASM data. This data **is not interleaved**. * **Tile**: given a RGB png tile sheet that satisfies the same requirements as above, it extracts a 14x16 tile and converts it to ASM data. The lines forming the tile data **are not interleaved** as in a HIRES framebuffer.
And one Apple II project: And one Apple II project:
* **Loader**: a program that will load and display a picture generated by the *Picture* program. A bash scripts is provided as an exemple to load the picture and the loader on an image disk. [AppleCommander](https://applecommander.github.io/) is required to do so. Once in ProDOS, just type *-DISPLAY*. * **Loader**: a program that will load and display a picture generated by the *Picture* program. A bash scripts is provided as an exemple to load the picture and the loader on an image disk. [AppleCommander](https://applecommander.github.io/) is required to do so. Once in ProDOS, just type *-DISPLAY*.
@ -32,40 +32,19 @@ __Note:__ For more information about the "Hires" format and its limitations, you
## Build from sources ## Build from sources
This project has been tested with VisualStudio 2019, Gcc 9 (Ubuntu 20.04) and Gcc8.3.0 (Debian 10).
### Dependencies ### Dependencies
* **Magick++** from ImageMagick 6 and **SDL2** The dependencies are managed by [conan.io](https://conan.io/). Please refer to (their documentation)[https://docs.conan.io/en/latest/installation.html] for installation instructions.
* On **Windows**
* ImageMagick
* Download ImageMagick 6 from the [official website](https://legacy.imagemagick.org/script/install-source.php).
* Compile it in *Dynamic Multithreaded*.
* Provide an environment variable called *MAGICK_HOME* and pointing to the root ImageMagick folder.
* Copy *ImageMagick-config* from the *script/* folder to *MAGICK_HOME*.
* SDL2
* Download the latest version of the *development library* from the [official website](https://www.libsdl.org/download-2.0.php) and unarchive it.
* Provide an environment variable called *SDL2_HOME* and pointing to the root of the SDL2 library.
* On **Linux**, install libmagick++-dev for version 6 and libsdl2-dev
> sudo apt install libmagick++-6.q16-dev libsdl2-dev
Depending on your Linux distribution, you may have to set an environment variable *sdl2_DIR*, pointing to the directory hosting SDL2's cmake configuration, before running cmake.
Example on Debian:
> export sdl2_DIR=/usr/lib/x86_64-linux-gnu/cmake/SDL2/
The build system is managed by CMake.
### How to build ### How to build
* **Linux** a CMakeList is provided: ```bash
> mkdir build && cd build mkdir build && cd build
conan install ..
> cmake .. cmake .. -DCMAKE_BUILD_TYPE=RELEASE
cmake --build . --config release -j
> cmake --build . --config release ```
* **Windows** a VisualStudio solution is provided
## Apple II project (Loader) ## Apple II project (Loader)
@ -73,13 +52,17 @@ This project has been tested with VisualStudio 2019, Gcc 9 (Ubuntu 20.04) and Gc
* [CC65](https://cc65.github.io/cc65/) * [CC65](https://cc65.github.io/cc65/)
* The crosscompiler suit. Please provide an environment variable, *CC65_HOME* pointing to your CC65 folder. * The crosscompiler suit. Please provide an environment variable, *CC65_HOME* pointing to your CC65 folder.
### Build ### How to build
> make A make file is provided. Just run
```bash
make
```
## Test ## Test
A correct source image, *test.png*, is provided as an example. Convert it using Picture, then copy it on a dsk image along with the Apple II loader. You can use or refer to the provided script in the *Loader_Apple2* folder. * A correct source image, *testPiceture.png*, is provided as an example. Convert it using the application *Picture*, then copy it on a dsk image along with the Apple II loader. You can use or refer to the provided script in the *Loader_Apple2* folder.
* Another source image *testTile.png* is provided to test that the correct tile is converted and extracted using the application *Tile*.
### Demo ### Demo

View File

@ -1,7 +1,7 @@
cmake_minimum_required (VERSION 3.19) cmake_minimum_required (VERSION 3.19)
cmake_policy(SET CMP0074 NEW) cmake_policy(SET CMP0074 NEW)
project (Rgb2Hires-SDL) project (Rgb2Hires)
# flags not compatibles with magick++ # flags not compatibles with magick++
if(WIN32) if(WIN32)

View File

@ -89,47 +89,54 @@ int main( int argc, char *argv[] )
ExitOnError("No input path provided.\n"); ExitOnError("No input path provided.\n");
} }
const auto filepath = imagePath.getValue();
if (!exists(filepath)) {
ExitOnError("Cannot read " + filepath);
}
std::vector<SDL_Surface*> surfaces; std::vector<SDL_Surface*> surfaces;
SDL_Surface* surfaceRgb = IMG_Load(filepath.c_str()); try
surfaces.push_back(surfaceRgb);
if (surfaceRgb == nullptr)
{ {
ExitOnError("Cannot decode " + filepath, surfaces); const auto filepath = imagePath.getValue();
} if (!exists(filepath)) {
const ImageQuantized imageHiRes{ surfaceRgb }; ExitOnError("Cannot read " + filepath);
}
// Preview SDL_Surface* surfaceRgb = IMG_Load(filepath.c_str());
if (preview.getValue()) surfaces.push_back(surfaceRgb);
{ if (surfaceRgb == nullptr)
if (assembly.getValue() == true)
{ {
std::cout << "\nIgnoring --asm option.\n"; ExitOnError("Cannot decode " + filepath, surfaces);
} }
const auto bytes = imageHiRes.getHiresBuffer(); const ImageQuantized imageHiRes{ surfaceRgb };
Display::Window::GetInstance()->display(filepath, bytes->data());
} // Preview
// Convertion to disk if (preview.getValue())
else {
{ if (assembly.getValue() == true)
if (outputPath.getValue().size() == 0) { {
ExitOnError("No output path provided.\n"); std::cout << "\nIgnoring --asm option.\n";
}
const auto bytes = imageHiRes.getHiresBuffer();
Display::Window::GetInstance()->display(filepath, bytes->data());
}
// Convertion to disk
else
{
if (outputPath.getValue().size() == 0) {
ExitOnError("No output path provided.\n");
}
if (assembly.getValue() == true) { //Ouput in ASM
ofstream output(outputPath.getValue());
output << imageHiRes.getHiresAsm();
}
else { //Binary output
ofstream output(outputPath.getValue(), ios::binary);
const auto bytes = imageHiRes.getHiresBuffer();
output.write(reinterpret_cast<const char*>(bytes.get()), bytes->size());
}
} }
if (assembly.getValue() == true) { //Ouput in ASM }
ofstream output(outputPath.getValue()); catch (const std::exception& e)
output << imageHiRes.getHiresAsm(); {
} ExitOnError(e.what(), surfaces);
else { //Binary output
ofstream output(outputPath.getValue(), ios::binary);
const auto bytes = imageHiRes.getHiresBuffer();
output.write(reinterpret_cast<const char*>(bytes.get()), bytes->size());
}
} }
for (auto surface : surfaces) for (auto surface : surfaces)

View File

@ -89,22 +89,29 @@ int main( int argc, char *argv[] )
const auto filepath = imagePath.getValue(); const auto filepath = imagePath.getValue();
if (!exists(filepath)) { if (!exists(filepath)) {
throw runtime_error("Cannot read " + filepath); ExitOnError("Cannot read " + filepath);
} }
std::vector<SDL_Surface*> surfaces;
SDL_Surface* surfaceRgb = IMG_Load(filepath.c_str());
surfaces.push_back(surfaceRgb);
if (surfaceRgb == nullptr)
{
ExitOnError("Cannot decode " + filepath, surfaces);
}
const ImageQuantized imageHiRes{ surfaceRgb };
const auto tileHiRes = imageHiRes.getTile(column.getValue(), line.getValue());
// Always output in asm
ofstream output(outputPath.getValue());
output << tileHiRes;
std::vector<SDL_Surface*> surfaces;
try
{
SDL_Surface* surfaceRgb = IMG_Load(filepath.c_str());
surfaces.push_back(surfaceRgb);
if (surfaceRgb == nullptr)
{
ExitOnError("Cannot decode " + filepath, surfaces);
}
const ImageQuantized imageHiRes{ surfaceRgb };
const auto tileHiRes = imageHiRes.getTile(column.getValue(), line.getValue());
// Always output in asm
ofstream output(outputPath.getValue());
output << tileHiRes;
}
catch (const std::exception& e)
{
ExitOnError(e.what(), surfaces);
}
for (auto surface : surfaces) for (auto surface : surfaces)
{ {

View File

@ -25,7 +25,7 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include <SDL.h> #include <SDL2/SDL_image.h>
namespace RgbToHires namespace RgbToHires
{ {