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 7cafa02..a2a956a 100644 Binary files a/font/dejavusansmono/dejavusansmono.data and b/font/dejavusansmono/dejavusansmono.data differ diff --git a/font/dejavusansmono/dejavusansmono_mono.data b/font/dejavusansmono/dejavusansmono_mono.data index a9dd968..181ec1d 100644 Binary files a/font/dejavusansmono/dejavusansmono_mono.data and b/font/dejavusansmono/dejavusansmono_mono.data differ 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 6fc10b5..27fd7c2 100644 Binary files a/font/ter_u20n/ter_u20n.data and b/font/ter_u20n/ter_u20n.data differ 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); }