[commit] r1858 - in trunk: GME/Gme GME/Gme/res GME/Gme/res/icon_sources Install

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Fri Mar 9 16:29:50 CST 2012


Author: ksmyth
Date: Fri Mar  9 16:29:50 2012
New Revision: 1858

Log:
XME icon, "Open with 64bit GME" "Open with 32bit GME" options

Added:
   trunk/GME/Gme/res/XME.ico
   trunk/GME/Gme/res/icon_sources/
   trunk/GME/Gme/res/icon_sources/extract_icons.py
   trunk/GME/Gme/res/icon_sources/make_ico.py
   trunk/GME/Gme/res/icon_sources/xme_16x16.xcf
   trunk/GME/Gme/res/icon_sources/xme_32x32.xcf
   trunk/GME/Gme/res/icon_sources/xme_48x48.xcf
Modified:
   trunk/GME/Gme/GME.rc
   trunk/Install/GME_bin.wxs

Modified: trunk/GME/Gme/GME.rc
==============================================================================
--- trunk/GME/Gme/GME.rc	Fri Mar  9 16:29:35 2012	(r1857)
+++ trunk/GME/Gme/GME.rc	Fri Mar  9 16:29:50 2012	(r1858)
@@ -71,6 +71,8 @@
 IDI_TYPEMARK_ICON       ICON                    "res\\icon1.ico"
 IDI_INSTANCEMARK_ICON   ICON                    "res\\typemark.ico"
 IDI_COMPNOTFOUND        ICON                    "res\\compnotfound.ico"
+// If this changes from ,5, change GME_bin.wxs
+ID_FILE_IMPORTXML       ICON                    "res\\XME.ico"
 
 /////////////////////////////////////////////////////////////////////////////
 //

Added: trunk/GME/Gme/res/XME.ico
==============================================================================
Binary files /dev/null	00:00:00 1970	(empty, because file is newly added) and trunk/GME/Gme/res/XME.ico	Fri Mar  9 16:29:50 2012	(r1858) differ

Added: trunk/GME/Gme/res/icon_sources/extract_icons.py
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/GME/Gme/res/icon_sources/extract_icons.py	Fri Mar  9 16:29:50 2012	(r1858)
@@ -0,0 +1,115 @@
+import sys
+import struct
+
+
+#with open(r'C:\Users\ksmyth\git\GMESRC\GME\Gme\res\GME.ico', 'rb') as input:
+with open(sys.argv[1], 'rb') as input:
+    input.read(4)
+    n = struct.unpack('<h', input.read(2))[0]
+    data = []
+    for i in range(n):
+        datum = {}
+        datum['width'] = struct.unpack('<B', input.read(1))[0]
+        datum['height'] = struct.unpack('<B', input.read(1))[0]
+        datum['colors'] = struct.unpack('<B', input.read(1))[0]
+        input.read(1)
+        datum['planes'] = struct.unpack('<h', input.read(2))[0]
+        datum['bpp'] = struct.unpack('<h', input.read(2))[0]
+        datum['size'] = struct.unpack('<l', input.read(4))[0]
+        datum['offset'] = struct.unpack('<l', input.read(4))[0]
+        print datum['size'],datum['offset']
+        print datum
+        data.append(type('Data', (object,), datum))
+
+    for datum in data:
+        input.seek(datum.offset)
+        imagedata = input.read(datum.size)
+        info = str(datum.offset) + "_" + str(datum.width) + "x" + str(datum.height) + "_" + str(datum.bpp) + "bpp"
+#        with open('output_' + info, 'wb') as output:
+#            output.write(imagedata)
+        if imagedata[1:4] == 'PNG':
+            with open('output_' + info + ".png", 'wb') as output:
+                output.write(imagedata)
+        else:
+            with open('output_' + info + ".bmp", 'wb') as output:
+#typedef struct tagBITMAPFILEHEADER {
+#  WORD bfType; 
+                output.write('BM')
+#  DWORD bfSize; 
+                output.write(struct.pack('<L', len(imagedata) + 14))
+#  WORD bfReserved1; 
+                output.write(struct.pack('<H', 0))
+#  WORD bfReserved2; 
+                output.write(struct.pack('<H', 0))
+#  DWORD bfOffBits; 
+#} BITMAPFILEHEADER; 
+                #output.write(struct.pack('<L', 140))
+                output.write(struct.pack('<L', 54))
+#  LONG  biHeight;
+#} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+                output.write(imagedata)
+                # AND/XOR transparency business (this kills the alpha mask)
+                output.seek(0x16) # sizeof(BITMAPFILEHEADER) + offsetof(BITMAPINFOHEADER, biHeight)
+                output.write(struct.pack('<L', datum.height))
+
+            with open('output_' + info + "_mask.bmp", 'wb') as output:
+#typedef struct tagBITMAPFILEHEADER {
+#  WORD bfType; 
+                output.write('BM')
+#  DWORD bfSize; 
+                output.write(struct.pack('<L', 14 + 40 + 8 + datum.width*datum.height/8 + datum.height*2))
+#  WORD bfReserved1; 
+                output.write(struct.pack('<H', 0))
+#  WORD bfReserved2; 
+                output.write(struct.pack('<H', 0))
+#  DWORD bfOffBits; 
+#} BITMAPFILEHEADER; 
+                #output.write(struct.pack('<L', 140))
+                output.write(struct.pack('<L', 54))
+                #output.write(struct.pack('<L', 62))
+#  LONG  biHeight;
+#} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+#typedef struct tagBITMAPINFOHEADER {
+#  DWORD biSize;
+                output.write(struct.pack('<L', 40))
+#  LONG  biWidth;
+                output.write(struct.pack('<L', datum.width))
+#  LONG  biHeight;
+                output.write(struct.pack('<L', datum.height))
+#  WORD  biPlanes;
+                output.write(struct.pack('<H', 1))
+#  WORD  biBitCount;
+                output.write(struct.pack('<H', 1))
+#  DWORD biCompression;
+                output.write(struct.pack('<L', 0))
+#  DWORD biSizeImage;
+                output.write(struct.pack('<L', 0))
+#  LONG  biXPelsPerMeter;
+                output.write(struct.pack('<L', 0))
+#  LONG  biYPelsPerMeter;
+                output.write(struct.pack('<L', 0))
+#  DWORD biClrUsed;
+                output.write(struct.pack('<L', 2))
+#  DWORD biClrImportant;
+                output.write(struct.pack('<L', 2))
+#} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
+                output.write(struct.pack('<L', 0x00000000))
+                output.write(struct.pack('<L', 0x00FFFFFF))
+                #output.write(imagedata[-(datum.width*datum.height/8):])
+                #output.write(imagedata[-(datum.width*datum.height/8):])
+                for i in range(datum.height, 0, -1):
+                    pad = 0
+                    #  The bits in the array are packed together, but each scan line must be padded with zeros to end on a LONG data-type boundary
+                    if datum.width % 32 != 0: pad = 16
+                    start, end = -((datum.width+pad)*i/8), -((datum.width+pad)*(i-1)/8)
+                    if end == 0: end = len(imagedata)
+                    print "%d %d %d" % (datum.width, start, end)
+                    output.write(imagedata[start:end])
+                    #if datum.width % 32 != 0:
+                    #    output.write(struct.pack('H', 0))
+                # AND/XOR transparency business (this kills the alpha mask)
+                #output.seek(0x16) # sizeof(BITMAPFILEHEADER) + offsetof(BITMAPINFOHEADER, biHeight)
+                #output.write(struct.pack('<L', datum.height))
+
+
+

Added: trunk/GME/Gme/res/icon_sources/make_ico.py
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/GME/Gme/res/icon_sources/make_ico.py	Fri Mar  9 16:29:50 2012	(r1858)
@@ -0,0 +1,69 @@
+# python make_ico.py  GME_icon.png  output_10198  output_17534  output_20774
+
+import struct
+import os
+import sys
+
+class Out(object):
+    def __init__(self, output):
+        self.output = output
+        self.count = 0
+    
+    def write1(self, v):
+        output.write(struct.pack('<B', v))
+
+    def write2(self, v):
+        output.write(struct.pack('<H', v))
+
+    def write4(self, v):
+        output.write(struct.pack('<L', v))
+
+    def write(self, v):
+        output.write(v)
+
+#sizes = ( (0,0), (48,48), (32,32), (16,16) )
+sizes = ( (48,48), (32,32), (16,16) )
+palettesize = ( 0, 0, 0, 0 )
+bpp = ( 32, 32, 32, 24)
+
+def roundup(x):
+    import math
+    return int(math.ceil(x / 32.0) * 32)
+
+files = []
+for (i, f) in enumerate(sys.argv[1:]):
+    with open(f, 'rb') as datafile:
+        data = datafile.read()
+        if data[0:2] == 'BM': # magic number for BMP
+            data = data[14:] # sizeof(BITMAPFILEHEADER)
+            # TODO: read mask bmp
+            # TODO: fix size
+            data += struct.pack('b', 0) * roundup(sizes[i][0]) * sizes[i][1]
+            data = list(data)
+            data[8:12] = struct.pack('<L', struct.unpack('<L', ''.join(data[8:12]))[0] * 2) # offsetof(BITMAPINFOHEADER, biHeight) == 8
+            print struct.unpack('<L', ''.join(data[8:12]))
+            data = ''.join(data)
+        files.append(data)
+
+with open('output.ico', 'wb') as output:
+    out = Out(output)
+    out.write2(0)
+    out.write2(1)
+    out.write2(len(files))
+    for i in range(len(files)):
+        out.write1(sizes[i][0])
+        out.write1(sizes[i][1])
+        print 'height ' + str(sizes[i][1])
+        out.write1(palettesize[i])
+        out.write1(0)
+        out.write2(1) # FIXME: what is color plane?
+        out.write2(bpp[i])
+        out.write4(len(files[i]))
+        print(len(files[i]))
+        print sum((len(file) for file in files[:i]))
+        out.write4(6 + 16 * len(files) + sum((len(file) for file in files[:i])))
+        
+    for file in files:
+        out.write(file)
+
+

Added: trunk/GME/Gme/res/icon_sources/xme_16x16.xcf
==============================================================================
Binary files /dev/null	00:00:00 1970	(empty, because file is newly added) and trunk/GME/Gme/res/icon_sources/xme_16x16.xcf	Fri Mar  9 16:29:50 2012	(r1858) differ

Added: trunk/GME/Gme/res/icon_sources/xme_32x32.xcf
==============================================================================
Binary files /dev/null	00:00:00 1970	(empty, because file is newly added) and trunk/GME/Gme/res/icon_sources/xme_32x32.xcf	Fri Mar  9 16:29:50 2012	(r1858) differ

Added: trunk/GME/Gme/res/icon_sources/xme_48x48.xcf
==============================================================================
Binary files /dev/null	00:00:00 1970	(empty, because file is newly added) and trunk/GME/Gme/res/icon_sources/xme_48x48.xcf	Fri Mar  9 16:29:50 2012	(r1858) differ

Modified: trunk/Install/GME_bin.wxs
==============================================================================
--- trunk/Install/GME_bin.wxs	Fri Mar  9 16:29:35 2012	(r1857)
+++ trunk/Install/GME_bin.wxs	Fri Mar  9 16:29:50 2012	(r1858)
@@ -72,14 +72,27 @@
 
         <ProgId Id='GME.mgafile' Description='GME project file'>
           <Extension Id='mga' ContentType='application/x-mga'>
+            <?if $(sys.BUILDARCH)=x86 ?>
             <Verb Id='open' Command='Open with GME' TargetFile='GME.exe' Argument='"%1"' />
+            <Verb Id='open_x86' Command='Open with GME' TargetFile='GME.exe' Argument='"%1"' />
+            <?else?>
+            <Verb Id='open_x64' Command='Open with 64bit GME' TargetFile='GME.exe' Argument='"%1"' />
+            <?endif?>
           </Extension>
         </ProgId>
         <ProgId Id='GME.xmefile' Description='GME XML project file'>
           <Extension Id='xme' ContentType='application/x-xme'>
+            <?if $(sys.BUILDARCH)=x86 ?>
             <Verb Id='open' Command='Open with GME' TargetFile='GME.exe' Argument='"%1"' />
+            <Verb Id='open_x86' Command='Open with GME' TargetFile='GME.exe' Argument='"%1"' />
+            <?else?>
+            <Verb Id='open_x64' Command='Open with 64bit GME' TargetFile='GME.exe' Argument='"%1"' />
+            <?endif?>
           </Extension>
         </ProgId>
+        <Registry Id='MGADesc' Root='HKCR' Key='GME.mgafile' Action='write' Type='string' Value='GME model file' />
+        <Registry Id='XMEDesc' Root='HKCR' Key='GME.xmefile' Action='write' Type='string' Value='GME XML model file' />
+        <Registry Id='XMEIcon' Root='HKCR' Key='GME.xmefile\DefaultIcon' Action='write' Type='string' Value='[#GME.exe],5' />
         <?if $(sys.BUILDARCH)=x86 ?>
         <Environment Id="GME_ROOT" Action="set" System="yes" Name="GME_ROOT" Value="[INSTALLDIR]" />
         <?endif?>


More information about the gme-commit mailing list