123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151(* This file is part of BOGUE, by San Vu Ngoc *)(* A simple text display in one line *)openB_utilsopenTsdl_ttfmoduleTheme=B_thememoduleVar=B_varmoduleDraw=B_drawtypefont=|Fileofstring|FontofTtf.fonttypestyle=Ttf.Style.ttypet={text:stringVar.t;align:Draw.align;render:(Draw.textureoption)Var.t;font:fontVar.t;style:Ttf.Style.t;size:int;(* font size *)fg:(Draw.coloroption)Var.t;(* foreground color *)}letcreate?(size=Theme.label_font_size)?(font=File!Theme.label_font)?(style=Ttf.Style.normal)?fg?(align=Draw.Center)text=Draw.ttf_init();(* we init here so that one can get the size of the widget *){text=Var.createtext;align;render=Var.createNone;font=Var.createfont;style;size;fg=Var.createfg}letfont_from_filefile=Filefileletstyles=s(* see https://lab.artlung.com/font-awesome-sample/*)leticon?size?fgname=create?size?fg~font:(FileTheme.fa_font)(Theme.fa_symbolname)letunloadl=matchVar.getl.renderwith|None->()|Sometex->beginDraw.forget_texturetex;Var.setl.renderNoneend(* TODO *)letfree=unload(* TODO free font ? *)lettextl=Var.getl.textletsetltext=ifVar.getl.text<>textthenbeginVar.setl.texttext;lettexo=Var.getl.renderinVar.setl.renderNone;do_optiontexoDraw.forget_textureendletset_fg_colorlcolor=Var.setl.fg(Somecolor)(************* display ***********)(* let default_size = (128,32);;*)(* "/home/san/public_html/7h09/sites/all/themes/drupal_7h09/css/museo.ttf";; *)(* physical size *)letphysical_size_textfonttext=(* Attention, SDL_ttf n'est peut-être pas encore initialisé... *)go(Ttf.size_utf8fonttext)(* Not used. The init is now done at [create]. *)letsize_text_initfonttext=ifnot(Ttf.was_init())then(go(Ttf.init());printddebug_graphics"SDL TTF initialized";Draw.at_cleanup(fun()->printddebug_graphics"Quitting SDL TTF";Ttf.quit()));go(Ttf.size_utf8fonttext)(* Not used. After benchmarking, this function is faster than size_text_init
after TTF initialization. *)letsize_text_exnfonttext=trygo(Ttf.size_utf8fonttext)with|Failure_->size_text_initfonttext|e->raiseeletrender_text_surf?fgfontstyletext=lettext=iftext=""then" "elsetextinprintddebug_graphics"render_text:%s"text;letcolor=Draw.create_color(defaultfg(10,11,12,255))inDraw.ttf_set_font_stylefontstyle;Draw.ttf_renderfonttextcolorletrender_textrenderer?fgfontstyletext=letsurf=render_text_surf?fgfontstyletextinprintddebug_graphics"convert to texture";lettex=Draw.create_texture_from_surfacerenderersurfinDraw.free_surfacesurf;tex(* open font with specified size. Here this is the true size, it will not be
scaled. *)(* This can be used by all widgets requiring a font. *)letget_font_varvsize=matchVar.getvwith|Fontf->f|Filefile->letf=Draw.open_fontfilesizeinVar.setv(Fontf);fletfontl=get_font_varl.font(Theme.scale_intl.size)letphysical_sizel=matchVar.getl.renderwith|Sometex->Draw.tex_sizetex|None->physical_size_text(fontl)(textl)(* a first order approximation of the "logical" size is obtained by dividing by
the scale; this is not ideal because the final physical scale of the layout
will be calculated by multiplying this by the scale, resulting in a +/- 1
pixel error. The size can be larger than the geometry, see
[center_tex_to_layer]. *)letsizel=physical_sizel|>Draw.unscale_size(* Resizing has no effect, since the size of the widget is entirely dictated by
the font size and possibly the geometry of the housing layout. *)letresize_size_l=()letdisplaycanvaslayerlg=lettex=matchVar.getl.renderwith|Somet->t|None->letfg=default(Var.getl.fg)Draw.(opaquelabel_color)inlettex=render_textcanvas.Draw.renderer(fontl)l.style(textl)~fginVar.setl.render(Sometex);texin[Draw.center_tex_to_layer~horiz:l.aligncanvaslayertexg]