2023-01-29 20:34:01 -05:00
use glyphon ::{
2023-06-20 00:08:41 -04:00
Attrs , Buffer , Color , Family , FontSystem , Metrics , Resolution , Shaping , SwashCache , TextArea ,
TextAtlas , TextBounds , TextRenderer ,
2023-01-29 20:34:01 -05:00
} ;
2022-05-09 08:49:10 -04:00
use wgpu ::{
2023-04-07 22:15:59 -04:00
CommandEncoderDescriptor , CompositeAlphaMode , DeviceDescriptor , Features , Instance ,
InstanceDescriptor , Limits , LoadOp , MultisampleState , Operations , PresentMode ,
RenderPassColorAttachment , RenderPassDescriptor , RequestAdapterOptions , SurfaceConfiguration ,
TextureFormat , TextureUsages , TextureViewDescriptor ,
2022-05-09 08:49:10 -04:00
} ;
use winit ::{
2022-10-27 23:14:15 -04:00
dpi ::LogicalSize ,
2022-05-09 08:49:10 -04:00
event ::{ Event , WindowEvent } ,
2024-01-15 14:33:02 -05:00
event_loop ::EventLoop ,
2022-10-27 23:14:15 -04:00
window ::WindowBuilder ,
2022-05-09 08:49:10 -04:00
} ;
2024-01-17 16:00:02 -05:00
use std ::sync ::Arc ;
2022-05-09 08:49:10 -04:00
fn main ( ) {
pollster ::block_on ( run ( ) ) ;
}
async fn run ( ) {
2022-10-27 23:14:15 -04:00
// Set up window
let ( width , height ) = ( 800 , 600 ) ;
2024-01-15 14:33:02 -05:00
let event_loop = EventLoop ::new ( ) . unwrap ( ) ;
2024-01-17 16:00:02 -05:00
let window = Arc ::new ( WindowBuilder ::new ( )
2022-10-27 23:14:15 -04:00
. with_inner_size ( LogicalSize ::new ( width as f64 , height as f64 ) )
. with_title ( " glyphon hello world " )
. build ( & event_loop )
2024-01-17 16:00:02 -05:00
. unwrap ( ) ) ;
2022-10-27 23:14:15 -04:00
let size = window . inner_size ( ) ;
let scale_factor = window . scale_factor ( ) ;
// Set up surface
2023-04-07 22:15:59 -04:00
let instance = Instance ::new ( InstanceDescriptor ::default ( ) ) ;
2022-05-09 08:49:10 -04:00
let adapter = instance
2022-05-09 21:10:00 -04:00
. request_adapter ( & RequestAdapterOptions ::default ( ) )
2022-05-09 08:49:10 -04:00
. await
. unwrap ( ) ;
let ( device , queue ) = adapter
. request_device (
2022-05-09 21:10:00 -04:00
& DeviceDescriptor {
2022-05-09 08:49:10 -04:00
label : None ,
2024-01-17 16:00:02 -05:00
required_features : Features ::empty ( ) ,
required_limits : Limits ::downlevel_defaults ( ) ,
2022-05-09 08:49:10 -04:00
} ,
None ,
)
. await
. unwrap ( ) ;
2024-01-17 16:00:02 -05:00
let surface = instance . create_surface ( window . clone ( ) ) . expect ( " Create surface " ) ;
2023-02-04 07:22:39 -05:00
let swapchain_format = TextureFormat ::Bgra8UnormSrgb ;
2022-05-09 21:10:00 -04:00
let mut config = SurfaceConfiguration {
usage : TextureUsages ::RENDER_ATTACHMENT ,
2022-05-09 08:49:10 -04:00
format : swapchain_format ,
width : size . width ,
height : size . height ,
2022-11-28 00:53:10 -05:00
present_mode : PresentMode ::Fifo ,
2022-10-18 11:32:31 -04:00
alpha_mode : CompositeAlphaMode ::Opaque ,
2023-04-07 22:15:59 -04:00
view_formats : vec ! [ ] ,
2024-01-17 16:00:02 -05:00
desired_maximum_frame_latency : 2 ,
2022-05-09 08:49:10 -04:00
} ;
surface . configure ( & device , & config ) ;
2022-10-27 23:14:15 -04:00
// Set up text renderer
2023-03-19 10:05:53 -04:00
let mut font_system = FontSystem ::new ( ) ;
let mut cache = SwashCache ::new ( ) ;
2022-06-02 23:08:59 -04:00
let mut atlas = TextAtlas ::new ( & device , & queue , swapchain_format ) ;
2023-02-13 21:05:04 -05:00
let mut text_renderer =
TextRenderer ::new ( & mut atlas , & device , MultisampleState ::default ( ) , None ) ;
2023-03-19 10:05:53 -04:00
let mut buffer = Buffer ::new ( & mut font_system , Metrics ::new ( 30.0 , 42.0 ) ) ;
2023-01-25 23:14:29 -05:00
2023-03-19 10:05:53 -04:00
let physical_width = ( width as f64 * scale_factor ) as f32 ;
let physical_height = ( height as f64 * scale_factor ) as f32 ;
2023-01-25 23:14:29 -05:00
2023-03-19 10:05:53 -04:00
buffer . set_size ( & mut font_system , physical_width , physical_height ) ;
2023-06-20 00:08:41 -04:00
buffer . set_text ( & mut font_system , " Hello world! 👋 \n This is rendered with 🦅 glyphon 🦁 \n The text below should be partially clipped. \n a b c d e f g h i j k l m n o p q r s t u v w x y z " , Attrs ::new ( ) . family ( Family ::SansSerif ) , Shaping ::Advanced ) ;
2023-03-19 10:05:53 -04:00
buffer . shape_until_scroll ( & mut font_system ) ;
2022-05-09 08:49:10 -04:00
2024-01-15 14:33:02 -05:00
event_loop
. run ( move | event , target | {
if let Event ::WindowEvent {
window_id : _ ,
event ,
} = event
{
match event {
WindowEvent ::Resized ( size ) = > {
config . width = size . width ;
config . height = size . height ;
surface . configure ( & device , & config ) ;
window . request_redraw ( ) ;
}
WindowEvent ::RedrawRequested = > {
text_renderer
. prepare (
& device ,
& queue ,
& mut font_system ,
& mut atlas ,
Resolution {
width : config . width ,
height : config . height ,
} ,
[ TextArea {
buffer : & buffer ,
left : 10.0 ,
top : 10.0 ,
scale : 1.0 ,
bounds : TextBounds {
left : 0 ,
top : 0 ,
right : 600 ,
bottom : 160 ,
} ,
default_color : Color ::rgb ( 255 , 255 , 255 ) ,
} ] ,
& mut cache ,
)
. unwrap ( ) ;
2022-05-09 08:49:10 -04:00
2024-01-15 14:33:02 -05:00
let frame = surface . get_current_texture ( ) . unwrap ( ) ;
let view = frame . texture . create_view ( & TextureViewDescriptor ::default ( ) ) ;
let mut encoder = device
. create_command_encoder ( & CommandEncoderDescriptor { label : None } ) ;
{
let mut pass = encoder . begin_render_pass ( & RenderPassDescriptor {
label : None ,
color_attachments : & [ Some ( RenderPassColorAttachment {
view : & view ,
resolve_target : None ,
ops : Operations {
load : LoadOp ::Clear ( wgpu ::Color ::BLACK ) ,
store : wgpu ::StoreOp ::Store ,
} ,
} ) ] ,
depth_stencil_attachment : None ,
timestamp_writes : None ,
occlusion_query_set : None ,
} ) ;
2022-05-09 08:49:10 -04:00
2024-01-15 14:33:02 -05:00
text_renderer . render ( & atlas , & mut pass ) . unwrap ( ) ;
}
2022-05-09 08:49:10 -04:00
2024-01-15 14:33:02 -05:00
queue . submit ( Some ( encoder . finish ( ) ) ) ;
frame . present ( ) ;
2023-02-08 17:08:37 -05:00
2024-01-15 14:33:02 -05:00
atlas . trim ( ) ;
}
WindowEvent ::CloseRequested = > target . exit ( ) ,
_ = > { }
}
2022-05-09 08:49:10 -04:00
}
2024-01-15 14:33:02 -05:00
} )
. unwrap ( ) ;
2022-05-09 08:49:10 -04:00
}