From 671fe92b12ef61dfbe17725ce773a43d283e2121 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 1 Dec 2024 10:30:01 -0600 Subject: [PATCH] tools/ttf_outline: twiddle at compile-time --- Makefile | 6 +- debug/debug_protocol.hpp | 2 + example/font_outline.cpp | 19 +-- example/maple_device_request.cpp | 2 +- font/dejavusansmono/dejavusansmono.data | Bin 34720 -> 16967 bytes font/dejavusansmono/dejavusansmono_mono.data | Bin 4000 -> 3996 bytes font/font.hpp | 5 +- font/ter_u20n/ter_u20n.data | Bin 6048 -> 6044 bytes ftdi.conf | 133 ------------------- memory.hpp | 28 ++++ serial_load.cpp | 13 -- tools/Makefile | 2 +- tools/{2d_pack.cpp => ttf_2d_pack.cpp} | 42 +++++- tools/{2d_pack.hpp => ttf_2d_pack.hpp} | 0 tools/ttf_outline.cpp | 40 +++--- 15 files changed, 105 insertions(+), 187 deletions(-) delete mode 100644 ftdi.conf create mode 100644 memory.hpp rename tools/{2d_pack.cpp => ttf_2d_pack.cpp} (64%) rename tools/{2d_pack.hpp => ttf_2d_pack.hpp} (100%) diff --git a/Makefile b/Makefile index ef0f2d3..b411a33 100644 --- a/Makefile +++ b/Makefile @@ -36,9 +36,9 @@ geometry/%.hpp: geometry/%.obj $(BUILD_BINARY_O) build-fonts: - ./tools/ttf_outline 20 7f 20 0 little /usr/share/fonts/dejavu/DejaVuSans.ttf dejavusansmono.data - ./tools/ttf_outline 20 7f 20 1 little /usr/share/fonts/dejavu/DejaVuSans.ttf dejavusansmono_mono.data - ./tools/ttf_outline 20 7f 20 1 little /usr/share/fonts/terminus/ter-u20n.otb ter_u20n.data + ./tools/ttf_outline 20 7f 20 0 little /usr/share/fonts/dejavu/DejaVuSans.ttf font/dejavusansmono/dejavusansmono.data + ./tools/ttf_outline 20 7f 20 1 little /usr/share/fonts/dejavu/DejaVuSans.ttf font/dejavusansmono/dejavusansmono_mono.data + ./tools/ttf_outline 20 7f 20 1 little /usr/share/fonts/terminus/ter-u20n.otb font/ter_u20n/ter_u20n.data include example/example.mk include chess/chess.mk diff --git a/debug/debug_protocol.hpp b/debug/debug_protocol.hpp index dc41701..c29dd55 100644 --- a/debug/debug_protocol.hpp +++ b/debug/debug_protocol.hpp @@ -1,3 +1,5 @@ +#pragma once + #include #include diff --git a/example/font_outline.cpp b/example/font_outline.cpp index b630559..37897f6 100644 --- a/example/font_outline.cpp +++ b/example/font_outline.cpp @@ -191,22 +191,12 @@ void init_texture_memory(const struct opb_size& opb_size) } void inflate_font(const uint8_t * src, - const uint32_t width, - const uint32_t height) + const uint32_t z_curve_max_ix) { auto texture = reinterpret_cast(&texture_memory64[texture_memory_alloc::texture.start / 4]); - const uint32_t size = width * height; - - uint8_t temp[size] __attribute__((aligned(4))); - - twiddle::texture(temp, - src, - width, - height); - - for (uint32_t i = 0; i < size / 4; i++) { - texture[i] = reinterpret_cast(temp)[i]; + for (uint32_t i = 0; i < z_curve_max_ix / 4; i++) { + texture[i] = reinterpret_cast(src)[i]; } } @@ -232,8 +222,7 @@ void main() */ inflate_font(texture, - font->texture_width, - font->texture_height); + font->max_z_curve_ix); palette_data<256>(); // The address of `ta_parameter_buf` must be a multiple of 32 bytes. diff --git a/example/maple_device_request.cpp b/example/maple_device_request.cpp index cb5beb8..3c4307a 100644 --- a/example/maple_device_request.cpp +++ b/example/maple_device_request.cpp @@ -7,7 +7,7 @@ void main() { - //serial::init(0); + serial::init(0); uint8_t send_buf[1024] __attribute__((aligned(32))); uint8_t recv_buf[1024] __attribute__((aligned(32))); diff --git a/font/dejavusansmono/dejavusansmono.data b/font/dejavusansmono/dejavusansmono.data index 7cafa02cb3205448cd9a6f1dc9ebe5cc1a45f1c8..a2a956a799ac33b8157bcc9775c8e226c63e9275 100644 GIT binary patch literal 16967 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 Ml=&iL`v1fKKN;>lC;$Ke diff --git a/font/dejavusansmono/dejavusansmono_mono.data b/font/dejavusansmono/dejavusansmono_mono.data index a9dd968db6df1de8b53cc440c3752b7778570528..181ec1d7c17ef4c527846e3f0650a38d885b860f 100644 GIT binary patch delta 32 kcmZ1=KSy3%fq{Xc9*7UHGB7xBGB6|n*$oU08>L(M0bm~m{{R30 delta 36 ocmbOuzd&AEfq{Xc9*7UHGB7xBGB6}C2rx7NAp-})M)6jD0CWci7XSbN diff --git a/font/font.hpp b/font/font.hpp index 1e6277f..b510af7 100644 --- a/font/font.hpp +++ b/font/font.hpp @@ -36,11 +36,10 @@ struct font { int32_t max_advance; // 26.6 fixed point } face_metrics; uint16_t glyph_count; - uint16_t texture_stride; + uint16_t _texture_stride; uint16_t texture_width; uint16_t texture_height; - uint32_t texture_size; uint32_t max_z_curve_ix; } __attribute__ ((packed)); -static_assert((sizeof (font)) == ((sizeof (uint32_t)) * 8)); +static_assert((sizeof (font)) == ((sizeof (uint32_t)) * 7)); diff --git a/font/ter_u20n/ter_u20n.data b/font/ter_u20n/ter_u20n.data index 6fc10b50483ad7deb0920d1751a26326c57af70b..27fd7c29c5f17c13c505e6e6a492fcd3f0213929 100644 GIT binary patch delta 33 lcmZ3WKSy6efq{Xc9*7xO85kOv7#I?O%mxMq#*H#9;s9D;1tI_d delta 37 pcmbQEzd&C`fq{Xc9*7xO85kOv7#I>51Q;3^7#M*R!$ye~aR6%w1wsG- diff --git a/ftdi.conf b/ftdi.conf deleted file mode 100644 index 33cbb63..0000000 --- a/ftdi.conf +++ /dev/null @@ -1,133 +0,0 @@ -#see http://developer.intra2net.com/git/?p=libftdi;a=blob;f=src/ftdi.c -#and http://developer.intra2net.com/git/?p=libftdi;a=blob;f=src/ftdi.h -#and http://developer.intra2net.com/git/?p=libftdi;a=tree;f=ftdi_eeprom -#and http://developer.intra2net.com/git/?p=libftdi;a=blob;f=ftdi_eeprom/example.conf -#and http://developer.intra2net.com/git/?p=libftdi;a=blob;f=ftdi_eeprom/main.c - -############ -# Filename # -############ -filename=eeprom.new # Filename of the EE file to be generated. Leave empty to skip file writing -#flash_raw=false # Boolean: - -## Include another config file? -#include - -############ -# IDs # -############ -# Future Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC - -vendor_id="0x0403" -product_id="0x6014" - -############################## -# Device and Serial Strings # -############################## -manufacturer="FTDI" # String: Manufacturer. FT245R factory default FTDI -product="FT232H Single HS USB-UART/FIFO" # String: Product. FT245R factory default FT245R USB FIFO -serial="00-00" -use_serial=true - -############ -# Options # -############ -max_power=500 # Integer: Max. power consumption: value * 2 mA(?). Use 0 if self_powered = true. FT245R factory default 90 -self_powered=false # Boolean: Turn this off for bus powered -remote_wakeup=true # Boolean: Turn this on for remote wakeup feature - -# Normally you don't have to change one of these flags -#in_is_isochronous=false # Boolean: In Endpoint is Isochronous -#out_is_isochronous=false # Boolean: Out Endpoint is Isochronous -#suspend_pull_downs=false # Boolean: Enable suspend pull downs for lower power -#change_usb_version=false # Boolean: Change USB Version -#usb_version=0x00 # Integer: Only used when change_usb_version is enabled - -#default_pid=0x6001 # Integer: Default Pid. - -eeprom_type=6 # Integer: Chip Type / EEPROM Type. Corresponds to ftdi_chip_type struct in ftdi.h -#high_current=false # Boolean: High Current Drive - -##Type_R chips -# Only used on FT-R chips (when omitted, use chip defaults) -# Possible values correspond to enum ftdi_cbus_func in ftdi.h and strings are defined in function parse_cbus in ftdi_eeprom/main.c -# Values in the struct are (see current ftid.h for an up to date list): -# CBUS_TXDEN = 0, CBUS_PWREN = 1, CBUS_RXLED = 2, CBUS_TXLED = 3, CBUS_TXRXLED = 4, CBUS_SLEEP = 5, CBUS_CLK48 = 6, CBUS_CLK24 = 7, CBUS_CLK12 = 8, CBUS_CLK6 = 9, CBUS_IOMODE = 0xa, CBUS_BB_WR = 0xb, CBUS_BB_RD = 0xc -# Strings to be used here are: -# "TXDEN", "PWREN", "RXLED", "TXLED", "TXRXLED", "SLEEP", "CLK48", "CLK24", "CLK12", "CLK6", "IOMODE", "BB_WR", "BB_RD" -#cbus0=TXLED # String parsed to integer: FT245R factory default TXLED -#cbus1=RXLED # String parsed to integer: FT245R factory default RXLED -#cbus2=TXDEN # String parsed to integer: FT245R factory default TXDEN -#cbus3=PWREN # String parsed to integer: FT245R factory default PWREN -#cbus4=SLEEP # String parsed to integer: FT245R factory default SLEEP - -## Only used on FT232H chips (when omitted, use chip defaults) -# Possible values correspond to enum ftdi_cbush_func in ftdi.h and strings are defined in function parse_cbush in ftdi_eeprom/main.c. -# Values are (see current ftid.h for an up to date list): -# CBUSH_TRISTATE = 0, CBUSH_TXLED = 1, CBUSH_RXLED = 2, CBUSH_TXRXLED = 3, CBUSH_PWREN = 4, CBUSH_SLEEP = 5, CBUSH_DRIVE_0 = 6, CBUSH_DRIVE1 = 7, CBUSH_IOMODE = 8, CBUSH_TXDEN = 9, CBUSH_CLK30 = 10, CBUSH_CLK15 = 11, CBUSH_CLK7_5 = 12 -# Strings to be used in this config file are: -# "TRISTATE", "TXLED", "RXLED", "TXRXLED", "PWREN", "SLEEP", "DRIVE_0", "DRIVE1", "IOMODE", "TXDEN", "CLK30", "CLK15", "CLK7_5" -##Type_232H Chips -#cbush0=TRISTATE # String parsed to integer: -#cbush1=TRISTATE # String parsed to integer: -#cbush2=TRISTATE # String parsed to integer: -#cbush3=TRISTATE # String parsed to integer: -#cbush4=TRISTATE # String parsed to integer: -#cbush5=TRISTATE # String parsed to integer: -#cbush6=TRISTATE # String parsed to integer: -#cbush7=TRISTATE # String parsed to integer: -cbush8=TXLED # String parsed to integer: -cbush9=RXLED # String parsed to integer: -# Group Drive -# Strings to be used in this config file are: -# "4MA", "8MA", "12MA", "16MA" -#group0_drive # Integer: - -# Only used on FT230X chips (when omitted, use chip defaults) -# Possible values correspond to enum ftdi_cbusx_func in ftdi.h and strings are defined in function parse_cbusx in ftdi_eeprom/main.c. -# Values are (see current ftid.h for an up to date list): -# CBUSX_TRISTATE = 0, CBUSX_TXLED = 1, CBUSX_RXLED = 2, CBUSX_TXRXLED = 3, CBUSX_PWREN = 4, CBUSX_SLEEP = 5, CBUSX_DRIVE_0 = 6, CBUSX_DRIVE1 = 7, CBUSX_IOMODE = 8, CBUSX_TXDEN = 9, CBUSX_CLK24 = 10, CBUSX_CLK12 = 11, CBUSX_CLK6 = 12, CBUSX_BAT_DETECT = 13, CBUSX_BAT_DETECT_NEG = 14, CBUSX_I2C_TXE = 15, CBUSX_I2C_RXF = 16, CBUSX_VBUS_SENSE = 17, CBUSX_BB_WR = 18, CBUSX_BB_RD = 19, CBUSX_TIME_STAMP = 20, CBUSX_AWAKE = 21 -# Strings to be used in this config file are: -# "TRISTATE", "TXLED", "RXLED", "TXRXLED", "PWREN", "SLEEP", "DRIVE_0", "DRIVE1", "IOMODE", "TXDEN", "CLK24", "CLK12", "CLK6", "BAT_DETECT", "BAT_DETECT_NEG", "I2C_TXE", "I2C_RXF", "VBUS_SENSE", "BB_WR", "BB_RD", "TIME_STAMP", "AWAKE" -#cbusx0=TXDEN # String parsed to integer: -#cbusx1=RXLED # String parsed to integer: -#cbusx2=TXLED # String parsed to integer: -#cbusx3=SLEEP # String parsed to integer: - -######## -# Misc # -######## - -## Pin Configuration -#invert_txd # Boolean: Invert TXD signal -#invert_rxd # Boolean: Invert RXD signal -#invert_rts # Boolean: Invert RTS signal -#invert_cts # Boolean: Invert CTS signal -#invert_dtr # Boolean: Invert DTR signal -#invert_dsr # Boolean: Invert DSR signal -#invert_dcd # Boolean: Invert DCD signal -#invert_ri # Boolean: Invert RI signal - -## Channel Types and Drivers -# Possible values are (see current ftid.h (Interface Mode macros) and ftdi.c "channel_mode" for an up to date list). They are parsed in fucntion parse_chtype in ftdi_eeprom/main.c. -# (from ftid.h): UART= 0x0, FIFO = 0x1, OPTO = 0x2, CPU = 0x4, FT1284 = 0x8, RS485 = 0x10 -# (from ftdi.c): UART = 0x0, FIOF = 0x1, CPU = 0x2, OPTO = 0x3, FT1284 = 0x3 -# Strings to be used in this config file are: -# "UART", "FIFO", "OPTO", "CPU", "FT1284" -cha_type=UART -# String parsed to integer: -#chb_type -# String parsed to integer: - -cha_vcp=false # Boolean: -#chb_vcp=false # Boolean: -#chc_vcp=false # Boolean: -#chd_vcp=false # Boolean: -#cha_rs485 # Boolean: -#chb_rs485 # Boolean: -#chc_rs485 # Boolean: -#chd_rs485 # Boolean: - -## Include user defined binary data into the the eeprom at address? -#user_data_addr # Integer: -#user_data_file # String: Filename of the data file to be used diff --git a/memory.hpp b/memory.hpp new file mode 100644 index 0000000..b5fe51f --- /dev/null +++ b/memory.hpp @@ -0,0 +1,28 @@ +namespace memory { + +template +void move(T * dst, const T * src, const uint32_t n) +{ + if (dst < src) { + while (n > 0) { + *d++ = *s++; + n--; + } + } else { + while (n > 0) { + n--; + d[n] = s[n]; + } + } +} + +template +inline void copy(T * dst, const T * src, const uint32_t n) +{ + while (n > 0) { + *dst++ = *src++; + n--; + } +} + +} diff --git a/serial_load.cpp b/serial_load.cpp index d29c181..fde73b9 100644 --- a/serial_load.cpp +++ b/serial_load.cpp @@ -10,19 +10,6 @@ namespace serial_load { struct state state; -static void move(void *dst, const void *src, uint32_t n) -{ - uint8_t * d = reinterpret_cast(dst); - const uint8_t * s = reinterpret_cast(src); - - if (d==s) return; - if (d #include #include +#include #include "insertion_sort.hpp" #include "rect.hpp" #include "../twiddle.hpp" -#include "2d_pack.hpp" +#include "ttf_2d_pack.hpp" struct size { uint16_t width; @@ -37,6 +38,39 @@ inline bool area_valid(const uint8_t texture[max_texture.height][max_texture.wid return true; } +constexpr inline std::array +from_ix(uint32_t curve_ix) +{ + std::array x_y = {0, 0}; + uint32_t curve_bit = 0; + + while (curve_ix != 0) { + x_y[(curve_bit + 1) % 2] |= (curve_ix & 1) << (curve_bit / 2); + curve_ix >>= 1; + curve_bit += 1; + } + + return x_y; +} + +static_assert(from_ix(0) == std::array{{0b000, 0b000}}); +static_assert(from_ix(2) == std::array{{0b001, 0b000}}); +static_assert(from_ix(8) == std::array{{0b010, 0b000}}); +static_assert(from_ix(10) == std::array{{0b011, 0b000}}); +static_assert(from_ix(32) == std::array{{0b100, 0b000}}); +static_assert(from_ix(34) == std::array{{0b101, 0b000}}); +static_assert(from_ix(40) == std::array{{0b110, 0b000}}); +static_assert(from_ix(42) == std::array{{0b111, 0b000}}); + +static_assert(from_ix(1) == std::array{{0b000, 0b001}}); +static_assert(from_ix(4) == std::array{{0b000, 0b010}}); +static_assert(from_ix(5) == std::array{{0b000, 0b011}}); +static_assert(from_ix(16) == std::array{{0b000, 0b100}}); +static_assert(from_ix(17) == std::array{{0b000, 0b101}}); +static_assert(from_ix(20) == std::array{{0b000, 0b110}}); +static_assert(from_ix(21) == std::array{{0b000, 0b111}}); + + uint32_t pack_into(uint8_t texture[max_texture.height][max_texture.width], struct size& window, struct rect& rect) @@ -50,7 +84,7 @@ uint32_t pack_into(uint8_t texture[max_texture.height][max_texture.width], } while (true) { - auto [x_offset, y_offset] = twiddle::from_ix(z_curve_ix); + auto [x_offset, y_offset] = from_ix(z_curve_ix); if (x_offset >= window.width and y_offset >= window.height) { //std::cerr << z_curve_ix << ' ' << window.width << ' ' << window.height << '\n'; @@ -78,7 +112,9 @@ uint32_t pack_into(uint8_t texture[max_texture.height][max_texture.width], rect.y = y_offset; return twiddle::from_xy(rect.x + rect.width - 1, - rect.y + rect.height - 1); + rect.y + rect.height - 1, + 1024, + 1024); } else { z_curve_ix += 1; continue; diff --git a/tools/2d_pack.hpp b/tools/ttf_2d_pack.hpp similarity index 100% rename from tools/2d_pack.hpp rename to tools/ttf_2d_pack.hpp diff --git a/tools/ttf_outline.cpp b/tools/ttf_outline.cpp index cb6f5f6..b4c875e 100644 --- a/tools/ttf_outline.cpp +++ b/tools/ttf_outline.cpp @@ -10,7 +10,7 @@ #include "../font/font.hpp" #include "rect.hpp" -#include "2d_pack.hpp" +#include "ttf_2d_pack.hpp" #include "../twiddle.hpp" std::endian _target_endian; @@ -93,8 +93,8 @@ load_outline_char(const FT_Face face, assert(bits_per_pixel == 8 || bits_per_pixel == 4 || bits_per_pixel == 2 || bits_per_pixel == 1); const uint32_t pixels_per_byte = 8 / bits_per_pixel; const uint32_t texture_stride = texture_width / pixels_per_byte; - std::cerr << "pixels per byte: " << pixels_per_byte << '\n'; - std::cerr << "texture stride: " << texture_stride << '\n'; + //std::cerr << "pixels per byte: " << pixels_per_byte << '\n'; + //std::cerr << "texture stride: " << texture_stride << '\n'; for (uint32_t y = 0; y < rect.height; y++) { for (uint32_t x = 0; x < rect.width; x++) { @@ -159,7 +159,7 @@ load_all_positions(const FT_Face face, const uint32_t start, const uint32_t end, glyph * glyphs, - uint32_t * texture + uint8_t * texture ) { const uint32_t num_glyphs = (end - start) + 1; @@ -197,7 +197,7 @@ load_all_positions(const FT_Face face, bits_per_pixel, char_code, &glyphs[char_code - start], - reinterpret_cast(texture), + texture, window_curve_ix.window.width, rects[i]); if (err < 0) assert(false); @@ -271,19 +271,27 @@ int main(int argc, char *argv[]) uint32_t num_glyphs = (end - start) + 1; glyph glyphs[num_glyphs]; - uint32_t texture[max_texture_size / 4]; + uint8_t texture[max_texture_size]; memset(texture, 0x00, max_texture_size); auto window_curve_ix = load_all_positions(face, monochrome, start, end, glyphs, texture); - uint32_t texture_stride; + //uint32_t texture_stride; uint32_t texture_size; if (monochrome) { - texture_stride = window_curve_ix.window.width / 8; + //texture_stride = window_curve_ix.window.width / 8; texture_size = window_curve_ix.window.width * window_curve_ix.window.height / 8; } else { - texture_stride = window_curve_ix.window.width; - texture_size = window_curve_ix.window.width * window_curve_ix.window.height; + //texture_stride = window_curve_ix.window.width; + texture_size = window_curve_ix.max_z_curve_ix; + } + + uint8_t twiddle_texture[window_curve_ix.window.width * window_curve_ix.window.height]; + if (!monochrome) { + twiddle::texture(twiddle_texture, + texture, + window_curve_ix.window.width, + window_curve_ix.window.height); } font font; @@ -292,18 +300,16 @@ int main(int argc, char *argv[]) font.face_metrics.height = byteswap(face->size->metrics.height); font.face_metrics.max_advance = byteswap(face->size->metrics.max_advance); font.glyph_count = byteswap(num_glyphs); - font.texture_stride = byteswap(texture_stride); + //font.texture_stride = byteswap(texture_stride); font.texture_width = byteswap(window_curve_ix.window.width); font.texture_height = byteswap(window_curve_ix.window.height); - font.texture_size = byteswap(texture_size); font.max_z_curve_ix = byteswap(window_curve_ix.max_z_curve_ix); std::cerr << "start: 0x" << std::hex << start << '\n'; std::cerr << "end: 0x" << std::hex << end << '\n'; - std::cerr << "texture_stride: " << std::dec << texture_stride << '\n'; + //std::cerr << "texture_stride: " << std::dec << texture_stride << '\n'; std::cerr << "texture_width: " << std::dec << window_curve_ix.window.width << '\n'; std::cerr << "texture_height: " << std::dec << window_curve_ix.window.height << '\n'; - std::cerr << "texture_size: " << std::dec << texture_size << '\n'; std::cerr << "max_z_curve_ix: " << std::dec << window_curve_ix.max_z_curve_ix << '\n'; FILE * out = fopen(argv[output_file_path], "w"); @@ -314,7 +320,11 @@ int main(int argc, char *argv[]) fwrite(reinterpret_cast(&font), (sizeof (font)), 1, out); fwrite(reinterpret_cast(&glyphs[0]), (sizeof (glyph)), num_glyphs, out); - fwrite(reinterpret_cast(&texture[0]), (sizeof (uint8_t)), texture_size, out); + if (monochrome) { + fwrite(reinterpret_cast(&texture[0]), (sizeof (uint8_t)), texture_size, out); + } else { + fwrite(reinterpret_cast(&twiddle_texture[0]), (sizeof (uint8_t)), texture_size, out); + } fclose(out); }