commit acfd57c3020efc5080d61426108d933b72feddf7
parent 2ce8b9d1d48c967b96c92cd47f299ba276be33dc
Author: Frederic Cambus <fred@statdns.com>
Date: Wed, 20 Dec 2017 12:56:07 +0100
Merge branch 'retina'
Diffstat:
19 files changed, 61 insertions(+), 44 deletions(-)
diff --git a/README.md b/README.md
@@ -98,8 +98,8 @@ Even more:
## Synopsis
- ansilove [options] file
- ansilove -e | -h | -v
+ ansilove [-ehirsv] [-b bits] [-c columns] [-f font] [-m mode] [-o file]
+ [-R factor] file
## Options
@@ -115,6 +115,7 @@ Even more:
workbench use Amiga Workbench palette
-o file specify output filename/path
-r creates additional Retina @2x output file
+ -R factor creates additional Retina output file with custom scale
-s show SAUCE record without generating output
-v show version information
diff --git a/ansilove.1 b/ansilove.1
@@ -38,6 +38,7 @@
.Op Fl f Ar font
.Op Fl m Ar mode
.Op Fl o Ar file
+.Op Fl R Ar factor
.Ar file
.Sh DESCRIPTION
.Nm
@@ -136,6 +137,8 @@ Use Amiga Workbench palette
Specify output filename/path
.It Fl r
Creates additional Retina @2x output file
+.It Fl R Ar factor
+Creates additional Retina output file with custom scale factor
.It Fl s
Show SAUCE record without generating output
.It Fl v
diff --git a/src/loaders/ansi.c b/src/loaders/ansi.c
@@ -15,7 +15,7 @@
#include "ansi.h"
-void ansi(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, char *mode, bool icecolors, char *fext, bool createRetinaRep)
+void ansi(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, char *mode, bool icecolors, char *fext, int retinaScaleFactor)
{
// ladies and gentlemen, it's type declaration time
struct fontStruct fontData;
@@ -496,7 +496,7 @@ void ansi(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFil
}
// create output image
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
// free memory
free(ansi_buffer);
diff --git a/src/loaders/ansi.h b/src/loaders/ansi.h
@@ -26,6 +26,6 @@ struct ansiChar {
bool underline;
};
-void ansi(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, char *mode, bool icecolors, char *fext, bool createRetinaRep);
+void ansi(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, char *mode, bool icecolors, char *fext, int retinaScaleFactor);
#endif
diff --git a/src/loaders/artworx.c b/src/loaders/artworx.c
@@ -11,7 +11,7 @@
#include "artworx.h"
-void artworx(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, bool createRetinaRep)
+void artworx(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int retinaScaleFactor)
{
const unsigned char *font_data;
unsigned char *font_data_adf;
@@ -81,7 +81,7 @@ void artworx(unsigned char *inputFileBuffer, int32_t inputFileSize, char *output
}
// create output file
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
// nuke garbage
free(font_data_adf);
diff --git a/src/loaders/artworx.h b/src/loaders/artworx.h
@@ -14,6 +14,6 @@
#ifndef artworx_h
#define artworx_h
-void artworx(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, bool createRetinaRep);
+void artworx(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int retinaScaleFactor);
#endif
diff --git a/src/loaders/binary.c b/src/loaders/binary.c
@@ -11,7 +11,7 @@
#include "binary.h"
-void binary(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int32_t columns, char *font, int32_t bits, bool icecolors, bool createRetinaRep)
+void binary(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int32_t columns, char *font, int32_t bits, bool icecolors, int retinaScaleFactor)
{
// binary files must have an even size
if (inputFileSize % 2) {
@@ -80,5 +80,5 @@ void binary(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputF
}
// create output image
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
}
diff --git a/src/loaders/binary.h b/src/loaders/binary.h
@@ -14,7 +14,7 @@
#ifndef binary_h
#define binary_h
-void binary(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int32_t columns, char *font, int32_t bits, bool icecolors, bool createRetinaRep);
+void binary(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int32_t columns, char *font, int32_t bits, bool icecolors, int retinaScaleFactor);
#endif
diff --git a/src/loaders/icedraw.c b/src/loaders/icedraw.c
@@ -11,7 +11,7 @@
#include "icedraw.h"
-void icedraw(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, bool createRetinaRep)
+void icedraw(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int retinaScaleFactor)
{
const unsigned char *font_data;
unsigned char *font_data_idf;
@@ -137,7 +137,7 @@ void icedraw(unsigned char *inputFileBuffer, int32_t inputFileSize, char *output
}
// create output file
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
// free memory
free(font_data_idf);
diff --git a/src/loaders/icedraw.h b/src/loaders/icedraw.h
@@ -14,7 +14,7 @@
#ifndef icedraw_h
#define icedraw_h
-void icedraw(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, bool createRetinaRep);
+void icedraw(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int retinaScaleFactor);
#endif
diff --git a/src/loaders/pcboard.c b/src/loaders/pcboard.c
@@ -11,7 +11,7 @@
#include "pcboard.h"
-void pcboard(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, bool createRetinaRep)
+void pcboard(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, int retinaScaleFactor)
{
// some type declarations
struct fontStruct fontData;
@@ -177,7 +177,7 @@ void pcboard(unsigned char *inputFileBuffer, int32_t inputFileSize, char *output
}
// create output image
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
// free memory
free(pcboard_buffer);
diff --git a/src/loaders/pcboard.h b/src/loaders/pcboard.h
@@ -23,6 +23,6 @@ struct pcbChar {
int32_t current_character;
};
-void pcboard(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, bool createRetinaRep);
+void pcboard(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, int retinaScaleFactor);
#endif
diff --git a/src/loaders/tundra.c b/src/loaders/tundra.c
@@ -11,7 +11,7 @@
#include "tundra.h"
-void tundra(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, bool createRetinaRep)
+void tundra(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, int retinaScaleFactor)
{
// some type declarations
struct fontStruct fontData;
@@ -176,6 +176,6 @@ void tundra(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputF
}
// create output image
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
}
diff --git a/src/loaders/tundra.h b/src/loaders/tundra.h
@@ -14,6 +14,6 @@
#ifndef tundra_h
#define tundra_h
-void tundra(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, bool createRetinaRep);
+void tundra(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, char *font, int32_t bits, int retinaScaleFactor);
#endif
diff --git a/src/loaders/xbin.c b/src/loaders/xbin.c
@@ -11,7 +11,7 @@
#include "xbin.h"
-void xbin(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, bool createRetinaRep)
+void xbin(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int retinaScaleFactor)
{
const unsigned char *font_data;
unsigned char *font_data_xbin = NULL;
@@ -175,7 +175,7 @@ void xbin(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFil
}
// create output file
- output(canvas, outputFile, retinaout, createRetinaRep);
+ output(canvas, outputFile, retinaout, retinaScaleFactor);
// nuke garbage
free(font_data_xbin);
diff --git a/src/loaders/xbin.h b/src/loaders/xbin.h
@@ -14,6 +14,6 @@
#ifndef xbin_h
#define xbin_h
-void xbin(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, bool createRetinaRep);
+void xbin(unsigned char *inputFileBuffer, int32_t inputFileSize, char *outputFile, char *retinaout, int retinaScaleFactor);
#endif
diff --git a/src/main.c b/src/main.c
@@ -75,6 +75,7 @@ void listExamples(void) {
fprintf(stderr, " ansilove file.ans (output path/name identical to input, no options)\n"
" ansilove -i file.ans (enable iCE colors)\n"
" ansilove -r file.ans (adds Retina @2x output file)\n"
+ " ansilove -R 3 file.ans (adds Retina @3x output file)\n"
" ansilove -o dir/file.png file.ans (custom path/name for output)\n"
" ansilove -s file.bin (just display SAUCE record, don't generate output)\n"
" ansilove -m transparent file.ans (render with transparent background)\n"
@@ -109,6 +110,7 @@ void synopsis(void) {
" workbench use Amiga Workbench palette\n"
" -o file specify output filename/path\n"
" -r creates additional Retina @2x output file\n"
+ " -R factor creates additional Retina output file with custom scale factor\n"
" -s show SAUCE record without generating output\n"
" -v show version information\n"
"\n");
@@ -122,8 +124,8 @@ int main(int argc, char *argv[]) {
bool justDisplaySAUCE = false;
bool fileHasSAUCE = false;
- // retina output bool type
- bool createRetinaRep = false;
+ // retina output scale factor
+ int retinaScaleFactor = 0;
// iCE colors bool type
bool icecolors = false;
@@ -155,14 +157,14 @@ int main(int argc, char *argv[]) {
err(EXIT_FAILURE, "pledge");
}
- while ((getoptFlag = getopt(argc, argv, "b:c:ef:him:o:rsv")) != -1) {
+ while ((getoptFlag = getopt(argc, argv, "b:c:ef:him:o:rR:sv")) != -1) {
switch(getoptFlag) {
case 'b':
// convert numeric command line flags to integer values
bits = strtonum(optarg, 8, 9, &errstr);
if (errstr) {
- fprintf(stderr, "\nInvalid value for bits.\n\n");
+ fprintf(stderr, "\nInvalid value for bits (must be 8 or 9).\n\n");
return EXIT_FAILURE;
}
@@ -172,7 +174,7 @@ int main(int argc, char *argv[]) {
columns = strtonum(optarg, 1, 8192, &errstr);
if (errstr) {
- fprintf(stderr, "\nInvalid value for columns.\n\n");
+ fprintf(stderr, "\nInvalid value for columns (must range from 1 to 8192).\n\n");
return EXIT_FAILURE;
}
@@ -196,7 +198,17 @@ int main(int argc, char *argv[]) {
output = optarg;
break;
case 'r':
- createRetinaRep = true;
+ retinaScaleFactor = 2;
+ break;
+ case 'R':
+ // convert numeric command line flags to integer values
+ retinaScaleFactor = strtonum(optarg, 2, 8, &errstr);
+
+ if (errstr) {
+ fprintf(stderr, "\nInvalid value for retina scale factor (must range from 2 to 8).\n\n");
+ return EXIT_FAILURE;
+ }
+
break;
case 's':
justDisplaySAUCE = true;
@@ -245,8 +257,8 @@ int main(int argc, char *argv[]) {
outputFile = outputName;
}
- if (createRetinaRep) {
- asprintf(&retinaout, "%s%s", outputName, "@2x.png");
+ if (retinaScaleFactor) {
+ asprintf(&retinaout, "%s@%ix.png", outputName, retinaScaleFactor);
}
// default to empty string if mode option is not specified
@@ -263,7 +275,7 @@ int main(int argc, char *argv[]) {
fprintf(stderr, "\nInput File: %s\n", input);
fprintf(stderr, "Output File: %s\n", outputFile);
- if (createRetinaRep) {
+ if (retinaScaleFactor) {
fprintf(stderr, "Retina Output File: %s\n", retinaout);
}
@@ -317,27 +329,27 @@ int main(int argc, char *argv[]) {
// create the output file by invoking the appropiate function
if (!strcmp(fext, ".pcb")) {
// params: input, output, font, bits, icecolors
- pcboard(inputFileBuffer, inputFileSize, outputFile, retinaout, font, bits, createRetinaRep);
+ pcboard(inputFileBuffer, inputFileSize, outputFile, retinaout, font, bits, retinaScaleFactor);
fileIsPCBoard = true;
} else if (!strcmp(fext, ".bin")) {
// params: input, output, columns, font, bits, icecolors
- binary(inputFileBuffer, inputFileSize, outputFile, retinaout, columns, font, bits, icecolors, createRetinaRep);
+ binary(inputFileBuffer, inputFileSize, outputFile, retinaout, columns, font, bits, icecolors, retinaScaleFactor);
fileIsBinary = true;
} else if (!strcmp(fext, ".adf")) {
// params: input, output, bits
- artworx(inputFileBuffer, inputFileSize, outputFile, retinaout, createRetinaRep);
+ artworx(inputFileBuffer, inputFileSize, outputFile, retinaout, retinaScaleFactor);
} else if (!strcmp(fext, ".idf")) {
// params: input, output, bits
- icedraw(inputFileBuffer, inputFileSize, outputFile, retinaout, createRetinaRep);
+ icedraw(inputFileBuffer, inputFileSize, outputFile, retinaout, retinaScaleFactor);
} else if (!strcmp(fext, ".tnd")) {
- tundra(inputFileBuffer, inputFileSize, outputFile, retinaout, font, bits, createRetinaRep);
+ tundra(inputFileBuffer, inputFileSize, outputFile, retinaout, font, bits, retinaScaleFactor);
fileIsTundra = true;
} else if (!strcmp(fext, ".xb")) {
// params: input, output, bits
- xbin(inputFileBuffer, inputFileSize, outputFile, retinaout, createRetinaRep);
+ xbin(inputFileBuffer, inputFileSize, outputFile, retinaout, retinaScaleFactor);
} else {
// params: input, output, font, bits, icecolors, fext
- ansi(inputFileBuffer, inputFileSize, outputFile, retinaout, font, bits, mode, icecolors, fext, createRetinaRep);
+ ansi(inputFileBuffer, inputFileSize, outputFile, retinaout, font, bits, mode, icecolors, fext, retinaScaleFactor);
fileIsANSi = true;
}
diff --git a/src/output.c b/src/output.c
@@ -11,7 +11,7 @@
#include "output.h"
-void output(gdImagePtr im_Source, char *output, char *retinaout, bool createRetinaRep) {
+void output(gdImagePtr im_Source, char *output, char *retinaout, int retinaScaleFactor) {
FILE *file_Out = fopen(output, "wb");
if (file_Out) {
@@ -23,11 +23,12 @@ void output(gdImagePtr im_Source, char *output, char *retinaout, bool createReti
}
// in case Retina image output is wanted
- if (createRetinaRep) {
+ if (retinaScaleFactor) {
gdImagePtr im_Retina;
- // make the Retina image @2x as large as im_Source
- im_Retina = gdImageCreate(im_Source->sx * 2, im_Source->sy * 2);
+ // make the Retina image retinaScaleFactor as large as im_Source
+ im_Retina = gdImageCreate(im_Source->sx * retinaScaleFactor,
+ im_Source->sy * retinaScaleFactor);
gdImageCopyResized(im_Retina, im_Source, 0, 0, 0, 0,
im_Retina->sx, im_Retina->sy,
diff --git a/src/output.h b/src/output.h
@@ -18,6 +18,6 @@
#define output_h
// prototypes
-void output(gdImagePtr im_Source, char *output, char *retinaout, bool createRetinaRep);
+void output(gdImagePtr im_Source, char *output, char *retinaout, int retinaScaleFactor);
#endif