Hello community, here is the log from the commit of package hxtools for openSUSE:Factory checked in at 2020-07-14 07:58:56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hxtools (Old) and /work/SRC/openSUSE:Factory/.hxtools.new.3060 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hxtools" Tue Jul 14 07:58:56 2020 rev:40 rq:820536 version:20200712 Changes: -------- --- /work/SRC/openSUSE:Factory/hxtools/hxtools.changes 2020-04-29 20:53:27.677146159 +0200 +++ /work/SRC/openSUSE:Factory/.hxtools.new.3060/hxtools.changes 2020-07-14 07:59:50.661897411 +0200 @@ -1,0 +2,9 @@ +Sun Jul 12 09:55:18 UTC 2020 - Jan Engelhardt <[email protected]> + +- Update to release 20200712 + * profile: add QUILT_COLORS + * bsvplay: Pianoman MUS support + * pcmmix: new utility for arpeggio/polyphonic mixing of + bsvplay/qplay outputs + +------------------------------------------------------------------- Old: ---- hxtools-20200428.tar.asc hxtools-20200428.tar.xz New: ---- hxtools-20200712.tar.asc hxtools-20200712.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hxtools.spec ++++++ --- /var/tmp/diff_new_pack.ZbgjkI/_old 2020-07-14 07:59:51.173899069 +0200 +++ /var/tmp/diff_new_pack.ZbgjkI/_new 2020-07-14 07:59:51.177899082 +0200 @@ -17,7 +17,7 @@ Name: hxtools -Version: 20200428 +Version: 20200712 Release: 0 Summary: Collection of day-to-day tools (binaries) License: GPL-2.0+ and WTFPL @@ -139,7 +139,8 @@ %description -n fd0ssh fd0ssh a helper program used by non-interactive programs, for example -pam_mount, that want to pipe a password to ssh. +pam_mount, that want to pipe a password to ssh. It works similar in +spirit to expect(1), but implements much less features. %package -n ofl Summary: Open File Lister from hxtools @@ -199,6 +200,7 @@ %_bindir/gxxdm %_bindir/hcdplay %_bindir/pcmdiff +%_bindir/pcmmix %_bindir/proc_iomem_count %_bindir/proc_stat_parse %_bindir/qplay ++++++ hxtools-20200428.tar.xz -> hxtools-20200712.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/configure new/hxtools-20200712/configure --- old/hxtools-20200428/configure 2020-04-28 23:16:35.897024624 +0200 +++ new/hxtools-20200712/configure 2020-07-12 11:44:59.919834895 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for hxtools 20200428. +# Generated by GNU Autoconf 2.69 for hxtools 20200712. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -577,8 +577,8 @@ # Identity of this package. PACKAGE_NAME='hxtools' PACKAGE_TARNAME='hxtools' -PACKAGE_VERSION='20200428' -PACKAGE_STRING='hxtools 20200428' +PACKAGE_VERSION='20200712' +PACKAGE_STRING='hxtools 20200712' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1301,7 +1301,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures hxtools 20200428 to adapt to many kinds of systems. +\`configure' configures hxtools 20200712 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1367,7 +1367,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of hxtools 20200428:";; + short | recursive ) echo "Configuration of hxtools 20200712:";; esac cat <<\_ACEOF @@ -1486,7 +1486,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -hxtools configure 20200428 +hxtools configure 20200712 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1946,7 +1946,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by hxtools $as_me 20200428, which was +It was created by hxtools $as_me 20200712, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2811,7 +2811,7 @@ # Define the identity of the package. PACKAGE='hxtools' - VERSION='20200428' + VERSION='20200712' cat >>confdefs.h <<_ACEOF @@ -5936,7 +5936,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by hxtools $as_me 20200428, which was +This file was extended by hxtools $as_me 20200712, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6002,7 +6002,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -hxtools config.status 20200428 +hxtools config.status 20200712 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/configure.ac new/hxtools-20200712/configure.ac --- old/hxtools-20200428/configure.ac 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/configure.ac 2020-07-12 11:44:16.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT([hxtools], [20200428]) +AC_INIT([hxtools], [20200712]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) AC_PROG_INSTALL diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/data/hxtools_bashrc.bash new/hxtools-20200712/data/hxtools_bashrc.bash --- old/hxtools-20200428/data/hxtools_bashrc.bash 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/data/hxtools_bashrc.bash 2020-07-12 11:44:16.000000000 +0200 @@ -110,26 +110,16 @@ unset PS1_XTERM eval "$(/usr/bin/dircolors -b /usr/share/hxtools/hxtools_dircolors)"; +export QUILT_COLORS="diff_add=32:diff_rem=31:diff_hdr=1;37;44:diff_hunk=35" # Find out what options this machine's "ls" supports # Same option finding for "less" # -if [[ "$(uname -s)" == Linux ]]; then - LESS="-Mi"; - LS_OPTIONS="-NT0"; - for i in --color=auto --group-dir; do - /bin/ls "$i" -d >/dev/null 2>&1 && LS_OPTIONS="$LS_OPTIONS $i"; - done; -else - unset LESS; - unset LS_OPTIONS; - for i in -M -i; do - less "$i" </dev/null >/dev/null 2>&1 && LESS="$LESS $i"; - done; - for i in --color=auto --group-dir -N "-T 0"; do - /bin/ls "$i" -d >/dev/null 2>&1 && LS_OPTIONS="$LS_OPTIONS $i"; - done; -fi; +LESS="-Mi" +LS_OPTIONS="-NT0" +for i in --color=auto --group-dir; do + /bin/ls "$i" -d >/dev/null 2>&1 && LS_OPTIONS="$LS_OPTIONS $i" +done export LESS; export LS_OPTIONS; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/doc/Makefile.am new/hxtools-20200712/doc/Makefile.am --- old/hxtools-20200428/doc/Makefile.am 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/doc/Makefile.am 2020-07-12 11:44:16.000000000 +0200 @@ -35,6 +35,7 @@ qplay.1 \ qtar.1 \ pcmdiff.1 \ + pcmmix.1 \ psthreads.1 \ recursive_lower.1 \ rezip.1 \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/doc/Makefile.in new/hxtools-20200712/doc/Makefile.in --- old/hxtools-20200428/doc/Makefile.in 2020-04-28 23:16:36.485025707 +0200 +++ new/hxtools-20200712/doc/Makefile.in 2020-07-12 11:45:00.579837712 +0200 @@ -296,6 +296,7 @@ qplay.1 \ qtar.1 \ pcmdiff.1 \ + pcmmix.1 \ psthreads.1 \ recursive_lower.1 \ rezip.1 \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/doc/NEWS.txt new/hxtools-20200712/doc/NEWS.txt --- old/hxtools-20200428/doc/NEWS.txt 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/doc/NEWS.txt 2020-07-12 11:44:16.000000000 +0200 @@ -1,4 +1,12 @@ +rel-20200712 +============ +* profile: add QUILT_COLORS +* bsvplay: Pianoman MUS support +* pcmmix: new utility for arpeggio/polyphonic mixing of + bsvplay/qplay outputs + + rel-20200428 ============ * vfontas: N2 vectorizer: cease smoothing of stub serifs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/doc/bsvplay.1 new/hxtools-20200712/doc/bsvplay.1 --- old/hxtools-20200428/doc/bsvplay.1 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/doc/bsvplay.1 2020-07-12 11:44:16.000000000 +0200 @@ -1,18 +1,22 @@ .TH bsvplay 1 "2008-02-06" "hxtools" "hxtools" .SH Name .PP -bsvplay \(em convert BASICA music files to PCM +bsvplay \(em convert BASICA music data to PCM .SH Syntax .PP \fBbsvplay\fP [\fB\-i\fP \fIpart\fP] [\fB\-q\fP \fIpart\fP] [\fB\-r\fP \fIrate\fP] [\fIfile\fP...] \fB| aplay \-f dat \-c 1\fP .SH Description .PP -bsvplay will convert BASICA binary music files to linear 16-bit raw PCM. +bsvplay will convert BASICA binary music data to linear 16-bit raw PCM. Normally, you will be wanting to pipe it into a raw PCM player like \fBaplay\fP(1) to actually output it to a sound device. Be sure to lower the volume beforehand to avoid nasty surprises that come with square waves. By default, bsvplay will mix 1:1 square:sine waves to give a medium tone hardness. +.PP +Do note that the music data is embedded in BSV/EXE/COM files and needs to +be manually located. It is usually very evident from a regular pattern in +hexdumps. .SH Options .TP \fB\-q\fP \fIpart\fP @@ -25,6 +29,9 @@ .TP \fB\-r\fP \fIrate\fP PCM sample rate (default: 48000 Hz) +.TP +\fB\-\-pianoman\fP +Assume the input is Pianoman MUS. .SH File format .PP The BASICA format is defined 6-byte tuples of divisor, duration and pause. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/doc/pcmmix.1 new/hxtools-20200712/doc/pcmmix.1 --- old/hxtools-20200428/doc/pcmmix.1 1970-01-01 01:00:00.000000000 +0100 +++ new/hxtools-20200712/doc/pcmmix.1 2020-07-12 11:44:16.000000000 +0200 @@ -0,0 +1,34 @@ +.TH pcmmix 1 "2020-07-11" "hxtools" "hxtools" +.SH Name +.PP +pcmmix \(em PCM mixer +.SH Syntax +.PP +\fBpcmmix\fP [\fB\-ap\fP] [\fB\-t\fP \fIp/q\fP] \fIfile\fP... +.SH Description +.PP +pcmmix will mix two or more input streams (assumed to be LE16 PCM, and of +the same number of channels). It can do so in either arpeggiated or +polyphonic mode. +.SH Options +.PP +\fB\-a\fP +Select arpeggio mode. +.PP +\fB\-p\fP +Select polyphony mode. +.PP +\fB\-r\fP \fIrate\fP +Input sample rate (default: 48000). +.PP +\fB\-t\fP \fIp/q\fP +Defines the length of one arpeggio block in which data from all input sources +will be round-robined within, as p/q seconds. (default: 80/1086) +.SH Examples +.IP \(bu 4 +Entertainer from FOG: `pcmmix -t 160/1086 <(bsvplay --pianoman entrtan1.mus) <(bsvplay --pianoman entrtan2.mus) <(bsvplay --pianoman exe/entrtan3.mus) <(bsvplay --pianoman exe/entrtan4.mus) | aplay -fcd -r48000 -c1` +.IP \(bu 4 +IHOLD from FOG: `pcmmix -t 80/1086 <(bsvplay --pianoman ihold1.mus) <(bsvplay --pianoman ihold2.mus) <(bsvplay --pianoman ihold3.mus) <(bsvplay --pianoman ihold4.mus) | aplay -fcd -r48000 -c1` +.SH See also +.PP +\fBaplay\fP(1), \fBbsvplay\fP(1), \fBhxtools\fP(7), \fBqplay\fP(1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/doc/vfontas.1 new/hxtools-20200712/doc/vfontas.1 --- old/hxtools-20200428/doc/vfontas.1 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/doc/vfontas.1 2020-07-12 11:44:16.000000000 +0200 @@ -61,6 +61,120 @@ .PP vfontas (originally "VGA font file assembler") can transform raster font files in various ways. +.SH Aspect ratio +.PP +CRT screens of the time commonly had an aspect ratio of 4:3, and whatever +resolution was shown would be squeezed into that frame, potentially making the +pixels non-square. This means that bitmap fonts of the time will need a +corrective factor for modern display hardware to be reproduced faithfully. This +correction can happen either during conversion (vfontas has no support for this +at present), or at the time of rendering. The font can either be stretched in +the vertical direction or compressed in the horizontal by using the reciprocal. +.TS +allbox tab(:); +lB lB lB lB. +T{ +Text res +T}:T{ +Char size +T}:T{ +Resolution +T}:T{ +VStretch +T} +.T& +l l l l. +T{ +80x25 +T}:T{ +9x14 +T}:T{ +720x350 +T}:T{ +54/35 = 1.54 +T} +.T& +l l l l. +T{ +40x25 +T}:T{ +8x8 +T}:T{ +320x200 +T}:T{ +6/5 = 1.2 +T} +.T& +l l l l. +T{ +80x25 +T}:T{ +8x8 +T}:T{ +640x200 +T}:T{ +12/5 = 2.4 +T} +.T& +l l l l. +T{ +80x25 +T}:T{ +8x14 +T}:T{ +640x350 +T}:T{ +48/35 = 1.37 +T} +.T& +l l l l. +T{ +80x43 +T}:T{ +8x8 +T}:T{ +640x350 +T}:T{ +48/35 = 1.37 +T} +.T& +l l l l. +T{ +80x25 +T}:T{ +9x16 +T}:T{ +720x400 +T}:T{ +27/20 = 1.35 +T} +.T& +l l l l. +T{ +80x30 +T}:T{ +8x16 +T}:T{ +640x480 +T}:T{ +1.0 +T} +.T& +l l l l. +T{ +80x50 +T}:T{ +9x8 +T}:T{ +720x400 +T}:T{ +27/20 = 1.35 +T} +.T& +l l l l. +::x*y:x*y/3*4 +.TE +.SH Commands .SS blankfnt .PP Initializes the memory buffer with 256 empty 8x16 glyphs. The primary purpose diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/examples/colortable new/hxtools-20200712/examples/colortable --- old/hxtools-20200428/examples/colortable 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/examples/colortable 2020-07-12 11:44:16.000000000 +0200 @@ -18,7 +18,7 @@ } } -for (my $bg = 0; $bg < 8; ++$bg) { +for (my $bg = -1; $bg < 8; ++$bg) { for my $bit (0,1,7) { for $fg (30..37, 39) { my $lo_fg = $fg - 30; @@ -28,10 +28,14 @@ } elsif ($bit == 7) { $lo_bg |= 8; } - printf"\e[0;$bit;$fg;4${bg}m%x%x", $lo_bg, $lo_fg; + if ($bg == -1) { + printf "\e[0;$bit;${fg}m%02x", $lo_fg; + } else { + printf "\e[0;$bit;$fg;4${bg}m%x%x", $lo_bg, $lo_fg; + } } } - print"\e[0m\n"; + print "\e[0m\n"; } print "\e[1mbold\e[0m \e[2mdim\e[0m \e[3mitalic\e[0m \e[4munderscore\e[0m ", "\e[5mblink\e[0m \e[6mrapidblink\e[0m \e[7mreverse\e[0m\ndefault ", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/.gitignore new/hxtools-20200712/smm/.gitignore --- old/hxtools-20200428/smm/.gitignore 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/.gitignore 2020-07-12 11:44:16.000000000 +0200 @@ -1,5 +1,6 @@ /bsvplay /hcdplay /pcmdiff +/pcmmix /qplay /vfontas diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/Makefile.am new/hxtools-20200712/smm/Makefile.am --- old/hxtools-20200428/smm/Makefile.am 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/Makefile.am 2020-07-12 11:44:16.000000000 +0200 @@ -4,7 +4,7 @@ AM_CFLAGS = ${regular_CFLAGS} AM_CXXFLAGS = ${regular_CXXFLAGS} -bin_PROGRAMS = bsvplay hcdplay pcmdiff qplay vfontas +bin_PROGRAMS = bsvplay hcdplay pcmdiff pcmmix qplay vfontas dist_bin_SCRIPTS = aumeta extract_d3pkg extract_dxhog extract_f3pod \ extract_qupak extract_dfqshared.pm gpsh mod2opus mkvappend ssa2srt @@ -12,6 +12,7 @@ bsvplay_LDADD = ${libHX_LIBS} -lm hcdplay_LDADD = ${libHX_LIBS} pcmdiff_LDADD = ${libHX_LIBS} +pcmmix_LDADD = ${libHX_LIBS} qplay_SOURCES = qplay.c pcspkr_pcm.c qplay_LDADD = ${libHX_LIBS} -lm vfontas_SOURCES = vfontas.cpp vfalib.cpp vfalib.hpp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/Makefile.in new/hxtools-20200712/smm/Makefile.in --- old/hxtools-20200428/smm/Makefile.in 2020-04-28 23:16:36.605025928 +0200 +++ new/hxtools-20200712/smm/Makefile.in 2020-07-12 11:45:00.699838225 +0200 @@ -90,7 +90,7 @@ PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = bsvplay$(EXEEXT) hcdplay$(EXEEXT) pcmdiff$(EXEEXT) \ - qplay$(EXEEXT) vfontas$(EXEEXT) + pcmmix$(EXEEXT) qplay$(EXEEXT) vfontas$(EXEEXT) subdir = smm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -114,6 +114,9 @@ pcmdiff_SOURCES = pcmdiff.c pcmdiff_OBJECTS = pcmdiff.$(OBJEXT) pcmdiff_DEPENDENCIES = $(am__DEPENDENCIES_1) +pcmmix_SOURCES = pcmmix.c +pcmmix_OBJECTS = pcmmix.$(OBJEXT) +pcmmix_DEPENDENCIES = $(am__DEPENDENCIES_1) am_qplay_OBJECTS = qplay.$(OBJEXT) pcspkr_pcm.$(OBJEXT) qplay_OBJECTS = $(am_qplay_OBJECTS) qplay_DEPENDENCIES = $(am__DEPENDENCIES_1) @@ -189,10 +192,10 @@ am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = -SOURCES = $(bsvplay_SOURCES) hcdplay.c pcmdiff.c $(qplay_SOURCES) \ - $(vfontas_SOURCES) -DIST_SOURCES = $(bsvplay_SOURCES) hcdplay.c pcmdiff.c $(qplay_SOURCES) \ - $(vfontas_SOURCES) +SOURCES = $(bsvplay_SOURCES) hcdplay.c pcmdiff.c pcmmix.c \ + $(qplay_SOURCES) $(vfontas_SOURCES) +DIST_SOURCES = $(bsvplay_SOURCES) hcdplay.c pcmdiff.c pcmmix.c \ + $(qplay_SOURCES) $(vfontas_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -338,6 +341,7 @@ bsvplay_LDADD = ${libHX_LIBS} -lm hcdplay_LDADD = ${libHX_LIBS} pcmdiff_LDADD = ${libHX_LIBS} +pcmmix_LDADD = ${libHX_LIBS} qplay_SOURCES = qplay.c pcspkr_pcm.c qplay_LDADD = ${libHX_LIBS} -lm vfontas_SOURCES = vfontas.cpp vfalib.cpp vfalib.hpp @@ -431,6 +435,10 @@ @rm -f pcmdiff$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pcmdiff_OBJECTS) $(pcmdiff_LDADD) $(LIBS) +pcmmix$(EXEEXT): $(pcmmix_OBJECTS) $(pcmmix_DEPENDENCIES) $(EXTRA_pcmmix_DEPENDENCIES) + @rm -f pcmmix$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pcmmix_OBJECTS) $(pcmmix_LDADD) $(LIBS) + qplay$(EXEEXT): $(qplay_OBJECTS) $(qplay_DEPENDENCIES) $(EXTRA_qplay_DEPENDENCIES) @rm -f qplay$(EXEEXT) $(AM_V_CCLD)$(LINK) $(qplay_OBJECTS) $(qplay_LDADD) $(LIBS) @@ -483,6 +491,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsvplay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hcdplay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcmdiff.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcmmix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pcspkr_pcm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qplay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vfalib.Po@am__quote@ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/bsvplay.c new/hxtools-20200712/smm/bsvplay.c --- old/hxtools-20200428/smm/bsvplay.c 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/bsvplay.c 2020-07-12 11:44:16.000000000 +0200 @@ -1,6 +1,6 @@ /* * bsvplay.c - BASICA binary music format interpreter - * Copyright © Jan Engelhardt <jengelh [at] medozas de>, 2002 - 2010 + * Copyright © Jan Engelhardt, 2002-2010,2020 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -11,6 +11,7 @@ #include <sys/types.h> #include <errno.h> #include <fcntl.h> +#include <math.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> @@ -20,35 +21,61 @@ #include <libHX/init.h> #include <libHX/option.h> #include "pcspkr.h" +#define TICKSPERSEC 1086 +/* + * based on findings from pvt collection + * entertan.exe 1989 (size:29527 md5:13caa8100e15ad65d900f6a12b9ddf24) + * ihold.exe 1989 (size:21317 md5:5cf7aef915539c60a9a98c96a3a8aefb) + * maplleaf.exe 1989 (size:27865 md5:f234797cbd1dba47d90da8a94dcb088f) + * mnty.exe 1989 (size:19441 md5:507997fa70b89f9a9ed5430e833cb6c0) + * willtell.exe 1989 (size:33799 md5:5d5405a5ff063476deec618dcd3d990d) + */ struct bsv_insn { uint16_t divisor, duration, af_pause; }; +/* + * based on findings in FOGDOS.118, FOGDOS.119, FOGDOS.120: + * pianoman.com 1986-05-06 01:36:02 (md5:cba939868e35b2742984246aa9317984) (Neil J. Rubenking) + * entertan.mus 1984-12-06 03:51:24 (size:24280 md5:994a5130d91b5b1395e4f9653f06c2e9) + * (Scott Joplin - The Entertainer) + * ihold.mus 1986-05-03 18:10:36 (size:17440 md5:d1ed36909bd4db1e4903181e57486c19) + * (Tom Lehrer - I hold your hand in mine) + * maplleaf.mus 1984-12-07 03:56:00 (size:23080 md5:f070f2b417065c322434ea2af613d464) + * (Scott Joplin - The maple leaf rag) + * mntpythn.mus 1984-12-29 20:19:40 (size:18700 md5:e10ba993a9d3179af0b890f453ddc93f) + * (John Philip Sousa - The liberty bell) + * willtell.mus 1985-01-10 15:23:26 (size:40105 md5:bd0e216ce89080a1e633465f57516b6a) + * (Gioachino Rossini - William Tell) + */ +struct pianoman_insn { + /* 0..255 */ + uint8_t octave; + /* c(1), c#(2), d(3), d#(4), e(5), f(6), f#(7), g(8), g#(9), + * a(10), a#(11), b(12), rest(13) */ + uint8_t note; + /* 0..9 */ + uint8_t staccato; + /* 1280=whole note, 640=half, etc. */ + uint16_t len; +} __attribute__((packed)); + static struct pcspkr pcsp = { .sample_rate = 48000, + .prop_square = 1, + .prop_sine = 1, .volume = 0.1, }; static unsigned int filter_lo = 0, filter_hi = ~0U; static unsigned int tick_groupsize, tick_filter; -static unsigned int no_zero_ticks; +static unsigned int no_zero_ticks, flg_pianoman; -static void parse_file(const char *file) +static void parse_basica(int fd) { unsigned int count = 0, ticks = 0; struct bsv_insn tone; - int fd; - - if (strcmp(file, "-") == 0) - fd = STDIN_FILENO; - else - fd = open(file, O_RDONLY); - - if (fd < 0) { - fprintf(stderr, "Could not open %s: %s\n", file, strerror(errno)); - return; - } while (read(fd, &tone, sizeof(struct bsv_insn)) == sizeof(struct bsv_insn)) @@ -62,34 +89,99 @@ if (tick_groupsize != 0) silenced |= (count % tick_groupsize) != tick_filter; - fprintf(stderr, "(%5u) %5hu %5ld%c %5hu %5hu\n", + fprintf(stderr, "(%5u) %5hu %5ldHz%c %5hu %5hu\n", count, tone.divisor, frequency, silenced ? '*' : ' ', tone.duration, tone.af_pause); /* * It seems that in the sample BSV executables from 1989 * calculate the cpu speed and then do around 1086 ticks/sec. - * entertan.exe: 199335 / 183 = 1089 - * ihold.exe: 73248 / 68 = 1077 - * maplleaf.exe: 170568 / 157 = 1086 - * mnty.exe: 119680 / 110 = 1088 - * willtell.exe: 225350 / 206 = 1093 + * entertan.exe: 199335 / 183s = 1089 + * ihold.exe: 73248 / 68s = 1077 + * maplleaf.exe: 170568 / 157s = 1086 + * mnty.exe: 119680 / 110s = 1088 + * willtell.exe: 225350 / 206s = 1093 */ ticks += tone.duration + tone.af_pause; if (silenced && no_zero_ticks) ; else if (silenced) pcspkr_silence(&pcsp, (tone.duration + tone.af_pause) * - pcsp.sample_rate / 1086); + pcsp.sample_rate / TICKSPERSEC); else pcspkr_output(&pcsp, frequency, - tone.duration * pcsp.sample_rate / 1086, - tone.af_pause * pcsp.sample_rate / 1086); + tone.duration * pcsp.sample_rate / TICKSPERSEC, + tone.af_pause * pcsp.sample_rate / TICKSPERSEC); } fprintf(stderr, "Total ticks: %u\n", ticks); } +static void parse_pianoman(int fd) +{ + unsigned int count = 0, ticks = 0; + struct pianoman_insn tone; + double notemap[255*12]; + + for (int n = 0; n < sizeof(notemap); ++n) + notemap[n] = 440.0 * pow(2, (n - 45) / 12.0); + + while (read(fd, &tone, sizeof(tone)) == sizeof(tone)) { + int frequency = notemap[tone.octave*12+tone.note]; + unsigned int af_pause = tone.len * tone.staccato / 10; + unsigned int duration = tone.len - af_pause; + bool silenced; + + ++count; + silenced = tone.note == 13; + if (tick_groupsize != 0) + silenced |= (count % tick_groupsize) != tick_filter; + + fprintf(stderr, "(%5u) O%uN%02u %5dHz%c %5u %5u\n", + count, tone.octave, tone.note, frequency, + silenced ? '*' : ' ', duration, + af_pause); + /* + * Pianoman runs through + * entertan.mus: 194240/182s=1067 + * ihold.mus: 69760/ 66s=1056 + * maplleaf.mus: 138480/130s=1065 + * mntpythn.mus: 112200/105s=1068 + * willtell.mus: 169407/159s=1065 + */ + ticks += tone.len; + if (silenced && no_zero_ticks) + ; + else if (silenced) + pcspkr_silence(&pcsp, (duration + af_pause) * + pcsp.sample_rate / TICKSPERSEC); + else + pcspkr_output(&pcsp, frequency, + duration * pcsp.sample_rate / TICKSPERSEC, + af_pause * pcsp.sample_rate / TICKSPERSEC); + } + fprintf(stderr, "Total ticks: %u\n", ticks); +} + +static void parse_file(const char *file) +{ + int fd; + if (strcmp(file, "-") == 0) + fd = STDIN_FILENO; + else + fd = open(file, O_RDONLY); + + if (fd < 0) { + fprintf(stderr, "Could not open %s: %s\n", file, strerror(errno)); + return; + } + if (flg_pianoman) + parse_pianoman(fd); + else + parse_basica(fd); + close(fd); +} + int main(int argc, const char **argv) { static const struct HXoption options_table[] = { @@ -103,8 +195,14 @@ .help = "Play only this tick in a tick block"}, {.sh = 'Z', .type = HXTYPE_NONE, .ptr = &no_zero_ticks, .help = "Skip over silenced ticks"}, + {.sh = 'i', .type = HXTYPE_DOUBLE, .ptr = &pcsp.prop_sine, + .help = "Proportion of sine-wave calculation mixed in"}, + {.sh = 'q', .type = HXTYPE_DOUBLE, .ptr = &pcsp.prop_square, + .help = "Proportion of square-wave calculation mixed in"}, {.sh = 'r', .type = HXTYPE_UINT, .ptr = &pcsp.sample_rate, .help = "Sample rate (default: 48000)"}, + {.ln = "pianoman", .type = HXTYPE_NONE, .ptr = &flg_pianoman, + .help = "Assume input is in Pianoman .MUS file"}, HXOPT_AUTOHELP, HXOPT_TABLEEND, }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/pcmmix.c new/hxtools-20200712/smm/pcmmix.c --- old/hxtools-20200428/smm/pcmmix.c 1970-01-01 01:00:00.000000000 +0100 +++ new/hxtools-20200712/smm/pcmmix.c 2020-07-12 11:44:16.000000000 +0200 @@ -0,0 +1,158 @@ +/* + * pcmmix - trivial wave mixer + * Copyright Jan Engelhardt, 2020 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + */ +#include <errno.h> +#include <fcntl.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <libHX/init.h> +#include <libHX/option.h> + +static char *blocklen_str; +static unsigned int mixing_mode, sample_rate = 48000; + +enum { + MIX_ARPEGGIO = 0, + MIX_POLYPHONY, +}; + +static ssize_t fullread(int fd, void *buf, size_t rem) +{ + size_t pos = 0; + while (rem > 0) { + ssize_t ret = read(fd, (char *)buf + pos, rem); + if (ret == 0) + return pos; + if (ret < 0) + return ret; + rem -= ret; + pos += ret; + } + return pos; +} + +int main(int argc, const char **argv) +{ + static const struct HXoption options_table[] = { + {.sh = 'a', .type = HXTYPE_NONE | HXTYPE_VAL, .ptr = &mixing_mode, + .val = MIX_ARPEGGIO, .help = "Arpeggio mix (see -t too)"}, + {.sh = 'p', .type = HXTYPE_NONE | HXTYPE_VAL, .ptr = &mixing_mode, + .val = MIX_POLYPHONY, .help = "Polyphonic mix"}, + {.sh = 'r', .type = HXTYPE_UINT, .ptr = &sample_rate, + .help = "Input sample rate (default: 48000)", .htyp = "RATE"}, + {.sh = 't', .type = HXTYPE_STRING, .ptr = &blocklen_str, + .help = "Block length (default: 40/1086)", .htyp = "p/q"}, + HXOPT_AUTOHELP, + HXOPT_TABLEEND, + }; + int ret; + if ((ret = HX_init()) <= 0) { + fprintf(stderr, "HX_init: %s\n", strerror(-ret)); + abort(); + } + if (HX_getopt(options_table, &argc, &argv, HXOPT_USAGEONERR) != + HXOPT_ERR_SUCCESS) { + HX_exit(); + return EXIT_FAILURE; + } + if (blocklen_str == NULL) + blocklen_str = "120/1086"; + + char *e = NULL; + unsigned int blocklen_p = strtoul(blocklen_str, &e, 0); + unsigned int blocklen_q = 1; + if (e != NULL && *e == '/') + blocklen_q = strtoul(e + 1, NULL, 0); + fprintf(stderr, "Block length: %u/%us", blocklen_p, blocklen_q); + unsigned int blocksamples = sample_rate * blocklen_p / blocklen_q; + unsigned int blockbytes = sizeof(int16_t) * blocksamples; + fprintf(stderr, ", %u samples, %u bytes\n", blocksamples, blockbytes); + + --argc; + ++argv; + + int *inputfd = malloc(sizeof(*inputfd) * argc); + int inputcount = 0, eofs = 0; + + for (int i = 0; i < argc; ++i) { + inputfd[i] = open(argv[i], O_RDONLY); + if (inputfd[i] < 0) { + fprintf(stderr, "open %s: %s\n", argv[i], strerror(errno)); + continue; + } + ++inputcount; + } + + if (inputfd == NULL) { + perror("malloc"); + HX_exit(); + return EXIT_FAILURE; + } + + if (mixing_mode == MIX_ARPEGGIO) { + void *inputbuf = malloc(blockbytes); + void *dumbbuf = malloc(blockbytes); + if (inputbuf == NULL || dumbbuf == NULL) { + perror("malloc"); + HX_exit(); + return EXIT_FAILURE; + } + + unsigned int fragsamples = blocksamples / inputcount; + unsigned int fragbytes = sizeof(int16_t) * fragsamples; + fprintf(stderr, "Slot sample count: %u\n", fragsamples); + + while (eofs < inputcount) { + memset(inputbuf, 0, sizeof(int16_t) * blocksamples); + for (int i = 0; i < inputcount; ++i) { + for (int j = 0; j < inputcount; ++j) { + void *atp = i != j ? dumbbuf : inputbuf + i * fragbytes; + ssize_t rdret = fullread(inputfd[i], atp, fragbytes); + if (i == j && rdret != fragbytes) + ++eofs; + } + } + write(STDOUT_FILENO, inputbuf, inputcount * fragbytes); + } + + free(dumbbuf); + free(inputbuf); + } else if (mixing_mode == MIX_POLYPHONY) { + int16_t **inputbuf = malloc(sizeof(int16_t *) * inputcount); + for (int i = 0; i < inputcount; ++i) + inputbuf[i] = malloc(blockbytes); + int16_t *outputbuf = malloc(blockbytes); + + while (eofs < inputcount) { + for (int i = 0; i < inputcount; ++i) { + memset(inputbuf[i], 0, blockbytes); + ssize_t rdret = fullread(inputfd[i], inputbuf[i], blockbytes); + if (rdret != blockbytes) + ++eofs; + } + for (int s = 0; s < blocksamples; ++s) { + int32_t v = 0; + for (int i = 0; i < inputcount; ++i) + v += inputbuf[i][s]; + outputbuf[s] = v / inputcount; + } + write(STDOUT_FILENO, outputbuf, blockbytes); + } + free(outputbuf); + for (int i = 0; i < inputcount; ++i) + free(inputbuf[i]); + free(inputbuf); + } + + free(inputfd); + return EXIT_SUCCESS; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/pcspkr.h new/hxtools-20200712/smm/pcspkr.h --- old/hxtools-20200428/smm/pcspkr.h 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/pcspkr.h 2020-07-12 11:44:16.000000000 +0200 @@ -9,7 +9,7 @@ #endif struct pcspkr { - double volume; + double prop_square, prop_sine, volume; FILE *file_ptr; unsigned int sample_rate; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/pcspkr_pcm.c new/hxtools-20200712/smm/pcspkr_pcm.c --- old/hxtools-20200428/smm/pcspkr_pcm.c 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/pcspkr_pcm.c 2020-07-12 11:44:16.000000000 +0200 @@ -13,6 +13,24 @@ #include "pcspkr.h" /** + * dynamic_qi + * @pcsp: pc speaker struct + * @x: time + * + * A pure sine wave does not sound at all like a PC speaker. A square wave on + * the other hand is very hard (hardness, not difficulty). Mix square and sine + * according to parameters. + */ +static inline double dynamic_qi(const struct pcspkr *pcsp, double x) +{ + double i = sin(x); + double q = (i > 0) ? 1 : -1; + + return (pcsp->prop_square * q + pcsp->prop_sine * i) / + (pcsp->prop_square + pcsp->prop_sine); +} + +/** * pcspkr_output - produce waves * @state: pcspkr state * @frequency: tone frequency @@ -30,8 +48,9 @@ long sample; for (sample = 0; sample < duration; ++sample) { - double q = sin(2.0 * M_PI * frequency * sample / pcsp->sample_rate); - value = 32767 * pcsp->volume * (q > 0 ? 1 : -1); + value = 32767 * dynamic_qi(pcsp, + 2.0 * M_PI * frequency * sample / pcsp->sample_rate) * + pcsp->volume; fwrite(&value, sizeof(value), 1, pcsp->file_ptr); } value = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/qplay.c new/hxtools-20200712/smm/qplay.c --- old/hxtools-20200428/smm/qplay.c 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/qplay.c 2020-07-12 11:44:16.000000000 +0200 @@ -30,6 +30,8 @@ static int glob_spd = 120, glob_len = 4, glob_octave = 4; static struct pcspkr pcsp = { .sample_rate = 48000, + .prop_square = 1, + .prop_sine = 1, .volume = 0.1, }; @@ -406,6 +408,10 @@ int main(int argc, const char **argv) { static const struct HXoption options_table[] = { + {.sh = 'i', .type = HXTYPE_DOUBLE, .ptr = &pcsp.prop_sine, + .help = "Proportion of sine-wave calculation mixed in"}, + {.sh = 'q', .type = HXTYPE_DOUBLE, .ptr = &pcsp.prop_square, + .help = "Proportion of square-wave calculation mixed in"}, {.sh = 'r', .type = HXTYPE_UINT, .ptr = &pcsp.sample_rate, .help = "Sample rate (default: 48000)"}, HXOPT_AUTOHELP, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/vfalib.cpp new/hxtools-20200712/smm/vfalib.cpp --- old/hxtools-20200428/smm/vfalib.cpp 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/vfalib.cpp 2020-07-12 11:44:16.000000000 +0200 @@ -793,14 +793,14 @@ void vectorizer::set(int x, int y) { - /* TTF/OTF spec wants CCW orientation */ + /* TTF/OTF spec: right side of line to be interior */ int s = scale_factor; x *= s; y *= s; - emap.insert(edge{{x, y}, {x, y + s}}); - emap.insert(edge{{x, y + s}, {x + s, y + s}}); - emap.insert(edge{{x + s, y + s}, {x + s, y}}); - emap.insert(edge{{x + s, y}, {x, y}}); + emap.insert(edge{{y, x}, {y + s, x}}); + emap.insert(edge{{y + s, x}, {y + s, x + s}}); + emap.insert(edge{{y + s, x + s}, {y, x + s}}); + emap.insert(edge{{y, x + s}, {y, x}}); } void vectorizer::make_squares() @@ -828,14 +828,13 @@ */ for (auto edge = emap.begin(); edge != emap.end(); ) { auto twin = emap.find({edge->end_vtx, edge->start_vtx}); - if (twin == edge) { - printf("Glyph outline description is faulty: edge with startvtx==endvtx (%d,%d)\n", - edge->start_vtx.x, edge->start_vtx.y); - break; - } if (twin == emap.cend()) { ++edge; continue; + } else if (twin == edge) { + printf("Glyph outline description is faulty: edge with startvtx==endvtx (%d,%d)\n", + edge->start_vtx.x, edge->start_vtx.y); + break; } emap.erase(twin); edge = emap.erase(edge); @@ -1022,30 +1021,30 @@ bool br = (c2 && ((c6 && ((!c3 && (c1 || c7 || c9)) || (!c1 && !c4) || (!c8 && !c9))) || c5)) || (c5 && ((!c1 && !c9) || c3 || c6)); if (tl) { - emap.insert(edge{{2*x, 2*y+1}, {2*x, 2*y+2}}); - emap.insert(edge{{2*x, 2*y+2}, {2*x+1, 2*y+2}}); - emap.insert(edge{{2*x+1, 2*y+2}, {2*x, 2*y+1}}); + emap.insert(edge{{2*y+1, 2*x}, {2*y+2, 2*x}}); + emap.insert(edge{{2*y+2, 2*x}, {2*y+2, 2*x+1}}); + emap.insert(edge{{2*y+2, 2*x+1}, {2*y+1, 2*x}}); } if (tr) { - emap.insert(edge{{2*x+1, 2*y+2}, {2*x+2, 2*y+2}}); - emap.insert(edge{{2*x+2, 2*y+2}, {2*x+2, 2*y+1}}); - emap.insert(edge{{2*x+2, 2*y+1}, {2*x+1, 2*y+2}}); + emap.insert(edge{{2*y+2, 2*x+1}, {2*y+2, 2*x+2}}); + emap.insert(edge{{2*y+2, 2*x+2}, {2*y+1, 2*x+2}}); + emap.insert(edge{{2*y+1, 2*x+2}, {2*y+2, 2*x+1}}); } if (bl) { - emap.insert(edge{{2*x, 2*y}, {2*x, 2*y+1}}); - emap.insert(edge{{2*x, 2*y+1}, {2*x+1, 2*y}}); - emap.insert(edge{{2*x+1, 2*y}, {2*x, 2*y}}); + emap.insert(edge{{2*y, 2*x}, {2*y+1, 2*x}}); + emap.insert(edge{{2*y+1, 2*x}, {2*y, 2*x+1}}); + emap.insert(edge{{2*y, 2*x+1}, {2*y, 2*x}}); } if (br) { - emap.insert(edge{{2*x+1, 2*y}, {2*x+2, 2*y+1}}); - emap.insert(edge{{2*x+2, 2*y+1}, {2*x+2, 2*y}}); - emap.insert(edge{{2*x+2, 2*y}, {2*x+1, 2*y}}); + emap.insert(edge{{2*y, 2*x+1}, {2*y+1, 2*x+2}}); + emap.insert(edge{{2*y+1, 2*x+2}, {2*y, 2*x+2}}); + emap.insert(edge{{2*y, 2*x+2}, {2*y, 2*x+1}}); } if (di) { - emap.insert(edge{{2*x, 2*y+1}, {2*x+1, 2*y+2}}); - emap.insert(edge{{2*x+1, 2*y+2}, {2*x+2, 2*y+1}}); - emap.insert(edge{{2*x+2, 2*y+1}, {2*x+1, 2*y }}); - emap.insert(edge{{2*x+1, 2*y }, {2*x, 2*y+1}}); + emap.insert(edge{{2*y+1, 2*x}, {2*y+2, 2*x+1}}); + emap.insert(edge{{2*y+2, 2*x+1}, {2*y+1, 2*x+2}}); + emap.insert(edge{{2*y+1, 2*x+2}, {2*y, 2*x+1}}); + emap.insert(edge{{2*y, 2*x+1}, {2*y+1, 2*x}}); } } } @@ -1424,12 +1423,12 @@ bool vertex::operator<(const struct vertex &o) const { - return std::tie(x, y) < std::tie(o.x, o.y); + return std::tie(y, x) < std::tie(o.y, o.x); } bool vertex::operator==(const struct vertex &o) const { - return std::tie(x, y) == std::tie(o.x, o.y); + return std::tie(y, x) == std::tie(o.y, o.x); } bool edge::operator<(const struct edge &o) const diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hxtools-20200428/smm/vfalib.hpp new/hxtools-20200712/smm/vfalib.hpp --- old/hxtools-20200428/smm/vfalib.hpp 2020-04-28 22:57:45.000000000 +0200 +++ new/hxtools-20200712/smm/vfalib.hpp 2020-07-12 11:44:16.000000000 +0200 @@ -68,7 +68,7 @@ bool operator<(const struct vertex &) const; bool operator==(const struct vertex &) const; bool operator!=(const struct vertex &a) const { return !operator==(a); } - int x, y; + int y, x; }; struct edge {
