some fixes, and patch bobtoolz improvements, from osxnetradiant
authordivverent <divverent@61c419a2-8eb2-4b30-bcec-8cead039b335>
Fri, 18 Dec 2009 08:03:34 +0000 (08:03 +0000)
committerdivverent <divverent@61c419a2-8eb2-4b30-bcec-8cead039b335>
Fri, 18 Dec 2009 08:03:34 +0000 (08:03 +0000)
git-svn-id: svn://svn.icculus.org/netradiant/trunk@403 61c419a2-8eb2-4b30-bcec-8cead039b335

Makefile
Makefile.conf
contrib/bobtoolz/DPatch.cpp
contrib/bobtoolz/DPatch.h
contrib/bobtoolz/bobToolz-GTK.cpp
contrib/bobtoolz/funchandlers-GTK.cpp
contrib/bobtoolz/funchandlers.h
install-dylibs.sh
setup/data/osx/NetRadiant.app/Contents/MacOS/install/fonts.conf [new file with mode: 0755]
setup/data/osx/NetRadiant.app/Contents/MacOS/install/fonts.dtd [new file with mode: 0755]
setup/data/osx/NetRadiant.app/Contents/MacOS/netradiant.sh

index a6a09ac..eb16462 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -184,9 +184,11 @@ ifeq ($(OS),Darwin)
        CFLAGS_COMMON += -fPIC
        CXXFLAGS_COMMON += -fno-exceptions -fno-rtti
        CPPFLAGS_COMMON += -I/sw/include -I/usr/X11R6/include
-       LDFLAGS_COMMON += -L/sw/lib -L/usr/lib -L/usr/X11R6/lib
+       LDFLAGS_COMMON += -L/sw/lib  -L/usr/X11R6/lib
+       #LDFLAGS_COMMON += -L/sw/lib -L/usr/lib -L/usr/X11R6/lib
        LDFLAGS_DLL += -dynamiclib -ldl
        EXE ?= ppc
+       MACLIBDIR ?= /sw/lib
        A = a
        DLL = dylib
        MWINDOWS =
@@ -906,12 +908,12 @@ $(INSTALLDIR)/plugins/ufoaiplug.$(DLL): \
        contrib/ufoaiplug/ufoai_level.o \
        contrib/ufoaiplug/ufoai.o \
 
-#$(INSTALLDIR)/plugins/bkgrnd2d.$(DLL): LIBS_EXTRA := $(LIBS_GLIB) $(LIBS_GTK)
-#$(INSTALLDIR)/plugins/bkgrnd2d.$(DLL): CPPFLAGS_EXTRA := $(CPPFLAGS_GLIB) $(CPPFLAGS_GTK) -Ilibs -Iinclude
-#$(INSTALLDIR)/plugins/bkgrnd2d.$(DLL): \
-#      contrib/bkgrnd2d/bkgrnd2d.o \
-#      contrib/bkgrnd2d/dialog.o \
-#      contrib/bkgrnd2d/plugin.o \
+$(INSTALLDIR)/plugins/bkgrnd2d.$(DLL): LIBS_EXTRA := $(LIBS_GLIB) $(LIBS_GTK)
+$(INSTALLDIR)/plugins/bkgrnd2d.$(DLL): CPPFLAGS_EXTRA := $(CPPFLAGS_GLIB) $(CPPFLAGS_GTK) -Ilibs -Iinclude
+$(INSTALLDIR)/plugins/bkgrnd2d.$(DLL): \
+       contrib/bkgrnd2d/bkgrnd2d.o \
+       contrib/bkgrnd2d/dialog.o \
+       contrib/bkgrnd2d/plugin.o \
 
 $(INSTALLDIR)/heretic2/h2data.$(EXE): LIBS_EXTRA := $(LIBS_XML)
 $(INSTALLDIR)/heretic2/h2data.$(EXE): CPPFLAGS_EXTRA := $(CPPFLAGS_XML) -Itools/quake2/qdata_heretic2/common -Itools/quake2/qdata_heretic2/qcommon -Itools/quake2/qdata_heretic2 -Itools/quake2/common -Ilibs -Iinclude
@@ -978,7 +980,7 @@ install-dll: binaries
 else
 ifeq ($(OS),Darwin)
 install-dll: binaries
-       CP="$(CP)" OTOOL="$(OTOOL)" INSTALLDIR="$(INSTALLDIR)" $(SH) install-dylibs.sh
+       EXE="$(EXE)" MACLIBDIR="$(MACLIBDIR)" CP="$(CP)" OTOOL="$(OTOOL)" INSTALLDIR="$(INSTALLDIR)" $(SH) install-dylibs.sh
 else
 install-dll: binaries
        @$(ECHO) No DLL inclusion implemented for this target.
index 0f5fa92..2986545 100644 (file)
@@ -1 +1,18 @@
 # empty Makefile.conf template
+
+## OS X:
+# BUILD=debug
+# RADIANT_ABOUTMSG=Custom build
+# EXE=ub
+#
+## MacPorts:
+# CPPFLAGS=-I/opt/local/include/ -I/usr/X11R6/include/ 
+# LDFLAGS=-L/opt/local/lib -L/usr/X11R6/lib
+# MACLIBDIR=/opt/local/lib
+
+## Fink
+## (-arch ppc can combined with -arch 386, I read somewhere. However does work fine like this on OSX 10.6) 
+# LDFLAGS=-arch i386
+# CFLAGS=-arch i386
+# TARGET_ARCH=-arch i386
+# MACLIBDIR=/sw/lib
index 30bb5c6..259355e 100644 (file)
@@ -307,29 +307,31 @@ DPatch* DPatch::MergePatches(patch_merge_t merge_info, DPatch *p1, DPatch *p2)
                if(merge_info.pos2 < 0)
                        merge_info.pos2 += 3;
        }
-
-       int newHeight = p1->height + p2->height - 1;
+       //
+       /* The Patch will never be reaching max, previous comparissions make sure,
+          for 2 patches with 3x3 size. Results always in a patch of 3x5. (31 is max currently)
+       int newHeight = p1->height + p2->height - 1; anyway = 5
        if(newHeight > MAX_PATCH_HEIGHT)
                return NULL;
-
+       int newWidth = p1->width + p2->width - 1;
+       if(newWidth > MAX_PATCH_WIDTH)
+               return NULL;
+       */
        DPatch* newPatch = new DPatch();
 
-       newPatch->height        = newHeight;
-       newPatch->width         = p1->width;
+       newPatch->height        = 3;
+       newPatch->width         = 5;
        newPatch->SetTexture(p1->texture);
 
-       int y = 0;
-       int i;
-       for(i = 0; i < p1->height; i++, y++)
-               for(int x = 0; x < p1->width; x++)
-                       newPatch->points[x][y] = p1->points[x][i];
-
-       for(i = 1; i < p2->height; i++, y++)
-               for(int x = 0; x < p2->width; x++)
-                       newPatch->points[x][y] = p2->points[x][i];
-
+       for(int y = 0; y < 3; y++)
+               for(int x = 0; x < 3; x++)
+                       newPatch->points[x][y] = p1->points[x][y];
+       
+       for(int y = 1; y < 3; y++)
+               for(int x = 0; x < 3; x++)
+                       newPatch->points[x][y+2] = p2->points[x][y];
+       
 //     newPatch->Invert();
-
        return newPatch;
 }
 
@@ -396,13 +398,13 @@ void DPatch::Transpose()
        Invert();
 }
 
-std::list<DPatch> DPatch::Split(bool rows, bool cols)
+std::list<DPatch> DPatch::SplitRows()
 {
        std::list<DPatch> patchList;
        int i;
        int x, y;
 
-       if(rows && height >= 5)
+       if(height >= 5)
        {
                for(i = 0; i < (height-1)/2; i++)
                {
@@ -411,53 +413,162 @@ std::list<DPatch> DPatch::Split(bool rows, bool cols)
                        p.width = width;
                        p.height = 3;
                        p.SetTexture(texture);
+                       for(x = 0; x < 3; x++)
+                       {
+                               for(y = 0; y < p.width; y++)
+                               {
+                                       p.points[x][y] = points[(i*2)+x][y];
+                               }
+                       }                       
+                       patchList.push_back(p);
+               }
+       } else {
+               //This returns exactly what comes in.. I don't know better :/
+               //If nothing is returned, the Patch in Radiant is just deleted - I suppose for evil follow up erros.
+               DPatch p;
+               
+               p.height = height;
+               p.width = width;
+               p.SetTexture(texture);
+               
+               for(x = 0; x < p.height; x++)
+               {
+                       for(y = 0; y < p.width; y++)
+                       {
+                               p.points[x][y] = points[x][y];
+                       }
+               }
+               patchList.push_back(p);
+       }
+       return patchList;
+}
 
-                       for(y = 0; y < 3; y++)
+std::list<DPatch> DPatch::SplitCols()
+{
+       std::list<DPatch> patchList;
+       int i;
+       int x, y;
+       
+       if(width >= 5)
+       {
+               for(i = 0; i < (width-1)/2; i++)
+               {
+                       DPatch p;
+                       
+                       p.width = 3;
+                       p.height = height;
+                       p.SetTexture(texture);
+                       
+                       for(x = 0; x < p.height; x++)
                        {
-                               for(x = 0; x < p.width; x++)
+                               for(y = 0; y < 3; y++)
                                {
                                        p.points[x][y] = points[x][(i*2)+y];
                                }
                        }
                        patchList.push_back(p);
                }
-
-               if(cols && width >= 5)
+       } else 
+       {
+               //This returns exactly what comes in.. I don't know better :/
+               //If nothing is returned, the Patch in Radiant is just deleted - I suppose for evil follow up erros.
+               DPatch p;
+               
+               p.height = height;
+               p.width = width;
+               p.SetTexture(texture);
+               
+               for(x = 0; x < p.height; x++)
                {
-                       std::list<DPatch> patchList2;
-
-                       for(std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++)
+                       for(y = 0; y < p.width; y++)
                        {
-                               std::list<DPatch> patchList3 = (*patches).Split(false, true);
-                               
-                               for(std::list<DPatch>::iterator patches2 = patchList3.begin(); patches2 != patchList3.end(); patches2++)
-                                       patchList2.push_front(*patches2);
+                               p.points[x][y] = points[x][y];
                        }
-
-                       return patchList2;
                }
+               patchList.push_back(p);
        }
-       else if(cols && width >= 5)
+       return patchList;
+}
+
+std::list<DPatch> DPatch::Split()
+{
+       std::list<DPatch> patchList;
+       int i;
+       int x, y;
+       
+       if(width >= 5)
        {
                for(i = 0; i < (width-1)/2; i++)
                {
                        DPatch p;
-
-                       p.height = height;
+                       
                        p.width = 3;
+                       p.height = height;
+                       p.SetTexture(texture);
+                       
+                       for(x = 0; x < p.height; x++)
+                       {
+                               for(y = 0; y < 3; y++)
+                               {
+                                       p.points[x][y] = points[x][(i*2)+y];
+                               }
+                       }
+                       patchList.push_back(p);
+               }
+               std::list<DPatch> patchList2;
+               for(std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++)
+               {
+                       std::list<DPatch> patchList3 = (*patches).SplitRows();
+                       for(std::list<DPatch>::iterator patches2 = patchList3.begin(); patches2 != patchList3.end(); patches2++)
+                               patchList2.push_front(*patches2);
+               }
+               return patchList2;
+               
+       } else  if(height >= 5) 
+       {
+               for(i = 0; i < (height-1)/2; i++)
+               {
+                       DPatch p;
+                       
+                       p.width = width;
+                       p.height = 3;
                        p.SetTexture(texture);
-
                        for(x = 0; x < 3; x++)
                        {
-                               for(y = 0; y < p.height; y++)
+                               for(y = 0; y < p.width; y++)
                                {
                                        p.points[x][y] = points[(i*2)+x][y];
                                }
-                       }
-
+                       }                       
                        patchList.push_back(p);
+               }               
+               std::list<DPatch> patchList2;
+               for(std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++)
+               {
+                       std::list<DPatch> patchList3 = (*patches).SplitCols();
+                       for(std::list<DPatch>::iterator patches2 = patchList3.begin(); patches2 != patchList3.end(); patches2++)
+                               patchList2.push_front(*patches2);
                }
+               return patchList2;
+               
+       } else 
+       {
+               //This returns exactly what comes in.. I don't know better :/
+               //If nothing is returned, the Patch in Radiant is just deleted - I suppose for evil follow up erros.
+               DPatch p;
+               
+               p.height = height;
+               p.width = width;
+               p.SetTexture(texture);
+               
+               for(x = 0; x < p.height; x++)
+               {
+                       for(y = 0; y < p.width; y++)
+                       {
+                               p.points[x][y] = points[x][y];
+                       }
+               }
+               patchList.push_back(p);         
        }
-
        return patchList;
 }
index 3243918..5a956f9 100644 (file)
@@ -46,15 +46,17 @@ namespace scene
   class Instance;
 }
 
-#define MAX_PATCH_WIDTH 16
-#define MAX_PATCH_HEIGHT 16
+#define MAX_PATCH_WIDTH 32
+#define MAX_PATCH_HEIGHT 32
 #define MIN_PATCH_WIDTH 3
 #define MIN_PATCH_HEIGHT 3
 
 class DPatch  
 {
 public:
-       std::list<DPatch> Split(bool rows, bool cols);
+       std::list<DPatch> SplitRows();
+       std::list<DPatch> SplitCols();
+       std::list<DPatch> Split();
        void Transpose();
        void Invert();
        DPatch* MergePatches(patch_merge_t merge_info, DPatch* p1, DPatch* p2);
index be4f780..6e868be 100644 (file)
@@ -62,7 +62,7 @@ void BobToolz_destroy()
 char* PLUGIN_NAME = "bobToolz";
 
 // commands in the menu
-static char* PLUGIN_COMMANDS = "About...,-,Reset Textures...,PitOMatic,-,Vis Viewer,Brush Cleanup,Polygon Builder,Caulk Selection,-,Tree Planter,Drop Entity,Plot Splines,-,Merge Patches,Split patches,Turn edge";
+static char* PLUGIN_COMMANDS = "About...,-,Reset Textures...,PitOMatic,-,Vis Viewer,Brush Cleanup,Polygon Builder,Caulk Selection,-,Tree Planter,Drop Entity,Plot Splines,-,Merge Patches,Split patches,Split patches cols,Split patches rows,Turn edge";
 
 // globals
 GtkWidget *g_pRadiantWnd = NULL;
@@ -106,6 +106,10 @@ extern "C" void QERPlug_Dispatch (const char *p, vec3_t vMin, vec3_t vMax, bool
     DoMergePatches();
   } else if( string_equal_nocase( p, "split patches" ) ) {
     DoSplitPatch();
+  } else if( string_equal_nocase( p, "split patches rows" ) ) {
+       DoSplitPatchRows();
+  } else if( string_equal_nocase( p, "split patches cols" ) ) {
+       DoSplitPatchCols();
   } else if( string_equal_nocase( p, "turn edge" ) ) {
     DoFlipTerrain();
   } else if( string_equal_nocase(p, "reset textures...") ) {
index 5d1f16a..5e7b25c 100644 (file)
@@ -499,7 +499,7 @@ void DoSplitPatch() {
 
        patch.LoadFromPatch(instance);
 
-       std::list<DPatch> patchList = patch.Split( true, true );
+       std::list<DPatch> patchList = patch.Split();
        for(std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++) {
                (*patches).BuildInRadiant();
        }
@@ -507,6 +507,64 @@ void DoSplitPatch() {
        Path_deleteTop(instance.path());
 }
 
+void DoSplitPatchCols() {
+       UndoableCommand undo("bobToolz.splitPatchCols");
+       
+       DPatch patch;
+       
+       // ensure we have something selected
+       if( GlobalSelectionSystem().countSelected() != 1 )
+       {
+               DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
+               return; 
+       }
+       
+       scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+       
+       if( !Node_isPatch(instance.path().top()) ) {
+               DoMessageBox("You must select ONLY patches", "Error", eMB_OK);
+               return; 
+       }
+       
+       patch.LoadFromPatch(instance);
+       
+       std::list<DPatch> patchList = patch.SplitCols();
+       for(std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++) {
+               (*patches).BuildInRadiant();
+       }
+       
+       Path_deleteTop(instance.path());
+}
+
+void DoSplitPatchRows() {
+       UndoableCommand undo("bobToolz.splitPatchRows");
+       
+       DPatch patch;
+       
+       // ensure we have something selected
+       if( GlobalSelectionSystem().countSelected() != 1 )
+       {
+               DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
+               return; 
+       }
+       
+       scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+       
+       if( !Node_isPatch(instance.path().top()) ) {
+               DoMessageBox("You must select ONLY patches", "Error", eMB_OK);
+               return; 
+       }
+       
+       patch.LoadFromPatch(instance);
+       
+       std::list<DPatch> patchList = patch.SplitRows();
+       for(std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++) {
+               (*patches).BuildInRadiant();
+       }
+       
+       Path_deleteTop(instance.path());
+}
+
 void DoVisAnalyse()
 {
        char filename[1024];
index 8be283f..3f4202f 100644 (file)
@@ -62,6 +62,8 @@ void DoPitBuilder();
 void DoCTFColourChanger();
 void DoMergePatches();
 void DoSplitPatch();
+void DoSplitPatchRows();
+void DoSplitPatchCols();
 void DoVisAnalyse();
 void DoTrainThing();
 void DoTrainPathPlot();
index 107e477..cdb7dc7 100644 (file)
@@ -5,10 +5,12 @@ set -ex
 : ${OTOOL:=otool}
 : ${CP:=cp}
 : ${INSTALLDIR:=.}
+: ${EXE:=ppc}
+: ${MACLIBDIR:=/sw/lib}
 
 finkgetdeps()
 {
-       otool -L "$1" | grep /sw/lib | while read -r LIB STUFF; do
+       otool -L "$1" | grep "$MACLIBDIR" | while read -r LIB STUFF; do
                [ -z "${LIB##*:}" ] && continue # first line
                [ -f "$INSTALLDIR/${LIB##*/}" ] && continue
                cp -vL "$LIB" "$INSTALLDIR"
@@ -16,22 +18,22 @@ finkgetdeps()
        done
 }
 
-finkgetdeps "$INSTALLDIR/radiant.ppc"
+finkgetdeps "$INSTALLDIR/radiant.$EXE"
 echo Warning: this only works if only ONE version of gtk-2.0 and pango is installed
 
-for LIB in /sw/lib/gtk-2.0/*/loaders/libpixbufloader-bmp.so; do
+for LIB in "$MACLIBDIR"/gtk-2.0/*/loaders/libpixbufloader-bmp.so; do
        LAST=$LIB
 done
 cp -L "$LAST" "$INSTALLDIR"
 finkgetdeps "$LAST"
 
-for LIB in /sw/lib/pango/*/modules/pango-basic-fc.so; do
+for LIB in "$MACLIBDIR"/pango/*/modules/pango-basic-fc.so; do
        LAST=$LIB
 done
 cp -L "$LAST" "$INSTALLDIR"
 finkgetdeps "$LAST"
 
-for LIB in /sw/lib/pango/*/modules/pango-basic-x.so; do
+for LIB in "$MACLIBDIR"/pango/*/modules/pango-basic-x.so; do
        LAST=$LIB
 done
 cp -L "$LAST" "$INSTALLDIR"
diff --git a/setup/data/osx/NetRadiant.app/Contents/MacOS/install/fonts.conf b/setup/data/osx/NetRadiant.app/Contents/MacOS/install/fonts.conf
new file mode 100755 (executable)
index 0000000..86dc8af
--- /dev/null
@@ -0,0 +1,150 @@
+<?xml version="1.0"?>
+<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+<!-- /etc/fonts/fonts.conf file to configure system font access -->
+<fontconfig>
+
+<!--
+       DO NOT EDIT THIS FILE.
+       IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED.
+       LOCAL CHANGES BELONG IN 'local.conf'.
+
+       The intent of this standard configuration file is to be adequate for
+       most environments.  If you have a reasonably normal environment and
+       have found problems with this configuration, they are probably
+       things that others will also want fixed.  Please submit any
+       problems to the fontconfig bugzilla system located at fontconfig.org
+
+       Note that the normal 'make install' procedure for fontconfig is to
+       replace any existing fonts.conf file with the new version.  Place
+       any local customizations in local.conf which this file references.
+
+       Keith Packard
+-->
+
+<!-- Font directory list -->
+
+       <dir>/usr/share/fonts</dir>
+       <dir>/usr/X11/lib/X11/fonts</dir> <dir>/Library/Fonts</dir> <dir>/Network/Library/Fonts</dir> <dir>/System/Library/Fonts</dir> <dir>/opt/local/share/fonts</dir>
+       <dir>~/.fonts</dir>
+
+<!--
+  Accept deprecated 'mono' alias, replacing it with 'monospace'
+-->
+       <match target="pattern">
+               <test qual="any" name="family">
+                       <string>mono</string>
+               </test>
+               <edit name="family" mode="assign">
+                       <string>monospace</string>
+               </edit>
+       </match>
+
+<!--
+  Accept alternate 'sans serif' spelling, replacing it with 'sans-serif'
+-->
+       <match target="pattern">
+               <test qual="any" name="family">
+                       <string>sans serif</string>
+               </test>
+               <edit name="family" mode="assign">
+                       <string>sans-serif</string>
+               </edit>
+       </match>
+
+<!--
+  Accept deprecated 'sans' alias, replacing it with 'sans-serif'
+-->
+       <match target="pattern">
+               <test qual="any" name="family">
+                       <string>sans</string>
+               </test>
+               <edit name="family" mode="assign">
+                       <string>sans-serif</string>
+               </edit>
+       </match>
+
+<!--
+  Load local system customization file
+-->
+       <include ignore_missing="yes">conf.d</include>
+
+<!-- Font cache directory list -->
+
+       <cachedir>~/.fontconfig</cachedir>
+
+       <config>
+<!--
+  These are the default Unicode chars that are expected to be blank
+  in fonts.  All other blank chars are assumed to be broken and
+  won't appear in the resulting charsets
+ -->
+               <blank>
+                       <int>0x0020</int>       <!-- SPACE -->
+                       <int>0x00A0</int>       <!-- NO-BREAK SPACE -->
+                       <int>0x00AD</int>       <!-- SOFT HYPHEN -->
+                       <int>0x034F</int>       <!-- COMBINING GRAPHEME JOINER -->
+                       <int>0x0600</int>       <!-- ARABIC NUMBER SIGN -->
+                       <int>0x0601</int>       <!-- ARABIC SIGN SANAH -->
+                       <int>0x0602</int>       <!-- ARABIC FOOTNOTE MARKER -->
+                       <int>0x0603</int>       <!-- ARABIC SIGN SAFHA -->
+                       <int>0x06DD</int>       <!-- ARABIC END OF AYAH -->
+                       <int>0x070F</int>       <!-- SYRIAC ABBREVIATION MARK -->
+                       <int>0x115F</int>       <!-- HANGUL CHOSEONG FILLER -->
+                       <int>0x1160</int>       <!-- HANGUL JUNGSEONG FILLER -->
+                       <int>0x1680</int>       <!-- OGHAM SPACE MARK -->
+                       <int>0x17B4</int>       <!-- KHMER VOWEL INHERENT AQ -->
+                       <int>0x17B5</int>       <!-- KHMER VOWEL INHERENT AA -->
+                       <int>0x180E</int>       <!-- MONGOLIAN VOWEL SEPARATOR -->
+                       <int>0x2000</int>       <!-- EN QUAD -->
+                       <int>0x2001</int>       <!-- EM QUAD -->
+                       <int>0x2002</int>       <!-- EN SPACE -->
+                       <int>0x2003</int>       <!-- EM SPACE -->
+                       <int>0x2004</int>       <!-- THREE-PER-EM SPACE -->
+                       <int>0x2005</int>       <!-- FOUR-PER-EM SPACE -->
+                       <int>0x2006</int>       <!-- SIX-PER-EM SPACE -->
+                       <int>0x2007</int>       <!-- FIGURE SPACE -->
+                       <int>0x2008</int>       <!-- PUNCTUATION SPACE -->
+                       <int>0x2009</int>       <!-- THIN SPACE -->
+                       <int>0x200A</int>       <!-- HAIR SPACE -->
+                       <int>0x200B</int>       <!-- ZERO WIDTH SPACE -->
+                       <int>0x200C</int>       <!-- ZERO WIDTH NON-JOINER -->
+                       <int>0x200D</int>       <!-- ZERO WIDTH JOINER -->
+                       <int>0x200E</int>       <!-- LEFT-TO-RIGHT MARK -->
+                       <int>0x200F</int>       <!-- RIGHT-TO-LEFT MARK -->
+                       <int>0x2028</int>       <!-- LINE SEPARATOR -->
+                       <int>0x2029</int>       <!-- PARAGRAPH SEPARATOR -->
+                       <int>0x202A</int>       <!-- LEFT-TO-RIGHT EMBEDDING -->
+                       <int>0x202B</int>       <!-- RIGHT-TO-LEFT EMBEDDING -->
+                       <int>0x202C</int>       <!-- POP DIRECTIONAL FORMATTING -->
+                       <int>0x202D</int>       <!-- LEFT-TO-RIGHT OVERRIDE -->
+                       <int>0x202E</int>       <!-- RIGHT-TO-LEFT OVERRIDE -->
+                       <int>0x202F</int>       <!-- NARROW NO-BREAK SPACE -->
+                       <int>0x205F</int>       <!-- MEDIUM MATHEMATICAL SPACE -->
+                       <int>0x2060</int>       <!-- WORD JOINER -->
+                       <int>0x2061</int>       <!-- FUNCTION APPLICATION -->
+                       <int>0x2062</int>       <!-- INVISIBLE TIMES -->
+                       <int>0x2063</int>       <!-- INVISIBLE SEPARATOR -->
+                       <int>0x206A</int>       <!-- INHIBIT SYMMETRIC SWAPPING -->
+                       <int>0x206B</int>       <!-- ACTIVATE SYMMETRIC SWAPPING -->
+                       <int>0x206C</int>       <!-- INHIBIT ARABIC FORM SHAPING -->
+                       <int>0x206D</int>       <!-- ACTIVATE ARABIC FORM SHAPING -->
+                       <int>0x206E</int>       <!-- NATIONAL DIGIT SHAPES -->
+                       <int>0x206F</int>       <!-- NOMINAL DIGIT SHAPES -->
+                       <int>0x2800</int>       <!-- BRAILLE PATTERN BLANK -->
+                       <int>0x3000</int>       <!-- IDEOGRAPHIC SPACE -->
+                       <int>0x3164</int>       <!-- HANGUL FILLER -->
+                       <int>0xFEFF</int>       <!-- ZERO WIDTH NO-BREAK SPACE -->
+                       <int>0xFFA0</int>       <!-- HALFWIDTH HANGUL FILLER -->
+                       <int>0xFFF9</int>       <!-- INTERLINEAR ANNOTATION ANCHOR -->
+                       <int>0xFFFA</int>       <!-- INTERLINEAR ANNOTATION SEPARATOR -->
+                       <int>0xFFFB</int>       <!-- INTERLINEAR ANNOTATION TERMINATOR -->
+               </blank>
+<!--
+  Rescan configuration every 30 seconds when FcFontSetList is called
+ -->
+               <rescan>
+                       <int>30</int>
+               </rescan>
+       </config>
+
+</fontconfig>
diff --git a/setup/data/osx/NetRadiant.app/Contents/MacOS/install/fonts.dtd b/setup/data/osx/NetRadiant.app/Contents/MacOS/install/fonts.dtd
new file mode 100755 (executable)
index 0000000..cbdfdab
--- /dev/null
@@ -0,0 +1,224 @@
+<!-- This is the Document Type Definition for font configuration files -->
+<!ELEMENT fontconfig (dir | 
+                     cache | 
+                     cachedir |
+                     include | 
+                     config |
+                     selectfont |
+                     match | 
+                     alias)* >
+
+<!-- 
+    Add a directory that provides fonts
+-->
+<!ELEMENT dir (#PCDATA)>
+<!ATTLIST dir xml:space (default|preserve) 'preserve'>
+
+<!--
+    Define the per-user file that holds cache font information.
+
+    If the filename begins with '~', it is replaced with the users
+    home directory path.
+-->
+<!ELEMENT cache (#PCDATA)>
+<!ATTLIST cache xml:space (default|preserve) 'preserve'>
+
+<!--
+    Add a directory that is searched for font cache files.
+    These hold per-directory cache data and are searched in
+    order for each directory. When writing cache files, the first
+    directory which allows the cache file to be created is used.
+
+    A leading '~' in a directory name is replaced with the users
+    home directory path.
+-->
+<!ELEMENT cachedir (#PCDATA)>
+<!ATTLIST cachedir xml:space (default|preserve) 'preserve'>
+
+<!--
+    Reference another configuration file; note that this
+    is another complete font configuration file and not
+    just a file included by the XML parser.
+
+    Set 'ignore_missing' to 'yes' if errors are to be ignored.
+
+    If the filename begins with '~', it is replaced with the users
+    home directory path.
+-->
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include
+         ignore_missing    (no|yes)            "no"
+         xml:space         (default|preserve)  "preserve">
+
+<!--
+    Global library configuration data
+ -->
+<!ELEMENT config (blank|rescan)*>
+
+<!--
+    Specify the set of Unicode encoding values which
+    represent glyphs that are allowed to contain no
+    data.  With this list, fontconfig can examine
+    fonts for broken glyphs and eliminate them from
+    the set of valid Unicode chars.  This idea
+    was borrowed from Mozilla
+ -->
+<!ELEMENT blank (int)*>
+
+<!--
+    Aliases are just a special case for multiple match elements
+
+    They are syntactically equivalent to:
+
+    <match>
+       <test name="family">
+           <string value=[family]/>
+       </test>
+       <edit name="family" mode="prepend">
+           <string value=[prefer]/>
+           ...
+       </edit>
+       <edit name="family" mode="append">
+           <string value=[accept]/>
+           ...
+       </edit>
+       <edit name="family" mode="append_last">
+           <string value=[default]/>
+           ...
+       </edit>
+    </match>
+-->
+<!--
+    Periodically rescan the font configuration and
+    directories to synch internal state with filesystem
+ -->
+<!ELEMENT rescan (int)>
+
+<!--
+    Edit list of available fonts at startup/reload time
+ -->
+<!ELEMENT selectfont (rejectfont | acceptfont)* >
+
+<!ELEMENT rejectfont (glob | pattern)*>
+
+<!ELEMENT acceptfont (glob | pattern)*>
+
+<!ELEMENT glob (#PCDATA)>
+
+<!ELEMENT pattern (patelt)*>
+
+<!ENTITY % constant 'int|double|string|matrix|bool|charset|const'>
+
+<!ELEMENT patelt (%constant;)*>
+<!ATTLIST patelt
+         name CDATA    #REQUIRED>
+
+<!ELEMENT alias (family*, prefer?, accept?, default?)>
+<!ATTLIST alias
+         binding (weak|strong|same) "weak">
+<!ELEMENT prefer (family)*>
+<!ELEMENT accept (family)*>
+<!ELEMENT default (family)*>
+<!ELEMENT family (#PCDATA)>
+<!ATTLIST family xml:space (default|preserve) 'preserve'>
+
+<!ENTITY % expr 'int|double|string|matrix|bool|charset
+               |name|const
+               |or|and|eq|not_eq|less|less_eq|more|more_eq|contains|not_contains
+               |plus|minus|times|divide|not|if|floor|ceil|round|trunc'>
+
+<!--
+    Match and edit patterns.
+
+    If 'target' is 'pattern', execute the match before selecting a font.
+    if 'target' is 'font', execute the match on the result of a font
+    selection.
+-->
+<!ELEMENT match (test*, edit*)>
+<!ATTLIST match
+         target (pattern|font|scan) "pattern">
+
+<!--
+    Match a field in a pattern
+
+    if 'qual' is 'any', then the match succeeds if any value in the field matches.
+    if 'qual' is 'all', then the match succeeds only if all values match.
+    if 'qual' is 'first', then the match succeeds only if the first value matches.
+    if 'qual' is 'not_first', then the match succeeds only if any value other than
+       the first matches.
+    For match elements with target=font, if test 'target' is 'pattern',
+    then the test is applied to the pattern used in matching rather than
+    to the resulting font.
+
+    Match elements with target=scan are applied as fonts are scanned.
+    They edit the pattern generated from the scanned font and affect
+    what the fontconfig database contains.
+-->
+<!ELEMENT test (%expr;)*>
+<!ATTLIST test 
+         qual (any|all|first|not_first)    "any"
+         name CDATA        #REQUIRED
+         target (pattern|font|default)         "default"
+         compare (eq|not_eq|less|less_eq|more|more_eq|contains|not_contains)   "eq">
+
+<!--
+    Edit a field in a pattern
+
+    The enclosed values are used together to edit the list of values
+    associated with 'name'.
+
+    If 'name' matches one of those used in a test element for this match element:
+       if 'mode' is 'assign', replace the matched value.
+       if 'mode' is 'assign_replace', replace all of the values
+       if 'mode' is 'prepend', insert before the matched value
+       if 'mode' is 'append', insert after the matched value
+       if 'mode' is 'prepend_first', insert before all of the values
+       if 'mode' is 'append_last', insert after all of the values
+    If 'name' doesn't match any of those used in a test element:
+       if 'mode' is 'assign' or 'assign_replace, replace all of the values
+       if 'mode' is 'prepend' or 'prepend_first', insert before all of the values
+       if 'mode' is 'append' or 'append_last', insert after all of the values
+-->
+<!ELEMENT edit (%expr;)*>
+<!ATTLIST edit
+         name CDATA        #REQUIRED
+         mode (assign|assign_replace|prepend|append|prepend_first|append_last) "assign"
+         binding (weak|strong|same) "weak">
+
+<!--
+    Elements of expressions follow
+-->
+<!ELEMENT int (#PCDATA)>
+<!ATTLIST int xml:space (default|preserve) 'preserve'>
+<!ELEMENT double (#PCDATA)>
+<!ATTLIST double xml:space (default|preserve) 'preserve'>
+<!ELEMENT string (#PCDATA)>
+<!ATTLIST string xml:space (default|preserve) 'preserve'>
+<!ELEMENT matrix (double,double,double,double)>
+<!ELEMENT bool (#PCDATA)>
+<!ELEMENT charset (#PCDATA)>
+<!ATTLIST charset xml:space (default|preserve) 'preserve'>
+<!ELEMENT name (#PCDATA)>
+<!ATTLIST name xml:space (default|preserve) 'preserve'>
+<!ELEMENT const (#PCDATA)>
+<!ATTLIST const xml:space (default|preserve) 'preserve'>
+<!ELEMENT or (%expr;)*>
+<!ELEMENT and (%expr;)*>
+<!ELEMENT eq ((%expr;), (%expr;))>
+<!ELEMENT not_eq ((%expr;), (%expr;))>
+<!ELEMENT less ((%expr;), (%expr;))>
+<!ELEMENT less_eq ((%expr;), (%expr;))>
+<!ELEMENT more ((%expr;), (%expr;))>
+<!ELEMENT more_eq ((%expr;), (%expr;))>
+<!ELEMENT contains ((%expr;), (%expr;))>
+<!ELEMENT not_contains ((%expr;), (%expr;))>
+<!ELEMENT plus (%expr;)*>
+<!ELEMENT minus (%expr;)*>
+<!ELEMENT times (%expr;)*>
+<!ELEMENT divide (%expr;)*>
+<!ELEMENT not (%expr;)>
+<!ELEMENT if ((%expr;), (%expr;), (%expr;))>
+<!ELEMENT floor (%expr;)>
+<!ELEMENT ceil (%expr;)>
+<!ELEMENT round (%expr;)>
+<!ELEMENT trunc (%expr;)>
index 3df16e3..2f8bc00 100755 (executable)
@@ -7,10 +7,11 @@ MY_DIRECTORY="${MY_DIRECTORY%/*}" # cut off Contents
 export DYLD_LIBRARY_PATH="$MY_DIRECTORY/Contents/MacOS/install"
 export PANGO_RC_FILE="$MY_DIRECTORY/Contents/MacOS/install/pangorc"
 export GDK_PIXBUF_MODULE_FILE="$MY_DIRECTORY/Contents/MacOS/install/gdk-pixbuf.loaders"
+export FONTCONFIG_FILE="$MY_DIRECTORY/Contents/MacOS/install/fonts.conf"
 
 cd "$MY_DIRECTORY/Contents/MacOS/install"
 if [ -x /usr/bin/open-x11 ]; then
-       /usr/bin/open-x11 ./radiant.ppc "$@" &
+       /usr/bin/open-x11 ./radiant.%EXE% "$@" &
 else
-       ./radiant.ppc "$@" &
+       ./radiant.%EXE% "$@" &
 fi