tkMacBitmap.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacBitmap.c --
  3.  *
  4.  * This file handles the implementation of native bitmaps.
  5.  *
  6.  * Copyright (c) 1996-1997 Sun Microsystems, Inc.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * RCS: @(#) $Id: tkMacBitmap.c,v 1.6 2002/10/09 11:56:36 das Exp $
  12.  */
  13. #include "tkPort.h"
  14. #include "tk.h"
  15. #include "tkMacInt.h"
  16. #include <Icons.h>
  17. #include <Dialogs.h>
  18. #include <Resources.h>
  19. #include <Strings.h>
  20. /*
  21.  * Depending on the resource type there are different ways to
  22.  * draw native icons.
  23.  */
  24. #define TYPE1 0 /* Family icon suite. */
  25. #define TYPE2 1 /* ICON resource. */
  26. #define TYPE3 2 /* cicn resource. */
  27. /*
  28.  * This data structure describes the id and type of a given icon.
  29.  * It is used as the source for native icons.
  30.  */
  31. typedef struct {
  32.     int id; /* Resource Id for Icon. */
  33.     long int type; /* Type of icon. */
  34. } NativeIcon;
  35. /*
  36.  * This structure holds information about native bitmaps.
  37.  */
  38. typedef struct {
  39.     char *name; /* Name of icon. */
  40.     long int type; /* Type of icon. */
  41.     int id; /* Id of icon. */
  42.     int size; /* Size of icon. */
  43. } BuiltInIcon;
  44. /*
  45.  * This array mapps a string name to the supported builtin icons
  46.  * on the Macintosh.
  47.  */
  48. static BuiltInIcon builtInIcons[] = {
  49.     {"document", TYPE1, kGenericDocumentIconResource, 32},
  50.     {"stationery", TYPE1, kGenericStationeryIconResource, 32},
  51.     {"edition", TYPE1, kGenericEditionFileIconResource, 32},
  52.     {"application", TYPE1, kGenericApplicationIconResource, 32},
  53.     {"accessory", TYPE1, kGenericDeskAccessoryIconResource, 32},
  54.     {"folder", TYPE1, kGenericFolderIconResource, 32},
  55.     {"pfolder", TYPE1, kPrivateFolderIconResource, 32},
  56.     {"trash", TYPE1, kTrashIconResource, 32},
  57.     {"floppy", TYPE1, kFloppyIconResource, 32},
  58.     {"ramdisk", TYPE1, kGenericRAMDiskIconResource, 32},
  59.     {"cdrom", TYPE1, kGenericCDROMIconResource, 32},
  60.     {"preferences", TYPE1, kGenericPreferencesIconResource, 32},
  61.     {"querydoc", TYPE1, kGenericQueryDocumentIconResource, 32},
  62.     {"stop", TYPE2, kStopIcon, 32},
  63.     {"note", TYPE2, kNoteIcon, 32},
  64.     {"caution", TYPE2, kCautionIcon, 32},
  65.     {(char *) NULL, 0, 0,  0}
  66. };
  67. /*
  68.  *----------------------------------------------------------------------
  69.  *
  70.  * TkpDefineNativeBitmaps --
  71.  *
  72.  * Add native bitmaps.
  73.  *
  74.  * Results:
  75.  * A standard Tcl result.  If an error occurs then TCL_ERROR is
  76.  * returned and a message is left in the interp's result.
  77.  *
  78.  * Side effects:
  79.  * "Name" is entered into the bitmap table and may be used from
  80.  * here on to refer to the given bitmap.
  81.  *
  82.  *----------------------------------------------------------------------
  83.  */
  84. void
  85. TkpDefineNativeBitmaps()
  86. {
  87.     int new;
  88.     Tcl_HashEntry *predefHashPtr;
  89.     TkPredefBitmap *predefPtr;
  90.     CONST char * name;
  91.     BuiltInIcon *builtInPtr;
  92.     NativeIcon *nativeIconPtr;
  93.     Tcl_HashTable *tablePtr;
  94.     
  95.     for (builtInPtr = builtInIcons; builtInPtr->name != NULL; builtInPtr++) {
  96. name = Tk_GetUid(builtInPtr->name);
  97. tablePtr = TkGetBitmapPredefTable();
  98. predefHashPtr = Tcl_CreateHashEntry(tablePtr, name, &new);
  99. if (!new) {
  100.     continue;
  101. }
  102. predefPtr = (TkPredefBitmap *) ckalloc(sizeof(TkPredefBitmap));
  103. nativeIconPtr = (NativeIcon *) ckalloc(sizeof(NativeIcon));
  104. nativeIconPtr->id = builtInPtr->id;
  105. nativeIconPtr->type = builtInPtr->type;
  106. predefPtr->source = (char *) nativeIconPtr;
  107. predefPtr->width = builtInPtr->size;
  108. predefPtr->height = builtInPtr->size;
  109. predefPtr->native = 1;
  110. Tcl_SetHashValue(predefHashPtr, predefPtr);
  111.     }
  112. }
  113. /*
  114.  *----------------------------------------------------------------------
  115.  *
  116.  * TkpCreateNativeBitmap --
  117.  *
  118.  * Add native bitmaps.
  119.  *
  120.  * Results:
  121.  * A standard Tcl result.  If an error occurs then TCL_ERROR is
  122.  * returned and a message is left in the interp's result.
  123.  *
  124.  * Side effects:
  125.  * "Name" is entered into the bitmap table and may be used from
  126.  * here on to refer to the given bitmap.
  127.  *
  128.  *----------------------------------------------------------------------
  129.  */
  130. Pixmap
  131. TkpCreateNativeBitmap(
  132.     Display *display,
  133.     CONST char * source) /* Info about the icon to build. */
  134. {
  135.     Pixmap pix;
  136.     GWorldPtr destPort;
  137.     Rect destRect;
  138.     Handle icon;
  139.     CGrafPtr saveWorld;
  140.     GDHandle saveDevice;
  141.     NativeIcon *nativeIconPtr;
  142.     
  143.     pix = Tk_GetPixmap(display, None, 32, 32, 0);
  144.     destPort = TkMacGetDrawablePort(pix);
  145.     GetGWorld(&saveWorld, &saveDevice);
  146.     SetGWorld(destPort, NULL);
  147.     nativeIconPtr = (NativeIcon *) source;
  148.     SetRect(&destRect, 0, 0, 32, 32);
  149.     if (nativeIconPtr->type == TYPE1) {
  150. RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
  151. RGBForeColor(&white);
  152. PaintRect(&destRect);
  153. PlotIconID(&destRect, atAbsoluteCenter, ttNone, nativeIconPtr->id);
  154.     } else if (nativeIconPtr->type == TYPE2) {
  155. icon = GetIcon(nativeIconPtr->id);
  156. if (icon != NULL) {
  157.     RGBColor black = {0, 0, 0};
  158.     RGBForeColor(&black);
  159.     PlotIcon(&destRect, icon);
  160.     ReleaseResource(icon);
  161. }
  162.     }
  163.     SetGWorld(saveWorld, saveDevice);
  164.     return pix;
  165. }
  166. /*
  167.  *----------------------------------------------------------------------
  168.  *
  169.  * TkpGetNativeAppBitmap --
  170.  *
  171.  * Add native bitmaps.
  172.  *
  173.  * Results:
  174.  * A standard Tcl result.  If an error occurs then TCL_ERROR is
  175.  * returned and a message is left in the interp's result.
  176.  *
  177.  * Side effects:
  178.  * "Name" is entered into the bitmap table and may be used from
  179.  * here on to refer to the given bitmap.
  180.  *
  181.  *----------------------------------------------------------------------
  182.  */
  183. Pixmap
  184. TkpGetNativeAppBitmap(
  185.     Display *display, /* The display. */
  186.     CONST char *name, /* The name of the bitmap. */
  187.     int *width, /* The width & height of the bitmap. */
  188.     int *height)
  189. {
  190.     Pixmap pix;
  191.     CGrafPtr saveWorld;
  192.     GDHandle saveDevice;
  193.     GWorldPtr destPort;
  194.     Rect destRect;
  195.     Handle resource;
  196.     int type, destWrote;
  197.     Str255 nativeName;
  198.     
  199.     /*
  200.      * macRoman is the encoding that the resource fork uses.
  201.      */
  202.     Tcl_UtfToExternal(NULL, Tcl_GetEncoding(NULL, "macRoman"), name,
  203.     strlen(name), 0, NULL, 
  204.     (char *) &nativeName[1],
  205.     255, NULL, &destWrote, NULL); /* Internalize native */
  206.     nativeName[0] = destWrote;
  207.     resource = GetNamedResource('cicn', nativeName);
  208.     if (resource != NULL) {
  209. type = TYPE3;
  210.     } else {
  211. resource = GetNamedResource('ICON', nativeName);
  212. if (resource != NULL) {
  213.     type = TYPE2;
  214. }
  215.     }
  216.     
  217.     if (resource == NULL) {
  218. return NULL;
  219.     }
  220.     
  221.     pix = Tk_GetPixmap(display, None, 32, 32, 0);
  222.     destPort = TkMacGetDrawablePort(pix);
  223.     GetGWorld(&saveWorld, &saveDevice);
  224.     SetGWorld(destPort, NULL);
  225.     
  226.     SetRect(&destRect, 0, 0, 32, 32);
  227.     if (type == TYPE2) {
  228. RGBColor black = {0, 0, 0};
  229. RGBForeColor(&black);
  230. PlotIcon(&destRect, resource);
  231. ReleaseResource(resource);
  232.     } else if (type == TYPE3) {
  233. RGBColor white = {0xFFFF, 0xFFFF, 0xFFFF};
  234. short id;
  235. ResType theType;
  236. Str255 dummy;
  237. /*
  238.  * We need to first paint the background white.  Also, for
  239.  * some reason we *must* use GetCIcon instead of GetNamedResource
  240.  * for PlotCIcon to work - so we use GetResInfo to get the id.
  241.  */
  242. RGBForeColor(&white);
  243. PaintRect(&destRect);
  244. GetResInfo(resource, &id, &theType, dummy);
  245. ReleaseResource(resource);
  246. resource = (Handle) GetCIcon(id);
  247. PlotCIcon(&destRect, (CIconHandle) resource);
  248. DisposeCIcon((CIconHandle) resource);
  249.     }
  250.     
  251.     *width = 32;
  252.     *height = 32;
  253.     SetGWorld(saveWorld, saveDevice);
  254.     return pix;
  255. }