OpenType / Truetype 글꼴 용 툴킷; 일반적으로 텍스트 렌더링
tldr :
참고 : 이것은 TTF / OTF로드 / 드로우 기능만을 나타냅니다. 사용자 정의 글꼴 형식은 여전히 할 일입니다. 프로젝트 상태는 로드맵을 참조하십시오
현재 API는 매우 간단하지만 Comptime 구성을 통해 많은 유연성을 제공합니다.
첫 번째 단계는 FONT 유형을 작성하는 것입니다.이 유형은 CompTime 구성 옵션으로 백엔드를 가져옵니다. 옵션은 다음과 같습니다. fontana , freetype 및 freetype_harfbuzz . 아래의 예에서는 맞춤형 fontana 백엔드를 사용하고 있습니다.
const font_backend: fontana.Backend = .fontana;
const Font = fontana.Font(font_backend);
var font = try Font.initFromFile(allocator, font_path);
defer font.deinit(allocator); Font 유형에는 3 개의 공개 함수, initFromFile() , deinit() 및 createPen() 있습니다. 처음 두 작품은 예상대로 작동하므로 Pen 유형으로 이동하겠습니다.
Pen 타입은 코드 포인트의 아틀라스, 글꼴 크기 및 컬렉션을 캡슐화합니다. 지정된 코드 포인트는 글리프로 변환되고 텍스처로 레이더링됩니다. 다른 크기로 텍스트를 렌더링하는 응용 프로그램에서 작업하는 경우 동일한 Font 에서 더 많은 Pens 생성 할 수 있습니다.
참고 : 펜으로 관리되는 글꼴 아틀라스는 응용 프로그램의 다른 부분과 백업 텍스처를 공유 할 수 있으며, 렌더링 된 글리프가 어디에 저장되는지에 대한 메타 데이터 만 소유합니다.
기능 서명은 다음과 같습니다.
pub fn createPen (
self : * @ This ( ) ,
comptime PixelType : type ,
allocator : std . mem . Allocator ,
size : Size ,
points_per_pixel : f64 ,
codepoints : [ ] const u8 ,
texture_size : u32 ,
texture_pixels : [ * ] PixelType ,
) ! Pen 위의 예를 계속하면 여기에서 Pen 우리의 글꼴에서 생성됩니다.
const PixelType = graphics . RGBA ( f32 ) ;
const points_per_pixel = 100 ;
const font_size = fontana . Size { . point = 24 . 0 } ;
const pen = try font . createPen (
PixelType ,
allocator ,
font_size ,
points_per_pixel ,
atlas_codepoints ,
texture . dimensions . width ,
texture . pixels ,
) ;참고 : Atlas는 정사각형 텍스처 만 지원하므로 Texture_Size는 Texture_dimensions입니다.
참고 : PixelType는 클라이언트에 의해 전달되며 래스터 화 중에 속성이 자동으로 감지됩니다. 매우 불규칙한 유형이 아니라면 작동해야합니다.
Pen 유형은 단일 목적을 가지고 있으며, 그래픽 API에서 텍스트를 화면에 그리기 위해 텍스처 버퍼에 텍스처 쿼드를 생성하는 단일 목적이 있습니다. 단일 공개 기능 만 있습니다.
pub fn write (
self : * @ This ( ) ,
codepoints : [ ] const u8 ,
placement : geometry . Coordinates2D ( f64 ) ,
screen_scale : geometry . Scale2D ( f64 ) ,
writer_interface : anytype ,
) !void클라이언트는 렌더링 할 텍스트, 화면에서 렌더링 할 위치, 화면의 스케일링 및 출력을 전달하는 데 사용되는 Comptime 인터페이스를 지정합니다.
screen_scale 픽셀을 그래픽 API의 좌표계로 변환합니다. Vulkan에서는 다음과 같이 계산할 수 있습니다.
fn scaleFromScreenDimensions ( width : f64 , height : f64 ) Scale2D ( f64 ) {
return . {
. vertical = 2.0 / height ,
. horizontal = 2.0 / width ,
} ;
}Vulkan은 NDC 오른쪽 좌표 시스템을 사용하여 X 및 Y 축 모두에서 -1.0에서 +1.0 (총 길이 2.0)을 사용하기 때문입니다.
writer_interface 는 comptime 평가 유형이며 다음 인터페이스를 충족해야합니다.
pub fn write (
self : * @ This ( ) ,
screen_extent : fontana . geometry . Extent2D ( f32 ) ,
texture_extent : fontana . geometry . Extent2D ( f32 ) ,
) !void이 모든 것은 기본 그래픽 API의 좌표계에 정의 된 출력 디스플레이의 위치에 텍스처 값을 맵핑하는 것입니다.
src/fontana.zig build.zig에 새 패키지로 추가하십시오.
const fontana_path = "your_project/deps/fontana" ;
exe . addPackage ( . {
. name = "fontana" ,
. source = . { . path = fontana_path ++ "/src/fontana.zig" } ,
} ) ;Fontana는 최신 Zig 릴리스와 동기화됩니다. 버전 0.12.0-dev.3180 으로 마지막으로 테스트되었습니다.
실행중인 예제는 예제 저장소 Fontana-Examples에서 찾을 수 있습니다. 많은 양의 코드를 포함한 비 필수 자산은 메인 리포지토리에 확인되어 최소화하고 자동화를 친숙하게 유지합니다.
위의 예를 완전한 형식으로 보려면이 파일을 구체적으로 참조하십시오.
TODO : 로드맵을 추가하십시오
MIT