/* * tkMacOSXBitmap.c -- * * This file handles the implementation of native bitmaps. * * Copyright (c) 1996-1997 Sun Microsystems, Inc. * Copyright 2001, Apple Computer, Inc. * * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * * RCS: @(#) $Id: tkMacOSXBitmap.c,v 1.5 2007/04/13 14:51:17 dkf Exp $ */ #include "tkMacOSXInt.h" /* * Depending on the resource type there are different ways to draw native * icons. */ #define TYPE1 0 /* Family icon suite. */ #define TYPE2 1 /* ICON resource. */ #define TYPE3 2 /* cicn resource. */ /* * This data structure describes the id and type of a given icon. It is used * as the source for native icons. */ typedef struct { int id; /* Resource Id for Icon. */ long int type; /* Type of icon. */ } NativeIcon; /* * This structure holds information about native bitmaps. */ typedef struct { char *name; /* Name of icon. */ long int type; /* Type of icon. */ int id; /* Id of icon. */ int size; /* Size of icon. */ } BuiltInIcon; /* * This array mapps a string name to the supported builtin icons on the * Macintosh. */ static BuiltInIcon builtInIcons[] = { {"document", TYPE1, kGenericDocumentIconResource, 32}, {"stationery", TYPE1, kGenericStationeryIconResource, 32}, {"edition", TYPE1, kGenericEditionFileIconResource, 32}, {"application", TYPE1, kGenericApplicationIconResource, 32}, {"accessory", TYPE1, kGenericDeskAccessoryIconResource, 32}, {"folder", TYPE1, kGenericFolderIconResource, 32}, {"pfolder", TYPE1, kPrivateFolderIconResource, 32}, {"trash", TYPE1, kTrashIconResource, 32}, {"floppy", TYPE1, kFloppyIconResource, 32}, {"ramdisk", TYPE1, kGenericRAMDiskIconResource, 32}, {"cdrom", TYPE1, kGenericCDROMIconResource, 32}, {"preferences", TYPE1, kGenericPreferencesIconResource, 32}, {"querydoc", TYPE1, kGenericQueryDocumentIconResource, 32}, {"stop", TYPE2, kStopIcon, 32}, {"note", TYPE2, kNoteIcon, 32}, {"caution", TYPE2, kCautionIcon, 32}, {(char *) NULL, 0, 0, 0} }; /* *---------------------------------------------------------------------- * * TkpDefineNativeBitmaps -- * * Add native bitmaps. * * Results: * A standard Tcl result. If an error occurs then TCL_ERROR is returned * and a message is left in the interp's result. * * Side effects: * "Name" is entered into the bitmap table and may be used from here on * to refer to the given bitmap. * *---------------------------------------------------------------------- */ void TkpDefineNativeBitmaps(void) { Tcl_HashTable *tablePtr = TkGetBitmapPredefTable(); BuiltInIcon *builtInPtr; for (builtInPtr=builtInIcons ; builtInPtr->name!=NULL ; builtInPtr++) { Tcl_HashEntry *predefHashPtr; CONST char *name; int isNew; name = Tk_GetUid(builtInPtr->name); predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &isNew); if (isNew) { TkPredefBitmap *predefPtr = (TkPredefBitmap *) ckalloc(sizeof(TkPredefBitmap)); NativeIcon *nativeIconPtr = (NativeIcon *) ckalloc(sizeof(NativeIcon)); nativeIconPtr->id = builtInPtr->id; nativeIconPtr->type = builtInPtr->type; predefPtr->source = (char *) nativeIconPtr; predefPtr->width = builtInPtr->size; predefPtr->height = builtInPtr->size; predefPtr->native = 1; Tcl_SetHashValue(predefHashPtr, predefPtr); } } } /* *---------------------------------------------------------------------- * * TkpCreateNativeBitmap -- * * Add native bitmaps. * * Results: * A standard Tcl result. If an error occurs then TCL_ERROR is returned * and a message is left in the interp's result. * * Side effects: * "Name" is entered into the bitmap table and may be used from here on * to refer to the given bitmap. * *---------------------------------------------------------------------- */ Pixmap TkpCreateNativeBitmap( Display *display, CONST char *source) /* Info about the icon to build. */ { Pixmap pix; GWorldPtr destPort; Rect destRect; CGrafPtr saveWorld; GDHandle saveDevice; NativeIcon *nativeIconPtr; pix = Tk_GetPixmap(display, None, 32, 32, 0); destPort = TkMacOSXGetDrawablePort(pix); GetGWorld(&saveWorld, &saveDevice); SetGWorld(destPort, NULL); nativeIconPtr = (NativeIcon *) source; SetRect(&destRect, 0, 0, 32, 32); if (nativeIconPtr->type == TYPE1) { RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF}; RGBForeColor(&white); PaintRect(&destRect); PlotIconID(&destRect, atAbsoluteCenter, ttNone, nativeIconPtr->id); } else if (nativeIconPtr->type == TYPE2) { Handle icon = GetIcon(nativeIconPtr->id); if (icon != NULL) { RGBColor black = {0, 0, 0}; RGBForeColor(&black); PlotIcon(&destRect, icon); ReleaseResource(icon); } } SetGWorld(saveWorld, saveDevice); return pix; } /* *---------------------------------------------------------------------- * * TkpGetNativeAppBitmap -- * * Add native bitmaps. * * Results: * A standard Tcl result. If an error occurs then TCL_ERROR is returned * and a message is left in the interp's result. * * Side effects: * "Name" is entered into the bitmap table and may be used from here on * to refer to the given bitmap. * *---------------------------------------------------------------------- */ Pixmap TkpGetNativeAppBitmap( Display *display, /* The display. */ CONST char *name, /* The name of the bitmap. */ int *width, /* The width & height of the bitmap. */ int *height) { Pixmap pix; CGrafPtr saveWorld; GDHandle saveDevice; GWorldPtr destPort; Rect destRect; Handle resource; int type = -1, destWrote; Str255 nativeName; /* * macRoman is the encoding that the resource fork uses. */ Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), name, strlen(name), 0, NULL, (char *) &nativeName[1], 255, NULL, &destWrote, NULL); /* Internalize native */ nativeName[0] = destWrote; resource = GetNamedResource('cicn', nativeName); if (resource != NULL) { type = TYPE3; } else { resource = GetNamedResource('ICON', nativeName); if (resource != NULL) { type = TYPE2; } } if (resource == NULL) { return (Pixmap) NULL; } pix = Tk_GetPixmap(display, None, 32, 32, 0); destPort = TkMacOSXGetDrawablePort(pix); GetGWorld(&saveWorld, &saveDevice); SetGWorld(destPort, NULL); SetRect(&destRect, 0, 0, 32, 32); if (type == TYPE2) { RGBColor black = {0, 0, 0}; RGBForeColor(&black); PlotIcon(&destRect, resource); ReleaseResource(resource); } else if (type == TYPE3) { RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF}; short id; ResType theType; Str255 dummy; /* * We need to first paint the background white. Also, for some reason * we *must* use GetCIcon instead of GetNamedResource for PlotCIcon to * work - so we use GetResInfo to get the id. */ RGBForeColor(&white); PaintRect(&destRect); GetResInfo(resource, &id, &theType, dummy); ReleaseResource(resource); resource = (Handle) GetCIcon(id); PlotCIcon(&destRect, (CIconHandle) resource); DisposeCIcon((CIconHandle) resource); } *width = 32; *height = 32; SetGWorld(saveWorld, saveDevice); return pix; } /* * Local Variables: * mode: c * c-basic-offset: 4 * fill-column: 78 * End: */