Class: Fontisan::Utilities::BrotliWrapper

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/utilities/brotli_wrapper.rb

Overview

Wrapper for Brotli compression with consistent settings

BrotliWrapper provides a consistent interface for Brotli compression with configurable quality and error handling. Used primarily for WOFF2 encoding.

Brotli compression is significantly more effective than zlib (used in WOFF), typically achieving 20-30% better compression ratios on font data.

Examples:

Compress table data

compressed = BrotliWrapper.compress(table_data, quality: 11)

Decompress data

decompressed = BrotliWrapper.decompress(compressed_data)

Constant Summary collapse

DEFAULT_QUALITY =

Default compression quality (0-11, higher = better but slower) Quality 11 gives best compression for WOFF2

11
MIN_QUALITY =

Minimum quality level

0
MAX_QUALITY =

Maximum quality level

11

Class Method Summary collapse

Class Method Details

.compress(data, quality: DEFAULT_QUALITY, mode: :font) ⇒ String

Compress data using Brotli

Examples:

Compress with default quality

compressed = BrotliWrapper.compress(data)

Compress with specific quality

compressed = BrotliWrapper.compress(data, quality: 9)

Parameters:

  • data (String)

    Data to compress

  • quality (Integer) (defaults to: DEFAULT_QUALITY)

    Compression quality (0-11)

  • mode (Symbol) (defaults to: :font)

    Compression mode (:generic, :text, :font)

Returns:

  • (String)

    Compressed data

Raises:

  • (ArgumentError)

    If quality is out of range

  • (Error)

    If compression fails



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/fontisan/utilities/brotli_wrapper.rb', line 46

def self.compress(data, quality: DEFAULT_QUALITY, mode: :font)
  validate_quality!(quality)
  validate_data!(data)

  begin
    Brotli.deflate(data, quality: quality, mode: mode)
  rescue StandardError => e
    raise Fontisan::Error,
          "Brotli compression failed: #{e.message}"
  end
end

.compression_percentage(original_size, compressed_size) ⇒ Float

Calculate compression percentage

Examples:

pct = BrotliWrapper.compression_percentage(1000, 300)
# => 70.0 (70% reduction)

Parameters:

  • original_size (Integer)

    Original data size

  • compressed_size (Integer)

    Compressed data size

Returns:

  • (Float)

    Compression percentage reduction



101
102
103
104
105
# File 'lib/fontisan/utilities/brotli_wrapper.rb', line 101

def self.compression_percentage(original_size, compressed_size)
  return 0.0 if original_size.zero?

  ((original_size - compressed_size).to_f / original_size * 100).round(1)
end

.compression_ratio(original_size, compressed_size) ⇒ Float

Calculate compression ratio

Examples:

ratio = BrotliWrapper.compression_ratio(1000, 300)
# => 0.3 (30% of original size)

Parameters:

  • original_size (Integer)

    Original data size

  • compressed_size (Integer)

    Compressed data size

Returns:

  • (Float)

    Compression ratio (0.0-1.0)



86
87
88
89
90
# File 'lib/fontisan/utilities/brotli_wrapper.rb', line 86

def self.compression_ratio(original_size, compressed_size)
  return 0.0 if original_size.zero?

  compressed_size.to_f / original_size
end

.decompress(data) ⇒ String

Decompress Brotli-compressed data

Examples:

decompressed = BrotliWrapper.decompress(compressed_data)

Parameters:

  • data (String)

    Compressed data

Returns:

  • (String)

    Decompressed data

Raises:

  • (Error)

    If decompression fails



66
67
68
69
70
71
72
73
74
75
# File 'lib/fontisan/utilities/brotli_wrapper.rb', line 66

def self.decompress(data)
  validate_data!(data)

  begin
    Brotli.inflate(data)
  rescue StandardError => e
    raise Fontisan::Error,
          "Brotli decompression failed: #{e.message}"
  end
end