From 858fd5f7f120de6a8d0c916937f073591b0a0c3b Mon Sep 17 00:00:00 2001 From: Just van Rossum Date: Thu, 2 Mar 2000 01:38:53 +0000 Subject: [PATCH] Mac demo support stuff. --- demos/mac/README | 22 +++ demos/mac/codewarrior/ftlint.prj | Bin 0 -> 32526 bytes demos/mac/codewarrior/ftview.prj | Bin 0 -> 35766 bytes demos/mac/ftlint_m.c | 59 ++++++ demos/mac/ftview_m.c | 59 ++++++ demos/mac/getargv.c | 312 +++++++++++++++++++++++++++++++ demos/mac/getargv.h | 19 ++ demos/mac/resource.hqx | 38 ++++ 8 files changed, 509 insertions(+) create mode 100644 demos/mac/README create mode 100644 demos/mac/codewarrior/ftlint.prj create mode 100644 demos/mac/codewarrior/ftview.prj create mode 100644 demos/mac/ftlint_m.c create mode 100644 demos/mac/ftview_m.c create mode 100644 demos/mac/getargv.c create mode 100644 demos/mac/getargv.h create mode 100644 demos/mac/resource.hqx diff --git a/demos/mac/README b/demos/mac/README new file mode 100644 index 000000000..9674240ae --- /dev/null +++ b/demos/mac/README @@ -0,0 +1,22 @@ +This folder contains supporting code and CodeWarrior Pro 4 project +files to build the FreeType demo programs ftlint and ftview for MacOS. + +Building +To build these apps, you'll first need to build the FreeType library +(see config/mac). The applications get built in the demos/bin folder. + +Notes +Since the Mac doesn't have the notion of argc/argv, we'll emulate +this: each file dropped onto the application will be translated +to a command line argument. Both ftlint and ftview take a ppem +value as their first command line argument: for the Mac version +this has been hard-coded into the source. Also: the additional +options for ftview cannot be set. + +Have fun with FreeType on the Mac! + +Just van Rossum, + +DISCLAIMER: this subdirectory is *not* being maintained by the +FreeType team, but by Just van Rossum. It's being released under +the same terms as FreeType (see license.txt). diff --git a/demos/mac/codewarrior/ftlint.prj b/demos/mac/codewarrior/ftlint.prj new file mode 100644 index 0000000000000000000000000000000000000000..a76742e67b664c08c80d121a26c3cccf2e0c4d3f GIT binary patch literal 32526 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 aAx7`tz6E-eT=3BkOYG#o?*=1E?*9S9(K7!4 literal 0 HcmV?d00001 diff --git a/demos/mac/codewarrior/ftview.prj b/demos/mac/codewarrior/ftview.prj new file mode 100644 index 0000000000000000000000000000000000000000..3eedd83e9e76788bcfa5a287a8d3df322b68a3b8 GIT binary patch literal 35766 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 +#include "getargv.h" +#include +#include +#include +#include + +static void +init_toolbox() +{ + InitGraf(&qd.thePort); + InitFonts(); + InitWindows(); + TEInit(); + InitDialogs((long)0); + InitMenus(); + InitCursor(); + SIOUXSettings.asktosaveonclose = 0; +} + +int main() +{ + int argc, i; + char** argv; + + init_toolbox(); + + /* put paths of all files dropped onto the app into argv */ + argc = FTMac_GetArgv(&argv); + if (argc < 2) + { + printf("Please drop one or more font files onto the app (but quit first!)\n"); + exit(1); + } + /* move argv[1:] to argv[2:] and fill in the ppem arg */ + for (i = argc; i > 1; i--) + { + argv[i] = argv[i-1]; + } + argc++; + argv[1] = PPEM; + /* call the original main() program */ + original_main(argc, argv); +} diff --git a/demos/mac/ftview_m.c b/demos/mac/ftview_m.c new file mode 100644 index 000000000..c4edc7e60 --- /dev/null +++ b/demos/mac/ftview_m.c @@ -0,0 +1,59 @@ +/* minimal Mac wrapper for the ftview.c program */ + + +int original_main( int argc, char** argv ); + +/* We rename the original main() program to original_main, + so we can provide a wrapper around it */ +#define main original_main +#include "ftview.c" +#undef main + + +#define PPEM "24" /* hard-code the ppem size */ + + +#include +#include "getargv.h" +#include +#include +#include +#include + +static void +init_toolbox() +{ + InitGraf(&qd.thePort); + InitFonts(); + InitWindows(); + TEInit(); + InitDialogs((long)0); + InitMenus(); + InitCursor(); + SIOUXSettings.asktosaveonclose = 0; +} + +int main() +{ + int argc, i; + char** argv; + + init_toolbox(); + + /* put paths of all files dropped onto the app into argv */ + argc = FTMac_GetArgv(&argv); + if (argc < 2) + { + printf("Please drop one or more font files onto the app (but quit first!)\n"); + exit(1); + } + /* move argv[1:] to argv[2:] and fill in the ppem arg */ + for (i = argc; i > 1; i--) + { + argv[i] = argv[i-1]; + } + argc++; + argv[1] = PPEM; + /* call the original main() program */ + original_main(argc, argv); +} diff --git a/demos/mac/getargv.c b/demos/mac/getargv.c new file mode 100644 index 000000000..7ff18e03b --- /dev/null +++ b/demos/mac/getargv.c @@ -0,0 +1,312 @@ +/*********************************************************** +Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, +The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* Construct argc and argv for main() by using Apple Events */ +/* From Jack's implementation for STDWIN */ + +/* Modified for use with FreeType from MacPython's macgetargv.c + by Just van Rossum */ + +#include +#include +#include "getargv.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifdef GENERATINGCFM /* Defined to 0 or 1 in Universal headers */ +#define HAVE_UNIVERSAL_HEADERS +#endif + +#ifndef HAVE_UNIVERSAL_HEADERS +#define NewAEEventHandlerProc(x) (x) +#define AEEventHandlerUPP EventHandlerProcPtr +#endif + +static int arg_count; +static char *arg_vector[256]; +static char app_name[256]; +static int app_name_inited; + + +/* Duplicate a string to the heap. */ + +static char * +strdup(char *src) +{ + char *dst = malloc(strlen(src) + 1); + if (dst) + strcpy(dst, src); + return dst; +} + + +/* Given an FSSpec, return the FSSpec of the parent folder */ + +static OSErr +get_folder_parent (FSSpec * fss, FSSpec * parent) +{ + CInfoPBRec rec; + short err; + + * parent = * fss; + rec.hFileInfo.ioNamePtr = parent->name; + rec.hFileInfo.ioVRefNum = parent->vRefNum; + rec.hFileInfo.ioDirID = parent->parID; + rec.hFileInfo.ioFDirIndex = -1; + rec.hFileInfo.ioFVersNum = 0; + if (err = PBGetCatInfoSync (& rec)) + return err; + parent->parID = rec.dirInfo.ioDrParID; +/* parent->name[0] = 0; */ + return 0; +} + + +/* Given an FSSpec return a full, colon-separated pathname */ + +static OSErr +FTMac_GetFullPath (FSSpec *fss, char *buf) +{ + short err; + FSSpec fss_parent, fss_current; + char tmpbuf[256]; + int plen; + + fss_current = *fss; + plen = fss_current.name[0]; + memcpy(buf, &fss_current.name[1], plen); + buf[plen] = 0; + /* Special case for disk names */ + if ( fss_current.parID <= 1 ) { + buf[plen++] = ':'; + buf[plen] = 0; + return 0; + } + while (fss_current.parID > 1) { + /* Get parent folder name */ + if (err = get_folder_parent(&fss_current, &fss_parent)) + return err; + fss_current = fss_parent; + /* Prepend path component just found to buf */ + plen = fss_current.name[0]; + if (strlen(buf) + plen + 1 > 256) { + /* Oops... Not enough space (shouldn't happen) */ + *buf = 0; + return -1; + } + memcpy(tmpbuf, &fss_current.name[1], plen); + tmpbuf[plen] = ':'; + strcpy(&tmpbuf[plen+1], buf); + strcpy(buf, tmpbuf); + } + return 0; +} + + +/* Initialize name of current application */ + +static OSErr +init_app_name() +{ + ProcessSerialNumber currentPSN; + ProcessInfoRec info; + OSErr err; + FSSpec appSpec; + + if ( app_name_inited ) return 0; + currentPSN.highLongOfPSN = 0; + currentPSN.lowLongOfPSN = kCurrentProcess; + info.processInfoLength = sizeof(ProcessInfoRec); + info.processName = NULL; + info.processAppSpec = &appSpec; + if ( err=GetProcessInformation(¤tPSN, &info)) + return err; + strncpy(app_name, (char*)appSpec.name + 1, appSpec.name[0]); + app_name[appSpec.name[0]] = '\0'; + app_name_inited = 1; + return 0; +} + + +/* Check that there aren't any args remaining in the event */ + +static OSErr +get_missing_params(AppleEvent *theAppleEvent) +{ + DescType theType; + Size actualSize; + OSErr err; + + err = AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard, + &theType, nil, 0, &actualSize); + if (err == errAEDescNotFound) + return noErr; + else + return errAEEventNotHandled; +} + +static int got_one; /* Flag that we can stop getting events */ + + +/* Handle the Print or Quit events (by failing) */ + +static pascal OSErr +handle_not(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon) +{ + #pragma unused (reply, refCon) + got_one = 1; + return errAEEventNotHandled; +} + + +/* Handle the Open Application event (by ignoring it) */ + +static pascal OSErr +handle_open_app(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon) +{ + #pragma unused (reply, refCon) +#if 0 + /* Test by Jack: would removing this facilitate debugging? */ + got_one = 1; +#endif + return get_missing_params(theAppleEvent); +} + + +/* Handle the Open Document event, by adding an argument */ + +static pascal OSErr +handle_open_doc(AppleEvent *theAppleEvent, AppleEvent *reply, long refCon) +{ + #pragma unused (reply, refCon) + OSErr err; + AEDescList doclist; + AEKeyword keywd; + DescType rttype; + long i, ndocs, size; + FSSpec fss; + char path[256]; + + got_one = 1; + if (err = AEGetParamDesc(theAppleEvent, + keyDirectObject, typeAEList, &doclist)) + return err; + if (err = get_missing_params(theAppleEvent)) + return err; + if (err = AECountItems(&doclist, &ndocs)) + return err; + for(i = 1; i <= ndocs; i++) { + err = AEGetNthPtr(&doclist, i, typeFSS, + &keywd, &rttype, &fss, sizeof(fss), &size); + if (err) + break; + FTMac_GetFullPath(&fss, path); + arg_vector[arg_count++] = strdup(path); + } + return err; +} + + +/* Install standard core event handlers */ +static AEEventHandlerUPP open_doc_upp; +static AEEventHandlerUPP open_app_upp; +static AEEventHandlerUPP not_upp; + +static void +set_ae_handlers() +{ + open_doc_upp = NewAEEventHandlerProc(handle_open_doc); + open_app_upp = NewAEEventHandlerProc(handle_open_app); + not_upp = NewAEEventHandlerProc(handle_not); + + AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, + open_app_upp, 0L, false); + AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, + open_doc_upp, 0L, false); + AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, + not_upp, 0L, false); + AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, + not_upp, 0L, false); +} + +/* Uninstall standard core event handlers */ + +static void +reset_ae_handlers() +{ + AERemoveEventHandler(kCoreEventClass, kAEOpenApplication, + open_app_upp, false); + AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments, + open_doc_upp, false); + AERemoveEventHandler(kCoreEventClass, kAEPrintDocuments, + not_upp, false); + AERemoveEventHandler(kCoreEventClass, kAEQuitApplication, + not_upp, false); +} + +/* Wait for events until a core event has been handled */ + +static void +event_loop() +{ + EventRecord event; + int n; + int ok; + + got_one = 0; + for (n = 0; n < 100 && !got_one; n++) { + SystemTask(); + ok = GetNextEvent(everyEvent, &event); + if (ok && event.what == kHighLevelEvent) { + AEProcessAppleEvent(&event); + } + } +} + +/* Get the argv vector, return argc. See macgetargv.h for more doco. */ + +int +FTMac_GetArgv(pargv) + char ***pargv; +{ + + arg_count = 0; + (void)init_app_name(); + arg_vector[arg_count++] = strdup(app_name); + + set_ae_handlers(); + event_loop(); + reset_ae_handlers(); + + arg_vector[arg_count] = NULL; + + *pargv = arg_vector; + return arg_count; +} diff --git a/demos/mac/getargv.h b/demos/mac/getargv.h new file mode 100644 index 000000000..a13289dd8 --- /dev/null +++ b/demos/mac/getargv.h @@ -0,0 +1,19 @@ +/* + + FTMac_GetArgv + + + argc/argv emulation for the Mac. Converts files dropped + onto the application to full paths, and stuff them into + argv. + + + pargv :: a pointer to an argv array. The array doesn't need to + exist before calling this function. + + + The number of files dropped onto the app (ie. argc) +*/ + +int FTMac_GetArgv(char ***pargv); + diff --git a/demos/mac/resource.hqx b/demos/mac/resource.hqx new file mode 100644 index 000000000..cde902da4 --- /dev/null +++ b/demos/mac/resource.hqx @@ -0,0 +1,38 @@ +(This file must be converted with BinHex 4.0) +:$(*PFfpeFQ0P,R0TG!"6594%8dP8)3%!!!!'[!!!!!!REP0*9#%!!J!!"Vab6'& +e!RX!!!!@EhX0!!YQG'aTER3ZFR0bB`K"ST!!!%9qHJ!!!)!!!!!!#%PXcPl2#BB +!!!!!!!!!!!!!!!!!!!!!!!!"R`!!!!$rrrrrFR0bBe*6483"!,6HlZHdhZmk!!! +"Q3!!!!!!!!%C!!!!!"2I!!!!!!!!!!#2I4%!#"`XG3MLeZTM1d$2c[ec0aXql5S +ShPIL[&U,h14S@fT@KjEj-dK+IjNHBG)R-N9+9!`J2MP%TSHT%#Nd-qT*elC3-#N +4JA)Hkc6qlRVSqDHb&A*3a9&1cdmjhEbBUHN9ad&X+`E&1ceI!Y68j0ki6qFA)(r +b,FRGeI4f6k%5&4RNVXbJD-emb41U6CZldibq,@I[0+0[hAC1Pd8qb1GJMXlkGX[ +Qi$6*5FhCV+hMcp9GjDB!CG6%FFi-Y%hSD+RR#(40DQ1''@VI1VRml-&F9CdAA5b +'mAYaP!drhR!2h3*kJDG9FQ)R4mZIfD4`CM-&4Q9IJU0XbMdc06QfE,r!c)B,BXZ +5lI0h(XbS`)*QmLcRP#B"!!!!$3!,CR4fD@9h,R*cFQ-)3D+3!!"&IRS!!!#!!!! +!!!K*E-kIZJQ'!!!!!!!!!!!!!!!!!!!!&J!!!!!!!!!!rrrrrh*cFQ058d9%!3# +dhZlRY0pi`J!!#Fd!!!!!!!!%V3!!!!#NcJ!!!!!!!!!!i8X,3,6cZVA1c0lNY)[ +f+j[)D@pq&ff8&[hml++YG5DRR()cQTfYCHr*j#YEf5Jc%CLIXrbFjqFX2cmr2dr +ZTpFJfU$ca31a!b+85iiI35I(Bq'a#e!!VJ6J!#F!VSd!Nr('42m&cC%BQfS+kII +X%,b5(HDLA-XlBDbP"ISMY'LUSfGRDkm!HhGl5NUk05!P)laE*h[lM)b!S+!8DhG +VJA4q'GFk-X)*HFCMl1QrCp29l+`h+kl(I3FBqcaJl-h0E-YliEX#cZ%fH-9NHb2 +[J5A*h#if"qk@8jD%["I4@8lH[MDBr'c`$(5cE+ral1fF[*0$mqINR4`FEH`P-!" +ZaYZ$[j86fKM'6M`k&3TTDRc[bEfDM@PAb0Zc`KL$6e6mrPk'RD,L)U0H$fC!XbD +@b[N$+ecGH0iXmEpL-Vhq#F#BEGiV"UHAIc%8q2X*3m(RMaLFRfBcZ16HC5Mdq$C +$iBFh'%`j9aPFlepL+(,[2%241fFBh,*1-"5lGC6"rHBKKZ,Apc&iA0[&81,+GSD +5PlF`P,UiJF(c`PU'dZG@-ALGAFE`cZP&$0iRjc'816k,SHbaD3c[(TR%i(0i(%1 +jJk-BbZmIaP"Klb!'mqlq$"9hpQ@SY+-R3q9YGSBU@fd-96GhBI$GQ-V`h[S1$(l +VNKLUV@R$8(ee!N10PDdBr*HhB+LjY"P$`1*)KX#&B3a"md-BDXeY`&"lGKf'pfI +@BJLHAT1KcY4U$(8R9f@S0l%L3rhaj4JDM#h$d("dDBB24TCJD$5m'%2)8&H'aS0 +G'$iFk-33f[mP3eLrj`cKIA-CQ[4qb"$4mcj$T1-13j6p&N26c1X-dEBV$-h5,c) +dlh+1iD1dd``aUFFC@R3m`Q$TF*!!)6Cj,d2,T*d-VGTZBiKVXjQKGH*kK[L%03` +IakpJ5)KE`["*b`8-LCBj$*r'c'"Sdh`+`fI4%aMD4SeKq$aL"%05q"#'GU%$'*) +Epf0ShkJh3iH'$SD8qTN-(HZQ-eL$daK5DhGNk"58c*!!&Y#@SE0r)N1Ak[%-AIe +D-U6laM"N9)PQX&@+B1KQ$QA),0q)i3ZIqJcfXX%-hEf$'"aHrJ`p22dBHTDX`Y$ +,`mc3fpf(SBqE0d2I)Ti-AjSm'2S9FQ2ibYR%d,q!-m2A1KN-d2PQS$a)(L`2NBI ++`q6KmJKjT$a+(Lf2NFI+iq6amJ4jSMa*RLa2NDI+dq6TmJajTMa,RLh2NHI+mq6 +jmJ*jSEa)AL`[NCI+bq6PmJTjTEa+ALer)kq4emVVj'rPpI)'HD1m5GiXEj'hbYr +*fq6YmJljHhQR[%[H,Hq4pmVlj2hb!IQJI%Jq,2mJ(j'2bXIN(qAMmJRjT(a+2Lf +INFr+2mRRj22b"IPRqD*m5EiXrb*INDr+eq4IjH[b$IQQr*Ym5liYCmQrbhINZr) +pq3rj[T`YjmJ2j)Ib)rQar+HF+cq4RmV2j1IbAr,ImJ[jTIa+cVrAq2IZa#8h`e( +[M,(L!aX+KPXLBSbe5VT9#0!Y3m18p"i1`e(jTiGr6K,QYpFN0E5riJD$A(+l,R' +2l@@cfXefDrGZ2H`TeP*4GUXe[NqQe4`@CXjXRfje1+cr!`IL!!!: