servo / font-kit

A cross-platform font loading library written in Rust
Apache License 2.0
678 stars 100 forks source link

Rasterization to Rgba32 from Rgb24 causes panic on windows. #190

Closed PossiblyAShrub closed 2 years ago

PossiblyAShrub commented 2 years ago

The following code will panic on my windows 10 machine (specifically with the font windows returns for ArialMT):

use font_kit::canvas::{Canvas, Format, RasterizationOptions};
use font_kit::hinting::HintingOptions;
use font_kit::source::SystemSource;
use pathfinder_geometry::transform2d::Transform2F;

fn main() {
    let font = SystemSource::new()
        .select_by_postscript_name("ArialMT")
        .unwrap()
        .load()
        .unwrap();
    let glyph_id = font.glyph_for_char('A').unwrap();

    let raster_rect = font
        .raster_bounds(
            glyph_id,
            32.0,
            Transform2F::default(),
            HintingOptions::None,
            RasterizationOptions::SubpixelAa,
        )
        .unwrap();

    let mut canvas = Canvas::new(raster_rect.size(), Format::Rgba32);
    font.rasterize_glyph(
        &mut canvas,
        glyph_id,
        32.0,
        Transform2F::from_translation(-raster_rect.origin().to_f32()),
        HintingOptions::None,
        RasterizationOptions::SubpixelAa,
    )
    .unwrap();
}

Stacktrace:

thread 'main' panicked at 'not implemented', src\canvas.rs:120:47
stack backtrace:
   0: std::panicking::begin_panic_handler
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c\/library\std\src\panicking.rs:517
   1: core::panicking::panic_fmt
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c\/library\core\src\panicking.rs:100
   2: core::panicking::panic
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c\/library\core\src\panicking.rs:50
   3: font_kit::canvas::Canvas::blit_from
             at .\src\canvas.rs:120
   4: font_kit::loaders::directwrite::Font::rasterize_glyph
             at .\src\loaders\directwrite.rs:542

The specific line causing the panic is: https://github.com/servo/font-kit/blob/59213db4fe2458eefc79ea8b39f17c9b5e046c1e/src/canvas.rs#L118-L120 And this match is hit due to the values of self.format = Rgba32 and src_format = Rgb24.

This is on the latest commit on master: bd6b39d3d82330a5da313d427a2e4d8deade2373.