From 185eb7a3ab3913fa09173739de152935d3e4399e Mon Sep 17 00:00:00 2001 From: Chlumsky Date: Sat, 7 Mar 2020 11:40:32 +0100 Subject: [PATCH] Version 1.0 --- README.md | 6 + artery-font/artery-font.h | 10 + artery-font/crc32.h | 13 + artery-font/crc32.hpp | 48 ++++ artery-font/enums.h | 66 +++++ artery-font/serialization.h | 18 ++ artery-font/serialization.hpp | 394 ++++++++++++++++++++++++++++ artery-font/std-artery-font.h | 47 ++++ artery-font/stdio-serialization.h | 23 ++ artery-font/stdio-serialization.hpp | 48 ++++ artery-font/structures.h | 87 ++++++ artery-font/types.h | 12 + example.arfont | Bin 0 -> 66580 bytes 13 files changed, 772 insertions(+) create mode 100644 README.md create mode 100644 artery-font/artery-font.h create mode 100644 artery-font/crc32.h create mode 100644 artery-font/crc32.hpp create mode 100644 artery-font/enums.h create mode 100644 artery-font/serialization.h create mode 100644 artery-font/serialization.hpp create mode 100644 artery-font/std-artery-font.h create mode 100644 artery-font/stdio-serialization.h create mode 100644 artery-font/stdio-serialization.hpp create mode 100644 artery-font/structures.h create mode 100644 artery-font/types.h create mode 100644 example.arfont diff --git a/README.md b/README.md new file mode 100644 index 0000000..1b75fb0 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ + +# Artery Atlas Font format library + +This is a header-only C++ library that facilitates encoding and decoding of the Artery Atlas Font format – a specialized binary file format for storing fonts as bitmap atlases used by the [Artery Engine](https://www.arteryengine.com/), intended for use in video games and other hardware accelerated applications. + +An Artery Atlas font file (*.arfont) wraps together the atlas bitmap(s), which can be compressed e.g. in PNG format, the layout of the atlas, as well as the font's and the individual glyphs' metrics and positioning data, including kerning pairs. diff --git a/artery-font/artery-font.h b/artery-font/artery-font.h new file mode 100644 index 0000000..5a9c620 --- /dev/null +++ b/artery-font/artery-font.h @@ -0,0 +1,10 @@ + +#pragma once + +#include "types.h" +#include "enums.h" +#include "structures.h" +#include "serialization.h" + +// ARTERY ENGINE ATLAS FONT FORMAT LIBRARY v1.0 +// Author: Viktor Chlumsky (c) 2020 diff --git a/artery-font/crc32.h b/artery-font/crc32.h new file mode 100644 index 0000000..a05341b --- /dev/null +++ b/artery-font/crc32.h @@ -0,0 +1,13 @@ + +#pragma once + +#include "types.h" + +namespace artery_font { + +uint32 crc32Init(); +uint32 crc32Update(uint32 crc, byte x); + +} + +#include "crc32.hpp" diff --git a/artery-font/crc32.hpp b/artery-font/crc32.hpp new file mode 100644 index 0000000..17ab4b3 --- /dev/null +++ b/artery-font/crc32.hpp @@ -0,0 +1,48 @@ + +#include "crc32.h" + +namespace artery_font { + +inline uint32 crc32Init() { + return ~0u; +} + +inline uint32 crc32Update(uint32 crc, byte x) { + static const uint32 crc32Table[256] = { + 0x00000000u, 0x77073096u, 0xee0e612cu, 0x990951bau, 0x076dc419u, 0x706af48fu, 0xe963a535u, 0x9e6495a3u, + 0x0edb8832u, 0x79dcb8a4u, 0xe0d5e91eu, 0x97d2d988u, 0x09b64c2bu, 0x7eb17cbdu, 0xe7b82d07u, 0x90bf1d91u, + 0x1db71064u, 0x6ab020f2u, 0xf3b97148u, 0x84be41deu, 0x1adad47du, 0x6ddde4ebu, 0xf4d4b551u, 0x83d385c7u, + 0x136c9856u, 0x646ba8c0u, 0xfd62f97au, 0x8a65c9ecu, 0x14015c4fu, 0x63066cd9u, 0xfa0f3d63u, 0x8d080df5u, + 0x3b6e20c8u, 0x4c69105eu, 0xd56041e4u, 0xa2677172u, 0x3c03e4d1u, 0x4b04d447u, 0xd20d85fdu, 0xa50ab56bu, + 0x35b5a8fau, 0x42b2986cu, 0xdbbbc9d6u, 0xacbcf940u, 0x32d86ce3u, 0x45df5c75u, 0xdcd60dcfu, 0xabd13d59u, + 0x26d930acu, 0x51de003au, 0xc8d75180u, 0xbfd06116u, 0x21b4f4b5u, 0x56b3c423u, 0xcfba9599u, 0xb8bda50fu, + 0x2802b89eu, 0x5f058808u, 0xc60cd9b2u, 0xb10be924u, 0x2f6f7c87u, 0x58684c11u, 0xc1611dabu, 0xb6662d3du, + 0x76dc4190u, 0x01db7106u, 0x98d220bcu, 0xefd5102au, 0x71b18589u, 0x06b6b51fu, 0x9fbfe4a5u, 0xe8b8d433u, + 0x7807c9a2u, 0x0f00f934u, 0x9609a88eu, 0xe10e9818u, 0x7f6a0dbbu, 0x086d3d2du, 0x91646c97u, 0xe6635c01u, + 0x6b6b51f4u, 0x1c6c6162u, 0x856530d8u, 0xf262004eu, 0x6c0695edu, 0x1b01a57bu, 0x8208f4c1u, 0xf50fc457u, + 0x65b0d9c6u, 0x12b7e950u, 0x8bbeb8eau, 0xfcb9887cu, 0x62dd1ddfu, 0x15da2d49u, 0x8cd37cf3u, 0xfbd44c65u, + 0x4db26158u, 0x3ab551ceu, 0xa3bc0074u, 0xd4bb30e2u, 0x4adfa541u, 0x3dd895d7u, 0xa4d1c46du, 0xd3d6f4fbu, + 0x4369e96au, 0x346ed9fcu, 0xad678846u, 0xda60b8d0u, 0x44042d73u, 0x33031de5u, 0xaa0a4c5fu, 0xdd0d7cc9u, + 0x5005713cu, 0x270241aau, 0xbe0b1010u, 0xc90c2086u, 0x5768b525u, 0x206f85b3u, 0xb966d409u, 0xce61e49fu, + 0x5edef90eu, 0x29d9c998u, 0xb0d09822u, 0xc7d7a8b4u, 0x59b33d17u, 0x2eb40d81u, 0xb7bd5c3bu, 0xc0ba6cadu, + 0xedb88320u, 0x9abfb3b6u, 0x03b6e20cu, 0x74b1d29au, 0xead54739u, 0x9dd277afu, 0x04db2615u, 0x73dc1683u, + 0xe3630b12u, 0x94643b84u, 0x0d6d6a3eu, 0x7a6a5aa8u, 0xe40ecf0bu, 0x9309ff9du, 0x0a00ae27u, 0x7d079eb1u, + 0xf00f9344u, 0x8708a3d2u, 0x1e01f268u, 0x6906c2feu, 0xf762575du, 0x806567cbu, 0x196c3671u, 0x6e6b06e7u, + 0xfed41b76u, 0x89d32be0u, 0x10da7a5au, 0x67dd4accu, 0xf9b9df6fu, 0x8ebeeff9u, 0x17b7be43u, 0x60b08ed5u, + 0xd6d6a3e8u, 0xa1d1937eu, 0x38d8c2c4u, 0x4fdff252u, 0xd1bb67f1u, 0xa6bc5767u, 0x3fb506ddu, 0x48b2364bu, + 0xd80d2bdau, 0xaf0a1b4cu, 0x36034af6u, 0x41047a60u, 0xdf60efc3u, 0xa867df55u, 0x316e8eefu, 0x4669be79u, + 0xcb61b38cu, 0xbc66831au, 0x256fd2a0u, 0x5268e236u, 0xcc0c7795u, 0xbb0b4703u, 0x220216b9u, 0x5505262fu, + 0xc5ba3bbeu, 0xb2bd0b28u, 0x2bb45a92u, 0x5cb36a04u, 0xc2d7ffa7u, 0xb5d0cf31u, 0x2cd99e8bu, 0x5bdeae1du, + 0x9b64c2b0u, 0xec63f226u, 0x756aa39cu, 0x026d930au, 0x9c0906a9u, 0xeb0e363fu, 0x72076785u, 0x05005713u, + 0x95bf4a82u, 0xe2b87a14u, 0x7bb12baeu, 0x0cb61b38u, 0x92d28e9bu, 0xe5d5be0du, 0x7cdcefb7u, 0x0bdbdf21u, + 0x86d3d2d4u, 0xf1d4e242u, 0x68ddb3f8u, 0x1fda836eu, 0x81be16cdu, 0xf6b9265bu, 0x6fb077e1u, 0x18b74777u, + 0x88085ae6u, 0xff0f6a70u, 0x66063bcau, 0x11010b5cu, 0x8f659effu, 0xf862ae69u, 0x616bffd3u, 0x166ccf45u, + 0xa00ae278u, 0xd70dd2eeu, 0x4e048354u, 0x3903b3c2u, 0xa7672661u, 0xd06016f7u, 0x4969474du, 0x3e6e77dbu, + 0xaed16a4au, 0xd9d65adcu, 0x40df0b66u, 0x37d83bf0u, 0xa9bcae53u, 0xdebb9ec5u, 0x47b2cf7fu, 0x30b5ffe9u, + 0xbdbdf21cu, 0xcabac28au, 0x53b39330u, 0x24b4a3a6u, 0xbad03605u, 0xcdd70693u, 0x54de5729u, 0x23d967bfu, + 0xb3667a2eu, 0xc4614ab8u, 0x5d681b02u, 0x2a6f2b94u, 0xb40bbe37u, 0xc30c8ea1u, 0x5a05df1bu, 0x2d02ef8du, + }; + return crc32Table[byte(x^crc)]^crc>>8; +} + +} diff --git a/artery-font/enums.h b/artery-font/enums.h new file mode 100644 index 0000000..979bf5f --- /dev/null +++ b/artery-font/enums.h @@ -0,0 +1,66 @@ + +#pragma once + +namespace artery_font { + +enum FontFlags { + FONT_BOLD = 0x01, + FONT_LIGHT = 0x02, + FONT_EXTRA_BOLD = 0x04, + FONT_CONDENSED = 0x08, + FONT_ITALIC = 0x10, + FONT_SMALL_CAPS = 0x20, + FONT_ICONOGRAPHIC = 0x0100, + FONT_SANS_SERIF = 0x0200, + FONT_SERIF = 0x0400, + FONT_MONOSPACE = 0x1000, + FONT_CURSIVE = 0x2000 +}; + +enum CodepointType { + CP_UNSPECIFIED = 0, + CP_UNICODE = 1, + CP_INDEXED = 2, + CP_ICONOGRAPHIC = 14 +}; + +enum MetadataFormat { + METADATA_NONE = 0, + METADATA_PLAINTEXT = 1, + METADATA_JSON = 2 +}; + +enum ImageType { + IMAGE_NONE = 0, + IMAGE_SRGB_IMAGE = 1, + IMAGE_LINEAR_MASK = 2, + IMAGE_MASKED_SRGB_IMAGE = 3, + IMAGE_SDF = 4, + IMAGE_PSDF = 5, + IMAGE_MSDF = 6, + IMAGE_MTSDF = 7, + IMAGE_MIXED_CONTENT = 255 +}; + +enum PixelFormat { + PIXEL_UNKNOWN = 0, + PIXEL_BOOLEAN1 = 1, + PIXEL_UNSIGNED8 = 8, + PIXEL_FLOAT32 = 32 +}; + +enum ImageEncoding { + IMAGE_UNKNOWN_ENCODING = 0, + IMAGE_RAW_BINARY = 1, + IMAGE_BMP = 4, + IMAGE_TIFF = 5, + IMAGE_PNG = 8, + IMAGE_TGA = 9 +}; + +enum ImageOrientation { + ORIENTATION_TOP_DOWN = 1, + ORIENTATION_BOTTOM_UP = -1 +}; + +} diff --git a/artery-font/serialization.h b/artery-font/serialization.h new file mode 100644 index 0000000..da949f8 --- /dev/null +++ b/artery-font/serialization.h @@ -0,0 +1,18 @@ + +#pragma once + +#include "types.h" +#include "enums.h" +#include "structures.h" + +namespace artery_font { + +template class LIST, class BYTE_ARRAY, class STRING> +bool decode(ArteryFont &font, void *userData); + +template class LIST, class BYTE_ARRAY, class STRING> +bool encode(const ArteryFont &font, void *userData); + +} + +#include "serialization.hpp" diff --git a/artery-font/serialization.hpp b/artery-font/serialization.hpp new file mode 100644 index 0000000..9b8582f --- /dev/null +++ b/artery-font/serialization.hpp @@ -0,0 +1,394 @@ + +#include "serialization.h" + +#include +#include "crc32.h" + +namespace artery_font { + +namespace internal { + +#define ARTERY_FONT_HEADER_TAG "ARTERY/FONT\0\0\0\0\0" +#define ARTERY_FONT_HEADER_VERSION 1u +#define ARTERY_FONT_HEADER_MAGIC_NO 0x4d276a5cu +#define ARTERY_FONT_FOOTER_MAGIC_NO 0x55ccb363u + +struct ArteryFontHeader { + char tag[16]; + uint32 magicNo; + uint32 version; + uint32 flags; + uint32 realType; + uint32 reserved[4]; + + uint32 metadataFormat; + uint32 metadataLength; + uint32 variantCount; + uint32 variantsLength; + uint32 imageCount; + uint32 imagesLength; + uint32 appendixCount; + uint32 appendicesLength; + uint32 reserved2[8]; +}; + +struct ArteryFontFooter { + uint32 salt; + uint32 magicNo; + uint32 reserved[4]; + uint32 totalLength; + uint32 checksum; +}; + +template +struct FontVariantHeader { + uint32 flags; + uint32 weight; + uint32 codepointType; + uint32 imageType; + uint32 fallbackVariant; + uint32 fallbackGlyph; + uint32 reserved[6]; + REAL metrics[32]; + uint32 nameLength; + uint32 metadataLength; + uint32 glyphCount; + uint32 kernPairCount; +}; + +struct ImageHeader { + uint32 flags; + uint32 encoding; + uint32 width, height; + uint32 channels; + uint32 pixelFormat; + uint32 imageType; + uint32 rowLength; + sint32 orientation; + uint32 childImages; + uint32 textureFlags; + uint32 reserved[3]; + uint32 metadataLength; + uint32 dataLength; +}; + +struct AppendixHeader { + uint32 metadataLength; + uint32 dataLength; +}; + +template +uint32 realTypeCode(); + +template <> +uint32 realTypeCode() { + return 0x14u; +} +template <> +uint32 realTypeCode() { + return 0x18u; +} + +inline uint32 paddedLength(uint32 len) { + if (len&0x03u) + len += 0x04u-(len&0x03u); + return len; +} + +template +uint32 paddedStringLength(const STRING &str) { + uint32 len = str.length(); + return paddedLength(len+(len > 0)); +} + +} + +#ifndef __BIG_ENDIAN__ + +template class LIST, class BYTE_ARRAY, class STRING> +bool decode(ArteryFont &font, void *userData) { + uint32 totalLength = 0; + uint32 prevLength = 0; + uint32 checksum = crc32Init(); + byte dump[4]; + #define ARTERY_FONT_DECODE_READ(target, len) { \ + if (READ((void *) (target), (len), userData) != (len)) \ + return false; \ + totalLength += (len); \ + for (int i = 0; i < int(len); ++i) \ + checksum = crc32Update(checksum, ((const byte *) (const void *) (target))[i]); \ + } + #define ARTERY_FONT_DECODE_REALIGN() { \ + if (totalLength&0x03u) { \ + uint32 len = 0x04u-(totalLength&0x03u); \ + ARTERY_FONT_DECODE_READ(dump, len); \ + } \ + } + #define ARTERY_FONT_DECODE_READ_STRING(str, len) { \ + if ((len) > 0) { \ + LIST characters((len)+1); \ + ARTERY_FONT_DECODE_READ((char *) characters, (len)+1); \ + ((char *) characters)[len] = '\0'; \ + (str) = STRING((const char *) characters, uint32(len)); \ + ARTERY_FONT_DECODE_REALIGN(); \ + } else \ + (str) = STRING(); \ + } + int variantCount = 0; + int imageCount = 0; + int appendixCount = 0; + uint32 variantsLength = 0; + uint32 imagesLength = 0; + uint32 appendicesLength = 0; + // Read header + { + internal::ArteryFontHeader header; + ARTERY_FONT_DECODE_READ(&header, sizeof(header)); + if (memcmp(header.tag, ARTERY_FONT_HEADER_TAG, sizeof(header.tag))) + return false; + if (header.magicNo != ARTERY_FONT_HEADER_MAGIC_NO) + return false; + if (header.realType != internal::realTypeCode()) + return false; + font.metadataFormat = (MetadataFormat) header.metadataFormat; + ARTERY_FONT_DECODE_READ_STRING(font.metadata, header.metadataLength); + variantCount = header.variantCount; + imageCount = header.imageCount; + appendixCount = header.appendixCount; + font.variants = LIST >(header.variantCount); + font.images = LIST >(header.imageCount); + font.appendices = LIST >(header.appendixCount); + variantsLength = header.variantsLength; + imagesLength = header.imagesLength; + appendicesLength = header.appendicesLength; + } + prevLength = totalLength; + // Read variants + for (int i = 0; i < variantCount; ++i) { + FontVariant &variant = font.variants[i]; + internal::FontVariantHeader header; + ARTERY_FONT_DECODE_READ(&header, sizeof(header)); + variant.flags = header.flags; + variant.weight = header.weight; + variant.codepointType = (CodepointType) header.codepointType; + variant.imageType = (ImageType) header.imageType; + variant.fallbackVariant = header.fallbackVariant; + variant.fallbackGlyph = header.fallbackGlyph; + memcpy(&variant.metrics, header.metrics, sizeof(header.metrics)); + ARTERY_FONT_DECODE_READ_STRING(variant.name, header.nameLength); + ARTERY_FONT_DECODE_READ_STRING(variant.metadata, header.metadataLength); + variant.glyphs = LIST >(header.glyphCount); + variant.kernPairs = LIST >(header.kernPairCount); + ARTERY_FONT_DECODE_READ((Glyph *) variant.glyphs, header.glyphCount*sizeof(Glyph)); + ARTERY_FONT_DECODE_READ((KernPair *) variant.kernPairs, header.kernPairCount*sizeof(KernPair)); + } + if (totalLength-prevLength != variantsLength) + return false; + prevLength = totalLength; + // Read images + for (int i = 0; i < imageCount; ++i) { + Image &image = font.images[i]; + internal::ImageHeader header; + ARTERY_FONT_DECODE_READ(&header, sizeof(header)); + image.flags = header.flags; + image.encoding = (ImageEncoding) header.encoding; + image.width = header.width; + image.height = header.height; + image.channels = header.channels; + image.pixelFormat = (PixelFormat) header.pixelFormat; + image.imageType = (ImageType) header.imageType; + image.rawBinaryFormat.rowLength = header.rowLength; + image.rawBinaryFormat.orientation = (ImageOrientation) header.orientation; + image.childImages = header.childImages; + image.textureFlags = header.textureFlags; + ARTERY_FONT_DECODE_READ_STRING(image.metadata, header.metadataLength); + image.data = BYTE_ARRAY(header.dataLength); + ARTERY_FONT_DECODE_READ((unsigned char *) image.data, header.dataLength); + ARTERY_FONT_DECODE_REALIGN(); + } + if (totalLength-prevLength != imagesLength) + return false; + prevLength = totalLength; + // Read appendices + for (int i = 0; i < appendixCount; ++i) { + Appendix &appendix = font.appendices[i]; + internal::AppendixHeader header; + ARTERY_FONT_DECODE_READ(&header, sizeof(header)); + ARTERY_FONT_DECODE_READ_STRING(appendix.metadata, header.metadataLength); + appendix.data = BYTE_ARRAY(header.dataLength); + ARTERY_FONT_DECODE_READ((unsigned char *) appendix.data, header.dataLength); + ARTERY_FONT_DECODE_REALIGN(); + } + if (totalLength-prevLength != appendicesLength) + return false; + prevLength = totalLength; + // Read footer + { + internal::ArteryFontFooter footer; + ARTERY_FONT_DECODE_READ(&footer, sizeof(footer)-sizeof(footer.checksum)); + if (footer.magicNo != ARTERY_FONT_FOOTER_MAGIC_NO) + return false; + uint32 prevChecksum = checksum; + ARTERY_FONT_DECODE_READ(&footer.checksum, sizeof(footer.checksum)); + if (footer.checksum != prevChecksum) + return false; + if (totalLength != footer.totalLength) + return false; + } + return true; + #undef ARTERY_FONT_DECODE_READ + #undef ARTERY_FONT_DECODE_REALIGN + #undef ARTERY_FONT_DECODE_READ_STRING +} + +template class LIST, class BYTE_ARRAY, class STRING> +bool encode(const ArteryFont &font, void *userData) { + uint32 totalLength = 0; + uint32 checksum = crc32Init(); + const byte padding[4] = { }; + #define ARTERY_FONT_ENCODE_WRITE(data, len) { \ + if (WRITE((const void *) (data), (len), userData) != (len)) \ + return false; \ + totalLength += (len); \ + for (int i = 0; i < int(len); ++i) \ + checksum = crc32Update(checksum, ((const byte *) (const void *) (data))[i]); \ + } + #define ARTERY_FONT_ENCODE_REALIGN() { \ + if (totalLength&0x03u) { \ + uint32 len = 0x04u-(totalLength&0x03u); \ + ARTERY_FONT_ENCODE_WRITE(padding, len); \ + } \ + } + #define ARTERY_FONT_ENCODE_WRITE_STRING(str) { \ + uint32 len = (str).length(); \ + if ((len) > 0) { \ + ARTERY_FONT_ENCODE_WRITE((const char *) (str), (len)); \ + ARTERY_FONT_ENCODE_WRITE(padding, 1) \ + ARTERY_FONT_ENCODE_REALIGN(); \ + } \ + } + int variantCount = 0; + int imageCount = 0; + int appendixCount = 0; + // Write header + { + internal::ArteryFontHeader header; + memcpy(header.tag, ARTERY_FONT_HEADER_TAG, sizeof(header.tag)); + header.magicNo = ARTERY_FONT_HEADER_MAGIC_NO; + header.version = ARTERY_FONT_HEADER_VERSION; + header.flags = 0; + header.realType = internal::realTypeCode(); + memset(header.reserved, 0, sizeof(header.reserved)); + header.metadataFormat = (uint32) font.metadataFormat; + header.metadataLength = font.metadata.length(); + header.variantCount = variantCount = font.variants.length(); + header.variantsLength = 0; + header.imageCount = imageCount = font.images.length(); + header.imagesLength = 0; + header.appendixCount = appendixCount = font.appendices.length(); + header.appendicesLength = 0; + memset(header.reserved2, 0, sizeof(header.reserved2)); + for (int i = 0; i < variantCount; ++i) { + const FontVariant &variant = font.variants[i]; + header.variantsLength += sizeof(internal::FontVariantHeader); + header.variantsLength += internal::paddedStringLength(variant.name); + header.variantsLength += internal::paddedStringLength(variant.metadata); + header.variantsLength += variant.glyphs.length()*sizeof(Glyph); + header.variantsLength += variant.kernPairs.length()*sizeof(KernPair); + } + for (int i = 0; i < imageCount; ++i) { + const Image &image = font.images[i]; + header.imagesLength += sizeof(internal::ImageHeader); + header.imagesLength += internal::paddedStringLength(image.metadata); + header.imagesLength += internal::paddedLength(image.data.length()); + } + for (int i = 0; i < appendixCount; ++i) { + const Appendix &appendix = font.appendices[i]; + header.appendicesLength += sizeof(internal::AppendixHeader); + header.appendicesLength += internal::paddedStringLength(appendix.metadata); + header.appendicesLength += internal::paddedLength(appendix.data.length()); + } + ARTERY_FONT_ENCODE_WRITE(&header, sizeof(header)); + ARTERY_FONT_ENCODE_WRITE_STRING(font.metadata); + } + // Write variants + for (int i = 0; i < variantCount; ++i) { + const FontVariant &variant = font.variants[i]; + internal::FontVariantHeader header; + header.flags = variant.flags; + header.weight = variant.weight; + header.codepointType = (uint32) variant.codepointType; + header.imageType = (uint32) variant.imageType; + header.fallbackVariant = variant.fallbackVariant; + header.fallbackGlyph = variant.fallbackGlyph; + memset(header.reserved, 0, sizeof(header.reserved)); + memcpy(header.metrics, &variant.metrics, sizeof(header.metrics)); + header.nameLength = variant.name.length(); + header.metadataLength = variant.metadata.length(); + header.glyphCount = variant.glyphs.length(); + header.kernPairCount = variant.kernPairs.length(); + ARTERY_FONT_ENCODE_WRITE(&header, sizeof(header)); + ARTERY_FONT_ENCODE_WRITE_STRING(variant.name); + ARTERY_FONT_ENCODE_WRITE_STRING(variant.metadata); + ARTERY_FONT_ENCODE_WRITE((const Glyph *) variant.glyphs, header.glyphCount*sizeof(Glyph)); + ARTERY_FONT_ENCODE_WRITE((const KernPair *) variant.kernPairs, header.kernPairCount*sizeof(KernPair)); + } + // Write images + for (int i = 0; i < imageCount; ++i) { + const Image &image = font.images[i]; + internal::ImageHeader header; + header.flags = image.flags; + header.encoding = (uint32) image.encoding; + header.width = image.width; + header.height = image.height; + header.channels = image.channels; + header.pixelFormat = (uint32) image.pixelFormat; + header.imageType = (uint32) image.imageType; + header.rowLength = image.rawBinaryFormat.rowLength; + header.orientation = (sint32) image.rawBinaryFormat.orientation; + header.childImages = image.childImages; + header.textureFlags = image.textureFlags; + memset(header.reserved, 0, sizeof(header.reserved)); + header.metadataLength = image.metadata.length(); + header.dataLength = image.data.length(); + ARTERY_FONT_ENCODE_WRITE(&header, sizeof(header)); + ARTERY_FONT_ENCODE_WRITE_STRING(image.metadata); + ARTERY_FONT_ENCODE_WRITE((const unsigned char *) image.data, header.dataLength); + ARTERY_FONT_ENCODE_REALIGN(); + } + // Write appendices + for (int i = 0; i < appendixCount; ++i) { + const Appendix &appendix = font.appendices[i]; + internal::AppendixHeader header; + header.metadataLength = appendix.metadata.length(); + header.dataLength = appendix.data.length(); + ARTERY_FONT_ENCODE_WRITE(&header, sizeof(header)); + ARTERY_FONT_ENCODE_WRITE_STRING(appendix.metadata); + ARTERY_FONT_ENCODE_WRITE((const unsigned char *) appendix.data, header.dataLength); + ARTERY_FONT_ENCODE_REALIGN(); + } + // Write footer + { + internal::ArteryFontFooter footer; + footer.salt = 0; + footer.magicNo = ARTERY_FONT_FOOTER_MAGIC_NO; + memset(footer.reserved, 0, sizeof(footer.reserved)); + footer.totalLength = totalLength+sizeof(footer); + ARTERY_FONT_ENCODE_WRITE(&footer, sizeof(footer)-sizeof(footer.checksum)); + footer.checksum = checksum; + ARTERY_FONT_ENCODE_WRITE(&footer.checksum, sizeof(footer.checksum)); + } + return true; + #undef ARTERY_FONT_ENCODE_WRITE + #undef ARTERY_FONT_ENCODE_REALIGN + #undef ARTERY_FONT_ENCODE_WRITE_STRING +} + +#endif + +#undef ARTERY_FONT_HEADER_TAG +#undef ARTERY_FONT_HEADER_VERSION +#undef ARTERY_FONT_HEADER_MAGIC_NO +#undef ARTERY_FONT_FOOTER_MAGIC_NO + +} diff --git a/artery-font/std-artery-font.h b/artery-font/std-artery-font.h new file mode 100644 index 0000000..2f01da8 --- /dev/null +++ b/artery-font/std-artery-font.h @@ -0,0 +1,47 @@ + +#pragma once + +#include +#include +#include "artery-font.h" + +namespace artery_font { + +template +class StdList { + +public: + std::vector vector; + + StdList() { } + explicit StdList(int length) : vector((size_t) length) { } + int length() const { return (int) vector.size(); } + explicit operator T *() { return vector.data(); } + explicit operator const T *() const { return vector.data(); } + T & operator[](int index) { return vector[index]; } + const T & operator[](int index) const { return vector[index]; } + +}; + +class StdString { + +public: + std::string string; + + StdString() { } + StdString(const char *characters, int length) : string(characters, (size_t) length) { } + int length() const { return (int) string.size(); } + explicit operator const char *() const { return string.c_str(); } + +}; + +typedef StdList StdByteArray; + +template +using StdArteryFont = ArteryFont; +template +using StdFontVariant = FontVariant; +using StdImage = Image; +using StdAppendix = Appendix; + +} diff --git a/artery-font/stdio-serialization.h b/artery-font/stdio-serialization.h new file mode 100644 index 0000000..65d5245 --- /dev/null +++ b/artery-font/stdio-serialization.h @@ -0,0 +1,23 @@ + +#pragma once + +#include +#include "serialization.h" + +namespace artery_font { + +template class LIST, class BYTE_ARRAY, class STRING> +bool read(ArteryFont &font, FILE *file); + +template class LIST, class BYTE_ARRAY, class STRING> +bool write(const ArteryFont &font, FILE *file); + +template class LIST, class BYTE_ARRAY, class STRING> +bool readFile(ArteryFont &font, const char *filename); + +template class LIST, class BYTE_ARRAY, class STRING> +bool writeFile(const ArteryFont &font, const char *filename); + +} + +#include "stdio-serialization.hpp" diff --git a/artery-font/stdio-serialization.hpp b/artery-font/stdio-serialization.hpp new file mode 100644 index 0000000..fff2561 --- /dev/null +++ b/artery-font/stdio-serialization.hpp @@ -0,0 +1,48 @@ + +#include "stdio-serialization.h" + +namespace artery_font { + +namespace internal { + +inline int fileRead(void *buffer, int length, void *file) { + return fread(buffer, 1, length, reinterpret_cast(file)); +} + +inline int fileWrite(const void *buffer, int length, void *file) { + return fwrite(buffer, 1, length, reinterpret_cast(file)); +} + +} + +template class LIST, class BYTE_ARRAY, class STRING> +bool read(ArteryFont &font, FILE *file) { + return decode(font, file); +} + +template class LIST, class BYTE_ARRAY, class STRING> +bool write(const ArteryFont &font, FILE *file) { + return encode(font, file); +} + +template class LIST, class BYTE_ARRAY, class STRING> +bool readFile(ArteryFont &font, const char *filename) { + FILE *file = fopen(filename, "rb"); + if (!file) + return false; + bool result = read(font, file); + fclose(file); + return result; +} + +template class LIST, class BYTE_ARRAY, class STRING> +bool writeFile(const ArteryFont &font, const char *filename) { + FILE *file = fopen(filename, "wb"); + if (!file) + return false; + bool result = write(font, file); + fclose(file); + return result; +} + +} diff --git a/artery-font/structures.h b/artery-font/structures.h new file mode 100644 index 0000000..12cb806 --- /dev/null +++ b/artery-font/structures.h @@ -0,0 +1,87 @@ + +#pragma once + +#include "types.h" +#include "enums.h" + +namespace artery_font { + +template +struct Glyph { + uint32 codepoint; + uint32 image; + struct { + REAL l, b, r, t; + } planeBounds, imageBounds; + struct { + REAL h, v; + } advance; +}; + +template +struct KernPair { + uint32 codepoint1, codepoint2; + struct { + REAL h, v; + } advance; +}; + +template class LIST, class STRING> +struct FontVariant { + uint32 flags; + uint32 weight; + CodepointType codepointType; + ImageType imageType; + uint32 fallbackVariant; + uint32 fallbackGlyph; + struct Metrics { + // In pixels: + REAL fontSize; + REAL distanceRange; + // Proportional to font size: + REAL emSize; + REAL ascender, descender; + REAL lineHeight; + REAL underlineY, underlineThickness; + REAL reserved[24]; + } metrics; + STRING name; + STRING metadata; + LIST > glyphs; + LIST > kernPairs; +}; + +template +struct Image { + uint32 flags; + ImageEncoding encoding; + uint32 width, height; + uint32 channels; + PixelFormat pixelFormat; + ImageType imageType; + struct { + uint32 rowLength; + ImageOrientation orientation; + } rawBinaryFormat; + uint32 childImages; + uint32 textureFlags; + STRING metadata; + BYTE_ARRAY data; +}; + +template +struct Appendix { + STRING metadata; + BYTE_ARRAY data; +}; + +template class LIST, class BYTE_ARRAY, class STRING> +struct ArteryFont { + MetadataFormat metadataFormat; + STRING metadata; + LIST > variants; + LIST > images; + LIST > appendices; +}; + +} diff --git a/artery-font/types.h b/artery-font/types.h new file mode 100644 index 0000000..d81db4e --- /dev/null +++ b/artery-font/types.h @@ -0,0 +1,12 @@ + +#pragma once + +#include + +namespace artery_font { + +typedef unsigned char byte; +typedef int32_t sint32; +typedef uint32_t uint32; + +} diff --git a/example.arfont b/example.arfont new file mode 100644 index 0000000000000000000000000000000000000000..a1530434762b659980ec1494c080c2f55b5c68b8 GIT binary patch literal 66580 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 S000000000K1OWg(hk18jFr>Nw literal 0 HcmV?d00001