packages feed

freetype2-0.2.0: FreeType/Format/TrueType/Types.hsc

{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE PatternSynonyms #-}

module FreeType.Format.TrueType.Types where

import           FreeType.Core.Types.Types

import           Data.Function ((&))
import           Data.Word
import           Foreign.Ptr
import           Foreign.Storable

#include "ft2build.h"
#include FT_TRUETYPE_TABLES_H

data TT_Header = TT_Header
                   { hTable_Version       :: FT_Fixed
                   , hFont_Revision       :: FT_Fixed
                   , hCheckSum_Adjust     :: FT_Long
                   , hMagic_Number        :: FT_Long
                   , hFlags               :: FT_UShort
                   , hUnits_Per_EM        :: FT_UShort
                   , hCreated             :: Ptr FT_ULong
                   , hModified            :: Ptr FT_ULong
                   , hXMin                :: FT_Short
                   , hYMin                :: FT_Short
                   , hXMax                :: FT_Short
                   , hYMax                :: FT_Short
                   , hMac_Style           :: FT_UShort
                   , hLowest_Rec_PPEM     :: FT_UShort
                   , hFont_Direction      :: FT_Short
                   , hIndex_To_Loc_Format :: FT_Short
                   , hGlyph_Data_Format   :: FT_Short
                   }

instance Storable TT_Header where    
  sizeOf _    = #size      struct TT_Header_    
  alignment _ = #alignment struct TT_Header_    
    
  peek ptr =    
    TT_Header    
      <$> #{peek struct TT_Header_, Table_Version      } ptr    
      <*> #{peek struct TT_Header_, Font_Revision      } ptr    
      <*> #{peek struct TT_Header_, CheckSum_Adjust    } ptr    
      <*> #{peek struct TT_Header_, Magic_Number       } ptr    
      <*> #{peek struct TT_Header_, Flags              } ptr    
      <*> #{peek struct TT_Header_, Units_Per_EM       } ptr    
      <*> #{peek struct TT_Header_, Created            } ptr    
      <*> #{peek struct TT_Header_, Modified           } ptr    
      <*> #{peek struct TT_Header_, xMin               } ptr    
      <*> #{peek struct TT_Header_, yMin               } ptr    
      <*> #{peek struct TT_Header_, xMax               } ptr    
      <*> #{peek struct TT_Header_, yMax               } ptr    
      <*> #{peek struct TT_Header_, Mac_Style          } ptr    
      <*> #{peek struct TT_Header_, Lowest_Rec_PPEM    } ptr    
      <*> #{peek struct TT_Header_, Font_Direction     } ptr    
      <*> #{peek struct TT_Header_, Index_To_Loc_Format} ptr    
      <*> #{peek struct TT_Header_, Glyph_Data_Format  } ptr    
    
  poke ptr val = do    
    #{poke struct TT_Header_, Table_Version      } ptr $ val & hTable_Version          
    #{poke struct TT_Header_, Font_Revision      } ptr $ val & hFont_Revision          
    #{poke struct TT_Header_, CheckSum_Adjust    } ptr $ val & hCheckSum_Adjust        
    #{poke struct TT_Header_, Magic_Number       } ptr $ val & hMagic_Number           
    #{poke struct TT_Header_, Flags              } ptr $ val & hFlags                  
    #{poke struct TT_Header_, Units_Per_EM       } ptr $ val & hUnits_Per_EM           
    #{poke struct TT_Header_, Created            } ptr $ val & hCreated                
    #{poke struct TT_Header_, Modified           } ptr $ val & hModified               
    #{poke struct TT_Header_, xMin               } ptr $ val & hXMin                   
    #{poke struct TT_Header_, yMin               } ptr $ val & hYMin                   
    #{poke struct TT_Header_, xMax               } ptr $ val & hXMax                   
    #{poke struct TT_Header_, yMax               } ptr $ val & hYMax                   
    #{poke struct TT_Header_, Mac_Style          } ptr $ val & hMac_Style              
    #{poke struct TT_Header_, Lowest_Rec_PPEM    } ptr $ val & hLowest_Rec_PPEM        
    #{poke struct TT_Header_, Font_Direction     } ptr $ val & hFont_Direction         
    #{poke struct TT_Header_, Index_To_Loc_Format} ptr $ val & hIndex_To_Loc_Format    
    #{poke struct TT_Header_, Glyph_Data_Format  } ptr $ val & hGlyph_Data_Format



data TT_HoriHeader = TT_HoriHeader
                       { hhVersion                :: FT_Fixed
                       , hhAscender               :: FT_Short
                       , hhDescender              :: FT_Short
                       , hhLine_Gap               :: FT_Short
                       , hhAdvance_Width_Max      :: FT_UShort
                       , hhMin_Left_Side_Bearing  :: FT_Short
                       , hhMin_Right_Side_Bearing :: FT_Short
                       , hhXMax_Extent            :: FT_Short
                       , hhCaret_Slope_Rise       :: FT_Short
                       , hhCaret_Slope_Run        :: FT_Short
                       , hhCaret_Offset           :: FT_Short
                       , hhReserved               :: Ptr FT_Short
                       , hhMetric_Data_Format     :: FT_Short
                       , hhNumber_Of_HMetrics     :: FT_UShort
                       , hhLong_metrics           :: Ptr ()
                       , hhShort_metrics          :: Ptr ()
                       }

instance Storable TT_HoriHeader where           
  sizeOf _    = #size      struct TT_HoriHeader_
  alignment _ = #alignment struct TT_HoriHeader_
                
  peek ptr =     
    TT_HoriHeader                                               
      <$> #{peek struct TT_HoriHeader_, Version               } ptr
      <*> #{peek struct TT_HoriHeader_, Ascender              } ptr
      <*> #{peek struct TT_HoriHeader_, Descender             } ptr
      <*> #{peek struct TT_HoriHeader_, Line_Gap              } ptr
      <*> #{peek struct TT_HoriHeader_, advance_Width_Max     } ptr
      <*> #{peek struct TT_HoriHeader_, min_Left_Side_Bearing } ptr
      <*> #{peek struct TT_HoriHeader_, min_Right_Side_Bearing} ptr
      <*> #{peek struct TT_HoriHeader_, xMax_Extent           } ptr
      <*> #{peek struct TT_HoriHeader_, caret_Slope_Rise      } ptr
      <*> #{peek struct TT_HoriHeader_, caret_Slope_Run       } ptr
      <*> #{peek struct TT_HoriHeader_, caret_Offset          } ptr
      <*> #{peek struct TT_HoriHeader_, Reserved              } ptr
      <*> #{peek struct TT_HoriHeader_, metric_Data_Format    } ptr
      <*> #{peek struct TT_HoriHeader_, number_Of_HMetrics    } ptr
      <*> #{peek struct TT_HoriHeader_, long_metrics          } ptr
      <*> #{peek struct TT_HoriHeader_, short_metrics         } ptr
    
                       
  poke ptr val = do                                                                  
    #{poke struct TT_HoriHeader_, Version               } ptr $ val & hhVersion               
    #{poke struct TT_HoriHeader_, Ascender              } ptr $ val & hhAscender              
    #{poke struct TT_HoriHeader_, Descender             } ptr $ val & hhDescender             
    #{poke struct TT_HoriHeader_, Line_Gap              } ptr $ val & hhLine_Gap              
    #{poke struct TT_HoriHeader_, advance_Width_Max     } ptr $ val & hhAdvance_Width_Max     
    #{poke struct TT_HoriHeader_, min_Left_Side_Bearing } ptr $ val & hhMin_Left_Side_Bearing 
    #{poke struct TT_HoriHeader_, min_Right_Side_Bearing} ptr $ val & hhMin_Right_Side_Bearing
    #{poke struct TT_HoriHeader_, xMax_Extent           } ptr $ val & hhXMax_Extent           
    #{poke struct TT_HoriHeader_, caret_Slope_Rise      } ptr $ val & hhCaret_Slope_Rise      
    #{poke struct TT_HoriHeader_, caret_Slope_Run       } ptr $ val & hhCaret_Slope_Run       
    #{poke struct TT_HoriHeader_, caret_Offset          } ptr $ val & hhCaret_Offset          
    #{poke struct TT_HoriHeader_, Reserved              } ptr $ val & hhReserved              
    #{poke struct TT_HoriHeader_, metric_Data_Format    } ptr $ val & hhMetric_Data_Format    
    #{poke struct TT_HoriHeader_, number_Of_HMetrics    } ptr $ val & hhNumber_Of_HMetrics    
    #{poke struct TT_HoriHeader_, long_metrics          } ptr $ val & hhLong_metrics          
    #{poke struct TT_HoriHeader_, short_metrics         } ptr $ val & hhShort_metrics



data TT_VertHeader = TT_VertHeader
                       { vhVersion                 :: FT_Fixed
                       , vhAscender                :: FT_Short
                       , vhDescender               :: FT_Short
                       , vhLine_Gap                :: FT_Short
                       , vhAdvance_Height_Max      :: FT_UShort
                       , vhMin_Top_Side_Bearing    :: FT_Short
                       , vhMin_Bottom_Side_Bearing :: FT_Short
                       , vhYMax_Extent             :: FT_Short
                       , vhCaret_Slope_Rise        :: FT_Short
                       , vhCaret_Slope_Run         :: FT_Short
                       , vhCaret_Offset            :: FT_Short
                       , vhReserved                :: Ptr FT_Short
                       , vhMetric_Data_Format      :: FT_Short
                       , vhNumber_Of_VMetrics      :: FT_UShort
                       , vhLong_metrics            :: Ptr ()
                       , vhShort_metrics           :: Ptr ()
                       }

instance Storable TT_VertHeader where
  sizeOf _    = #size      struct TT_VertHeader_
  alignment _ = #alignment struct TT_VertHeader_

  peek ptr =
    TT_VertHeader
      <$> #{peek struct TT_VertHeader_, Version                } ptr
      <*> #{peek struct TT_VertHeader_, Ascender               } ptr
      <*> #{peek struct TT_VertHeader_, Descender              } ptr
      <*> #{peek struct TT_VertHeader_, Line_Gap               } ptr
      <*> #{peek struct TT_VertHeader_, advance_Height_Max     } ptr
      <*> #{peek struct TT_VertHeader_, min_Top_Side_Bearing   } ptr
      <*> #{peek struct TT_VertHeader_, min_Bottom_Side_Bearing} ptr
      <*> #{peek struct TT_VertHeader_, yMax_Extent            } ptr
      <*> #{peek struct TT_VertHeader_, caret_Slope_Rise       } ptr
      <*> #{peek struct TT_VertHeader_, caret_Slope_Run        } ptr
      <*> #{peek struct TT_VertHeader_, caret_Offset           } ptr
      <*> #{peek struct TT_VertHeader_, Reserved               } ptr
      <*> #{peek struct TT_VertHeader_, metric_Data_Format     } ptr
      <*> #{peek struct TT_VertHeader_, number_Of_VMetrics     } ptr
      <*> #{peek struct TT_VertHeader_, long_metrics           } ptr
      <*> #{peek struct TT_VertHeader_, short_metrics          } ptr


  poke ptr val = do
    #{poke struct TT_VertHeader_, Version                } ptr $ val & vhVersion                
    #{poke struct TT_VertHeader_, Ascender               } ptr $ val & vhAscender               
    #{poke struct TT_VertHeader_, Descender              } ptr $ val & vhDescender              
    #{poke struct TT_VertHeader_, Line_Gap               } ptr $ val & vhLine_Gap               
    #{poke struct TT_VertHeader_, advance_Height_Max     } ptr $ val & vhAdvance_Height_Max     
    #{poke struct TT_VertHeader_, min_Top_Side_Bearing   } ptr $ val & vhMin_Top_Side_Bearing   
    #{poke struct TT_VertHeader_, min_Bottom_Side_Bearing} ptr $ val & vhMin_Bottom_Side_Bearing
    #{poke struct TT_VertHeader_, yMax_Extent            } ptr $ val & vhYMax_Extent            
    #{poke struct TT_VertHeader_, caret_Slope_Rise       } ptr $ val & vhCaret_Slope_Rise       
    #{poke struct TT_VertHeader_, caret_Slope_Run        } ptr $ val & vhCaret_Slope_Run        
    #{poke struct TT_VertHeader_, caret_Offset           } ptr $ val & vhCaret_Offset           
    #{poke struct TT_VertHeader_, Reserved               } ptr $ val & vhReserved               
    #{poke struct TT_VertHeader_, metric_Data_Format     } ptr $ val & vhMetric_Data_Format     
    #{poke struct TT_VertHeader_, number_Of_VMetrics     } ptr $ val & vhNumber_Of_VMetrics     
    #{poke struct TT_VertHeader_, long_metrics           } ptr $ val & vhLong_metrics           
    #{poke struct TT_VertHeader_, short_metrics          } ptr $ val & vhShort_metrics



data TT_OS2 = TT_OS2
                { osVersion                 :: FT_UShort
                , osXAvgCharWidth           :: FT_Short
                , osUsWeightClass           :: FT_UShort
                , osUsWidthClass            :: FT_UShort
                , osFsType                  :: FT_UShort
                , osYSubscriptXSize         :: FT_Short
                , osYSubscriptYSize         :: FT_Short
                , osYSubscriptXOffset       :: FT_Short
                , osYSubscriptYOffset       :: FT_Short
                , osYSuperscriptXSize       :: FT_Short
                , osYSuperscriptYSize       :: FT_Short
                , osYSuperscriptXOffset     :: FT_Short
                , osYSuperscriptYOffset     :: FT_Short
                , osYStrikeoutSize          :: FT_Short
                , osYStrikeoutPosition      :: FT_Short
                , osSFamilyClass            :: FT_Short
                , osPanose                  :: Ptr FT_Byte
                , osUlUnicodeRange1         :: FT_ULong
                , osUlUnicodeRange2         :: FT_ULong
                , osUlUnicodeRange3         :: FT_ULong
                , osUlUnicodeRange4         :: FT_ULong
                , osAchVendID               :: Ptr FT_Char
                , osFsSelection             :: FT_UShort
                , osUsFirstCharIndex        :: FT_UShort
                , osUsLastCharIndex         :: FT_UShort
                , osSTypoAscender           :: FT_Short
                , osSTypoDescender          :: FT_Short
                , osSTypoLineGap            :: FT_Short
                , osUsWinAscent             :: FT_UShort
                , osUsWinDescent            :: FT_UShort
                , osUlCodePageRange1        :: FT_ULong
                , osUlCodePageRange2        :: FT_ULong
                , osSxHeight                :: FT_Short
                , osSCapHeight              :: FT_Short
                , osUsDefaultChar           :: FT_UShort
                , osUsBreakChar             :: FT_UShort
                , osUsMaxContext            :: FT_UShort
                , osUsLowerOpticalPointSize :: FT_UShort
                , osUsUpperOpticalPointSize :: FT_UShort
                }

instance Storable TT_OS2 where
  sizeOf _    = #size      struct TT_OS2_
  alignment _ = #alignment struct TT_OS2_

  peek ptr =
    TT_OS2
      <$> #{peek struct TT_OS2_, version                } ptr
      <*> #{peek struct TT_OS2_, xAvgCharWidth          } ptr
      <*> #{peek struct TT_OS2_, usWeightClass          } ptr
      <*> #{peek struct TT_OS2_, usWidthClass           } ptr
      <*> #{peek struct TT_OS2_, fsType                 } ptr
      <*> #{peek struct TT_OS2_, ySubscriptXSize        } ptr
      <*> #{peek struct TT_OS2_, ySubscriptYSize        } ptr
      <*> #{peek struct TT_OS2_, ySubscriptXOffset      } ptr
      <*> #{peek struct TT_OS2_, ySubscriptYOffset      } ptr
      <*> #{peek struct TT_OS2_, ySuperscriptXSize      } ptr
      <*> #{peek struct TT_OS2_, ySuperscriptYSize      } ptr
      <*> #{peek struct TT_OS2_, ySuperscriptXOffset    } ptr
      <*> #{peek struct TT_OS2_, ySuperscriptYOffset    } ptr
      <*> #{peek struct TT_OS2_, yStrikeoutSize         } ptr
      <*> #{peek struct TT_OS2_, yStrikeoutPosition     } ptr
      <*> #{peek struct TT_OS2_, sFamilyClass           } ptr
      <*> #{peek struct TT_OS2_, panose                 } ptr
      <*> #{peek struct TT_OS2_, ulUnicodeRange1        } ptr
      <*> #{peek struct TT_OS2_, ulUnicodeRange2        } ptr
      <*> #{peek struct TT_OS2_, ulUnicodeRange3        } ptr
      <*> #{peek struct TT_OS2_, ulUnicodeRange4        } ptr
      <*> #{peek struct TT_OS2_, achVendID              } ptr
      <*> #{peek struct TT_OS2_, fsSelection            } ptr
      <*> #{peek struct TT_OS2_, usFirstCharIndex       } ptr
      <*> #{peek struct TT_OS2_, usLastCharIndex        } ptr
      <*> #{peek struct TT_OS2_, sTypoAscender          } ptr
      <*> #{peek struct TT_OS2_, sTypoDescender         } ptr
      <*> #{peek struct TT_OS2_, sTypoLineGap           } ptr
      <*> #{peek struct TT_OS2_, usWinAscent            } ptr
      <*> #{peek struct TT_OS2_, usWinDescent           } ptr
      <*> #{peek struct TT_OS2_, ulCodePageRange1       } ptr
      <*> #{peek struct TT_OS2_, ulCodePageRange2       } ptr
      <*> #{peek struct TT_OS2_, sxHeight               } ptr
      <*> #{peek struct TT_OS2_, sCapHeight             } ptr
      <*> #{peek struct TT_OS2_, usDefaultChar          } ptr
      <*> #{peek struct TT_OS2_, usBreakChar            } ptr
      <*> #{peek struct TT_OS2_, usMaxContext           } ptr
      <*> #{peek struct TT_OS2_, usLowerOpticalPointSize} ptr
      <*> #{peek struct TT_OS2_, usUpperOpticalPointSize} ptr

  poke ptr val = do
    #{poke struct TT_OS2_, version                } ptr $ val & osVersion                
    #{poke struct TT_OS2_, xAvgCharWidth          } ptr $ val & osXAvgCharWidth          
    #{poke struct TT_OS2_, usWeightClass          } ptr $ val & osUsWeightClass          
    #{poke struct TT_OS2_, usWidthClass           } ptr $ val & osUsWidthClass           
    #{poke struct TT_OS2_, fsType                 } ptr $ val & osFsType                 
    #{poke struct TT_OS2_, ySubscriptXSize        } ptr $ val & osYSubscriptXSize        
    #{poke struct TT_OS2_, ySubscriptYSize        } ptr $ val & osYSubscriptYSize        
    #{poke struct TT_OS2_, ySubscriptXOffset      } ptr $ val & osYSubscriptXOffset      
    #{poke struct TT_OS2_, ySubscriptYOffset      } ptr $ val & osYSubscriptYOffset      
    #{poke struct TT_OS2_, ySuperscriptXSize      } ptr $ val & osYSuperscriptXSize      
    #{poke struct TT_OS2_, ySuperscriptYSize      } ptr $ val & osYSuperscriptYSize      
    #{poke struct TT_OS2_, ySuperscriptXOffset    } ptr $ val & osYSuperscriptXOffset    
    #{poke struct TT_OS2_, ySuperscriptYOffset    } ptr $ val & osYSuperscriptYOffset    
    #{poke struct TT_OS2_, yStrikeoutSize         } ptr $ val & osYStrikeoutSize         
    #{poke struct TT_OS2_, yStrikeoutPosition     } ptr $ val & osYStrikeoutPosition     
    #{poke struct TT_OS2_, sFamilyClass           } ptr $ val & osSFamilyClass           
    #{poke struct TT_OS2_, panose                 } ptr $ val & osPanose                 
    #{poke struct TT_OS2_, ulUnicodeRange1        } ptr $ val & osUlUnicodeRange1        
    #{poke struct TT_OS2_, ulUnicodeRange2        } ptr $ val & osUlUnicodeRange2        
    #{poke struct TT_OS2_, ulUnicodeRange3        } ptr $ val & osUlUnicodeRange3        
    #{poke struct TT_OS2_, ulUnicodeRange4        } ptr $ val & osUlUnicodeRange4        
    #{poke struct TT_OS2_, achVendID              } ptr $ val & osAchVendID              
    #{poke struct TT_OS2_, fsSelection            } ptr $ val & osFsSelection            
    #{poke struct TT_OS2_, usFirstCharIndex       } ptr $ val & osUsFirstCharIndex       
    #{poke struct TT_OS2_, usLastCharIndex        } ptr $ val & osUsLastCharIndex        
    #{poke struct TT_OS2_, sTypoAscender          } ptr $ val & osSTypoAscender          
    #{poke struct TT_OS2_, sTypoDescender         } ptr $ val & osSTypoDescender         
    #{poke struct TT_OS2_, sTypoLineGap           } ptr $ val & osSTypoLineGap           
    #{poke struct TT_OS2_, usWinAscent            } ptr $ val & osUsWinAscent            
    #{poke struct TT_OS2_, usWinDescent           } ptr $ val & osUsWinDescent           
    #{poke struct TT_OS2_, ulCodePageRange1       } ptr $ val & osUlCodePageRange1       
    #{poke struct TT_OS2_, ulCodePageRange2       } ptr $ val & osUlCodePageRange2       
    #{poke struct TT_OS2_, sxHeight               } ptr $ val & osSxHeight               
    #{poke struct TT_OS2_, sCapHeight             } ptr $ val & osSCapHeight             
    #{poke struct TT_OS2_, usDefaultChar          } ptr $ val & osUsDefaultChar          
    #{poke struct TT_OS2_, usBreakChar            } ptr $ val & osUsBreakChar            
    #{poke struct TT_OS2_, usMaxContext           } ptr $ val & osUsMaxContext           
    #{poke struct TT_OS2_, usLowerOpticalPointSize} ptr $ val & osUsLowerOpticalPointSize
    #{poke struct TT_OS2_, usUpperOpticalPointSize} ptr $ val & osUsUpperOpticalPointSize



data TT_Postscript = TT_Postscript
                       { pFormatType         :: FT_Fixed
                       , pItalicAngle        :: FT_Fixed
                       , pUnderlinePosition  :: FT_Short
                       , pUnderlineThickness :: FT_Short
                       , pIsFixedPitch       :: FT_ULong
                       , pMinMemType42       :: FT_ULong
                       , pMaxMemType42       :: FT_ULong
                       , pMinMemType1        :: FT_ULong
                       , pMaxMemType1        :: FT_ULong
                       }
instance Storable TT_Postscript where
  sizeOf _    = #size      struct TT_Postscript_
  alignment _ = #alignment struct TT_Postscript_

  peek ptr =
    TT_Postscript
      <$> #{peek struct TT_Postscript_, FormatType        } ptr
      <*> #{peek struct TT_Postscript_, italicAngle       } ptr
      <*> #{peek struct TT_Postscript_, underlinePosition } ptr
      <*> #{peek struct TT_Postscript_, underlineThickness} ptr
      <*> #{peek struct TT_Postscript_, isFixedPitch      } ptr
      <*> #{peek struct TT_Postscript_, minMemType42      } ptr
      <*> #{peek struct TT_Postscript_, maxMemType42      } ptr
      <*> #{peek struct TT_Postscript_, minMemType1       } ptr
      <*> #{peek struct TT_Postscript_, maxMemType1       } ptr

  poke ptr val = do
    #{poke struct TT_Postscript_, FormatType        } ptr $ val & pFormatType        
    #{poke struct TT_Postscript_, italicAngle       } ptr $ val & pItalicAngle       
    #{poke struct TT_Postscript_, underlinePosition } ptr $ val & pUnderlinePosition 
    #{poke struct TT_Postscript_, underlineThickness} ptr $ val & pUnderlineThickness
    #{poke struct TT_Postscript_, isFixedPitch      } ptr $ val & pIsFixedPitch      
    #{poke struct TT_Postscript_, minMemType42      } ptr $ val & pMinMemType42      
    #{poke struct TT_Postscript_, maxMemType42      } ptr $ val & pMaxMemType42      
    #{poke struct TT_Postscript_, minMemType1       } ptr $ val & pMinMemType1       
    #{poke struct TT_Postscript_, maxMemType1       } ptr $ val & pMaxMemType1



data TT_PCLT = TT_PCLT
                 { pcltVersion             :: FT_Fixed
                 , pcltFontNumber          :: FT_ULong
                 , pcltPitch               :: FT_UShort
                 , pcltXHeight             :: FT_UShort
                 , pcltStyle               :: FT_UShort
                 , pcltTypeFamily          :: FT_UShort
                 , pcltCapHeight           :: FT_UShort
                 , pcltSymbolSet           :: FT_UShort
                 , pcltTypeFace            :: Ptr FT_Char
                 , pcltCharacterComplement :: Ptr FT_Char
                 , pcltFileName            :: Ptr FT_Char
                 , pcltStrokeWeight        :: FT_Char
                 , pcltWidthType           :: FT_Char
                 , pcltSerifStyle          :: FT_Byte
                 , pcltReserved            :: FT_Byte
                 }

instance Storable TT_PCLT where
  sizeOf _    = #size      struct TT_PCLT_
  alignment _ = #alignment struct TT_PCLT_

  peek ptr =
    TT_PCLT
      <$> #{peek struct TT_PCLT_, Version            } ptr
      <*> #{peek struct TT_PCLT_, FontNumber         } ptr
      <*> #{peek struct TT_PCLT_, Pitch              } ptr
      <*> #{peek struct TT_PCLT_, xHeight            } ptr
      <*> #{peek struct TT_PCLT_, Style              } ptr
      <*> #{peek struct TT_PCLT_, TypeFamily         } ptr
      <*> #{peek struct TT_PCLT_, CapHeight          } ptr
      <*> #{peek struct TT_PCLT_, SymbolSet          } ptr
      <*> #{peek struct TT_PCLT_, TypeFace           } ptr
      <*> #{peek struct TT_PCLT_, CharacterComplement} ptr
      <*> #{peek struct TT_PCLT_, FileName           } ptr
      <*> #{peek struct TT_PCLT_, StrokeWeight       } ptr
      <*> #{peek struct TT_PCLT_, WidthType          } ptr
      <*> #{peek struct TT_PCLT_, SerifStyle         } ptr
      <*> #{peek struct TT_PCLT_, Reserved           } ptr

  poke ptr val = do
    #{poke struct TT_PCLT_, Version            } ptr $ val & pcltVersion            
    #{poke struct TT_PCLT_, FontNumber         } ptr $ val & pcltFontNumber         
    #{poke struct TT_PCLT_, Pitch              } ptr $ val & pcltPitch              
    #{poke struct TT_PCLT_, xHeight            } ptr $ val & pcltXHeight            
    #{poke struct TT_PCLT_, Style              } ptr $ val & pcltStyle              
    #{poke struct TT_PCLT_, TypeFamily         } ptr $ val & pcltTypeFamily         
    #{poke struct TT_PCLT_, CapHeight          } ptr $ val & pcltCapHeight          
    #{poke struct TT_PCLT_, SymbolSet          } ptr $ val & pcltSymbolSet          
    #{poke struct TT_PCLT_, TypeFace           } ptr $ val & pcltTypeFace           
    #{poke struct TT_PCLT_, CharacterComplement} ptr $ val & pcltCharacterComplement
    #{poke struct TT_PCLT_, FileName           } ptr $ val & pcltFileName           
    #{poke struct TT_PCLT_, StrokeWeight       } ptr $ val & pcltStrokeWeight       
    #{poke struct TT_PCLT_, WidthType          } ptr $ val & pcltWidthType          
    #{poke struct TT_PCLT_, SerifStyle         } ptr $ val & pcltSerifStyle         
    #{poke struct TT_PCLT_, Reserved           } ptr $ val & pcltReserved



data TT_MaxProfile = TT_MaxProfile
                       { mpVersion               :: FT_Fixed
                       , mpNumGlyphs             :: FT_UShort
                       , mpMaxPoints             :: FT_UShort
                       , mpMaxContours           :: FT_UShort
                       , mpMaxCompositePoints    :: FT_UShort
                       , mpMaxCompositeContours  :: FT_UShort
                       , mpMaxZones              :: FT_UShort
                       , mpMaxTwilightPoints     :: FT_UShort
                       , mpMaxStorage            :: FT_UShort
                       , mpMaxFunctionDefs       :: FT_UShort
                       , mpMaxInstructionDefs    :: FT_UShort
                       , mpMaxStackElements      :: FT_UShort
                       , mpMaxSizeOfInstructions :: FT_UShort
                       , mpMaxComponentElements  :: FT_UShort
                       , mpMaxComponentDepth     :: FT_UShort
                       }

instance Storable TT_MaxProfile where
  sizeOf _    = #size      struct TT_MaxProfile_
  alignment _ = #alignment struct TT_MaxProfile_

  peek ptr =
    TT_MaxProfile
      <$> #{peek struct TT_MaxProfile_, version              } ptr
      <*> #{peek struct TT_MaxProfile_, numGlyphs            } ptr
      <*> #{peek struct TT_MaxProfile_, maxPoints            } ptr
      <*> #{peek struct TT_MaxProfile_, maxContours          } ptr
      <*> #{peek struct TT_MaxProfile_, maxCompositePoints   } ptr
      <*> #{peek struct TT_MaxProfile_, maxCompositeContours } ptr
      <*> #{peek struct TT_MaxProfile_, maxZones             } ptr
      <*> #{peek struct TT_MaxProfile_, maxTwilightPoints    } ptr
      <*> #{peek struct TT_MaxProfile_, maxStorage           } ptr
      <*> #{peek struct TT_MaxProfile_, maxFunctionDefs      } ptr
      <*> #{peek struct TT_MaxProfile_, maxInstructionDefs   } ptr
      <*> #{peek struct TT_MaxProfile_, maxStackElements     } ptr
      <*> #{peek struct TT_MaxProfile_, maxSizeOfInstructions} ptr
      <*> #{peek struct TT_MaxProfile_, maxComponentElements } ptr
      <*> #{peek struct TT_MaxProfile_, maxComponentDepth    } ptr

  poke ptr val = do
    #{poke struct TT_MaxProfile_, version              } ptr $ val & mpVersion              
    #{poke struct TT_MaxProfile_, numGlyphs            } ptr $ val & mpNumGlyphs            
    #{poke struct TT_MaxProfile_, maxPoints            } ptr $ val & mpMaxPoints            
    #{poke struct TT_MaxProfile_, maxContours          } ptr $ val & mpMaxContours          
    #{poke struct TT_MaxProfile_, maxCompositePoints   } ptr $ val & mpMaxCompositePoints   
    #{poke struct TT_MaxProfile_, maxCompositeContours } ptr $ val & mpMaxCompositeContours 
    #{poke struct TT_MaxProfile_, maxZones             } ptr $ val & mpMaxZones             
    #{poke struct TT_MaxProfile_, maxTwilightPoints    } ptr $ val & mpMaxTwilightPoints    
    #{poke struct TT_MaxProfile_, maxStorage           } ptr $ val & mpMaxStorage           
    #{poke struct TT_MaxProfile_, maxFunctionDefs      } ptr $ val & mpMaxFunctionDefs      
    #{poke struct TT_MaxProfile_, maxInstructionDefs   } ptr $ val & mpMaxInstructionDefs   
    #{poke struct TT_MaxProfile_, maxStackElements     } ptr $ val & mpMaxStackElements     
    #{poke struct TT_MaxProfile_, maxSizeOfInstructions} ptr $ val & mpMaxSizeOfInstructions
    #{poke struct TT_MaxProfile_, maxComponentElements } ptr $ val & mpMaxComponentElements 
    #{poke struct TT_MaxProfile_, maxComponentDepth    } ptr $ val & mpMaxComponentDepth



type FT_Sfnt_Tag = #type enum FT_Sfnt_Tag_