package allegro5 // #include // #include // #include import "C" import ( "fmt" "unsafe" ) type Font struct { font *C.ALLEGRO_FONT hght float32 asc float32 desc float32 } type HorizontalAlignment int const ( AlignLeft HorizontalAlignment = iota AlignCenter AlignRight ) func LoadTTFFont(path string, size int) (*Font, error) { p := C.CString(path) defer C.free(unsafe.Pointer(p)) f := C.al_load_ttf_font(p, C.int(size), 0) if nil == f { return nil, fmt.Errorf("unable to load ttf font '%s'", path) } return &Font{f, 0, 0, 0}, nil } func (f *Font) drawFlags(a HorizontalAlignment) C.int { switch a { case AlignLeft: return C.ALLEGRO_ALIGN_LEFT case AlignCenter: return C.ALLEGRO_ALIGN_CENTRE case AlignRight: return C.ALLEGRO_ALIGN_RIGHT } return C.ALLEGRO_ALIGN_LEFT } func (f *Font) Draw(left, top float32, color Color, align HorizontalAlignment, text string) { t := C.CString(text) defer C.free(unsafe.Pointer(t)) flags := f.drawFlags(align) C.al_draw_text(f.font, color.color, C.float(left), C.float(top), flags, t) } // Ascent returns the ascent of the font func (f *Font) Ascent() float32 { if 0 == f.asc { f.asc = float32(C.al_get_font_ascent(f.font)) } return f.asc } // Descent returns the descent of the font. func (f *Font) Descent() float32 { if 0 == f.desc { f.desc = float32(C.al_get_font_descent(f.font)) } return f.desc } // Height returns the height of the font func (f *Font) Height() float32 { if 0 == f.hght { f.hght = f.Ascent() + f.Descent() } return f.hght } // TextDimensions returns the bounding box of the rendered text. func (f *Font) TextDimensions(text string) (x, y, w, h float32) { t := C.CString(text) defer C.free(unsafe.Pointer(t)) var bbx, bby, bbw, bbh C.int C.al_get_text_dimensions(f.font, t, &bbx, &bby, &bbw, &bbh) x = float32(bbx) y = float32(bby) w = float32(bbw) h = float32(bbh) return } // TextWidth returns the width of the rendered text. func (f *Font) TextWidth(text string) float32 { t := C.CString(text) defer C.free(unsafe.Pointer(t)) return float32(C.al_get_text_width(f.font, t)) } func (f *Font) Destroy() { C.al_destroy_font(f.font) }