2023-01-29 20:34:01 -05:00
use glyphon ::{
Attrs , Buffer , Color , Family , FontSystem , Metrics , Resolution , SwashCache , TextArea , TextAtlas ,
TextBounds , TextRenderer ,
} ;
2022-05-09 08:49:10 -04:00
use wgpu ::{
2022-10-18 11:32:31 -04:00
Backends , CommandEncoderDescriptor , CompositeAlphaMode , DeviceDescriptor , Features , Instance ,
2023-02-13 21:05:04 -05:00
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 } ,
event_loop ::{ ControlFlow , EventLoop } ,
2022-10-27 23:14:15 -04:00
window ::WindowBuilder ,
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 ) ;
let event_loop = EventLoop ::new ( ) ;
let window = WindowBuilder ::new ( )
. with_inner_size ( LogicalSize ::new ( width as f64 , height as f64 ) )
. with_title ( " glyphon hello world " )
. build ( & event_loop )
. unwrap ( ) ;
let size = window . inner_size ( ) ;
let scale_factor = window . scale_factor ( ) ;
// Set up surface
2022-05-09 21:10:00 -04:00
let instance = Instance ::new ( Backends ::all ( ) ) ;
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 ,
2022-05-09 21:10:00 -04:00
features : Features ::empty ( ) ,
limits : Limits ::downlevel_defaults ( ) ,
2022-05-09 08:49:10 -04:00
} ,
None ,
)
. await
. unwrap ( ) ;
let surface = unsafe { instance . create_surface ( & window ) } ;
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 ,
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 ) ;
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 ) ) ;
buffer . shape_until_scroll ( & mut font_system ) ;
2022-05-09 08:49:10 -04:00
event_loop . run ( move | event , _ , control_flow | {
let _ = ( & instance , & adapter ) ;
* control_flow = ControlFlow ::Poll ;
match event {
Event ::WindowEvent {
event : WindowEvent ::Resized ( size ) ,
..
} = > {
config . width = size . width ;
config . height = size . height ;
surface . configure ( & device , & config ) ;
window . request_redraw ( ) ;
}
Event ::RedrawRequested ( _ ) = > {
text_renderer
. prepare (
& device ,
& queue ,
2023-03-19 10:05:53 -04:00
& mut font_system ,
2022-06-02 23:08:59 -04:00
& mut atlas ,
2022-05-09 08:49:10 -04:00
Resolution {
width : config . width ,
height : config . height ,
} ,
2023-01-25 22:37:05 -05:00
& [ TextArea {
buffer : & buffer ,
2023-01-25 23:14:29 -05:00
left : 10 ,
top : 10 ,
2023-01-25 22:37:05 -05:00
bounds : TextBounds {
2023-01-25 23:14:29 -05:00
left : 0 ,
top : 0 ,
right : 600 ,
bottom : 160 ,
2023-01-25 22:37:05 -05:00
} ,
2023-02-26 21:31:34 -05:00
default_color : Color ::rgb ( 255 , 255 , 255 ) ,
2023-01-25 22:37:05 -05:00
} ] ,
2022-10-27 23:44:07 -04:00
& mut cache ,
2022-05-09 08:49:10 -04:00
)
. unwrap ( ) ;
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 ,
2022-07-13 08:04:49 -04:00
color_attachments : & [ Some ( RenderPassColorAttachment {
2022-05-09 08:49:10 -04:00
view : & view ,
resolve_target : None ,
ops : Operations {
2022-05-09 21:10:00 -04:00
load : LoadOp ::Clear ( wgpu ::Color ::BLACK ) ,
2022-05-09 08:49:10 -04:00
store : true ,
} ,
2022-07-13 08:04:49 -04:00
} ) ] ,
2022-05-09 08:49:10 -04:00
depth_stencil_attachment : None ,
} ) ;
2022-06-02 23:08:59 -04:00
text_renderer . render ( & atlas , & mut pass ) . unwrap ( ) ;
2022-05-09 08:49:10 -04:00
}
queue . submit ( Some ( encoder . finish ( ) ) ) ;
frame . present ( ) ;
}
Event ::WindowEvent {
event : WindowEvent ::CloseRequested ,
..
} = > * control_flow = ControlFlow ::Exit ,
Event ::MainEventsCleared = > {
window . request_redraw ( ) ;
}
_ = > { }
}
} ) ;
}