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

通讯编程

开发平台:

Visual C++

  1. /* 
  2.  * tkMacColor.c --
  3.  *
  4.  * This file maintains a database of color values for the Tk
  5.  * toolkit, in order to avoid round-trips to the server to
  6.  * map color names to pixel values.
  7.  *
  8.  * Copyright (c) 1990-1994 The Regents of the University of California.
  9.  * Copyright (c) 1994-1996 Sun Microsystems, Inc.
  10.  *
  11.  * See the file "license.terms" for information on usage and redistribution
  12.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  13.  *
  14.  * RCS: @(#) $Id: tkMacColor.c,v 1.6 1999/05/22 06:32:36 jingham Exp $
  15.  */
  16. #include <tkColor.h>
  17. #include "tkMacInt.h"
  18. #include <LowMem.h>
  19. #include <Palettes.h>
  20. #include <Quickdraw.h>
  21. /*
  22.  * Default Auxillary Control Record for all controls.  This is cached once
  23.  * and is updated by the system.  We use this to get the default system
  24.  * colors used by controls.
  25.  */
  26. static AuxCtlHandle defaultAuxCtlHandle = NULL;
  27. /*
  28.  * Forward declarations for procedures defined later in this file:
  29.  */
  30. static int GetControlPartColor _ANSI_ARGS_((short part, RGBColor *macColor));
  31. static int GetMenuPartColor _ANSI_ARGS_((int part, RGBColor *macColor));
  32. static int GetWindowPartColor _ANSI_ARGS_((short part, RGBColor *macColor));
  33. /*
  34.  *----------------------------------------------------------------------
  35.  *
  36.  * TkSetMacColor --
  37.  *
  38.  * Populates a Macintosh RGBColor structure from a X style
  39.  * pixel value.
  40.  *
  41.  * Results:
  42.  * Returns false if not a real pixel, true otherwise.
  43.  *
  44.  * Side effects:
  45.  * The variable macColor is updated to the pixels value.
  46.  *
  47.  *----------------------------------------------------------------------
  48.  */
  49. int
  50. TkSetMacColor(
  51.     unsigned long pixel, /* Pixel value to convert. */
  52.     RGBColor *macColor) /* Mac color struct to modify. */
  53. {
  54.     switch (pixel >> 24) {
  55. case HIGHLIGHT_PIXEL:
  56.     LMGetHiliteRGB(macColor);
  57.     return true;
  58. case HIGHLIGHT_TEXT_PIXEL:
  59.     LMGetHiliteRGB(macColor);
  60.     if ((macColor->red == 0) && (macColor->green == 0)
  61.     && (macColor->blue == 0)) {
  62. macColor->red = macColor->green = macColor->blue = 0xFFFFFFFF;
  63.     } else {
  64. macColor->red = macColor->green = macColor->blue = 0;
  65.     }
  66.     return true;
  67. case CONTROL_TEXT_PIXEL:
  68.     GetControlPartColor(cTextColor, macColor);
  69.     return true;
  70. case CONTROL_BODY_PIXEL:
  71.     GetControlPartColor(cBodyColor, macColor);
  72.     return true;
  73. case CONTROL_FRAME_PIXEL:
  74.     GetControlPartColor(cFrameColor, macColor);
  75.     return true;
  76. case WINDOW_BODY_PIXEL:
  77.     GetWindowPartColor(wContentColor, macColor);
  78.     return true;
  79. case MENU_ACTIVE_PIXEL:
  80. case MENU_ACTIVE_TEXT_PIXEL:
  81. case MENU_BACKGROUND_PIXEL:
  82. case MENU_DISABLED_PIXEL:
  83. case MENU_TEXT_PIXEL:
  84.     return GetMenuPartColor((pixel >> 24), macColor);
  85. case APPEARANCE_PIXEL:
  86.     return false;
  87. case PIXEL_MAGIC:
  88. default:
  89.     macColor->blue = (unsigned short) ((pixel & 0xFF) << 8);
  90.     macColor->green = (unsigned short) (((pixel >> 8) & 0xFF) << 8);
  91.     macColor->red = (unsigned short) (((pixel >> 16) & 0xFF) << 8);
  92.     return true;
  93.     }
  94. }
  95. /*
  96.  *----------------------------------------------------------------------
  97.  *
  98.  * Stub functions --
  99.  *
  100.  * These functions are just stubs for functions that either
  101.  * don't make sense on the Mac or have yet to be implemented.
  102.  *
  103.  * Results:
  104.  * None.
  105.  *
  106.  * Side effects:
  107.  * These calls do nothing - which may not be expected.
  108.  *
  109.  *----------------------------------------------------------------------
  110.  */
  111. Status
  112. XAllocColor(
  113.     Display *display, /* Display. */
  114.     Colormap map, /* Not used. */
  115.     XColor *colorPtr) /* XColor struct to modify. */
  116. {
  117.     display->request++;
  118.     colorPtr->pixel = TkpGetPixel(colorPtr);
  119.     return 1;
  120. }
  121. Colormap
  122. XCreateColormap(
  123.     Display *display, /* Display. */
  124.     Window window, /* X window. */
  125.     Visual *visual, /* Not used. */
  126.     int alloc) /* Not used. */
  127. {
  128.     static Colormap index = 1;
  129.     
  130.     /*
  131.      * Just return a new value each time.
  132.      */
  133.     return index++;
  134. }
  135. void
  136. XFreeColormap(
  137.     Display* display, /* Display. */
  138.     Colormap colormap) /* Colormap. */
  139. {
  140. }
  141. void
  142. XFreeColors(
  143.     Display* display, /* Display. */
  144.     Colormap colormap, /* Colormap. */
  145.     unsigned long* pixels, /* Array of pixels. */
  146.     int npixels, /* Number of pixels. */
  147.     unsigned long planes) /* Number of pixel planes. */
  148. {
  149.     /*
  150.      * The Macintosh version of Tk uses TrueColor.  Nothing
  151.      * needs to be done to release colors as there really is
  152.      * no colormap in the Tk sense.
  153.      */
  154. }
  155. /*
  156.  *----------------------------------------------------------------------
  157.  *
  158.  * TkpGetColor --
  159.  *
  160.  * Allocate a new TkColor for the color with the given name.
  161.  *
  162.  * Results:
  163.  * Returns a newly allocated TkColor, or NULL on failure.
  164.  *
  165.  * Side effects:
  166.  * May invalidate the colormap cache associated with tkwin upon
  167.  * allocating a new colormap entry.  Allocates a new TkColor
  168.  * structure.
  169.  *
  170.  *----------------------------------------------------------------------
  171.  */
  172. TkColor *
  173. TkpGetColor(
  174.     Tk_Window tkwin, /* Window in which color will be used. */
  175.     Tk_Uid name) /* Name of color to allocated (in form
  176.  * suitable for passing to XParseColor). */
  177. {
  178.     Display *display = Tk_Display(tkwin);
  179.     Colormap colormap = Tk_Colormap(tkwin);
  180.     TkColor *tkColPtr;
  181.     XColor color;
  182.     /*
  183.      * Check to see if this is a system color.  Otherwise, XParseColor
  184.      * will do all the work.
  185.      */
  186.     if (strncasecmp(name, "system", 6) == 0) {
  187. int foundSystemColor = false;
  188. RGBColor rgbValue;
  189. char pixelCode;
  190. if (!strcasecmp(name+6, "Highlight")) {
  191.     LMGetHiliteRGB(&rgbValue);
  192.     pixelCode = HIGHLIGHT_PIXEL;
  193.     foundSystemColor = true;
  194. } else if (!strcasecmp(name+6, "HighlightText")) {
  195.     LMGetHiliteRGB(&rgbValue);
  196.     if ((rgbValue.red == 0) && (rgbValue.green == 0)
  197.     && (rgbValue.blue == 0)) {
  198. rgbValue.red = rgbValue.green = rgbValue.blue = 0xFFFFFFFF;
  199.     } else {
  200. rgbValue.red = rgbValue.green = rgbValue.blue = 0;
  201.     }
  202.     pixelCode = HIGHLIGHT_TEXT_PIXEL;
  203.     foundSystemColor = true;
  204. } else if (!strcasecmp(name+6, "ButtonText")) {
  205.     GetControlPartColor(cTextColor, &rgbValue);
  206.     pixelCode = CONTROL_TEXT_PIXEL;
  207.     foundSystemColor = true;
  208. } else if (!strcasecmp(name+6, "ButtonFace")) {
  209.     GetControlPartColor(cBodyColor, &rgbValue);
  210.     pixelCode = CONTROL_BODY_PIXEL;
  211.     foundSystemColor = true;
  212. } else if (!strcasecmp(name+6, "ButtonFrame")) {
  213.     GetControlPartColor(cFrameColor, &rgbValue);
  214.     pixelCode = CONTROL_FRAME_PIXEL;
  215.     foundSystemColor = true;
  216. } else if (!strcasecmp(name+6, "WindowBody")) {
  217.     GetWindowPartColor(wContentColor, &rgbValue);
  218.     pixelCode = WINDOW_BODY_PIXEL;
  219.     foundSystemColor = true;
  220. } else if (!strcasecmp(name+6, "MenuActive")) {
  221.     GetMenuPartColor(MENU_ACTIVE_PIXEL, &rgbValue);
  222.     pixelCode = MENU_ACTIVE_PIXEL;
  223.     foundSystemColor = true;
  224. } else if (!strcasecmp(name+6, "MenuActiveText")) {
  225.     GetMenuPartColor(MENU_ACTIVE_TEXT_PIXEL, &rgbValue);
  226.     pixelCode = MENU_ACTIVE_TEXT_PIXEL;
  227.     foundSystemColor = true;
  228. } else if (!strcasecmp(name+6, "Menu")) {
  229.     GetMenuPartColor(MENU_BACKGROUND_PIXEL, &rgbValue);
  230.     pixelCode = MENU_BACKGROUND_PIXEL;
  231.     foundSystemColor = true;
  232. } else if (!strcasecmp(name+6, "MenuDisabled")) {
  233.     GetMenuPartColor(MENU_DISABLED_PIXEL, &rgbValue);
  234.     pixelCode = MENU_DISABLED_PIXEL;
  235.     foundSystemColor = true;
  236. } else if (!strcasecmp(name+6, "MenuText")) {
  237.     GetMenuPartColor(MENU_TEXT_PIXEL, &rgbValue);
  238.     pixelCode = MENU_TEXT_PIXEL;
  239.     foundSystemColor = true;
  240. } else if (!strcasecmp(name+6, "AppearanceColor")) {
  241.     color.red = 0;
  242.     color.green = 0;
  243.     color.blue = 0;
  244.     pixelCode = APPEARANCE_PIXEL;
  245.     foundSystemColor = true;
  246. }
  247. if (foundSystemColor) {
  248.     color.red = rgbValue.red;
  249.     color.green = rgbValue.green;
  250.     color.blue = rgbValue.blue;
  251.     color.pixel = ((((((pixelCode << 8)
  252. | ((color.red >> 8) & 0xff)) << 8)
  253. | ((color.green >> 8) & 0xff)) << 8)
  254. | ((color.blue >> 8) & 0xff));
  255.     
  256.     tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
  257.     tkColPtr->color = color;
  258.     return tkColPtr;
  259. }
  260.     }
  261.     
  262.     if (XParseColor(display, colormap, name, &color) == 0) {
  263. return (TkColor *) NULL;
  264.     }
  265.     
  266.     tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
  267.     tkColPtr->color = color;
  268.     return tkColPtr;
  269. }
  270. /*
  271.  *----------------------------------------------------------------------
  272.  *
  273.  * TkpGetColorByValue --
  274.  *
  275.  * Given a desired set of red-green-blue intensities for a color,
  276.  * locate a pixel value to use to draw that color in a given
  277.  * window.
  278.  *
  279.  * Results:
  280.  * The return value is a pointer to an TkColor structure that
  281.  * indicates the closest red, blue, and green intensities available
  282.  * to those specified in colorPtr, and also specifies a pixel
  283.  * value to use to draw in that color.
  284.  *
  285.  * Side effects:
  286.  * May invalidate the colormap cache for the specified window.
  287.  * Allocates a new TkColor structure.
  288.  *
  289.  *----------------------------------------------------------------------
  290.  */
  291. TkColor *
  292. TkpGetColorByValue(
  293.     Tk_Window tkwin, /* Window in which color will be used. */
  294.     XColor *colorPtr) /* Red, green, and blue fields indicate
  295.  * desired color. */
  296. {
  297.     TkColor *tkColPtr = (TkColor *) ckalloc(sizeof(TkColor));
  298.     tkColPtr->color.red = colorPtr->red;
  299.     tkColPtr->color.green = colorPtr->green;
  300.     tkColPtr->color.blue = colorPtr->blue;
  301.     tkColPtr->color.pixel = TkpGetPixel(&tkColPtr->color);
  302.     return tkColPtr;
  303. }
  304. /*
  305.  *----------------------------------------------------------------------
  306.  *
  307.  * GetControlPartColor --
  308.  *
  309.  * Given a part number this function will return the standard
  310.  * system default color for that part.  It does this by looking
  311.  * in the system's 'cctb' resource.
  312.  *
  313.  * Results:
  314.  * True if a color is found, false otherwise.
  315.  *
  316.  * Side effects:
  317.  * If a color is found then the RGB variable will be changed to
  318.  * the parts color.
  319.  *
  320.  *----------------------------------------------------------------------
  321.  */
  322. static int 
  323. GetControlPartColor(
  324.     short part,  /* Part code. */
  325.     RGBColor *macColor) /* Pointer to Mac color. */
  326. {
  327.     short index;
  328.     CCTabHandle ccTab;
  329.     if (defaultAuxCtlHandle == NULL) {
  330. GetAuxiliaryControlRecord(NULL, &defaultAuxCtlHandle);
  331.     }
  332.     ccTab = (**defaultAuxCtlHandle).acCTable;
  333.     if(ccTab && (ResError() == noErr)) {
  334. for(index = 0; index <= (**ccTab).ctSize; index++) {
  335.     if((**ccTab).ctTable[index].value == part) {
  336. *macColor = (**ccTab).ctTable[index].rgb;
  337. return true;
  338.     }
  339. }
  340.     }
  341.     return false;
  342. }
  343. /*
  344.  *----------------------------------------------------------------------
  345.  *
  346.  * GetWindowPartColor --
  347.  *
  348.  * Given a part number this function will return the standard
  349.  * system default color for that part.  It does this by looking
  350.  * in the system's 'wctb' resource.
  351.  *
  352.  * Results:
  353.  * True if a color is found, false otherwise.
  354.  *
  355.  * Side effects:
  356.  * If a color is found then the RGB variable will be changed to
  357.  * the parts color.
  358.  *
  359.  *----------------------------------------------------------------------
  360.  */
  361. static int 
  362. GetWindowPartColor(
  363.     short part,  /* Part code. */
  364.     RGBColor *macColor) /* Pointer to Mac color. */
  365. {
  366.     short index;
  367.     WCTabHandle wcTab;
  368.     wcTab = (WCTabHandle) GetResource('wctb', 0);
  369.     if(wcTab && (ResError() == noErr)) {
  370. for(index = 0; index <= (**wcTab).ctSize; index++) {
  371.     if((**wcTab).ctTable[index].value == part) {
  372. *macColor = (**wcTab).ctTable[index].rgb;
  373. return true;
  374.     }
  375. }
  376.     }
  377.     return false;
  378. }
  379. /*
  380.  *----------------------------------------------------------------------
  381.  *
  382.  * GetMenuPartColor --
  383.  *
  384.  * Given a magic pixel value, returns the RGB color associated
  385.  * with it by looking the value up in the system's 'mctb' resource.
  386.  *
  387.  * Results:
  388.  * True if a color is found, false otherwise.
  389.  *
  390.  * Side effects:
  391.  * If a color is found then the RGB variable will be changed to
  392.  * the parts color.
  393.  *
  394.  *----------------------------------------------------------------------
  395.  */
  396. static int
  397. GetMenuPartColor(
  398.     int pixel, /* The magic pixel value */
  399.     RGBColor *macColor) /* Pointer to Mac color */
  400. {
  401.     RGBColor backColor, foreColor;
  402.     GDHandle maxDevice;
  403.     Rect globalRect;
  404.     MCEntryPtr mcEntryPtr;
  405.     
  406.     /* Under Appearance, we don't want to set any menu colors when we
  407.        are asked for the standard menu colors.  So we return false (which
  408.        means don't use this color... */
  409.        
  410.     if (TkMacHaveAppearance()) {
  411.         macColor->red = 0xFFFF;
  412.         macColor->green = 0;
  413.         macColor->blue = 0;
  414.         return false;
  415.     } else {
  416.         mcEntryPtr = GetMCEntry(0, 0);
  417.     switch (pixel) {
  418.      case MENU_ACTIVE_PIXEL:
  419.          if (mcEntryPtr == NULL) {
  420.      macColor->red = macColor->blue = macColor->green = 0;
  421.          } else {
  422.           *macColor = mcEntryPtr->mctRGB3;
  423.          }
  424.          return true;
  425.      case MENU_ACTIVE_TEXT_PIXEL:
  426.          if (mcEntryPtr == NULL) {
  427.      macColor->red = macColor->blue = macColor->green = 0xFFFF;
  428.          } else {
  429.              *macColor = mcEntryPtr->mctRGB2;
  430.          }
  431.          return true;
  432.      case MENU_BACKGROUND_PIXEL:
  433.          if (mcEntryPtr == NULL) {
  434.      macColor->red = macColor->blue = macColor->green = 0xFFFF;
  435.          } else {
  436.              *macColor = mcEntryPtr->mctRGB2;
  437.          }
  438.          return true;
  439.      case MENU_DISABLED_PIXEL:
  440.          if (mcEntryPtr == NULL) {
  441.      backColor.red = backColor.blue = backColor.green = 0xFFFF;
  442.      foreColor.red = foreColor.blue = foreColor.green = 0x0000;
  443.          } else {
  444.           backColor = mcEntryPtr->mctRGB2;
  445.           foreColor = mcEntryPtr->mctRGB3;
  446.          }
  447.          SetRect(&globalRect, SHRT_MIN, SHRT_MIN, SHRT_MAX, SHRT_MAX);
  448.          maxDevice = GetMaxDevice(&globalRect);
  449.          if (GetGray(maxDevice, &backColor, &foreColor)) {
  450.           *macColor = foreColor;
  451.          } else {
  452.          
  453.           /*
  454.            * Pointer may have been moved by GetMaxDevice or GetGray.
  455.            */
  456.            
  457.           mcEntryPtr = GetMCEntry(0,0);
  458.           if (mcEntryPtr == NULL) {
  459.              macColor->red = macColor->green = macColor->blue = 0x7777;
  460.          } else {
  461.               *macColor = mcEntryPtr->mctRGB2;
  462.           }
  463.          }
  464.          return true;
  465.      case MENU_TEXT_PIXEL:
  466.          if (mcEntryPtr == NULL) {
  467.           macColor->red = macColor->green = macColor->blue = 0;
  468.          } else {
  469.           *macColor = mcEntryPtr->mctRGB3;
  470.          }
  471.          return true;
  472.     }
  473.     return false;
  474. }
  475. }