3E7ON5LK5KELT7NX7O2DRSVSQQGVW3HU3LFTQGGCJ5PIRZDWD56QC NBT2QCONKZ2E5I7HIQJUNQAUNJA6RPYYTUVZQCT6Z6ABU42A277AC KLGRQAFUQPJP75NVLS5MZZ3CY4TGNVGB4K2YHQSLYVGAPKCLBLUAC 2NFFH775XBXGXBJYGTGUAUH45T5ZI6FFJXHFGUQQS324XEAFKT7AC I3F42XELTBNGNFJGKEDBRYU75HHQX2CHMWPEIEMXAGU2FFHQVHKAC SDFC64IQZWAAG36UV4GVSAER5S3FISBQEE2NVGI4G6ODD6CCGBIAC 3MJHVTOTVPO6KYWXVKALETNOZBHQ3XSI3SDUWIPHGWP5ZITQL4KAC TWBSX7IMMGO6G6CEEMPQZHBVDG4XHDMHL6FEAKOH34ILJJNMRUIQC YR6S4ANJ34M45KU6BU5RRJWI5AW5SSFPCDLH4KUO55DICUK5LQ4QC X6QJYZJZSS7YSRCDOPQ2I2Y7U7VJA4HE5P74ZYENROR7FRUPPXWQC PTQ26KY65NDVZ35EG66SARWRGGYKDJ2BT3EVK4RJFS2J5AQUX6OQC ALRSGGIYO2DYI7QMBE5HRMBYTZKPIJ6UKVDI5LCKMN4SVZE3K4DQC 5S34ANJMEKYNSGROMFRDP22UA2FK2ENSGOBB4MPSHS7PG2BW6DLAC fn run_length(gbuf: &GlyphBuffer, upe: i32, font_size: u32) -> i32 {gbuf.glyph_positions().iter().map(|i| i.x_advance * font_size as i32 / upe).sum::<i32>()
impl Run {fn length(&self, font_size: i32) -> usize {self.glyph_buffer.glyph_positions().iter().map(|i| i.x_advance * font_size / self.upe).sum::<i32>() as usize}}#[derive(Default)]struct Shaper {fonts: Vec<(Vec<u8>, rustybuzz::Face<'static>)>,cache: ShapeCache,plans: Plans,
let upe = self.shaper.fonts[font].1.units_per_em();
let bg = run.face.bg.to_rgba(config);let fg = run.face.fg.to_rgba(config).unwrap_or(default_fg);let line_height = self.line_height() as usize;if let Some(bg) = bg {self.draw_background(pos.0,pos.1 - line_height + 4,run.length(self.font_size as i32),line_height,bg,);}let Run {upe,glyph_buffer,font,..} = run;
for (face, font, glyph_buffer) in self.shaper.make_runs(line.clone()).iter() {let upe = self.shaper.fonts[*font].1.units_per_em();if let Some(bg) = face.bg.to_rgba(config) {let run_length = run_length(glyph_buffer, upe, self.font_size);self.draw_background(pos.0,pos.1 - line_height + 4,run_length as usize,line_height,bg,);}let fg = face.fg.to_rgba(config).unwrap_or(default_fg);self.rasterize_segment(*font, glyph_buffer, fg, &mut pos);
for run in self.shaper.make_runs(line.clone()).iter() {self.rasterize_segment(run, config, default_fg, &mut pos);
for (face, font, glyph_buffer) in self.shaper.make_runs(ui.prompt_line.clone()).iter() {let upe = self.shaper.fonts[*font].1.units_per_em();if let Some(bg) = face.bg.to_rgba(config) {let run_length = run_length(glyph_buffer, upe, self.font_size);self.draw_background(pos.0,pos.1 - line_height + 4,run_length as usize,line_height,bg,);}let fg = face.fg.to_rgba(config).unwrap_or(ui.line_face.fg.to_rgba(config).unwrap_or(default_fg));self.rasterize_segment(*font, glyph_buffer, fg, &mut pos);
for run in self.shaper.make_runs(ui.prompt_line.clone()).iter() {let line_fg = ui.line_face.fg.to_rgba(config).unwrap_or(default_fg);self.rasterize_segment(run, config, line_fg, &mut pos);
for (face, font, glyph_buffer) in mode_line.iter() {let upe = self.shaper.fonts[*font].1.units_per_em();if let Some(bg) = face.bg.to_rgba(config) {let run_length = run_length(glyph_buffer, upe, self.font_size);self.draw_background(pos.0,pos.1 - line_height + 4,run_length as usize,line_height,bg,);
for run in mode_line.iter() {let mode_fg = ui.line_face.fg.to_rgba(config).unwrap_or(default_fg);self.rasterize_segment(run, config, mode_fg, &mut pos);}let menu_padding_x: usize = 2;let menu_padding_y: usize = 2;let mut menu_space: usize = 0;for menu in &ui.menus {let lines: Vec<_> = menu.content.iter().map(|line| self.shaper.make_runs(line.clone())).collect();let menu_bg = menu.menu_face.bg.to_rgba(config).unwrap_or(default_bg);let menu_fg = menu.menu_face.fg.to_rgba(config).unwrap_or(default_fg);let selected_fg = menu.selected_face.fg.to_rgba(config).unwrap_or(default_fg);let selected_bg = menu.selected_face.bg.to_rgba(config).unwrap_or(default_bg);match menu.style {MenuShowStyle::Prompt => {let width = self.font_size * 15;let num_width = self.size.0 / width as usize;let num_height = usize::min(menu.content.len() / num_width, 10);println!("{} {}", num_height, num_width);let width = self.size.0 / num_width;menu_space = line_height * num_height + menu_padding_y * 2;for (i, line) in lines.into_iter().enumerate() {let x = i % num_width;let y = i / num_width;if y >= num_height {break;}pos.0 = x * width + menu_padding_x;pos.1 = (self.size.1).saturating_sub(line_height * (y + 1) + menu_padding_y + status_padding,);let (fg, bg) = if menu.selected == i {(selected_fg, selected_bg)} else {(menu_fg, menu_bg)};self.draw_background(pos.0,pos.1 - line_height + 4,width,line_height,bg,);for run in line.iter() {self.rasterize_segment(run, config, fg, &mut pos);}}}_ => {}
for (face, font, glyph_buffer) in run.iter() {let upe = self.shaper.fonts[*font].1.units_per_em();if let Some(bg) = face.bg.to_rgba(config) {let run_length = run_length(glyph_buffer, upe, self.font_size);self.draw_background(pos.0,pos.1 - line_height + 4,run_length as usize,line_height,bg,);}let fg = info.face.fg.to_rgba(config).unwrap_or(info.face.fg.to_rgba(config).unwrap_or(default_fg));self.rasterize_segment(*font, glyph_buffer, fg, &mut pos);
for run in runs.iter() {let info_fg = info.face.fg.to_rgba(config).unwrap_or(default_fg);self.rasterize_segment(run, config, info_fg, &mut pos);
Request::MenuShow(_content, _anchor, _selected_face, _menu_face, _style) => {}Request::MenuSelect(_) => {}
Request::MenuShow(content, anchor, selected_face, menu_face, style) => {self.ui.menus.retain(|menu| menu.style != style);self.ui.menus.push(Menu {content: content.into_iter().map(From::from).collect(),anchor,selected_face,menu_face,style,selected: 0,});println!("{}", self.ui.menus.len());}Request::MenuSelect(index) => {if let Some(menu) = self.ui.menus.last_mut() {menu.selected = index[0] as usize;}}