FTGL (empty) → 1.0
raw patch · 4 files changed
+298/−0 lines, 4 filesdep +GLUTdep +OpenGLdep +basesetup-changed
Dependencies added: GLUT, OpenGL, base
Files
- FTGL.cabal +21/−0
- Graphics/Rendering/FTGL.hs +251/−0
- LICENSE +24/−0
- Setup.hs +2/−0
+ FTGL.cabal view
@@ -0,0 +1,21 @@+Name: FTGL+Version: 1.0+Cabal-Version: >= 1.2+License: BSD3+License-File: LICENSE+Author: J.R. Heard+Maintainer: J.R. Heard+Category: Graphics+Description: + A Haskell binding for the portable TrueType to OpenGL font rendering library FTGL.+ This package provides OpenGL with polygonal, texture mapped, and extruded fonts using+ Freetype2 and any truetype font. +Synopsis: Portable TrueType font rendering for OpenGL using the Freetype2 library+Build-Type: Simple++Library+ Build-Depends: OpenGL, GLUT, base+ Exposed-Modules:+ Graphics.Rendering.FTGL+ extra-libraries: ftgl+
+ Graphics/Rendering/FTGL.hs view
@@ -0,0 +1,251 @@+{-# INCLUDE <FTGL/ftgl.h> #-}+{-# LANGUAGE ForeignFunctionInterface #-}+{-# OPTIONS_GHC -O2 -fglasgow-exts #-}+-- | * Author: Jefferson Heard (jefferson.r.heard at gmail.com)+--+-- * Copyright 2008 Renaissance Computing Institute < http://www.renci.org > +-- +-- * License: GNU LGPL +--+-- * Compatibility GHC (I could change the data declarations to not be empty and that would make it more generally compatible, I believe)+--+-- * Description: +--+-- Use FreeType 2 Fonts in OpenGL. Requires the FTGL library and FreeType libraries.+-- available at < http://ftgl.wiki.sourceforge.net/ > . The most important functions for+-- everyday use are renderFont and the create*Font family of functions. To render a +-- simple string inside OpenGL, assuming you have OpenGL initialized and a current +-- pen color, all you need is:+-- +-- > do font <- createTextureFont "Font.ttf"+-- > setFontFaceSize font 24 72+-- > renderFont font "Hello world!"+--+-- Fonts are rendered so that a single point is an OpenGL unit, and a point is 1:72 of+-- an inch.+module Graphics.Rendering.FTGL ( + createBitmapFont+ , createBufferFont+ , createOutlineFont+ , createPixmapFont+ , createPolygonFont+ , createTextureFont+ , createExtrudeFont+ , Glyph+ , Font+ , Layout+ , createSimpleLayout+ , getLayoutFont+ , setLayoutFont+ , getLayoutAlignment+ , setLayoutAlignment + , getLayoutLineLength+ , setLayoutLineLength+ , setLayoutLineSpacing+ , destroyFont+ , attachData+ , attachFile+ , setFontCharMap + , setFontFaceSize+ , getFontFaceSize+ , setFontFaceDepth+ , getFontBBox+ , getFontAdvance+ , renderFont+ , getFontError + , destroyLayout+ , renderLayout+ , getLayoutError+ , RenderMode(All,Back,Front,Side)+ , TextAlignment(AlignLeft,AlignRight,AlignCenter,Justify)+ )+where++import Foreign (unsafePerformIO)+import Foreign.C+import Foreign.Ptr+import Foreign.Marshal.Alloc+import Foreign.Marshal.Array++import qualified Graphics.Rendering.OpenGL.GL as GL++import Control.Applicative ((<$>))++foreign import ccall unsafe "ftglCreateBitmapFont" fcreateBitmapFont :: CString -> IO Font+foreign import ccall unsafe "ftglCreateBufferFont" fcreateBufferFont :: CString -> IO Font+foreign import ccall unsafe "ftglCreateOutlineFont" fcreateOutlineFont :: CString -> IO Font+foreign import ccall unsafe "ftglCreatePixmapFont" fcreatePixmapFont :: CString -> IO Font+foreign import ccall unsafe "ftglCreatePolygonFont" fcreatePolygonFont :: CString -> IO Font+foreign import ccall unsafe "ftglCreateTextureFont" fcreateTextureFont :: CString -> IO Font+foreign import ccall unsafe "ftglCreateExtrudeFont" fcreateExtrudeFont :: CString -> IO Font++foreign import ccall unsafe "ftglCreateSimpleLayout" createSimpleLayout :: IO Layout+foreign import ccall unsafe "ftglSetLayoutFont" setLayoutFont :: Layout -> Font -> IO ()+foreign import ccall unsafe "ftglGetLayoutFont" fgetLayoutFont :: Layout -> IO Font+foreign import ccall unsafe "ftglSetLayoutLineLength" setLayoutLineLength :: Layout -> CFloat -> IO ()+foreign import ccall unsafe "ftglGetLayoutLineLength" fgetLayoutLineLength :: Layout -> IO CFloat+foreign import ccall unsafe "ftglSetLayoutAlignment" setLayoutAlignment :: Layout -> CInt -> IO ()+foreign import ccall unsafe "ftglGetLayoutAlignement" fgetLayoutAlignment :: Layout -> IO CInt+foreign import ccall unsafe "ftglSetLayoutLineSpacing" setLayoutLineSpacing :: Layout -> CFloat -> IO ()++foreign import ccall unsafe "ftglDestroyFont" destroyFont :: Font -> IO ()+foreign import ccall unsafe "ftglAttachFile" fattachFile :: Font -> CString -> IO ()+foreign import ccall unsafe "ftglAttachData" attachData :: Font -> Ptr () -> IO () +foreign import ccall unsafe "ftglSetFontCharMap" setFontCharMap :: Font -> CInt -> IO ()+foreign import ccall unsafe "ftglGetFontCharMapCount" fgetFontCharMapCount :: Font -> IO CInt+foreign import ccall unsafe "ftglGetFontCharMapList" fgetFontCharMapList :: Font -> IO (Ptr CInt)+foreign import ccall unsafe "ftglSetFontFaceSize" fsetFontFaceSize :: Font -> CInt -> CInt -> IO CInt+foreign import ccall unsafe "ftglGetFontFaceSize" fgetFontFaceSize :: Font -> IO CInt+foreign import ccall unsafe "ftglSetFontDepth" setFontFaceDepth :: Font -> CInt -> IO ()+foreign import ccall unsafe "ftglSetFontOutset" setFontOutset :: Font -> CInt -> CInt -> IO ()+foreign import ccall unsafe "ftglGetFontBBox" fgetFontBBox :: Font -> CString -> Ptr CFloat -> IO () +foreign import ccall unsafe "ftglGetFontAdvance" fgetFontAdvance :: Font -> CString -> IO CFloat+foreign import ccall unsafe "ftglRenderFont" frenderFont :: Font -> CString -> CInt -> IO ()+foreign import ccall unsafe "ftglGetFontError" fgetFontError :: Font -> IO CInt++foreign import ccall unsafe "ftglDestroyLayout" destroyLayout :: Layout -> IO ()+foreign import ccall unsafe "ftglRenderLayout" renderLayout_foreign :: Layout -> CString -> IO ()+foreign import ccall unsafe "ftglGetLayoutError" fgetLayoutError :: Layout -> IO CInt++setFontFaceSize :: Font -> Int -> Int -> IO CInt+setFontFaceSize f s x = fsetFontFaceSize f (fromIntegral s) (fromIntegral x)+++-- | Whether or not in polygonal or extrusion mode, the font will render equally front and back+data RenderMode = Front | Back | Side | All++-- | In a Layout directed render, the layout mode of the text+data TextAlignment = AlignLeft | AlignCenter | AlignRight | Justify++marshalRenderMode :: RenderMode -> CInt+marshalRenderMode Front = 0x0001+marshalRenderMode Back = 0x0002+marshalRenderMode Side = 0x004+marshalRenderMode All = 0xffff++marshalTextAlignment :: TextAlignment -> CInt+marshalTextAlignment AlignLeft = 0+marshalTextAlignment AlignCenter = 1+marshalTextAlignment AlignRight = 2 +marshalTextAlignment Justify = 3++readTextAlignment :: CInt -> TextAlignment+readTextAlignment 0 = AlignLeft+readTextAlignment 1 = AlignCenter+readTextAlignment 2 = AlignRight+readTextAlignment 3 = Justify++-- | An opaque type encapsulating a glyph in C. Currently the glyph functions are unimplemented in Haskell.+data Glyph_Opaque ++-- | An opaque type encapsulating a font in C.+data Font_Opaque++-- | An opaque type encapsulating a layout in C+data Layout_Opaque++type Glyph = Ptr Glyph_Opaque+type Font = Ptr Font_Opaque+type Layout = Ptr Layout_Opaque++-- | Create a bitmapped version of a TrueType font. Bitmapped versions will not+-- | respond to matrix transformations, but rather must be transformed using the+-- | raster positioning functions in OpenGL+createBitmapFont :: String -> IO Font+createBitmapFont file = withCStringLen file $ \(p,l) -> fcreateBitmapFont p++-- | Create a buffered version of a TrueType font. This stores the entirety of+-- | a string in a texture, "buffering" it before rendering. Very fast if you+-- | will be repeatedly rendering the same strings over and over.+createBufferFont :: String -> IO Font+createBufferFont file = withCStringLen file $ \(p,l) -> fcreateBufferFont p++-- | Create an outline version of a TrueType font. This uses actual geometry+-- | and will scale independently without loss of quality. Faster than polygons+-- | but slower than texture or buffer fonts.+createOutlineFont :: String -> IO Font+createOutlineFont file = withCStringLen file $ \(p,l) -> fcreateOutlineFont p++-- | Create a pixmap version of a TrueType font. Higher quality than the bitmap+-- | font without losing any performance. Use this if you don't mind using+-- | set and get RasterPosition.+createPixmapFont :: String -> IO Font+createPixmapFont file = withCStringLen file $ \(p,l) -> fcreatePixmapFont p++-- | Create polygonal display list fonts. These scale independently without+-- | losing quality, unlike texture or buffer fonts, but can be impractical+-- | for large amounts of text because of the high number of polygons needed.+-- | Additionally, they do not, unlike the textured fonts, create artifacts+-- | within the square formed at the edge of each character.+createPolygonFont :: String -> IO Font+createPolygonFont file = withCStringLen file $ \(p,l) -> fcreatePolygonFont p++-- | Create textured display list fonts. These can scale somewhat well, +-- | but lose quality quickly. They are much faster than polygonal fonts, +-- | though, so are suitable for large quantities of text. Especially suited+-- | well to text that changes with most frames, because it doesn't incur the+-- | (normally helpful) overhead of buffering.+createTextureFont :: String -> IO Font+createTextureFont file = withCStringLen file $ \(p,l) -> fcreateTextureFont p++-- | Create a 3D extruded font. This is the only way of creating 3D fonts +-- | within FTGL. Could be fun to use a geometry shader to get different+-- | effects by warping the otherwise square nature of the font. Polygonal.+-- | Scales without losing quality. Slower than all other fonts.+createExtrudeFont :: String -> IO Font+createExtrudeFont file = withCStringLen file $ \(p,l) -> fcreateExtrudeFont p++-- | Get the embedded font from the Layout+getLayoutFont f = unsafePerformIO $ fgetLayoutFont f ++-- | Get the line length in points (1:72in) of lines in the layout+getLayoutLineLength :: Layout -> Float+getLayoutLineLength f = realToFrac . unsafePerformIO $ fgetLayoutLineLength f++-- | Get the alignment of text in this layout.+getLayoutAlignment :: Layout -> TextAlignment+getLayoutAlignment f = readTextAlignment . unsafePerformIO $ fgetLayoutAlignment f++-- | Get the number of characters loaded into the current charmap for the font.+getFontCharMapCount :: Font -> Int+getFontCharMapCount f = fromIntegral . unsafePerformIO $ fgetFontCharMapCount f++-- | Get the different character mappings available in this font.+getFontCharMapList f = unsafePerformIO $ fgetFontCharMapList f++-- | Get the current font face size in points.+getFontFaceSize :: Font -> Int+getFontFaceSize f = fromIntegral . unsafePerformIO $ fgetFontFaceSize f++-- | Get any errors associated with loading a font. FIXME return should be a type, not an Int.+getFontError :: Font -> Int+getFontError f = fromIntegral . unsafePerformIO $ fgetFontError f++-- | Attach a metadata file to a font.+attachFile :: Font -> String -> IO () +attachFile font str = withCString str $ \p -> fattachFile font p++-- | Get the horizontal span of a string of text using the current font. Input as the xcoord+-- | in any translate operation+getFontAdvance :: Font -> String -> Float+getFontAdvance font str = realToFrac . unsafePerformIO $ withCString str $ \p -> fgetFontAdvance font p ++-- | Render a string of text in the current font.+renderFont :: Font -> String -> RenderMode -> IO ()+renderFont font str mode = withCString str $ \p -> do + frenderFont font p (marshalRenderMode mode)++-- | Get the text extents of a string as a list of (lower-left,lower-right,upper-left,upper-right)+getFontBBox :: Font -> String -> [Float]+getFontBBox f s = unsafePerformIO $ + allocaBytes 16 $ \pf -> + withCString s $ \ps -> do + fgetFontBBox f ps pf+ map realToFrac <$> peekArray 4 pf++-- | Get any errors associated with a layout.+getLayoutError f = unsafePerformIO $ fgetLayoutError f++-- | Render a string of text within a layout.+renderLayout layout str = withCString str $ \strPtr -> do renderLayout_foreign layout strPtr+
+ LICENSE view
@@ -0,0 +1,24 @@+Copyright 2008, Jeff Heard. All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++- Redistributions of source code must retain the above copyright notice,+this list of conditions and the following disclaimer.+ +- Redistributions in binary form must reproduce the above copyright notice,+this list of conditions and the following disclaimer in the documentation+and/or other materials provided with the distribution.+ +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain