Compare commits

...
Author SHA1 Message Date
gronod b02df94744 Merge pull request 'Merge development into main (v3.5.0-ICCery.1.1)' (#23) from development into main
Windows x86_64 Release Build / build (push) Successful in 9m34s
Linux x86_64 Release Build / build (push) Successful in 9m41s
Merge pull request #23 from development into main
2026-08-28 20:23:45 +01:00
gronod 429c772e4a Merge pull request 'Fix: Sanitize manifest CRLF line endings and complete Windows release packaging' (#22) from fix/windows-package-crlf-manifests into development
Merge pull request #22 from fix/windows-package-crlf-manifests into development
2026-08-28 20:23:35 +01:00
gronod d843716e8b fix(packaging): sanitize CRLF line endings in manifest files and ensure catalog files exist (fixes #21) 2026-08-28 20:23:09 +01:00
gronod b763dd78d1 Merge pull request 'Feature: Add -d switch to printtarg for custom target label string' (#20) from feature/issue-19-printtarg-custom-label into development
Windows x86_64 Release Build / build (push) Successful in 8m41s
Linux x86_64 Release Build / build (push) Successful in 8m54s
Merge pull request #20 from feature/issue-19-printtarg-custom-label into development
2026-08-28 20:05:42 +01:00
gronod c88187b200 feat(printtarg): add -d switch for custom chart label string and omission (fixes #19) 2026-08-28 20:01:32 +01:00
8 changed files with 105 additions and 17 deletions
+9
View File
@@ -63,6 +63,15 @@ jobs:
echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV
mv Argyll_V*_win64_exe.zip "Argyll_${TAG}_${SHORT_SHA}_win64_exe.zip" mv Argyll_V*_win64_exe.zip "Argyll_${TAG}_${SHORT_SHA}_win64_exe.zip"
- name: Verify Package Contents
run: |
ZIP_FILE=$(ls Argyll_*_win64_exe.zip)
echo "Verifying contents of ${ZIP_FILE}..."
unzip -l "${ZIP_FILE}" | grep "usb/ArgyllCMS.inf"
unzip -l "${ZIP_FILE}" | grep "usb/bin/amd64/libusb0.sys"
unzip -l "${ZIP_FILE}" | grep "doc/ArgyllDoc.html"
unzip -l "${ZIP_FILE}" | grep "ReadMe.txt"
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
+9
View File
@@ -65,6 +65,15 @@ jobs:
echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV echo "SHORT_SHA=${SHORT_SHA}" >> $GITHUB_ENV
mv Argyll_V*_win64_exe.zip "Argyll_${TAG}_${SHORT_SHA}_win64_exe.zip" mv Argyll_V*_win64_exe.zip "Argyll_${TAG}_${SHORT_SHA}_win64_exe.zip"
- name: Verify Package Contents
run: |
ZIP_FILE=$(ls Argyll_*_win64_exe.zip)
echo "Verifying contents of ${ZIP_FILE}..."
unzip -l "${ZIP_FILE}" | grep "usb/ArgyllCMS.inf"
unzip -l "${ZIP_FILE}" | grep "usb/bin/amd64/libusb0.sys"
unzip -l "${ZIP_FILE}" | grep "doc/ArgyllDoc.html"
unzip -l "${ZIP_FILE}" | grep "ReadMe.txt"
- name: Upload Artifact - name: Upload Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
+1
View File
@@ -19,6 +19,7 @@
<h1>[V3.4.1 -&gt; V3.5.0] 4th February 2026<br> <h1>[V3.4.1 -&gt; V3.5.0] 4th February 2026<br>
</h1> </h1>
<ul> <ul>
<li>Added -d switch to printtarg to allow custom chart label strings or omit labelling entirely.</li>
<li>Added MSWindows ARM release.</li> <li>Added MSWindows ARM release.</li>
<li>Added Mac ARM release.</li> <li>Added Mac ARM release.</li>
<li>Removed Mac PowerPC build from release.</li> <li>Removed Mac PowerPC build from release.</li>
+7
View File
@@ -264,6 +264,7 @@ channels
Dither 8 bit TIFF values down from 16 bit<br> Dither 8 bit TIFF values down from 16 bit<br>
&nbsp;<a href="#d">-d "string"</a>&nbsp;&nbsp;&nbsp; Custom target label string, or "" to omit labelling<br>
&nbsp;<a href="#Q">-Q nbits</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a href="#Q">-Q nbits</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Quantize Quantize
test test
@@ -758,6 +759,12 @@ A3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
to use it to verify the overall operation of the printing system), then you to use it to verify the overall operation of the printing system), then you
can use the <b>-U</b> flag to disable this.<br> can use the <b>-U</b> flag to disable this.<br>
<br> <br>
<a name="d"></a> The <b>-d</b> parameter allows specifying a custom
chart description/label string to be printed along the page/strip borders on
generated test target files (TIFF, PostScript, EPS), replacing the default
generated chart identifier. If an empty string is provided (<b>-d ""</b>),
chart labelling along the page borders is suppressed entirely.<br>
<br>
<a name="p"></a> The <b>-p</b> parameter specifies the paper size. The size <a name="p"></a> The <b>-p</b> parameter specifies the paper size. The size
can either be one of the default sizes, <a name="pp"></a>or can be can either be one of the default sizes, <a name="pp"></a>or can be
specified in millimeters. Limitations of the instrument may limit the specified in millimeters. Limitations of the instrument may limit the
+16 -8
View File
@@ -167,13 +167,21 @@ fi
rm -rf $TOPDIR rm -rf $TOPDIR
mkdir $TOPDIR mkdir $TOPDIR
# Ensure catalog copies exist if needed for Windows packaging
if [ -d usb ] ; then
if [ -f usb/ArgyllCMS.cat ] ; then
[ ! -f usb/ArgyllCMS_x64.cat ] && cp usb/ArgyllCMS.cat usb/ArgyllCMS_x64.cat
[ ! -f usb/ArgyllCMS_arm64.cat ] && cp usb/ArgyllCMS.cat usb/ArgyllCMS_arm64.cat
fi
fi
# Collect the names of all the files that we're going to package # Collect the names of all the files that we're going to package
unset topfiles; for i in `cat binfiles`; do topfiles="$topfiles ${i}"; done unset topfiles; for i in `tr -d '\r' < binfiles`; do topfiles="$topfiles ${i}"; done
unset docfiles; for i in `cat doc/afiles`; do docfiles="$docfiles doc/${i}"; done unset docfiles; for i in `tr -d '\r' < doc/afiles`; do docfiles="$docfiles doc/${i}"; done
unset usbfiles; unset usbfiles;
for j in ${USBDIRS}; do for j in ${USBDIRS}; do
if [ ${j} ]; then if [ ${j} ]; then
for i in `cat ${j}/${USBBINFILES}`; do usbfiles="$usbfiles ${j}/${i}"; done for i in `tr -d '\r' < ${j}/${USBBINFILES}`; do usbfiles="$usbfiles ${j}/${i}"; done
fi fi
done done
@@ -183,16 +191,16 @@ allfiles="${topfiles} bin/* ref/* ${docfiles} ${usbfiles}"
for i in ${allfiles}; do for i in ${allfiles}; do
path=${i%/*} # extract path without filename path=${i%/*} # extract path without filename
file=${i##*/} # extract filename file=${i##*/} # extract filename
if [ $path = $i ] ; then if [ "$path" = "$i" ] ; then
path= path=
fi fi
if [ X$path != "X" ] ; then if [ X"$path" != "X" ] ; then
mkdir -p $TOPDIR/${path} mkdir -p "$TOPDIR/${path}"
fi fi
if [ X${file} = "Xafiles" ] ; then if [ X"${file}" = "Xafiles" ] ; then
continue continue
fi fi
cp $i $TOPDIR/$i cp "$i" "$TOPDIR/$i" || { echo "Failed to copy $i to $TOPDIR/$i"; exit 1; }
done done
# Create the package # Create the package
+61 -7
View File
@@ -463,6 +463,29 @@ static void ps_hexagon(trend *ss,
fprintf(s->of,"%f %f %f %f hex\n",w,h,x,y); fprintf(s->of,"%f %f %f %f hex\n",w,h,x,y);
} }
/* Helper to escape characters in PostScript string literals */
static void ps_escape_str(char *dst, int maxdst, const char *src) {
int di = 0;
if (dst == NULL || maxdst <= 0) return;
if (src == NULL) { dst[0] = '\0'; return; }
while (*src != '\0' && di < maxdst - 2) {
if (*src == '(' || *src == ')' || *src == '\\') {
if (di < maxdst - 3) {
dst[di++] = '\\';
dst[di++] = *src++;
} else {
break;
}
} else if (*src == '\r' || *src == '\n') {
dst[di++] = ' ';
src++;
} else {
dst[di++] = *src++;
}
}
dst[di] = '\0';
}
/* A centered string */ /* A centered string */
static void ps_string(trend *ss, static void ps_string(trend *ss,
double x, double y, /* Bot Left Corner of rectangle in mm from origin */ double x, double y, /* Bot Left Corner of rectangle in mm from origin */
@@ -470,15 +493,17 @@ static void ps_string(trend *ss,
char *str /* String */ char *str /* String */
) { ) {
ps_trend *s = (ps_trend *)ss; ps_trend *s = (ps_trend *)ss;
char esc_str[2048];
if (fabs(w) < 1e-6 || fabs(h) < 1e-6) if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized string */ return; /* Skip zero sized or empty string */
ps_escape_str(esc_str, sizeof(esc_str), str);
x = mm2pnt(x); x = mm2pnt(x);
y = mm2pnt(y); y = mm2pnt(y);
w = mm2pnt(w); w = mm2pnt(w);
h = mm2pnt(h); h = mm2pnt(h);
fprintf(s->of,"%f scaleTimes\n",h * 0.75); fprintf(s->of,"%f scaleTimes\n",h * 0.75);
fprintf(s->of,"(%s) %f %f centerShow\n",str,x+w/2.0,y+h/2.0); fprintf(s->of,"(%s) %f %f centerShow\n",esc_str,x+w/2.0,y+h/2.0);
} }
/* A vertically centered string */ /* A vertically centered string */
@@ -488,15 +513,17 @@ static void ps_vstring(trend *ss,
char *str /* String */ char *str /* String */
) { ) {
ps_trend *s = (ps_trend *)ss; ps_trend *s = (ps_trend *)ss;
char esc_str[2048];
if (fabs(w) < 1e-6 || fabs(h) < 1e-6) if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized string */ return; /* Skip zero sized or empty string */
ps_escape_str(esc_str, sizeof(esc_str), str);
x = mm2pnt(x); x = mm2pnt(x);
y = mm2pnt(y); y = mm2pnt(y);
w = mm2pnt(w); w = mm2pnt(w);
h = mm2pnt(h); h = mm2pnt(h);
fprintf(s->of,"%f scaleTimes\n",w * 0.75); fprintf(s->of,"%f scaleTimes\n",w * 0.75);
fprintf(s->of,"(%s) %f %f vcenterShow\n",str,x-w/2.0,y+h/2.0); fprintf(s->of,"(%s) %f %f vcenterShow\n",esc_str,x-w/2.0,y+h/2.0);
} }
/* A dotted line */ /* A dotted line */
@@ -872,6 +899,8 @@ static void tiff_string(trend *ss,
tiff_trend *s = (tiff_trend *)ss; tiff_trend *s = (tiff_trend *)ss;
double sw = 0.0, sh = 0.0; double sw = 0.0, sh = 0.0;
if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized or empty string */
sh = h * 0.57; sh = h * 0.57;
meas_string2d(s->r,&sw,NULL,timesr_b,str,sh,0); meas_string2d(s->r,&sw,NULL,timesr_b,str,sh,0);
/* Center the string within the recangle */ /* Center the string within the recangle */
@@ -889,6 +918,8 @@ static void tiff_vstring(trend *ss,
tiff_trend *s = (tiff_trend *)ss; tiff_trend *s = (tiff_trend *)ss;
double sw = 0.0, sh = 0.0; double sw = 0.0, sh = 0.0;
if (fabs(w) < 1e-6 || fabs(h) < 1e-6 || str == NULL || str[0] == '\000')
return; /* Skip zero sized or empty string */
x -= w; /* Make it bot left corner */ x -= w; /* Make it bot left corner */
sw = w * 0.57; sw = w * 0.57;
meas_string2d(s->r,NULL, &sh,timesr_b,str,sw,3); meas_string2d(s->r,NULL, &sh,timesr_b,str,sw,3);
@@ -2265,6 +2296,9 @@ int *p_npat /* Return number of patches including padding */
if (scanc & 2) /* Scan compatiblity */ if (scanc & 2) /* Scan compatiblity */
sxwi = pwid/2.0; /* First row patches extra width */ sxwi = pwid/2.0; /* First row patches extra width */
if (label == NULL || label[0] == '\000')
dopglabel = 0; /* Omit per-page labelling */
/* Compute limits for this page size */ /* Compute limits for this page size */
/* Figure the available space for patches */ /* Figure the available space for patches */
mints = bord + txhisl + lcar; /* Minimum top space due to border, text and clear area */ mints = bord + txhisl + lcar; /* Minimum top space due to border, text and clear area */
@@ -3009,6 +3043,7 @@ void usage(char *diag, ...) {
fprintf(stderr," -C Don't use TIFF compression\n"); fprintf(stderr," -C Don't use TIFF compression\n");
fprintf(stderr," -N Use TIFF alpha N channels more than 4\n"); fprintf(stderr," -N Use TIFF alpha N channels more than 4\n");
fprintf(stderr," -D Dither 8 bit TIFF values down from 16 bit\n"); fprintf(stderr," -D Dither 8 bit TIFF values down from 16 bit\n");
fprintf(stderr," -d label Custom chart description/label string, or \"\" to omit labelling\n");
fprintf(stderr," -Q nbits Quantize test values to fit in nbits\n"); fprintf(stderr," -Q nbits Quantize test values to fit in nbits\n");
fprintf(stderr," -R rsnum Use given random start number\n"); fprintf(stderr," -R rsnum Use given random start number\n");
fprintf(stderr," -K file.cal Apply printer calibration to patch values and include in .ti2\n"); fprintf(stderr," -K file.cal Apply printer calibration to patch values and include in .ti2\n");
@@ -3070,7 +3105,9 @@ int main(int argc, char *argv[]) {
int nchan = 0; /* Number of device chanels */ int nchan = 0; /* Number of device chanels */
int i; int i;
int si, fi, wi; /* Sample id index, field index, keyWord index */ int si, fi, wi; /* Sample id index, field index, keyWord index */
char label[400]; /* Space for chart label */ char *custom_label = NULL; /* Custom chart label string */
int custom_label_set = 0; /* Flag, custom label was specified */
char label[1024]; /* Space for chart label */
double marg = DEF_MARGINE; /* Margin from paper edge in mm */ double marg = DEF_MARGINE; /* Margin from paper edge in mm */
int nosubmarg = 0; /* Don't subtract it from raster */ int nosubmarg = 0; /* Don't subtract it from raster */
int nolpcbord = 0; /* NZ to suppress left paper clip border */ int nolpcbord = 0; /* NZ to suppress left paper clip border */
@@ -3302,6 +3339,13 @@ int main(int argc, char *argv[]) {
else if (argv[fa][1] == 'D') { else if (argv[fa][1] == 'D') {
tiffdith = 1; tiffdith = 1;
} }
/* Custom chart label string */
else if (argv[fa][1] == 'd') {
fa = nfa;
if (na == NULL) usage("Expected argument to -d");
custom_label = na;
custom_label_set = 1;
}
/* Don't use TIFF compression */ /* Don't use TIFF compression */
else if (argv[fa][1] == 'C') { else if (argv[fa][1] == 'C') {
tiffcomp = 0; tiffcomp = 0;
@@ -3789,8 +3833,18 @@ int main(int argc, char *argv[]) {
pcol = pcold; /* Density spacer alues */ pcol = pcold; /* Density spacer alues */
if (custom_label_set) {
if (custom_label[0] != '\000') {
strncpy(label, custom_label, sizeof(label) - 1);
label[sizeof(label) - 1] = '\000';
ocg->add_kword(ocg, 0, "CHART_LABEL", custom_label, NULL);
} else {
label[0] = '\000';
}
} else {
sprintf(label, "ArgyllCMS - Chart \"%s\" (%s %d) %s", sprintf(label, "ArgyllCMS - Chart \"%s\" (%s %d) %s",
psname, rand ? "Random Start" : "Chart ID", rstart, atm); psname, rand ? "Random Start" : "Chart ID", rstart, atm);
}
generate_file(itype, itype_mod, psname, cols, npat, applycal ? cal : NULL, label, generate_file(itype, itype_mod, psname, cols, npat, applycal ? cal : NULL, label,
pap != NULL ? pap->w : cwidth, pap != NULL ? pap->h : cheight, pap != NULL ? pap->w : cwidth, pap != NULL ? pap->h : cheight,
marg, nosubmarg, nollimit, nolpcbord, rand, rstart, saix, paix, ixord, marg, nosubmarg, nollimit, nolpcbord, rand, rstart, saix, paix, ixord,
Binary file not shown.
Binary file not shown.