Minor: better doc

This commit is contained in:
Christophe Meneboeuf 2018-10-07 00:37:44 +02:00
parent 93ee71ab7c
commit 2c73051e30
6 changed files with 56 additions and 28 deletions

View File

@ -1,32 +1,33 @@
#Rgb2Hires #Rgb2Hires
This program converts an RGB image to the Apple II's "HiRes" format. Provided it complies with this format's constraints: This program converts an RGB image to the Apple II's "HiRes" format. Provided it complies with this format's constraints:
* Source image must be 140x280. Pixels are anamorphic: twice wider than tall. * Source image must be 140x192. Pixels are anamorphic: twice wider than tall.
* Source image must contains six colors : BLACK, WHITE, ORANGE, GREEN, BLUE and PURPLE * Source image must contains six colors : BLACK, WHITE, ORANGE, GREEN, BLUE and PURPLE
For more information about the "Hires" format and its limitations, please refer to Wikipedia: https://en.wikipedia.org/wiki/Apple_II_graphics#High-Resolution_.28Hi-Res.29_graphics For more information about the "Hires" format and its limitations, please refer to Wikipedia: https://en.wikipedia.org/wiki/Apple_II_graphics#High-Resolution_.28Hi-Res.29_graphics
## Compiling ## Compiling
This repository contains two projects: This repository contains two projects:
* Rgb2Hires, the conversion programm running on a PC * Rgb2Hires, the conversion programm running on a PC
* Loader, for testing purposes. This program runs on Apple II hardware and displays an HiRes binary file named *test.picture* and located on the same disk. * Loader, for testing purposes. This program runs on Apple II hardware and displays an HiRes binary file named *test.picture* and located on the same disk.
### Rgb2Hires ### Rgb2Hires
The source is provided as a Visual Studio project. Howerver, it is standard C++11 without any Windows dependency, so it should compile on Linux and macOs without any modification. The source is provided as a Visual Studio project. Howerver, it is standard C++11 without any Windows dependency, so it should compile on Linux and macOs without any modification.
#### Dependencies #### Dependencies
* Magick++ * Magick++
* On Windows, you have provide an environment variable called *MAGICK_HOME* and pointing to the ImageMagick folder. * On Windows, you have provide an environment variable called *MAGICK_HOME* and pointing to the ImageMagick folder.
* On Linux, install libmagick++-dev * On Linux, install libmagick++-dev
### Loader (for Apple II) ### Loader (for Apple II)
This program will compile as an Apple II executable that you can run on the actual hardware. This program will compile as an Apple II executable that you can run on the actual hardware.
It is a Makefile project and must be crosscompiled using **[CC65](https://cc65.github.io/cc65/)** It is a Makefile project and must be crosscompiled using **[CC65](https://cc65.github.io/cc65/)**
#### Dependencies #### Dependencies
* CC65: The crosscompiler suit. Please provide an environment variable, *CC65_HOME* pointing to your CC65 folder. * CC65: The crosscompiler suit. Please provide an environment variable, *CC65_HOME* pointing to your CC65 folder.
# Running # Running
A correct source image, *test.png*, is provided as an example. Convert it into a file named *test.picture* and copy it along the Apple II *Loader*, then execute on the actual hardware ;) A correct source image, *test.png*, is provided as an example. Convert it into a file named *test.picture* and copy it along the Apple II *Loader*, then execute on the actual hardware ;)

View File

@ -0,0 +1,24 @@
cmake_minimum_required (VERSION 2.6)
project (Rgb2Hires)
# The version number.
set (Rgb2Hires_VERSION_MAJOR 1)
set (Rgb2Hires_VERSION_MINOR 0)
#Warning level
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(warnings "-Wall -Wextra -Werror")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
set(warnings "/W4 /WX /EHsc")
endif()
add_executable(${PROJECT_NAME} src/Common.h
src/HiRes.cpp
src/HiRes.h
src/ImageQuantized.cpp
src/ImageQuantized.h
src/Main.cpp
)

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
@ -32,33 +32,33 @@
<ProjectGuid>{754364B2-84E3-40A5-B838-C153775D8F4C}</ProjectGuid> <ProjectGuid>{754364B2-84E3-40A5-B838-C153775D8F4C}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>RgbToHiRes</RootNamespace> <RootNamespace>RgbToHiRes</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>
<ProjectName>Rgb2HiRes</ProjectName> <ProjectName>Rgb2HiRes</ProjectName>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset> <PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>

View File

@ -35,27 +35,27 @@ namespace RgbToHires {
class BlockHr class BlockHr
{ {
public: public:
/// \brief Default constructor: all black /// @brief Default constructor: all black
BlockHr(); BlockHr();
/// \brief Construction from 7 pixels /// @brief Construction from 7 pixels
BlockHr(const BlockPixel& ); BlockHr(const BlockPixel& );
/// \brief returns the position of the first element /// @brief returns the position of the first element
inline std::array<uint8_t, 2>::const_iterator begin() const { inline std::array<uint8_t, 2>::const_iterator begin() const {
return _data.begin(); return _data.begin();
} }
/// \brief returns the position after the last element /// @brief returns the position after the last element
inline std::array<uint8_t, 2>::const_iterator end() const { inline std::array<uint8_t, 2>::const_iterator end() const {
return _data.end(); return _data.end();
} }
private: private:
/// \brief color group as defined in Apple's documentation /// @brief color group as defined in Apple's documentation
enum eColorGroup { enum eColorGroup {
GROUP_1, GROUP_1,
GROUP_2 GROUP_2
}; };
/// \brief Returns the color group of these two 3.5 pixel blocks /// @brief Returns the color group of these two 3.5 pixel blocks
std::pair<eColorGroup, eColorGroup> getGroup(const BlockPixel&) const; std::pair<eColorGroup, eColorGroup> getGroup(const BlockPixel&) const;
/// \brief Returns the bit pait corresponding to the given color /// @brief Returns the bit pait corresponding to the given color
uint8_t getDibit(const Magick::Color&) const; uint8_t getDibit(const Magick::Color&) const;
std::array<uint8_t, 2> _data; std::array<uint8_t, 2> _data;
@ -68,7 +68,7 @@ namespace RgbToHires {
using Blob = std::array<LineHr, NB_LINES_PER_SCREEN>; using Blob = std::array<LineHr, NB_LINES_PER_SCREEN>;
/// @brief Describes an HIRES image
class HiRes class HiRes
{ {
public: public:
@ -77,9 +77,9 @@ namespace RgbToHires {
HiRes(const ImageQuantized&); HiRes(const ImageQuantized&);
~HiRes() = default; ~HiRes() = default;
/// \brief Returns the binary hires picture /// @brief Returns the binary hires picture
std::unique_ptr <std::array<uint8_t, FRAME_SIZE>> getBlob() const; std::unique_ptr <std::array<uint8_t, FRAME_SIZE>> getBlob() const;
/// \brief Returns asm code corresponding to the image in memory (CA65 format) /// @brief Returns asm code corresponding to the image in memory (CA65 format)
std::string getAsm() const; std::string getAsm() const;
private: private:

View File

@ -27,6 +27,8 @@
namespace RgbToHires { namespace RgbToHires {
/// @brief Image quantized to the HIRES colors.
/// @details Quantization works with a nearest distance algorithm.
class ImageQuantized : class ImageQuantized :
public Magick::Image public Magick::Image
{ {
@ -39,10 +41,11 @@ namespace RgbToHires {
ImageQuantized(const Magick::Image& src); ImageQuantized(const Magick::Image& src);
~ImageQuantized()=default; ~ImageQuantized()=default;
/// @brief Returns an array of bytes forming the RGB quantized image
std::unique_ptr<Blob> getBlob() const; std::unique_ptr<Blob> getBlob() const;
private: private:
/// @brief Computes the euclidian distance between two colors
double Distance(const Magick::Color&, const Magick::Color&); double Distance(const Magick::Color&, const Magick::Color&);
}; };

View File

@ -31,14 +31,14 @@
using namespace std; using namespace std;
using namespace RgbToHires; using namespace RgbToHires;
/// \brief Returns true if a file exists /// @brief Returns true if a file exists
inline bool exists(const std::string& path) inline bool exists(const std::string& path)
{ {
struct stat buffer; struct stat buffer;
return (stat(path.c_str(), &buffer) == 0); return (stat(path.c_str(), &buffer) == 0);
} }
/// \brief Program entry point /// @brief Program entry point
int main( int argc, char *argv[] ) int main( int argc, char *argv[] )
{ {
Magick::InitializeMagick(*argv); Magick::InitializeMagick(*argv);