Home | History | Annotate | Download | only in qd
      1 # Scan an Apple header file, generating a Python file of generator calls.
      2 
      3 import sys
      4 from bgenlocations import TOOLBOXDIR, BGENDIR
      5 sys.path.append(BGENDIR)
      6 
      7 from scantools import Scanner
      8 
      9 def main():
     10     input = "QuickDraw.h"
     11     output = "qdgen.py"
     12     defsoutput = TOOLBOXDIR + "QuickDraw.py"
     13     scanner = MyScanner(input, output, defsoutput)
     14     scanner.scan()
     15     scanner.close()
     16 
     17     # Grmpf. Universal Headers have Text-stuff in a different include file...
     18     input = "QuickDrawText.h"
     19     output = "@qdgentext.py"
     20     defsoutput = "@QuickDrawText.py"
     21     have_extra = 0
     22     try:
     23         scanner = MyScanner(input, output, defsoutput)
     24         scanner.scan()
     25         scanner.close()
     26         have_extra = 1
     27     except IOError:
     28         pass
     29     if have_extra:
     30         print "=== Copying QuickDrawText stuff into main files... ==="
     31         ifp = open("@qdgentext.py")
     32         ofp = open("qdgen.py", "a")
     33         ofp.write(ifp.read())
     34         ifp.close()
     35         ofp.close()
     36         ifp = open("@QuickDrawText.py")
     37         ofp = open(TOOLBOXDIR + "QuickDraw.py", "a")
     38         ofp.write(ifp.read())
     39         ifp.close()
     40         ofp.close()
     41 
     42     print "=== Testing definitions output code ==="
     43     execfile(defsoutput, {}, {})
     44     print "=== Done scanning and generating, now importing the generated code... ==="
     45     import qdsupport
     46     print "=== Done.  It's up to you to compile it now! ==="
     47 
     48 class MyScanner(Scanner):
     49 
     50     def destination(self, type, name, arglist):
     51         classname = "Function"
     52         listname = "functions"
     53         if arglist:
     54             t, n, m = arglist[0]
     55             if t in ('GrafPtr', 'CGrafPtr') and m == 'InMode':
     56                 classname = "Method"
     57                 listname = "gr_methods"
     58             elif t == 'BitMapPtr' and m == 'InMode':
     59                 classname = "Method"
     60                 listname = "bm_methods"
     61 ##                      elif t == "PolyHandle" and m == "InMode":
     62 ##                              classname = "Method"
     63 ##                              listname = "p_methods"
     64 ##                      elif t == "RgnHandle" and m == "InMode":
     65 ##                              classname = "Method"
     66 ##                              listname = "r_methods"
     67         return classname, listname
     68 
     69 
     70     def writeinitialdefs(self):
     71         self.defsfile.write("""
     72 def FOUR_CHAR_CODE(x): return x
     73 normal                                          = 0
     74 bold                                            = 1
     75 italic                                          = 2
     76 underline                                       = 4
     77 outline                                         = 8
     78 shadow                                          = 0x10
     79 condense                                        = 0x20
     80 extend                                          = 0x40
     81 """)
     82 
     83     def makeblacklistnames(self):
     84         return [
     85                 'InitGraf',
     86                 'StuffHex',
     87                 'StdLine',
     88                 'StdComment',
     89                 'StdGetPic',
     90                 'OpenPort',
     91                 'InitPort',
     92                 'ClosePort',
     93                 'OpenCPort',
     94                 'InitCPort',
     95                 'CloseCPort',
     96                 'BitMapToRegionGlue',
     97                 'StdOpcode',    # XXXX Missing from library...
     98                 # The following are for non-macos use:
     99                 'LockPortBits',
    100                 'UnlockPortBits',
    101                 'UpdatePort',
    102                 'GetPortNativeWindow',
    103                 'GetNativeWindowPort',
    104                 'NativeRegionToMacRegion',
    105                 'MacRegionToNativeRegion',
    106                 'GetPortHWND',
    107                 'GetHWNDPort',
    108                 'GetPICTFromDIB',
    109 
    110                 'HandleToRgn', # Funny signature
    111 
    112                 # Need Cm, which we don't want to drag in just yet
    113                 'OpenCursorComponent',
    114                 'CloseCursorComponent',
    115                 'SetCursorComponent',
    116                 'CursorComponentChanged',
    117                 'CursorComponentSetData',
    118                 ]
    119 
    120     def makeblacklisttypes(self):
    121         return [
    122                 "QDRegionBitsRef", # Should do this, but too lazy now.
    123                 'CIconHandle', # Obsolete
    124                 'CQDProcs',
    125                 'CQDProcsPtr',
    126                 'CSpecArray',
    127                 'ColorComplementProcPtr',
    128                 'ColorComplementUPP',
    129                 'ColorSearchProcPtr',
    130                 'ColorSearchUPP',
    131                 'ConstPatternParam',
    132                 'DeviceLoopDrawingProcPtr',
    133                 'DeviceLoopFlags',
    134                 'GrafVerb',
    135                 'OpenCPicParams_ptr',
    136                 'Ptr',
    137                 'QDProcs',
    138                 'ReqListRec',
    139                 'void_ptr',
    140                 'CustomXFerProcPtr',
    141                 ]
    142 
    143     def makerepairinstructions(self):
    144         return [
    145                 ([('void_ptr', 'textBuf', 'InMode'),
    146                   ('short', 'firstByte', 'InMode'),
    147                   ('short', 'byteCount', 'InMode')],
    148                  [('TextThingie', '*', '*'), ('*', '*', '*'), ('*', '*', '*')]),
    149 
    150                 # GetPen and SetPt use a point-pointer as output-only:
    151                 ('GetPen', [('Point', '*', 'OutMode')], [('*', '*', 'OutMode')]),
    152                 ('SetPt', [('Point', '*', 'OutMode')], [('*', '*', 'OutMode')]),
    153 
    154                 # All others use it as input/output:
    155                 ([('Point', '*', 'OutMode')],
    156                  [('*', '*', 'InOutMode')]),
    157 
    158                  # InsetRect, OffsetRect
    159                  ([('Rect', 'r', 'OutMode'),
    160                         ('short', 'dh', 'InMode'),
    161                         ('short', 'dv', 'InMode')],
    162                   [('Rect', 'r', 'InOutMode'),
    163                         ('short', 'dh', 'InMode'),
    164                         ('short', 'dv', 'InMode')]),
    165 
    166                  # MapRect
    167                  ([('Rect', 'r', 'OutMode'),
    168                         ('Rect_ptr', 'srcRect', 'InMode'),
    169                         ('Rect_ptr', 'dstRect', 'InMode')],
    170                   [('Rect', 'r', 'InOutMode'),
    171                         ('Rect_ptr', 'srcRect', 'InMode'),
    172                         ('Rect_ptr', 'dstRect', 'InMode')]),
    173 
    174                  # CopyBits and friends
    175                  ([('RgnHandle', 'maskRgn', 'InMode')],
    176                   [('OptRgnHandle', 'maskRgn', 'InMode')]),
    177 
    178                  ('QDFlushPortBuffer',
    179                   [('RgnHandle', '*', 'InMode')],
    180                   [('OptRgnHandle', '*', 'InMode')]),
    181 
    182                  # Accessors with reference argument also returned.
    183                  ([('Rect_ptr', 'GetPortBounds', 'ReturnMode')],
    184                   [('void', '*', 'ReturnMode')]),
    185 
    186                  ([('RGBColor_ptr', 'GetPortForeColor', 'ReturnMode')],
    187                   [('void', '*', 'ReturnMode')]),
    188 
    189                  ([('RGBColor_ptr', 'GetPortBackColor', 'ReturnMode')],
    190                   [('void', '*', 'ReturnMode')]),
    191 
    192                  ([('RGBColor_ptr', 'GetPortOpColor', 'ReturnMode')],
    193                   [('void', '*', 'ReturnMode')]),
    194 
    195                  ([('RGBColor_ptr', 'GetPortHiliteColor', 'ReturnMode')],
    196                   [('void', '*', 'ReturnMode')]),
    197 
    198                  ([('Point_ptr', 'GetPortPenSize', 'ReturnMode')],
    199                   [('void', '*', 'ReturnMode')]),
    200 
    201                  ([('Point_ptr', 'GetPortPenLocation', 'ReturnMode')],
    202                   [('void', '*', 'ReturnMode')]),
    203 
    204                  ([('Rect_ptr', 'GetPixBounds', 'ReturnMode')],
    205                   [('void', '*', 'ReturnMode')]),
    206 
    207                  ([('BitMap_ptr', 'GetQDGlobalsScreenBits', 'ReturnMode')],
    208                   [('void', '*', 'ReturnMode')]),
    209 
    210                  ([('Cursor_ptr', 'GetQDGlobalsArrow', 'ReturnMode')],
    211                   [('void', '*', 'ReturnMode')]),
    212 
    213                  ([('Rect_ptr', 'GetRegionBounds', 'ReturnMode')],
    214                   [('void', '*', 'ReturnMode')]),
    215 
    216                  ([('Pattern_ptr', '*', 'ReturnMode')],
    217                   [('void', '*', 'ReturnMode')]),
    218 
    219                  ([('Point_ptr', 'QDLocalToGlobalPoint', 'ReturnMode')],
    220                   [('void', '*', 'ReturnMode')]),
    221 
    222                  ([('Rect_ptr', 'QDLocalToGlobalRect', 'ReturnMode')],
    223                   [('void', '*', 'ReturnMode')]),
    224 
    225                  ([('Point_ptr', 'QDGlobalToLocalPoint', 'ReturnMode')],
    226                   [('void', '*', 'ReturnMode')]),
    227 
    228                  ([('Rect_ptr', 'QDGlobalToLocalRect', 'ReturnMode')],
    229                   [('void', '*', 'ReturnMode')]),
    230 
    231                 ]
    232 
    233 if __name__ == "__main__":
    234     main()
    235