///|
/// WOFF1 magic number: "wOFF" = 0x774F4646
let woff1_magic : Int = 0x774F4646

///|
/// Parse a WOFF1 font, decompress tables, rebuild sfnt, and delegate to parse_ttf
pub fn parse_woff1(data : Bytes) -> TTFont? {
  let reader = BinaryReader::new(data)
  // WOFF1 Header (44 bytes)
  let signature = reader.read_uint32()
  if signature != woff1_magic {
    return None
  }
  let flavor = reader.read_uint32()
  let _length = reader.read_uint32()
  let num_tables = reader.read_uint16()
  let _reserved = reader.read_uint16()
  let _total_sfnt_size = reader.read_uint32()
  let _major_version = reader.read_uint16()
  let _minor_version = reader.read_uint16()
  let _meta_offset = reader.read_uint32()
  let _meta_length = reader.read_uint32()
  let _meta_orig_length = reader.read_uint32()
  let _priv_offset = reader.read_uint32()
  let _priv_length = reader.read_uint32()
  // Read table directory entries (20 bytes each)
  let entries : Array[(String, Int, Int, Int)] = [] // (tag, offset, compLength, origLength)
  for i = 0; i < num_tables; i = i + 1 {
    let tag = reader.read_tag()
    let offset = reader.read_uint32()
    let comp_length = reader.read_uint32()
    let orig_length = reader.read_uint32()
    let _orig_checksum = reader.read_uint32()
    entries.push((tag, offset, comp_length, orig_length))
    ignore(i)
  }
  // Decompress each table
  let tables : Array[(String, Bytes)] = []
  for i = 0; i < entries.length(); i = i + 1 {
    let (tag, offset, comp_length, orig_length) = entries[i]
    let table_data = if comp_length < orig_length {
      // Compressed: extract slice and decompress with zlib
      let compressed = bytes_slice(data, offset, comp_length)
      @zlib.zlib_decompress(compressed) catch {
        _ => return None
      }
    } else {
      // Uncompressed: copy as-is
      bytes_slice(data, offset, orig_length)
    }
    tables.push((tag, table_data))
    ignore(i)
  }
  let sfnt = rebuild_sfnt(flavor, tables)
  parse_ttf(sfnt)
}