mirror of
https://github.com/python/cpython.git
synced 2025-11-01 10:45:30 +00:00
second CoreGraphics batch
This commit is contained in:
parent
c97eefc3c9
commit
79e71f73e7
8 changed files with 3414 additions and 0 deletions
1360
Mac/Modules/cg/CFMLateImport.c
Executable file
1360
Mac/Modules/cg/CFMLateImport.c
Executable file
File diff suppressed because it is too large
Load diff
272
Mac/Modules/cg/CFMLateImport.h
Executable file
272
Mac/Modules/cg/CFMLateImport.h
Executable file
|
|
@ -0,0 +1,272 @@
|
||||||
|
/*
|
||||||
|
File: CFMLateImport.h
|
||||||
|
|
||||||
|
Contains: Interface to CFM late import library.
|
||||||
|
|
||||||
|
Written by: Quinn
|
||||||
|
|
||||||
|
Copyright: Copyright © 1999 by Apple Computer, Inc., all rights reserved.
|
||||||
|
|
||||||
|
You may incorporate this Apple sample source code into your program(s) without
|
||||||
|
restriction. This Apple sample source code has been provided "AS IS" and the
|
||||||
|
responsibility for its operation is yours. You are not permitted to redistribute
|
||||||
|
this Apple sample source code as "Apple sample source code" after having made
|
||||||
|
changes. If you're going to re-distribute the source, we require that you make
|
||||||
|
it clear in the source that the code was descended from Apple sample source
|
||||||
|
code, but that you've made changes.
|
||||||
|
|
||||||
|
Change History (most recent first):
|
||||||
|
|
||||||
|
<6> 21/9/01 Quinn Changes for CWPro7 Mach-O build.
|
||||||
|
<5> 19/9/01 Quinn Change comments to reflect the fact that an unpacked data
|
||||||
|
section is no longer required.
|
||||||
|
<4> 19/9/01 Quinn Simplified API and implementation after a suggestion by Eric
|
||||||
|
Grant. You no longer have to CFM export a dummy function; you
|
||||||
|
can just pass in the address of your fragment's init routine.
|
||||||
|
<3> 16/11/00 Quinn Allow symbol finding via a callback and use that to implement
|
||||||
|
CFBundle support.
|
||||||
|
<2> 18/10/99 Quinn Renamed CFMLateImport to CFMLateImportLibrary to allow for
|
||||||
|
possible future API expansion.
|
||||||
|
<1> 15/6/99 Quinn First checked in.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// MoreIsBetter Setup
|
||||||
|
|
||||||
|
//#include "MoreSetup.h"
|
||||||
|
|
||||||
|
// Mac OS Interfaces
|
||||||
|
|
||||||
|
#if ! MORE_FRAMEWORK_INCLUDES
|
||||||
|
#include <MacTypes.h>
|
||||||
|
#include <CodeFragments.h>
|
||||||
|
#include <Devices.h>
|
||||||
|
#include <CFBundle.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FAQ
|
||||||
|
---
|
||||||
|
|
||||||
|
Q: What does this library do?
|
||||||
|
A: It allows you to resolve a weak linked library at runtime,
|
||||||
|
by supply a CFM connection to the library that should substitute
|
||||||
|
for the weak linked one.
|
||||||
|
|
||||||
|
Q: Does the substituted library have to have the same name as the
|
||||||
|
weak linked library.
|
||||||
|
A: No.
|
||||||
|
|
||||||
|
Q: What's this useful for?
|
||||||
|
A: The most obvious example of where this is useful is when
|
||||||
|
you rely on shared libraries that the user might delete
|
||||||
|
or move. To can find the shared library (possibly even
|
||||||
|
using CatSearch), call GetDiskFragment to open a connection
|
||||||
|
to it, late import it using this library, and then the
|
||||||
|
rest of your code can continue to use the shared library
|
||||||
|
as if nothing had happened. No more defining thousands
|
||||||
|
of stub routines which call through routine pointers.
|
||||||
|
|
||||||
|
There are, however, numerous less obvious uses. You can
|
||||||
|
use this code to make a 'self repairing' application. If
|
||||||
|
the user removes your shared library from the Extensions
|
||||||
|
folder, the startup code for your application can offer
|
||||||
|
tor re-install it. If the user agrees, you can then
|
||||||
|
re-install your shared library, late import it, and then
|
||||||
|
continue running your application if nothing happened.
|
||||||
|
|
||||||
|
You can even use this code to free yourself from the
|
||||||
|
Extensions folder entirely. Say you have a suite of
|
||||||
|
applications that currently installs a dozen shared
|
||||||
|
libraries in the Extensions folder. You can move those
|
||||||
|
libraries to another folder entirely and each application's
|
||||||
|
startup code can track down the library (using an alias
|
||||||
|
in the Preferences file) and late import it.
|
||||||
|
|
||||||
|
An even cooler use is to provide easy abstraction layers.
|
||||||
|
Say you have a network code for both the MacTCP
|
||||||
|
API and the Open Transport API. Typically, you would be
|
||||||
|
force to do this by having an abstraction layer where every
|
||||||
|
routine contains a switch between MacTCP and OT. Your
|
||||||
|
OpenSocket routine might look like:
|
||||||
|
|
||||||
|
static int OpenSocket(void)
|
||||||
|
{
|
||||||
|
if (gOTAvailable) {
|
||||||
|
return OpenSocketOT();
|
||||||
|
} else {
|
||||||
|
return OpenSocketMacTCP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
With this code, you can avoid that entirely. Simply
|
||||||
|
weak link to a shared library that you know is never
|
||||||
|
going to be implemented ("crea;MySocketsDummy") and then,
|
||||||
|
at runtime, decide whether the system has MacTCP or OT
|
||||||
|
and late import the relevant real implementation
|
||||||
|
("crea;MySocketsMacTCP" or "crea;MySocketsOT").
|
||||||
|
One benefit of this approach is that only the MacTCP or
|
||||||
|
the OT code is resident in memory on any given system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef pascal OSStatus (*CFMLateImportLookupProc)(ConstStr255Param symName, CFragSymbolClass symClass,
|
||||||
|
void **symAddr, void *refCon);
|
||||||
|
// CFMLateImportLookupProc defines a callback for CFMLateImportCore.
|
||||||
|
// The routine is expected to look up the address of the symbol named
|
||||||
|
// symName and return it in *symAddr. The symbol should be of class
|
||||||
|
// symClass, although the callback decides whether a class mismatch is
|
||||||
|
// an error. refCon is an application defined value that was originally
|
||||||
|
// passed in to CFMLateImportCore.
|
||||||
|
//
|
||||||
|
// If this routine returns an error, a symbol address of 0 is assumed.
|
||||||
|
// If the symbol is marked as a weak import, the CFMLateImportCore will
|
||||||
|
// continue, otherwise the CFMLateImportCore routine will fail with the
|
||||||
|
// error.
|
||||||
|
|
||||||
|
extern pascal OSStatus CFMLateImportCore(const CFragSystem7DiskFlatLocator *fragToFixLocator,
|
||||||
|
CFragConnectionID fragToFixConnID,
|
||||||
|
CFragInitFunction fragToFixInitRoutine,
|
||||||
|
ConstStr255Param weakLinkedLibraryName,
|
||||||
|
CFMLateImportLookupProc lookup,
|
||||||
|
void *refCon);
|
||||||
|
// This routine will link you, at runtime, to some library
|
||||||
|
// that you were weak linked to and wasn't present when your
|
||||||
|
// fragment was prepared. As well as the obvious functionality
|
||||||
|
// of being able to resolve weak links after prepare time,
|
||||||
|
// this functionality can be put to a number of less obvious uses,
|
||||||
|
// some of which are discussed at the top of this header file.
|
||||||
|
//
|
||||||
|
// To call this routine, you need a number of pieces of information:
|
||||||
|
//
|
||||||
|
// 1. fragToFixLocator, fragToFixConnID: The location of your own
|
||||||
|
// code fragment on disk and the CFM connection ID to your own
|
||||||
|
// code fragment. Typically you get this information from your
|
||||||
|
// fragment's CFM init routine. You must ensure that
|
||||||
|
// fragToFixLocator->fileSpec points to an FSSpec of the
|
||||||
|
// file which holds your code fragment.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// The fact that you pass in a CFragSystem7DiskFlatLocator as the
|
||||||
|
// fragToFixLocator implies that the fragment to be fixed up must
|
||||||
|
// be in the data fork of a file. The code could be modified
|
||||||
|
// to remove this requirement, but on disk code fragments are the most
|
||||||
|
// common case.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// The fragment to fix may have a packed data section. Packing the
|
||||||
|
// data section will reduce the size of your fragment on disk, but it
|
||||||
|
// will significantly increase the memory needed by this routine
|
||||||
|
// (it increases memory usage by the sum of the sizes of the packed
|
||||||
|
// and unpacked data section). See below for instructions on how to
|
||||||
|
// create an unpacked data section.
|
||||||
|
//
|
||||||
|
// 2. fragToFixInitRoutine: A pointer to your own code fragment's
|
||||||
|
// fragment initialiser routine. You necessarily have one of these
|
||||||
|
// because you need it to get values for the fragToFixLocator and
|
||||||
|
// fragToFixConnID parameters. Just pass its address in as a parameter
|
||||||
|
// as well.
|
||||||
|
//
|
||||||
|
// 3. weakLinkedLibraryName: The name of the weak linked library which
|
||||||
|
// failed to link. You must have weak linked to this library.
|
||||||
|
// It is oxymoric for you to pass a strong linked library here,
|
||||||
|
// because your code would not have prepared if a strong linked
|
||||||
|
// library failed to prepare, and so you couldn't supply a valid
|
||||||
|
/// fragToFix.
|
||||||
|
//
|
||||||
|
// 4. lookup, refCon: A pointer to a callback function that the
|
||||||
|
// routine calls to look up the address of a symbol, and a refCon
|
||||||
|
// for that callback routine.
|
||||||
|
//
|
||||||
|
// Note:
|
||||||
|
// The fragToFixLocator and fragToFixInitRoutine parameters
|
||||||
|
// are artifacts of the way in which this functionality is implemented.
|
||||||
|
// In an ideal world, where CFM exported decent introspection APIs
|
||||||
|
// to third party developers, these parameters would not be necessary.
|
||||||
|
// If you're using this code inside Apple, you probably should investigate
|
||||||
|
// using the CFM private APIs for getting at the information these
|
||||||
|
// parameters are needed for. See the comments inside the implementation
|
||||||
|
// for more details.
|
||||||
|
//
|
||||||
|
// Note:
|
||||||
|
// The extra memory taken when you use a packed data section is also an
|
||||||
|
// artifact of my workaround for the lack of CFM introspection APIs. In
|
||||||
|
// my opinion it's better to use an unpacked data section and consume more
|
||||||
|
// space on disk while saving memory. In CodeWarrior you can switch to an
|
||||||
|
// unpacked data section by checking the "Expand Uninitialized Data"
|
||||||
|
// checkbox in the "PPC PEF" settings panel. In MPW, specified the
|
||||||
|
// "-packdata off" option to PPCLink.
|
||||||
|
//
|
||||||
|
// When the routine returns, any symbols that you imported from the
|
||||||
|
// library named weakLinkedLibraryName will be resolved to the address
|
||||||
|
// of the symbol provided by the "lookup" callback routine.
|
||||||
|
//
|
||||||
|
// It is possible for an unresolved import to remain unresolved after
|
||||||
|
// this routine returns. If the symbol import is marked as weak (as
|
||||||
|
// opposed to the library, which *must* be marked as weak) and the symbol
|
||||||
|
// is not found by the "lookup" callback, the routine will simple skip
|
||||||
|
// that symbol. If the symbol isn't marked as weak, the routine will fail
|
||||||
|
// in that case.
|
||||||
|
//
|
||||||
|
// Most of the possible error results are co-opted CFM errors. These
|
||||||
|
// include:
|
||||||
|
//
|
||||||
|
// cfragFragmentFormatErr -- The fragment to fix is is an unknown format.
|
||||||
|
// cfragNoSectionErr -- Could not find the loader section in the fragment to fix.
|
||||||
|
// cfragNoLibraryErr -- The fragment to fix is not weak linked to weakLinkedLibraryName.
|
||||||
|
// cfragFragmentUsageErr -- The fragment to fix doesn't have a data section.
|
||||||
|
// -- The fragment to fix is strong linked to weakLinkedLibraryName.
|
||||||
|
// -- The fragment doesn't have an init routine.
|
||||||
|
// cfragFragmentCorruptErr -- Encountered an undefined relocation opcode.
|
||||||
|
// unimpErr -- Encountered an unimplement relocation opcode. The
|
||||||
|
// relocation engine only implements a subset of the CFM
|
||||||
|
// relocation opcodes, the subset most commonly used by
|
||||||
|
// MPW and CodeWarrior PEF containers. If you encounter
|
||||||
|
// this error, you'll probably have to add the weird
|
||||||
|
// relocation opcode to the engine, which shouldn't be
|
||||||
|
// be too hard.
|
||||||
|
// memFullErr -- It's likely that this error is triggered by the memory
|
||||||
|
// needed to unpack your data section. Either make your
|
||||||
|
// data section smaller, or unpack it (see above).
|
||||||
|
// errors returned by FindSymbol
|
||||||
|
// errors returned by Memory Manager
|
||||||
|
//
|
||||||
|
// The routine needs enough memory to hold the loader section of the fragment
|
||||||
|
// to fix in memory. It allocates that memory using NewPtr and dispsoses of
|
||||||
|
// it before it returns. You may want to change the memory allocator, which
|
||||||
|
// is very simple.
|
||||||
|
|
||||||
|
extern pascal OSStatus CFMLateImportLibrary(const CFragSystem7DiskFlatLocator *fragToFixLocator,
|
||||||
|
CFragConnectionID fragToFixConnID,
|
||||||
|
CFragInitFunction fragToFixInitRoutine,
|
||||||
|
ConstStr255Param weakLinkedLibraryName,
|
||||||
|
CFragConnectionID connIDToImport);
|
||||||
|
// A wrapper around CFMLateImportCore that looks up symbols by calling
|
||||||
|
// FindSymbol on a connection to a CFM library (connIDToImport).
|
||||||
|
// You can get this connection ID through any standard CFM API, for example
|
||||||
|
// GetSharedLibrary, GetDiskFragment, or GetMemFragment.
|
||||||
|
//
|
||||||
|
// IMPORTANT:
|
||||||
|
// The fragment name for connIDToImport *does not* have to match
|
||||||
|
// weakLinkedLibraryName. This is part of the power of this library.
|
||||||
|
|
||||||
|
extern pascal OSStatus CFMLateImportBundle(const CFragSystem7DiskFlatLocator *fragToFixLocator,
|
||||||
|
CFragConnectionID fragToFixConnID,
|
||||||
|
CFragInitFunction fragToFixInitRoutine,
|
||||||
|
ConstStr255Param weakLinkedLibraryName,
|
||||||
|
CFBundleRef bundleToImport);
|
||||||
|
// A wrapper around CFMLateImportCore that looks up symbols by calling
|
||||||
|
// CFBundleGetFunctionPointerForName on a reference to a Core Foundation
|
||||||
|
// bundle (bundleToImport). You can get this reference through any
|
||||||
|
// Core Foundation bundle API, for example CFBundleCreate.
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
1
Mac/Modules/cg/CGStubLib
Executable file
1
Mac/Modules/cg/CGStubLib
Executable file
|
|
@ -0,0 +1 @@
|
||||||
|
(This file must be converted with BinHex 4.0)
:!!"cG(9L69"6)!#3"!L3!!!!!BUjr%T[H5&`C@CQF(G`B`!!!!'i-rHh!*!0!3#
3"[q3"!#3$JJm!!!!8!3"!*!1rj!%!*!%rj!%!*!%rj!%!*!A1!!!"2!!!!!$!!!
!1N0(3fpZG'9iG&0SEhG8CAKd3A43EfPZG%0(3fpZG'9iG&0SEhG8CAKd3dG$Efj
dCAKd8f9XC@0d4QpZG%0(3fpZG'9iG&0PG&4PH(4%FQ&hD@jR6@pNC80(3fpZG'9
iG%4bBAG3BA4S3dG$EfjdCAKd8f9d6'PZC8T[D@j$4d0[ER4PH(46CA4-D@jP3f&
`3dG$EfjdCAKd4f9d9'9iG&"[FfPdD@pZ3dG$EfjdCAKd4f9d8'&dD%0eFR*PER4
3EfPZG%0(3fpZG'9iG&0PG&0SEh9XC%&ZG'PKE'PKFd0(3fpZG'9iG&0jEQ0SFQp
ZDATP3dG$EfjdCAKd4QaeFfK$4d0[ER4PH(4&EQ43B@GP3dG$EfjdCAKd8f9d4Qp
ZG&0THQ9$4d0[ER4PH(4(CA48CAKd6@&dFQPi3dG$EfjdCAKd8f9d9'9iG%eKG(*
TH%0(3fpZG'9iG&0PG&4PH(43Eh0TG'P[EN0(3fpZG'9iG&0PG%0SBA*KBh4PFP0
`B@0TEQG$4d0[ER4PH(46CA4$69P,8h4bEfYP3fpXEh*$4d0[ER4PH(46CA4$69P
,4QPXE%0[E'pb3dG$EfjdCAKd8f9d8NG#8h4bEfYP3fpXEh*$4d0[ER4PH(46CA4
54d*'D@aX3fpXEh*$4d0[ER4PH(46CA4(FQ&j8h4bEfYP3fpXEh*$4d0[ER4PH(4
6CA4(FQ&j4QPXE%0[E'pb3dG$EfjdCAKd3faTF&4[8Q9MG%0(3fpZG'9iG%923fa
TF%0(3fpZG'9iG%0XDA"$4d0[ER4PH(4$E'9KFP*PBh4$4d0[ER4PH(46G(*[Df9
5C@0d9fPdD>C(4S3dG$EfjdCAKd8h4bEfYP8Q9MG%0(3fpZG'9iG%CTE'a5C@0
d3dG$EfjdCAKd8h4bEfYP8'&dD%0(3fpZG'9iG%924QPXE&"KG'K$4d0[ER4PH(4
'D@aX8'&dD%0(3fpZG'9iG%GPG&"KG'K#Eh9ZC'PZCd*[H%0(3fpZG'9iG%Pc8'&
dD%9YF(4j3dG$EfjdCAKd3@4N3A*M9'p3EfPZG%0(3fpZG'9iG%&NC%&bBd0(3fp
ZG'9iG%&NC&*PBh4$4d0[ER4PH(4$E'pcC9"KG'K$4d0[ER4PH(4"C'44G@&N3h9
bGQ98Ee"[D@jd3dG$EfjdCAKd3@4N3h9bGQ98Ee"[D@jd3dG$EfjdCAKd3@4N6'P
ZC94[8'pTER4$4d0[ER4PH(40EhCP9'p3EfPZG%0(3fpZG'9iG%*PCfPZ8'&dD%0
(3fpZG'9iG&0PG%&XF'KK3dG$EfjdCAKd8f9d4QaKG'jPFh0$4d0[ER4PH(46CA4
0DA4PFNaTE@Pd3dG$EfjdCAKd8f9d6'PZC9GTC(4S3dG$EfjdCAKd4f9d3e403dG
$EfjdCAKd3fpZBf&d3e403dG$EfjdCAKd8QpdBA4P3e403dG$EfjdCAKd9(*KER0
XBA4P3e403dG$EfjdCAKd8f0KE'9$9%e$4d0[ER4PH(45CA0dEh*P4e0dBA4P3dG
$EfjdCAKd8f&fC8G6G'&dC80(3fpZG'9iG&*PE'9KFf9$FQ9KG'9$4d0[ER4PH(4
'Eh*3Eh*d!*!%)!!!!#J!#!!X!")!&!!G!"`!)J!F!#N!(!!`!!`!0`!BrD3!()G
E!"$KGJ!2F0)!%S6f!"X(8J!@+$m!%Er*!"3)b!!B18%!%TFP!"4133!6*YS!&QJ
q!"`5j3!6+b8!%FZX!!ijfJ!E40N!%FBC!!pc5`!83A3!%1#[!"BVd!!4bhd!%ab
3!!!83a!!&Nmd!"S9CJ!B@h8!'pSB!"4$r!!6,PJ!&IIe!"QcA`!6,A)!%S40!"@
4"!!C[em!(!eJ!"+&B!!B'J8!$h&S!"XE+!!4[r-!%r"c!"BZe`!6,@J!'&Y`!"+
(m!!0R!B!('d8!"Gd9!!E00d!%142!"3ae3!4bj`!&UJa!J#3"rrq!J!"D!#3"2r
q!J!$+J#3"2rq!J!$'`#3"2rq!J!#63#3"2rq!J!#eJ#3"2rq!J!"1J#3"2rq!J!
#a3#3"2rq!J!#m3#3"2rq!J!"dJ#3"2rq!J!%,J#3"2rq!J!!D!#3"2rq!J!!I!#
3"2rq!J!"*!#3"2rq!J!!T`#3"2rq!J!%I!#3"2rq!J!%93#3"2rq!J!!mJ#3"2r
q!J!"kJ#3"2rq!J!!9`#3"2rq!J!#-3#3"2rq!J!!hJ#3"2rq!J!"!*!&rri#!!-
&!*!%rri#!!!B!*!%rri#!!!T!*!%rri#!!21!*!%rri#!!4Q!*!%rri#!!'i!*!
%rri#!!#2!*!%rri#!!!m!*!%rri#!!%3!*!%rri#!!+b!*!%rri#!!4!!*!%rri
#!!'I!*!%rri#!!*l!*!%rri#!!3F!*!%rri#!!2i!*!%rri#!!)&!*!%rri#!!*
I!*!%rri#!!-k!*!%rri#!!0S!*!%rri#!!30!*!%rri#!!$$!*!%rri#!!+1!*!
%rri#!!)H!*!%rri#!!2L!*!%rri#!!+I!*!%rri#!!&3!*!%rri#!!1V!*!%rri
#!!*!!*!%rri#!!0-!*!%rri#!!1!!*!%rri#!!'%!*!%rri#!!52!*!%rri#!!1
A!*!%rri#!!1p!*!%rri#!!5I!*!%rri!N!3E2!!!!3!!!!&B!!!!@!!!!$)!N20
8!*!,!3#3%`&`Gh"M!*!5!`%!N"%d#80(8h4eBNaTBJ!!!3!!!!&B!!!!@!!!!$*
66e*8"*B!J!!F!$)!!'0QFQF!!!!+!!$rr`#3#2Ib:
|
||||||
58
Mac/Modules/cg/CGStubLib.exp
Executable file
58
Mac/Modules/cg/CGStubLib.exp
Executable file
|
|
@ -0,0 +1,58 @@
|
||||||
|
CGContextShowTextAtPoint
|
||||||
|
CGContextShowText
|
||||||
|
CGContextSelectFont
|
||||||
|
CGContextSetTextDrawingMode
|
||||||
|
CGContextDrawPath
|
||||||
|
CGContextSetLineJoin
|
||||||
|
CGContextSetLineCap
|
||||||
|
CGContextGetTextPosition
|
||||||
|
CGContextGetPathCurrentPoint
|
||||||
|
CGContextSetShouldAntialias
|
||||||
|
CGContextSynchronize
|
||||||
|
CGContextFlush
|
||||||
|
CGContextEndPage
|
||||||
|
CGContextSetFontSize
|
||||||
|
CGContextGetTextMatrix
|
||||||
|
CGContextSetTextMatrix
|
||||||
|
CGContextSetTextPosition
|
||||||
|
CGContextSetCharacterSpacing
|
||||||
|
CGContextSetCMYKStrokeColor
|
||||||
|
CGContextSetCMYKFillColor
|
||||||
|
CGContextSetRGBStrokeColor
|
||||||
|
CGContextSetRGBFillColor
|
||||||
|
CGContextSetGrayStrokeColor
|
||||||
|
CGContextSetGrayFillColor
|
||||||
|
CGContextClipToRect
|
||||||
|
CGContextEOClip
|
||||||
|
CGContextClip
|
||||||
|
CGContextClearRect
|
||||||
|
CGContextStrokeRectWithWidth
|
||||||
|
CGContextStrokeRect
|
||||||
|
CGContextFillRect
|
||||||
|
CGContextStrokePath
|
||||||
|
CGContextEOFillPath
|
||||||
|
CGContextFillPath
|
||||||
|
CGContextGetPathBoundingBox
|
||||||
|
CGContextIsPathEmpty
|
||||||
|
CGContextAddArcToPoint
|
||||||
|
CGContextAddArc
|
||||||
|
CGContextAddRect
|
||||||
|
CGContextClosePath
|
||||||
|
CGContextAddQuadCurveToPoint
|
||||||
|
CGContextAddCurveToPoint
|
||||||
|
CGContextAddLineToPoint
|
||||||
|
CGContextMoveToPoint
|
||||||
|
CGContextBeginPath
|
||||||
|
CGContextSetAlpha
|
||||||
|
CGContextSetFlatness
|
||||||
|
CGContextSetMiterLimit
|
||||||
|
CGContextSetLineWidth
|
||||||
|
CGContextGetCTM
|
||||||
|
CGContextConcatCTM
|
||||||
|
CGContextRotateCTM
|
||||||
|
CGContextTranslateCTM
|
||||||
|
CGContextScaleCTM
|
||||||
|
CGContextRestoreGState
|
||||||
|
CGContextSaveGState
|
||||||
|
CGContextRelease
|
||||||
|
CreateCGContextForPort
|
||||||
3
Mac/Modules/cg/CGStubLib.readme
Executable file
3
Mac/Modules/cg/CGStubLib.readme
Executable file
|
|
@ -0,0 +1,3 @@
|
||||||
|
# CGStubLib was created by issuing this command in MPW:
|
||||||
|
|
||||||
|
MakeStub CGStubLib.exp -o CGStubLib
|
||||||
1332
Mac/Modules/cg/_CGmodule.c
Executable file
1332
Mac/Modules/cg/_CGmodule.c
Executable file
File diff suppressed because it is too large
Load diff
83
Mac/Modules/cg/cgscan.py
Executable file
83
Mac/Modules/cg/cgscan.py
Executable file
|
|
@ -0,0 +1,83 @@
|
||||||
|
# Scan an Apple header file, generating a Python file of generator calls.
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
BGENDIR=os.path.join(sys.prefix, ':Tools:bgen:bgen')
|
||||||
|
sys.path.append(BGENDIR)
|
||||||
|
from scantools import Scanner_OSX
|
||||||
|
from bgenlocations import TOOLBOXDIR
|
||||||
|
|
||||||
|
LONG = "CoreGraphics"
|
||||||
|
SHORT = "cg"
|
||||||
|
OBJECTS = ("CGContextRef",
|
||||||
|
)
|
||||||
|
# ADD object typenames here
|
||||||
|
|
||||||
|
def main():
|
||||||
|
input = [
|
||||||
|
"CGContext.h",
|
||||||
|
]
|
||||||
|
output = SHORT + "gen.py"
|
||||||
|
defsoutput = TOOLBOXDIR + LONG + ".py"
|
||||||
|
scanner = MyScanner(input, output, defsoutput)
|
||||||
|
scanner.scan()
|
||||||
|
scanner.gentypetest(SHORT+"typetest.py")
|
||||||
|
scanner.close()
|
||||||
|
print "=== Done scanning and generating, now importing the generated code... ==="
|
||||||
|
exec "import " + SHORT + "support"
|
||||||
|
print "=== Done. It's up to you to compile it now! ==="
|
||||||
|
|
||||||
|
class MyScanner(Scanner_OSX):
|
||||||
|
|
||||||
|
def destination(self, type, name, arglist):
|
||||||
|
classname = "Function"
|
||||||
|
listname = "functions"
|
||||||
|
if arglist:
|
||||||
|
t, n, m = arglist[0]
|
||||||
|
if t in OBJECTS and m == "InMode":
|
||||||
|
classname = "Method"
|
||||||
|
listname = t + "_methods"
|
||||||
|
# Special case for the silly first AllocatorRef argument
|
||||||
|
if t == 'CFAllocatorRef' and m == 'InMode' and len(arglist) > 1:
|
||||||
|
t, n, m = arglist[1]
|
||||||
|
if t in OBJECTS and m == "InMode":
|
||||||
|
classname = "MethodSkipArg1"
|
||||||
|
listname = t + "_methods"
|
||||||
|
return classname, listname
|
||||||
|
|
||||||
|
def writeinitialdefs(self):
|
||||||
|
self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
|
||||||
|
|
||||||
|
def makeblacklistnames(self):
|
||||||
|
return [
|
||||||
|
"CGContextRetain",
|
||||||
|
"CGContextRelease",
|
||||||
|
]
|
||||||
|
|
||||||
|
def makegreylist(self):
|
||||||
|
return []
|
||||||
|
|
||||||
|
def makeblacklisttypes(self):
|
||||||
|
return [
|
||||||
|
"float_ptr",
|
||||||
|
"CGRect_ptr",
|
||||||
|
"CGPoint_ptr",
|
||||||
|
"CGColorSpaceRef",
|
||||||
|
"CGColorRenderingIntent",
|
||||||
|
"CGFontRef",
|
||||||
|
# "char_ptr",
|
||||||
|
"CGGlyph_ptr",
|
||||||
|
"CGImageRef",
|
||||||
|
"CGPDFDocumentRef",
|
||||||
|
]
|
||||||
|
|
||||||
|
def makerepairinstructions(self):
|
||||||
|
return [
|
||||||
|
([("char_ptr", "cstring", "InMode"), ("size_t", "length", "InMode")],
|
||||||
|
[("InBuffer", "*", "*")]),
|
||||||
|
# ([("char_ptr", "name", "InMode"),],
|
||||||
|
# [("CCCCC", "*", "*")]),
|
||||||
|
]
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
305
Mac/Modules/cg/cgsupport.py
Executable file
305
Mac/Modules/cg/cgsupport.py
Executable file
|
|
@ -0,0 +1,305 @@
|
||||||
|
# This script generates a Python interface for an Apple Macintosh Manager.
|
||||||
|
# It uses the "bgen" package to generate C code.
|
||||||
|
# The function specifications are generated by scanning the mamager's header file,
|
||||||
|
# using the "scantools" package (customized for this particular manager).
|
||||||
|
|
||||||
|
#error missing SetActionFilter
|
||||||
|
|
||||||
|
import string
|
||||||
|
|
||||||
|
# Declarations that change for each manager
|
||||||
|
MODNAME = '_CG' # The name of the module
|
||||||
|
|
||||||
|
# The following is *usually* unchanged but may still require tuning
|
||||||
|
MODPREFIX = 'CG' # The prefix for module-wide routines
|
||||||
|
INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
|
||||||
|
OUTPUTFILE = MODNAME + "module.c" # The file generated by this program
|
||||||
|
|
||||||
|
from macsupport import *
|
||||||
|
|
||||||
|
|
||||||
|
# Create the type objects
|
||||||
|
|
||||||
|
includestuff = includestuff + """
|
||||||
|
#ifdef WITHOUT_FRAMEWORKS
|
||||||
|
#include <Quickdraw.h>
|
||||||
|
#include <CGContext.h>
|
||||||
|
#else
|
||||||
|
#include <CoreGraphics/CoreGraphics.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !TARGET_API_MAC_OSX
|
||||||
|
/* This code is adapted from the CallMachOFramework demo at:
|
||||||
|
http://developer.apple.com/samplecode/Sample_Code/Runtime_Architecture/CallMachOFramework.htm
|
||||||
|
It allows us to call Mach-O functions from CFM apps. */
|
||||||
|
|
||||||
|
#include <Folders.h>
|
||||||
|
#include "CFMLateImport.h"
|
||||||
|
|
||||||
|
static OSStatus LoadFrameworkBundle(CFStringRef framework, CFBundleRef *bundlePtr)
|
||||||
|
// This routine finds a the named framework and creates a CFBundle
|
||||||
|
// object for it. It looks for the framework in the frameworks folder,
|
||||||
|
// as defined by the Folder Manager. Currently this is
|
||||||
|
// "/System/Library/Frameworks", but we recommend that you avoid hard coded
|
||||||
|
// paths to ensure future compatibility.
|
||||||
|
//
|
||||||
|
// You might think that you could use CFBundleGetBundleWithIdentifier but
|
||||||
|
// that only finds bundles that are already loaded into your context.
|
||||||
|
// That would work in the case of the System framework but it wouldn't
|
||||||
|
// work if you're using some other, less-obvious, framework.
|
||||||
|
{
|
||||||
|
OSStatus err;
|
||||||
|
FSRef frameworksFolderRef;
|
||||||
|
CFURLRef baseURL;
|
||||||
|
CFURLRef bundleURL;
|
||||||
|
|
||||||
|
*bundlePtr = nil;
|
||||||
|
|
||||||
|
baseURL = nil;
|
||||||
|
bundleURL = nil;
|
||||||
|
|
||||||
|
// Find the frameworks folder and create a URL for it.
|
||||||
|
|
||||||
|
err = FSFindFolder(kOnAppropriateDisk, kFrameworksFolderType, true, &frameworksFolderRef);
|
||||||
|
if (err == noErr) {
|
||||||
|
baseURL = CFURLCreateFromFSRef(kCFAllocatorSystemDefault, &frameworksFolderRef);
|
||||||
|
if (baseURL == nil) {
|
||||||
|
err = coreFoundationUnknownErr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append the name of the framework to the URL.
|
||||||
|
|
||||||
|
if (err == noErr) {
|
||||||
|
bundleURL = CFURLCreateCopyAppendingPathComponent(kCFAllocatorSystemDefault, baseURL, framework, false);
|
||||||
|
if (bundleURL == nil) {
|
||||||
|
err = coreFoundationUnknownErr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a bundle based on that URL and load the bundle into memory.
|
||||||
|
// We never unload the bundle, which is reasonable in this case because
|
||||||
|
// the sample assumes that you'll be calling functions from this
|
||||||
|
// framework throughout the life of your application.
|
||||||
|
|
||||||
|
if (err == noErr) {
|
||||||
|
*bundlePtr = CFBundleCreate(kCFAllocatorSystemDefault, bundleURL);
|
||||||
|
if (*bundlePtr == nil) {
|
||||||
|
err = coreFoundationUnknownErr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (err == noErr) {
|
||||||
|
if ( ! CFBundleLoadExecutable( *bundlePtr ) ) {
|
||||||
|
err = coreFoundationUnknownErr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean up.
|
||||||
|
|
||||||
|
if (err != noErr && *bundlePtr != nil) {
|
||||||
|
CFRelease(*bundlePtr);
|
||||||
|
*bundlePtr = nil;
|
||||||
|
}
|
||||||
|
if (bundleURL != nil) {
|
||||||
|
CFRelease(bundleURL);
|
||||||
|
}
|
||||||
|
if (baseURL != nil) {
|
||||||
|
CFRelease(baseURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// The CFMLateImport approach requires that you define a fragment
|
||||||
|
// initialisation routine that latches the fragment's connection
|
||||||
|
// ID and locator. If your code already has a fragment initialiser
|
||||||
|
// you will have to integrate the following into it.
|
||||||
|
|
||||||
|
static CFragConnectionID gFragToFixConnID;
|
||||||
|
static FSSpec gFragToFixFile;
|
||||||
|
static CFragSystem7DiskFlatLocator gFragToFixLocator;
|
||||||
|
|
||||||
|
extern OSErr FragmentInit(const CFragInitBlock *initBlock);
|
||||||
|
extern OSErr FragmentInit(const CFragInitBlock *initBlock)
|
||||||
|
{
|
||||||
|
__initialize(initBlock); /* call the "original" initializer */
|
||||||
|
gFragToFixConnID = (CFragConnectionID) initBlock->closureID;
|
||||||
|
gFragToFixFile = *(initBlock->fragLocator.u.onDisk.fileSpec);
|
||||||
|
gFragToFixLocator = initBlock->fragLocator.u.onDisk;
|
||||||
|
gFragToFixLocator.fileSpec = &gFragToFixFile;
|
||||||
|
|
||||||
|
return noErr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int GrafObj_Convert(PyObject *, GrafPtr *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Manual converters
|
||||||
|
*/
|
||||||
|
|
||||||
|
PyObject *CGPoint_New(CGPoint *itself)
|
||||||
|
{
|
||||||
|
|
||||||
|
return Py_BuildValue("(ff)",
|
||||||
|
itself->x,
|
||||||
|
itself->y);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
CGPoint_Convert(PyObject *v, CGPoint *p_itself)
|
||||||
|
{
|
||||||
|
if( !PyArg_Parse(v, "(ff)",
|
||||||
|
&p_itself->x,
|
||||||
|
&p_itself->y) )
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *CGRect_New(CGRect *itself)
|
||||||
|
{
|
||||||
|
|
||||||
|
return Py_BuildValue("(ffff)",
|
||||||
|
itself->origin.x,
|
||||||
|
itself->origin.y,
|
||||||
|
itself->size.width,
|
||||||
|
itself->size.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
CGRect_Convert(PyObject *v, CGRect *p_itself)
|
||||||
|
{
|
||||||
|
if( !PyArg_Parse(v, "(ffff)",
|
||||||
|
&p_itself->origin.x,
|
||||||
|
&p_itself->origin.y,
|
||||||
|
&p_itself->size.width,
|
||||||
|
&p_itself->size.height) )
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *CGAffineTransform_New(CGAffineTransform *itself)
|
||||||
|
{
|
||||||
|
|
||||||
|
return Py_BuildValue("(ffffff)",
|
||||||
|
itself->a,
|
||||||
|
itself->b,
|
||||||
|
itself->c,
|
||||||
|
itself->d,
|
||||||
|
itself->tx,
|
||||||
|
itself->ty);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
CGAffineTransform_Convert(PyObject *v, CGAffineTransform *p_itself)
|
||||||
|
{
|
||||||
|
if( !PyArg_Parse(v, "(ffffff)",
|
||||||
|
&p_itself->a,
|
||||||
|
&p_itself->b,
|
||||||
|
&p_itself->c,
|
||||||
|
&p_itself->d,
|
||||||
|
&p_itself->tx,
|
||||||
|
&p_itself->ty) )
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
|
||||||
|
initstuff = initstuff + """
|
||||||
|
#if !TARGET_API_MAC_OSX
|
||||||
|
CFBundleRef sysBundle;
|
||||||
|
OSStatus err;
|
||||||
|
|
||||||
|
if (&LoadFrameworkBundle == NULL) {
|
||||||
|
PyErr_SetString(PyExc_ImportError, "CoreCraphics not supported");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
err = LoadFrameworkBundle(CFSTR("ApplicationServices.framework"), &sysBundle);
|
||||||
|
if (err == noErr)
|
||||||
|
err = CFMLateImportBundle(&gFragToFixLocator, gFragToFixConnID, FragmentInit, "\pCGStubLib", sysBundle);
|
||||||
|
if (err != noErr) {
|
||||||
|
PyErr_SetString(PyExc_ImportError, "CoreCraphics not supported");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
#endif /* !TARGET_API_MAC_OSX */
|
||||||
|
"""
|
||||||
|
|
||||||
|
class MyOpaqueByValueType(OpaqueByValueType):
|
||||||
|
"""Sort of a mix between OpaqueByValueType and OpaqueType."""
|
||||||
|
def mkvalueArgs(self, name):
|
||||||
|
return "%s, &%s" % (self.new, name)
|
||||||
|
|
||||||
|
CGPoint = MyOpaqueByValueType('CGPoint', 'CGPoint')
|
||||||
|
CGRect = MyOpaqueByValueType('CGRect', 'CGRect')
|
||||||
|
CGAffineTransform = MyOpaqueByValueType('CGAffineTransform', 'CGAffineTransform')
|
||||||
|
|
||||||
|
char_ptr = Type("char *", "s")
|
||||||
|
|
||||||
|
CGTextEncoding = int
|
||||||
|
CGLineCap = int
|
||||||
|
CGLineJoin = int
|
||||||
|
CGTextDrawingMode = int
|
||||||
|
CGPathDrawingMode = int
|
||||||
|
|
||||||
|
# The real objects
|
||||||
|
CGContextRef = OpaqueByValueType("CGContextRef", "CGContextRefObj")
|
||||||
|
|
||||||
|
|
||||||
|
class MyObjectDefinition(GlobalObjectDefinition):
|
||||||
|
def outputStructMembers(self):
|
||||||
|
ObjectDefinition.outputStructMembers(self)
|
||||||
|
def outputCleanupStructMembers(self):
|
||||||
|
Output("CGContextRelease(self->ob_itself);")
|
||||||
|
|
||||||
|
|
||||||
|
# Create the generator groups and link them
|
||||||
|
module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
|
||||||
|
|
||||||
|
CGContextRef_object = MyObjectDefinition('CGContextRef', 'CGContextRefObj', 'CGContextRef')
|
||||||
|
|
||||||
|
|
||||||
|
# ADD object here
|
||||||
|
|
||||||
|
module.addobject(CGContextRef_object)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Function = FunctionGenerator
|
||||||
|
Method = MethodGenerator
|
||||||
|
|
||||||
|
CGContextRef_methods = []
|
||||||
|
|
||||||
|
# ADD _methods initializer here
|
||||||
|
execfile(INPUTFILE)
|
||||||
|
|
||||||
|
CreateCGContextForPort_body = """\
|
||||||
|
GrafPtr port;
|
||||||
|
CGContextRef ctx;
|
||||||
|
OSStatus _err;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(_args, "O&", GrafObj_Convert, &port))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
_err = CreateCGContextForPort(port, &ctx);
|
||||||
|
if (_err != noErr)
|
||||||
|
if (_err != noErr) return PyMac_Error(_err);
|
||||||
|
_res = Py_BuildValue("O&", CGContextRefObj_New, ctx);
|
||||||
|
return _res;
|
||||||
|
"""
|
||||||
|
|
||||||
|
f = ManualGenerator("CreateCGContextForPort", CreateCGContextForPort_body);
|
||||||
|
f.docstring = lambda: "(CGrafPtr) -> CGContextRef"
|
||||||
|
module.add(f)
|
||||||
|
|
||||||
|
|
||||||
|
# ADD add forloop here
|
||||||
|
for f in CGContextRef_methods:
|
||||||
|
CGContextRef_object.add(f)
|
||||||
|
|
||||||
|
# generate output (open the output file as late as possible)
|
||||||
|
SetOutputFileName(OUTPUTFILE)
|
||||||
|
module.generate()
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue