// Set up the drawingwand "dw" for the given font name, font size, and colour. // If the font or size changes sx get the new width of a space // (the magickwand is required if it is necessary to query the font metrics) func draw_setfont(mw *imagick.MagickWand, dw *imagick.DrawingWand, font string, size float64, colour string, sx *float64) { sflag := false if len(font) > 0 { dw.SetFont(font) sflag = true } if len(colour) > 0 { pw := imagick.NewPixelWand() pw.SetColor(colour) dw.SetFillColor(pw) pw.Destroy() sflag = true } if size > 0 { dw.SetFontSize(size) } // If either the font or the fontsize (or both) have changed // we need to get the size of a space again if sflag { fm := mw.QueryFontMetrics(dw, " ") *sx = fm.TextWidth } }
// The easiest (?) way to handle vertical text placement is // not to use gravity at all because then you know that all the text is // placed relative to ImageMagick's (0,0) coordinate which is the top left of // the screen and the baseline will be y=0. func draw_metrics(mw *imagick.MagickWand, dw *imagick.DrawingWand, dx *float64, dy, sx float64, text string) { mw.AnnotateImage(dw, *dx, dy, 0, text) mw.DrawImage(dw) // get the font metrics fm := mw.QueryFontMetrics(dw, text) if fm != nil { // Adjust the new x coordinate *dx += fm.TextWidth + sx } }