home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / WXWIN140.ZIP / SRC / WX_GDI.CC < prev    next >
C/C++ Source or Header  |  1993-04-19  |  43KB  |  1,697 lines

  1. /*
  2.  * File:     wx_gdi.cc
  3.  * Purpose:  GDI (Graphics Device Interface) objects and functions
  4.  *
  5.  *                       wxWindows 1.40
  6.  * Copyright (c) 1993 Artificial Intelligence Applications Institute,
  7.  *                   The University of Edinburgh
  8.  *
  9.  *                     Author: Julian Smart
  10.  *                       Date: 18-4-93
  11.  *
  12.  * Permission to use, copy, modify, and distribute this software and its
  13.  * documentation for any purpose is hereby granted without fee, provided
  14.  * that the above copyright notice, author statement and this permission
  15.  * notice appear in all copies of this software and related documentation.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS,
  18.  * IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
  19.  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  * IN NO EVENT SHALL THE ARTIFICIAL INTELLIGENCE APPLICATIONS INSTITUTE OR THE
  22.  * UNIVERSITY OF EDINBURGH BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR
  23.  * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM
  24.  * LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF
  25.  * DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
  26.  * THE USE OR PERFORMANCE OF THIS SOFTWARE.
  27.  */
  28.  
  29. #include <windows.h>
  30. #include <iostream.h>
  31. #include "common.h"
  32. #include "wx_list.h"
  33. #include "wx_main.h"
  34. #include "wx_gdi.h"
  35.  
  36. #ifdef wx_x
  37. XFontPool   *wxFontPool = NULL;
  38. #include <X11/cursorfont.h> // /aiai/sun4/include/X11/cursorfont.h
  39. #endif
  40.  
  41. #ifdef wx_motif
  42. #include "wx_frame.h"
  43. #include "wx_utils.h"
  44. #endif
  45.  
  46. #ifdef wx_xview
  47. #include <xview/screen.h>
  48. #include <xview/cursor.h>
  49. #include <xview/svrimage.h>
  50. extern Xv_Server xview_server;
  51.  
  52. /* These cursors courtesy of xfig
  53.  */
  54.  
  55. static short    bull_cursor_array[16] = {
  56.     0x0F00, 0x30C0, 0x4020, 0x4020, 0x8010, 0x8610, 0x8610, 0x8010,
  57.     0x4020, 0x4020, 0x30C0, 0x0F00, 0x0000, 0x0000, 0x0000, 0x0000
  58. };
  59.  
  60. static short    char_cursor_data[16] = {
  61.     0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00,
  62.     0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00,
  63. };
  64.  
  65. static short    crosshair_cursor_data[16] = {
  66.     0x1000, 0x1000, 0x1000, 0xFE00, 0x1000, 0x1000, 0x1000, 0x0000,
  67.     0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
  68. };
  69.  
  70. static short    magnifier_cursor_array[16] = {
  71.     0x0F80, 0x3060, 0x4010, 0x4010, 0x8008, 0x8008, 0x8008, 0x8008,
  72.     0x8008, 0x4010, 0x4010, 0x3078, 0x0F9C, 0x000E, 0x0007, 0x0003,
  73. };
  74.  
  75. static short    pencil_cursor_array[16] = {
  76.     0x0000, 0x0018, 0x0024, 0x0075, 0x009B, 0x0117, 0x022E, 0x045C,
  77.     0x08B8, 0x1170, 0x22E0, 0x25C0, 0x7B80, 0x6700, 0x8600, 0x0800,
  78. };
  79.  
  80. static short    vbar_cursor_array[16] = {
  81.     0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
  82.     0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
  83. };
  84.  
  85. static short hand_cursor_array[] =
  86. {
  87.   0x0C00,0x1200,0x1200,0x1380,0x1240,0x7270,0x9248,0x924E,
  88.   0x9249,0x9249,0x9009,0x8001,0x4002,0x4002,0x2004,0x2004
  89. };
  90.  
  91. #endif
  92.  
  93. wxBrushList *wxTheBrushList = NULL;
  94. wxPenList   *wxThePenList = NULL;
  95. wxGDIList   *wxTheIconList = NULL;
  96. wxGDIList   *wxTheFontList = NULL;
  97. wxGDIList   *wxTheBitmapList = NULL;
  98.  
  99. wxColourDatabase *wxTheColourDatabase = NULL;
  100.  
  101. // Stock objects
  102. wxFont *wxNORMAL_FONT;
  103. wxFont *wxSMALL_FONT;
  104. wxFont *wxITALIC_FONT;
  105. wxFont *wxSWISS_FONT;
  106. wxPen *wxRED_PEN;
  107. wxPen *wxCYAN_PEN;
  108. wxPen *wxGREEN_PEN;
  109. wxPen *wxBLACK_PEN;
  110. wxPen *wxTRANSPARENT_PEN;
  111. wxPen *wxBLACK_DASHED_PEN;
  112.  
  113. wxBrush *wxBLUE_BRUSH;
  114. wxBrush *wxGREEN_BRUSH;
  115. wxBrush *wxWHITE_BRUSH;
  116. wxBrush *wxBLACK_BRUSH;
  117. wxBrush *wxTRANSPARENT_BRUSH;
  118. wxBrush *wxCYAN_BRUSH;
  119. wxBrush *wxRED_BRUSH;
  120. wxBrush *wxGREY_BRUSH;
  121. wxBrush *wxMEDIUM_GREY_BRUSH;
  122. wxBrush *wxLIGHT_GREY_BRUSH;
  123.  
  124. wxColour *wxBLACK;
  125. wxColour *wxWHITE;
  126. wxColour *wxRED;
  127. wxColour *wxBLUE;
  128. wxColour *wxGREEN;
  129. wxColour *wxCYAN;
  130. wxColour *wxLIGHT_GREY;
  131.  
  132. wxCursor *wxSTANDARD_CURSOR = NULL;
  133. wxCursor *wxHOURGLASS_CURSOR = NULL;
  134. wxCursor *wxCROSS_CURSOR = NULL;
  135.  
  136. wxFont::wxFont(void)
  137. {
  138.   point_size = 0;
  139.   temporary = TRUE;
  140. #ifdef wx_motif
  141. #endif
  142. #ifdef wx_xview
  143.   x_font = NULL;
  144. #endif
  145. #ifdef wx_msw
  146.   cfont = NULL;
  147. #endif
  148. }
  149.  
  150. /* Constructor for a font. Note that the real construction is done
  151.  * in wxDC::SetFont, when information is available about scaling etc.
  152.  */
  153. wxFont::wxFont(int PointSize, int Family, int Style, int Weight)
  154. {
  155.   family = Family;
  156.   style = Style;
  157.   weight = Weight;
  158.   point_size = PointSize;
  159. #ifdef wx_motif
  160.   xFont = NULL;
  161. #endif
  162. #ifdef wx_xview
  163.   temporary = TRUE;
  164.   x_font = NULL;
  165. #endif
  166. #ifdef wx_msw
  167.   temporary = FALSE;
  168.   cfont = NULL;
  169. #endif
  170.   wxTheFontList->Append(this);
  171. }
  172.  
  173. int wxFont::GetPointSize(void)
  174. {
  175.   return point_size;
  176. }
  177.  
  178. wxFont::~wxFont()
  179. {
  180. #ifdef wx_motif
  181. #endif
  182. #ifdef wx_msw
  183.   if (cfont)
  184.     DeleteObject(cfont);
  185. #endif
  186.   wxTheFontList->DeleteObject(this);
  187. }
  188.  
  189. #ifdef wx_x
  190. // Pseudo-scaleable Font management under XView - a nightmare!
  191. // - but it works o.k.
  192. XFontInfo::XFontInfo(int the_family, int the_style, int the_weight, int the_point_size,
  193. #ifdef wx_xview
  194.                      Xv_Font the_font)
  195. #else
  196.                      XFontStruct *the_font)
  197. #endif
  198. {
  199.   family = the_family;
  200.   style = the_style;
  201.   weight = the_weight;
  202.   point_size = the_point_size;
  203.   font = the_font;
  204. }
  205.  
  206. XFontPool::XFontPool(void)
  207. {
  208.   cache = NULL;
  209. }
  210.  
  211. void XFontPool::AddFont(int family, int style, int weight, int point_size,
  212. #ifdef wx_xview
  213.                         Xv_Font font)
  214. #else
  215.                         XFontStruct *font)
  216. #endif
  217. {
  218.   XFontInfo *info = new XFontInfo(family, style, weight, point_size, font);
  219.   Append(info);
  220. }
  221.  
  222. #ifdef wx_xview
  223. Xv_Font
  224. #else
  225. XFontStruct *
  226. #endif
  227.   XFontPool::FindFont(int family, int style, int weight, int point_size)
  228. {
  229.   if (cache && cache->family == family && cache->style == style && cache->weight == weight
  230.         && cache->point_size == point_size)
  231.     return cache->font;
  232.  
  233.   wxNode *node = First();
  234. #ifdef wx_xview
  235.   Xv_Font
  236. #else
  237.   XFontStruct *
  238. #endif
  239.     found = NULL;
  240.   while (node && !found)
  241.   {
  242.     XFontInfo *info = (XFontInfo *)node->Data();
  243.     if (info->family == family && info->style == style && info->weight == weight
  244.         && info->point_size == point_size)
  245.     {
  246.       found = info->font;
  247.       cache = info;
  248.     }
  249.     node = node->Next();
  250.   }
  251.   return found;
  252. }
  253.  
  254. #ifdef wx_xview
  255. Xv_Font XFontPool::FindOrCreateFont(int family, int style, int weight, int point_size, int point_size_to_store, int xres, int yres)
  256. {
  257.   Xv_Font font = FindFont(family, style, weight, point_size);
  258.  
  259.   if (!font)
  260.   {
  261.     char *xfamily;
  262.     char *xstyle;
  263.     switch (family)
  264.     {
  265.     case wxDECORATIVE: xfamily = FONT_FAMILY_LUCIDA;  // ????
  266.                        break;
  267.     case wxROMAN:      xfamily = FONT_FAMILY_ROMAN;
  268.                        break;
  269.     case wxMODERN:     xfamily = FONT_FAMILY_COUR;
  270.                        break;
  271.     case wxSWISS:      xfamily = FONT_FAMILY_LUCIDA;
  272.                        break;
  273.     case wxDEFAULT:
  274.     default:           xfamily = FONT_FAMILY_DEFAULT;
  275.     }
  276.  
  277.     if (style == wxNORMAL && weight == wxNORMAL)
  278.       xstyle = FONT_STYLE_NORMAL;
  279.     else if (style == wxNORMAL && weight == wxBOLD)
  280.       xstyle = FONT_STYLE_BOLD;
  281.     else if (style == wxNORMAL && weight == wxLIGHT)
  282.       xstyle = FONT_STYLE_NORMAL;
  283.  
  284.     else if (style == wxITALIC && weight == wxNORMAL)
  285.       xstyle = FONT_STYLE_ITALIC;
  286.     else if (style == wxITALIC && weight == wxBOLD)
  287.       xstyle = FONT_STYLE_BOLD_ITALIC;
  288.     else if (style == wxITALIC && weight == wxLIGHT)
  289.       xstyle = FONT_STYLE_ITALIC;
  290.  
  291.     else if (style == wxSLANT && weight == wxNORMAL)
  292.       xstyle = FONT_STYLE_OBLIQUE;
  293.     else if (style == wxSLANT && weight == wxBOLD)
  294.       xstyle = FONT_STYLE_BOLD_OBLIQUE;
  295.     else if (style == wxSLANT && weight == wxLIGHT)
  296.       xstyle = FONT_STYLE_OBLIQUE;
  297.  
  298.     else xstyle = FONT_STYLE_DEFAULT;
  299.  
  300.     font = (Xv_Font)xv_find(NULL, FONT,
  301.                               FONT_FAMILY, xfamily,
  302.                               FONT_STYLE, xstyle,
  303.                               FONT_SIZE, point_size,
  304.                     NULL);
  305.  
  306.     if (font)
  307.     {
  308.       AddFont(family, style, weight, point_size_to_store, font);
  309.     }
  310.   }
  311.   return font;
  312. }
  313. #endif
  314.  
  315. #ifdef wx_motif
  316. XFontStruct *XFontPool::FindOrCreateFont(int family, int style, int weight, int point_size, int point_size_to_store, int xres, int yres)
  317. {
  318.   XFontStruct *font = FindFont(family, style, weight, point_size);
  319.  
  320.   if (!font)
  321.   {
  322.     char *xfamily;
  323.     char *xstyle;
  324.     char *xweight;
  325.     switch (family)
  326.     {
  327.       case wxDECORATIVE: xfamily = "lucida";
  328.                          break;
  329.       case wxROMAN:      xfamily = "times";
  330.                          break;
  331.       case wxMODERN:     xfamily = "courier";
  332.                          break;
  333.       case wxSWISS:      xfamily = "lucida";
  334.                          break;
  335.       case wxDEFAULT:
  336.         default:           xfamily = "*";
  337.     }
  338.     switch (style)
  339.     {
  340.       case wxITALIC:     xstyle = "i";
  341.                          break;
  342.       case wxSLANT:      xstyle = "o";
  343.                          break;
  344.       case wxNORMAL:     xstyle = "r";
  345.                          break;
  346.       default:           xstyle = "*";
  347.                          break;
  348.     }
  349.     switch (weight)
  350.     {
  351.       case wxBOLD:       xweight = "bold";
  352.                          break;
  353.       case wxLIGHT:
  354.       case wxNORMAL:     xweight = "medium";
  355.                          break;
  356.       default:           xweight = "*";
  357.                          break;
  358.     }
  359.  
  360.     sprintf(wxBuffer, "-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-*-*",
  361.             xfamily, xweight, xstyle, point_size);
  362.  
  363.     Display *dpy = XtDisplay(wxTheApp->topLevel);
  364.     font = XLoadQueryFont(dpy, wxBuffer);
  365.  
  366.     if (font)
  367.     {
  368.       AddFont(family, style, weight, point_size_to_store, font);
  369.     }
  370.   }
  371.   return font;
  372. }
  373. #endif
  374.  
  375. #ifdef wx_xview
  376. Xv_Font
  377. #else
  378. XFontStruct *
  379. #endif
  380.   XFontPool::FindNearestFont(int family, int style, int weight, int point_size, int xres, int yres)
  381. {
  382. #ifdef wx_xview
  383.   int max_size = 50;
  384.   int min_size = 1;
  385.   int search_inc = 1;
  386. #else
  387.   int max_size = 500;
  388.   int min_size = 1;
  389.   int search_inc = 10;
  390. #endif
  391. #ifdef wx_xview
  392.   Xv_Font
  393. #else
  394.   XFontStruct *
  395. #endif
  396.     font = FindOrCreateFont(family, style, weight, point_size, point_size, xres, yres);
  397.   if (!font)
  398.   {
  399.     int i;
  400.     i = point_size - search_inc;
  401.     while (!font && i > min_size)
  402.     {
  403.       font = FindOrCreateFont(family, style, weight, i, point_size, xres, yres);
  404.       i -= search_inc;
  405.     }
  406.  
  407.     i = point_size + search_inc;
  408.     while (!font && i < max_size)
  409.     {
  410.       font = FindOrCreateFont(family, style, weight, i, point_size, xres, yres);
  411.       i += search_inc;
  412.     }
  413.     // Remember what font to use for next time
  414.     if (font)
  415.       AddFont(family, style, weight, point_size, font);
  416.  
  417.     if (!font)
  418.     {
  419. #ifdef wx_xview
  420.       int bog_standard = 12;
  421. #endif
  422. #ifdef wx_motif
  423.       int bog_standard = 120;
  424. #endif
  425.       // For next time this happens, remember we just use a bog standard one
  426.       font = FindOrCreateFont(wxDEFAULT, wxNORMAL, wxNORMAL, bog_standard, point_size,
  427.              100, 100);
  428.     }
  429.   }
  430.   return font;
  431. }
  432.  
  433. #endif
  434.  
  435.  
  436.  
  437. // Colour
  438.  
  439. wxColour::wxColour(char r, char g, char b)
  440. {
  441.   red = r; green = g; blue = b;
  442. }
  443.  
  444. wxColour::wxColour(char *col)
  445. {
  446.   wxColour *the_colour = wxTheColourDatabase->FindColour(col);
  447.   if (the_colour)
  448.   {
  449.     red = the_colour->Red(); green = the_colour->Green();
  450.     blue = the_colour->Blue();
  451.   }
  452.   else
  453.   {
  454.     red = 0; green = 0; blue = 0;
  455.   }
  456. }
  457.  
  458.  
  459. void wxColour::Set(char r, char g, char b)
  460. {
  461.   red = r; green = g; blue = b;
  462. }
  463.  
  464. void wxColour::Get(char *r, char *g, char *b)
  465. {
  466.   *r = red; *g = green; *b = blue;
  467. }
  468.  
  469. char wxColour::Red(void)
  470. {
  471.   return red;
  472. }
  473.  
  474. char wxColour::Green(void)
  475. {
  476.   return green;
  477. }
  478.  
  479. char wxColour::Blue(void)
  480. {
  481.   return blue;
  482. }
  483.  
  484. wxColourDatabase::wxColourDatabase(int type):wxList(type)
  485. {
  486. }
  487.  
  488. // Colour database stuff
  489. void wxColourDatabase::Initialize(void)
  490. {
  491.   Append("AQUAMARINE"       , new wxColour(112, 219, 147));
  492.   Append("BLACK"            , new wxColour(0, 0, 0));
  493.   Append("BLUE"             , new wxColour(0, 0, 255));
  494.   Append("BLUE VIOLET"      , new wxColour(159, 95, 159));
  495.   Append("BROWN"            , new wxColour(165, 42, 42));
  496.   Append("CADET BLUE"       , new wxColour(95, 159, 159));
  497.   Append("CORAL"            , new wxColour(255, 127, 0));
  498.   Append("CORNFLOWER BLUE"  , new wxColour(66, 66, 111));
  499.   Append("CYAN"             , new wxColour(0, 255, 255));
  500.   Append("DARK GREY"        , new wxColour(47, 47, 47));  // ?
  501.   Append("DARK GREEN"       , new wxColour(47, 79, 47));
  502.   Append("DARK OLIVE GREEN" , new wxColour(79, 79, 47));
  503.   Append("DARK ORCHID"      , new wxColour(153, 50, 204));
  504.   Append("DARK SLATE BLUE"  , new wxColour(107, 35, 142));
  505.   Append("DARK SLATE GREY"  , new wxColour(47, 79, 79));
  506.   Append("DARK TURQUOISE"   , new wxColour(112, 147, 219));
  507.   Append("DIM GREY"         , new wxColour(84, 84, 84));
  508.   Append("FIREBRICK"        , new wxColour(142, 35, 35));
  509.   Append("FOREST GREEN"     , new wxColour(35, 142, 35));
  510.   Append("GOLD"             , new wxColour(204, 127, 50));
  511.   Append("GOLDENROD"        , new wxColour(219, 219, 112));
  512.   Append("GREY"             , new wxColour(192, 192, 192));
  513.   Append("GREEN"            , new wxColour(0, 255, 0));
  514.   Append("GREEN YELLOW"     , new wxColour(147, 219, 112));
  515.   Append("INDIAN RED"       , new wxColour(79, 47, 47));
  516.   Append("KHAKI"            , new wxColour(159, 159, 95));
  517.   Append("LIGHT BLUE"       , new wxColour(191, 216, 216));
  518.   Append("LIGHT GREY"       , new wxColour(168, 168, 168));
  519. //  Append("LIGHT GREY"       , new wxColour(200, 200, 200));
  520.   Append("LIGHT STEEL BLUE" , new wxColour(143, 143, 188));
  521.   Append("LIME GREEN"       , new wxColour(50, 204, 50));
  522.   Append("MAGENTA"          , new wxColour(255, 0, 255));
  523.   Append("MAROON"           , new wxColour(142, 35, 107));
  524.   Append("MEDIUM AQUAMARINE" , new wxColour(50, 204, 153));
  525.   Append("MEDIUM GREY" , new wxColour(100, 100, 100));
  526.   Append("MEDIUM BLUE"      , new wxColour(50, 50, 204));
  527.   Append("MEDIUM FOREST GREEN" , new wxColour(107, 142, 35));
  528.   Append("MEDIUM GOLDENROD" , new wxColour(234, 234, 173));
  529.   Append("MEDIUM ORCHID"    , new wxColour(147, 112, 219));
  530.   Append("MEDIUM SEA GREEN" , new wxColour(66, 111, 66));
  531.   Append("MEDIUM SLATE BLUE" , new wxColour(127, 0, 255));
  532.   Append("MEDIUM SPRING GREEN" , new wxColour(127, 255, 0));
  533.   Append("MEDIUM TURQUOISE" , new wxColour(112, 219, 219));
  534.   Append("MEDIUM VIOLET RED" , new wxColour(219, 112, 147));
  535.   Append("MIDNIGHT BLUE"    , new wxColour(47, 47, 79));
  536.   Append("NAVY"             , new wxColour(35, 35, 142));
  537.   Append("ORANGE"           , new wxColour(204, 50, 50));
  538.   Append("ORANGE RED"       , new wxColour(255, 0, 127));
  539.   Append("ORCHID"           , new wxColour(219, 112, 219));
  540.   Append("PALE GREEN"       , new wxColour(143, 188, 143));
  541.   Append("PINK"             , new wxColour(188, 143, 234));
  542.   Append("PLUM"             , new wxColour(234, 173, 234));
  543.   Append("PURPLE"           , new wxColour(176, 0, 255));
  544.   Append("RED"              , new wxColour(255, 0, 0));
  545.   Append("SALMON"           , new wxColour(111, 66, 66));
  546.   Append("SEA GREEN"        , new wxColour(35, 142, 107));
  547.   Append("SIENNA"           , new wxColour(142, 107, 35));
  548.   Append("SKY BLUE"         , new wxColour(50, 153, 204));
  549.   Append("SLATE BLUE"       , new wxColour(0, 127, 255));
  550.   Append("SPRING GREEN"     , new wxColour(0, 255, 127));
  551.   Append("STEEL BLUE"       , new wxColour(35, 107, 142));
  552.   Append("TAN"              , new wxColour(219, 147, 112));
  553.   Append("THISTLE"          , new wxColour(216, 191, 216));
  554.   Append("TURQUOISE"        , new wxColour(173, 234, 234));
  555.   Append("VIOLET"           , new wxColour(79, 47, 79));
  556.   Append("VIOLET RED"       , new wxColour(204, 50, 153));
  557.   Append("WHEAT"            , new wxColour(216, 216, 191));
  558.   Append("WHITE"            , new wxColour(255, 255, 255));
  559.   Append("YELLOW"           , new wxColour(255, 255, 0));
  560.   Append("YELLOW GREEN"     , new wxColour(153, 204, 50));
  561. }
  562.  
  563. wxColour *wxColourDatabase::FindColour(char *colour)
  564. {
  565.   wxNode *node = Find(colour);
  566.   if (node)
  567.     return (wxColour *)node->Data();
  568.   else
  569.     return NULL;
  570. }
  571.  
  572. char *wxColourDatabase::FindName(wxColour& colour)
  573. {
  574.   wxNode *node = First();
  575.   char *found = NULL;
  576.   char red = colour.Red();
  577.   char green = colour.Green();
  578.   char blue = colour.Blue();
  579.   while (node && !found)
  580.   {
  581.     wxColour *col = (wxColour *)node->Data();
  582.     if (col->Red() == red && col->Green() == green && col->Blue() == blue)
  583.       found = node->key.string;
  584.     else
  585.       node = node->Next();
  586.   }
  587.   return found;
  588. }
  589.  
  590.  
  591. void wxInitializeStockObjects(void)
  592. {
  593.   wxTheBrushList = new wxBrushList;
  594.   wxThePenList = new wxPenList;
  595.   wxTheIconList = new wxGDIList;
  596.   wxTheFontList =  new wxGDIList;
  597.   wxTheBitmapList =  new wxGDIList;
  598.  
  599. #ifdef wx_motif
  600. #endif
  601. #ifdef wx_x
  602.   wxFontPool = new XFontPool;
  603. #endif
  604.  
  605.   wxNORMAL_FONT = new wxFont(12, wxMODERN, wxNORMAL, wxNORMAL);
  606.   wxSMALL_FONT = new wxFont(10, wxSWISS, wxNORMAL, wxNORMAL);
  607.   wxITALIC_FONT = new wxFont(12, wxROMAN, wxITALIC, wxNORMAL);
  608.   wxSWISS_FONT = new wxFont(12, wxSWISS, wxNORMAL, wxNORMAL);
  609.   wxRED_PEN = new wxPen("RED", 3, wxSOLID);
  610.   wxCYAN_PEN = new wxPen("CYAN", 3, wxSOLID);
  611.   wxGREEN_PEN = new wxPen("GREEN", 1, wxSOLID);
  612.   wxBLACK_PEN = new wxPen("BLACK", 1, wxSOLID);
  613.   wxTRANSPARENT_PEN = new wxPen("BLACK", 1, wxTRANSPARENT);
  614.   wxBLACK_DASHED_PEN = new wxPen("BLACK", 1, wxSHORT_DASH);
  615.  
  616.   wxBLUE_BRUSH = new wxBrush("BLUE", wxSOLID);
  617.   wxGREEN_BRUSH = new wxBrush("GREEN", wxSOLID);
  618.   wxWHITE_BRUSH = new wxBrush("WHITE", wxSOLID);
  619.   wxBLACK_BRUSH = new wxBrush("BLACK", wxSOLID);
  620.   wxTRANSPARENT_BRUSH = new wxBrush("BLACK", wxTRANSPARENT);
  621.   wxCYAN_BRUSH = new wxBrush("CYAN", wxSOLID);
  622.   wxRED_BRUSH = new wxBrush("RED", wxSOLID);
  623.   wxGREY_BRUSH = new wxBrush("GREY", wxSOLID);
  624.   wxMEDIUM_GREY_BRUSH = new wxBrush("MEDIUM GREY", wxSOLID);
  625.   wxLIGHT_GREY_BRUSH = new wxBrush("LIGHT GREY", wxSOLID);
  626.  
  627.   wxBLACK = new wxColour("BLACK");
  628.   wxWHITE = new wxColour("WHITE");
  629.   wxRED = new wxColour("RED");
  630.   wxBLUE = new wxColour("BLUE");
  631.   wxGREEN = new wxColour("GREEN");
  632.   wxCYAN = new wxColour("CYAN");
  633.   wxLIGHT_GREY = new wxColour("LIGHT GREY");
  634.  
  635.   wxSTANDARD_CURSOR = new wxCursor(wxCURSOR_ARROW);
  636.   wxHOURGLASS_CURSOR = new wxCursor(wxCURSOR_WAIT);
  637.   wxCROSS_CURSOR = new wxCursor(wxCURSOR_CROSS);
  638. }
  639.  
  640. // Pens
  641.  
  642. wxPen::wxPen(void)
  643. {
  644.   colour = NULL;
  645.   style = wxSOLID;
  646.   width = 1;
  647. #ifdef wx_msw
  648.   cpen = NULL;
  649. #endif
  650.   wxThePenList->AddPen(this);
  651. }
  652.  
  653. wxPen::~wxPen()
  654. {
  655.   if (colour)
  656.     delete colour;
  657.  
  658. #ifdef wx_msw
  659.   if (cpen)
  660.     DeleteObject(cpen);
  661. #endif
  662.   wxThePenList->RemovePen(this);
  663. }
  664.  
  665. wxPen::wxPen(wxColour& col, int Width, int Style)
  666. {
  667.   colour = new wxColour(col.Red(), col.Green(), col.Blue());
  668.   width = Width;
  669.   style = Style;
  670. #ifdef wx_msw
  671.   DWORD ms_colour = RGB(col.Red(), col.Green(), col.Blue());
  672.   cpen = CreatePen(wx2msPenStyle(Style), Width, ms_colour);
  673. #endif
  674.   wxThePenList->AddPen(this);
  675. }
  676.  
  677. wxPen::wxPen(char *col, int Width, int Style)
  678. {
  679.   colour = new wxColour(col);
  680.   width = Width;
  681.   style = Style;
  682. #ifdef wx_msw
  683.   DWORD ms_colour = RGB(colour->Red(), colour->Green(), colour->Blue());
  684.   cpen = CreatePen(wx2msPenStyle(Style), Width, ms_colour);
  685. #endif
  686.   wxThePenList->AddPen(this);
  687. }
  688.  
  689. void wxPen::SetColour(wxColour& col)
  690. {
  691.   if (colour)
  692.     delete colour;
  693.   colour = new wxColour(col.Red(), col.Green(), col. Blue());
  694. #ifdef wx_msw
  695.   if (cpen)
  696.     DeleteObject(cpen);
  697.  
  698.   DWORD ms_colour = RGB(col.Red(), col.Green(), col.Blue());
  699.   cpen = CreatePen(wx2msPenStyle(style), width, ms_colour);
  700. #endif
  701. }
  702.  
  703. void wxPen::SetColour(char *col)
  704. {
  705.   if (colour)
  706.     delete colour;
  707.   colour = new wxColour(col);
  708. #ifdef wx_msw
  709.   if (cpen)
  710.     DeleteObject(cpen);
  711.  
  712.   DWORD ms_colour = RGB(colour->Red(), colour->Green(), colour->Blue());
  713.   cpen = CreatePen(wx2msPenStyle(style), width, ms_colour);
  714. #endif
  715. }
  716.  
  717. void wxPen::SetColour(char red, char green, char blue)
  718. {
  719.   if (colour)
  720.     delete colour;
  721.   colour = new wxColour(red, green, blue);
  722. #ifdef wx_msw
  723.   if (cpen)
  724.     DeleteObject(cpen);
  725.  
  726.   DWORD ms_colour = RGB(red, green, blue);
  727.   cpen = CreatePen(wx2msPenStyle(style), width, ms_colour);
  728. #endif
  729. }
  730.  
  731. void wxPen::SetWidth(int Width)
  732. {
  733.   width = Width;
  734. #ifdef wx_msw
  735.   if (cpen)
  736.     DeleteObject(cpen);
  737.  
  738.   DWORD ms_colour = 0;
  739.   if (colour)
  740.     ms_colour = RGB(colour->Red(), colour->Green(), colour->Blue());
  741.   cpen = CreatePen(wx2msPenStyle(style), width, ms_colour);
  742. #endif
  743. }
  744.  
  745. void wxPen::SetStyle(int Style)
  746. {
  747.   style = Style;
  748. #ifdef wx_msw
  749.   if (cpen)
  750.     DeleteObject(cpen);
  751.  
  752.   DWORD ms_colour = 0;
  753.   if (colour)
  754.     ms_colour = RGB(colour->Red(), colour->Green(), colour->Blue());
  755.   cpen = CreatePen(wx2msPenStyle(style), width, ms_colour);
  756. #endif
  757. }
  758.  
  759. int wxPen::GetWidth(void)
  760. {
  761.   return width;
  762. }
  763.  
  764. int wxPen::GetStyle(void)
  765. {
  766.   return style;
  767. }
  768.  
  769. wxColour& wxPen::GetColour(void)
  770. {
  771.   return *colour;
  772. }
  773.  
  774. #ifdef wx_msw
  775. int wx2msPenStyle(int wx_style)
  776. {
  777.   int cstyle;
  778.   switch (wx_style)
  779.   {
  780.     case wxDOT:
  781.       cstyle = PS_DOT;
  782.       break;
  783.     case wxSHORT_DASH:
  784.     case wxLONG_DASH:
  785.       cstyle = PS_DASH;
  786.       break;
  787.     case wxTRANSPARENT:
  788.       cstyle = PS_NULL;
  789.       break;
  790.     case wxSOLID:
  791.     default:
  792.       cstyle = PS_SOLID;
  793.       break;
  794.   }
  795.   return cstyle;
  796. }
  797. #endif
  798.  
  799. // Brushes
  800.  
  801. wxBrush::wxBrush(void)
  802. {
  803.   colour = NULL;
  804.   style = wxSOLID;
  805. #ifdef wx_msw
  806.   cbrush = NULL;
  807. #endif
  808.   wxTheBrushList->AddBrush(this);
  809. }
  810.  
  811. wxBrush::~wxBrush()
  812. {
  813.   if (colour)
  814.     delete colour;
  815. #ifdef wx_msw
  816.   if (cbrush)
  817.     DeleteObject(cbrush);
  818. #endif
  819.   wxTheBrushList->RemoveBrush(this);
  820. }
  821.  
  822. wxBrush::wxBrush(wxColour& col, int Style)
  823. {
  824.   colour = new wxColour(col.Red(), col.Green(), col. Blue());
  825.   style = Style;
  826. #ifdef wx_msw
  827.   switch (Style)
  828.   {
  829.     case wxTRANSPARENT:
  830.       cbrush = NULL;  // Must always select a suitable background brush
  831.                       // - could choose white always for a quick solution
  832.       break;
  833.     case wxSOLID:
  834.     default:
  835.       cbrush = CreateSolidBrush(RGB(col.Red(), col.Green(), col.Blue()));
  836.   }
  837. #endif
  838.   wxTheBrushList->AddBrush(this);
  839. }
  840.  
  841. wxBrush::wxBrush(char *col, int Style)
  842. {
  843.   colour = new wxColour(col);
  844.   style = Style;
  845. #ifdef wx_msw
  846.   switch (Style)
  847.   {
  848.     case wxTRANSPARENT:
  849.       cbrush = NULL;  // Must always select a suitable background brush
  850.                       // - could choose white always for a quick solution
  851.       break;
  852.     case wxSOLID:
  853.     default:
  854.       cbrush = CreateSolidBrush(RGB(colour->Red(), colour->Green(), colour->Blue()));
  855.   }
  856. #endif
  857.   wxTheBrushList->AddBrush(this);
  858. }
  859.  
  860. void wxBrush::SetColour(wxColour& col)
  861. {
  862.   if (colour)
  863.     delete colour;
  864.   colour = new wxColour(col.Red(), col.Green(), col. Blue());
  865.  
  866. #ifdef wx_msw
  867.   if (cbrush) DeleteObject(cbrush);
  868.   switch (style)
  869.   {
  870.     case wxTRANSPARENT:
  871.       cbrush = NULL;  // Must always select a suitable background brush
  872.                       // - could choose white always for a quick solution
  873.       break;
  874.     case wxSOLID:
  875.     default:
  876.       cbrush = CreateSolidBrush(RGB(col.Red(), col.Green(), col.Blue()));
  877.   }
  878. #endif
  879. }
  880.  
  881. void wxBrush::SetColour(char *col)
  882. {
  883.   if (colour)
  884.     delete colour;
  885.   colour = new wxColour(col);
  886.  
  887. #ifdef wx_msw
  888.   if (cbrush) DeleteObject(cbrush);
  889.   switch (style)
  890.   {
  891.     case wxTRANSPARENT:
  892.       cbrush = NULL;  // Must always select a suitable background brush
  893.                       // - could choose white always for a quick solution
  894.       break;
  895.     case wxSOLID:
  896.     default:
  897.       cbrush = CreateSolidBrush(RGB(colour->Red(), colour->Green(), colour->Blue()));
  898.   }
  899. #endif
  900. }
  901.  
  902. void wxBrush::SetColour(char red, char green, char blue)
  903. {
  904.   if (colour)
  905.     delete colour;
  906.   colour = new wxColour(red, green, blue);
  907. #ifdef wx_msw
  908.   if (cbrush) DeleteObject(cbrush);
  909.   switch (style)
  910.   {
  911.     case wxTRANSPARENT:
  912.       cbrush = NULL;  // Must always select a suitable background brush
  913.                       // - could choose white always for a quick solution
  914.       break;
  915.     case wxSOLID:
  916.     default:
  917.       cbrush = CreateSolidBrush(RGB(red, green, blue));
  918.   }
  919. #endif
  920. }
  921.  
  922. void wxBrush::SetStyle(int Style)
  923. {
  924.   style = Style;
  925. #ifdef wx_msw
  926.   if (cbrush) DeleteObject(cbrush);
  927.   switch (Style)
  928.   {
  929.     case wxTRANSPARENT:
  930.       cbrush = NULL;     // Don't fill shapes
  931.       break;
  932.     case wxSOLID:
  933.     default:
  934.       if (colour)
  935.       {
  936.         cbrush = CreateSolidBrush(RGB(colour->Red(), colour->Green(), colour->Blue()));
  937.       }
  938.       else cbrush = NULL;
  939.   }
  940. #endif
  941. }
  942.  
  943. int wxBrush::GetStyle(void)
  944. {
  945.   return style;
  946. }
  947.  
  948. wxColour& wxBrush::GetColour(void)
  949. {
  950.   return *colour;
  951. }
  952.  
  953. // Icons
  954. wxIcon::wxIcon(short bits[], int width, int height)
  955. {
  956. #ifdef wx_motif
  957.   iconWidth = width;
  958.   iconHeight = height;
  959.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  960.   x_pixmap = XCreateBitmapFromData(dpy, RootWindow(dpy, DefaultScreen(dpy)), (char *)bits, width, height);
  961. #endif
  962. #ifdef wx_xview
  963.   x_image = (Server_image)xv_create(NULL, SERVER_IMAGE,
  964.                        XV_WIDTH,    width,
  965.                        XV_HEIGHT,    height,
  966.                        SERVER_IMAGE_BITS, bits,
  967.                        NULL);
  968.   x_icon = (Icon)xv_create(NULL, ICON, ICON_IMAGE, x_image, NULL);
  969. #endif
  970.   wxTheIconList->Append(this);
  971. }
  972.  
  973. wxIcon::wxIcon(char *icon_file)
  974. {
  975. #ifdef wx_motif
  976.   int hotX, hotY;
  977.   unsigned int w, h;
  978.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  979.   int value = XReadBitmapFile(dpy, RootWindow(dpy, DefaultScreen(dpy)), icon_file, &w, &h, &x_pixmap, &hotX, &hotY);
  980.   iconWidth = w;
  981.   iconHeight = h;
  982.   if ((value == BitmapFileInvalid) || (value == BitmapOpenFailed) || (value == BitmapNoMemory))
  983.     x_pixmap = 0;
  984. #endif
  985. #ifdef wx_xview
  986.   x_image = (Server_image)xv_create(NULL, SERVER_IMAGE,
  987.                                        SERVER_IMAGE_BITMAP_FILE, icon_file,
  988.                        NULL);
  989.   x_icon = (Icon)xv_create(NULL, ICON, ICON_IMAGE, x_image, NULL);
  990. #endif
  991. #ifdef wx_msw
  992.   ms_icon = LoadIcon(wxhInstance, icon_file);
  993. #endif
  994.   wxTheIconList->Append(this);
  995. }
  996.  
  997. wxIcon::~wxIcon(void)
  998. {
  999. #ifdef wx_motif
  1000.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  1001.   if (x_pixmap)
  1002.     XFreePixmap(dpy, x_pixmap);
  1003. #endif
  1004. #ifdef wx_xview
  1005.   xv_destroy_safe(x_icon);
  1006. #endif
  1007. #ifdef wx_msw
  1008.   if (ms_icon)
  1009.     DestroyIcon(ms_icon);
  1010. #endif
  1011.   wxTheIconList->DeleteObject(this);
  1012. }
  1013.  
  1014. wxGDIList::wxGDIList(void)
  1015. {
  1016. }
  1017.  
  1018. wxGDIList::~wxGDIList(void)
  1019. {
  1020.   wxNode *node = First();
  1021.   while (node)
  1022.   {
  1023.     wxObject *object = (wxObject *)node->Data();
  1024.     wxNode *next = node->Next();
  1025.     delete object;
  1026.     node = next;
  1027.   }
  1028. }
  1029.  
  1030. // Cursors
  1031. // NB Should delete loaded Windows cursors with DestroyCursor!!!
  1032. wxCursor::wxCursor(short bits[], int width, int height)
  1033. {
  1034. #ifdef wx_motif
  1035. #endif
  1036. #ifdef wx_xview
  1037.   Server_image image;
  1038.   image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1039.                        XV_WIDTH,    width,
  1040.                        XV_HEIGHT,    height,
  1041.                        SERVER_IMAGE_BITS, bits,
  1042.                        NULL);
  1043.   x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, image, NULL);
  1044. #endif
  1045. }
  1046.  
  1047. wxCursor::wxCursor(char *cursor_file)
  1048. {
  1049. #ifdef wx_motif
  1050. #endif
  1051. #ifdef wx_xview
  1052.   Server_image image;
  1053.   image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1054.                                        SERVER_IMAGE_BITMAP_FILE, cursor_file,
  1055.                        NULL);
  1056.   x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, image, NULL);
  1057. #endif
  1058. #ifdef wx_msw
  1059.   ms_cursor = LoadCursor(wxhInstance, cursor_file);
  1060. #endif
  1061. }
  1062.  
  1063. // Cursors by stock number
  1064. wxCursor::wxCursor(int cursor_type)
  1065. {
  1066. #ifdef wx_motif
  1067.   x_cursor = 0;
  1068. #endif
  1069. #ifdef wx_x
  1070.   use_raw_x_cursor = FALSE;
  1071. #ifdef wx_xview
  1072.   Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
  1073.   Xv_Window root_window = xv_get(screen, XV_ROOT);
  1074.   Display *dpy = (Display *)xv_get(root_window, XV_DISPLAY);
  1075. #endif
  1076. #ifdef wx_motif
  1077.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  1078. #endif
  1079.  
  1080.   int x_cursor_type;
  1081.   x_cursor_type = 0;
  1082.   switch (cursor_type)
  1083.   {
  1084.     case wxCURSOR_WAIT:
  1085.     {
  1086. #ifdef wx_xview
  1087.       x_cursor_type = OLC_BUSY_PTR;
  1088.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_SRC_CHAR, x_cursor_type, NULL);
  1089. #endif
  1090. #ifdef wx_motif
  1091.       x_cursor = XCreateFontCursor(dpy, XC_watch);
  1092. #endif
  1093.       break;
  1094.     }
  1095.     case wxCURSOR_CROSS:
  1096.     {
  1097. #ifdef wx_xview
  1098.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1099.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, crosshair_cursor_data, NULL);
  1100.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image,
  1101.                            CURSOR_XHOT, 3, CURSOR_YHOT, 3, NULL);
  1102. #endif
  1103. #ifdef wx_motif
  1104.       x_cursor = XCreateFontCursor(dpy, XC_crosshair);
  1105. #endif
  1106.       break;
  1107.     }
  1108.     case wxCURSOR_CHAR:
  1109.     {
  1110. #ifdef wx_xview
  1111.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1112.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, char_cursor_data, NULL);
  1113.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image,
  1114.                            CURSOR_XHOT, 0, CURSOR_YHOT, 13, NULL);
  1115. #endif
  1116. #ifdef wx_motif
  1117. #endif
  1118.       break;
  1119.     }
  1120.     case wxCURSOR_HAND:
  1121.     {
  1122. #ifdef wx_xview
  1123.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1124.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, hand_cursor_array, NULL);
  1125.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image,
  1126.                            CURSOR_XHOT, 5, CURSOR_YHOT, 0, NULL);
  1127. #endif
  1128. #ifdef wx_motif
  1129.       x_cursor = XCreateFontCursor(dpy, XC_hand1);
  1130. #endif
  1131.       break;
  1132.     }
  1133.     case wxCURSOR_BULLSEYE:
  1134.     {
  1135. #ifdef wx_xview
  1136.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1137.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, bull_cursor_array, NULL);
  1138.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image, 
  1139.                            CURSOR_XHOT, 5, CURSOR_YHOT, 5, NULL);
  1140. #endif
  1141. #ifdef wx_motif
  1142.       x_cursor = XCreateFontCursor(dpy, XC_target);
  1143. #endif
  1144.       break;
  1145.     }
  1146.     case wxCURSOR_PENCIL:
  1147.     {
  1148. #ifdef wx_xview
  1149.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1150.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, pencil_cursor_array, 
  1151.               NULL);
  1152.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image, 
  1153.                            CURSOR_XHOT, 0, CURSOR_YHOT, 14, NULL);
  1154. #endif
  1155. #ifdef wx_motif
  1156.       x_cursor = XCreateFontCursor(dpy, XC_pencil);
  1157. #endif
  1158.       break;
  1159.     }
  1160.     case wxCURSOR_MAGNIFIER:
  1161.     {
  1162. #ifdef wx_xview
  1163.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1164.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, magnifier_cursor_array, NULL);
  1165.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image,
  1166.                            CURSOR_XHOT, 6, CURSOR_YHOT, 6, NULL);
  1167. #endif
  1168. #ifdef wx_motif
  1169.       x_cursor = XCreateFontCursor(dpy, XC_sizing);
  1170. #endif
  1171.       break;
  1172.     }
  1173.     case wxCURSOR_IBEAM:
  1174.     {
  1175. #ifdef wx_xview
  1176.       Server_image svr_image = (Server_image)xv_create(XV_NULL, SERVER_IMAGE,
  1177.               XV_WIDTH, 16, XV_HEIGHT, 16, SERVER_IMAGE_BITS, vbar_cursor_array, NULL);
  1178.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_IMAGE, svr_image,
  1179.                            CURSOR_XHOT, 0, CURSOR_YHOT, 13, NULL);
  1180. #endif
  1181. #ifdef wx_motif
  1182. #endif
  1183.       break;
  1184.     }
  1185.     case wxCURSOR_NO_ENTRY:
  1186.     {
  1187.       use_raw_x_cursor = TRUE;
  1188.       x_cursor = XCreateFontCursor(dpy, XC_pirate);
  1189.       break;
  1190.     }
  1191.  
  1192.     case wxCURSOR_LEFT_BUTTON:
  1193.     {
  1194.       use_raw_x_cursor = TRUE;
  1195.       x_cursor = XCreateFontCursor(dpy, XC_leftbutton);
  1196.       break;
  1197.     }
  1198.     case wxCURSOR_RIGHT_BUTTON:
  1199.     {
  1200.       use_raw_x_cursor = TRUE;
  1201.       x_cursor = XCreateFontCursor(dpy, XC_rightbutton);
  1202.       break;
  1203.     }
  1204.     case wxCURSOR_MIDDLE_BUTTON:
  1205.     {
  1206.       use_raw_x_cursor = TRUE;
  1207.       x_cursor = XCreateFontCursor(dpy, XC_middlebutton);
  1208.       break;
  1209.     }
  1210.     case wxCURSOR_QUESTION_ARROW:
  1211.     {
  1212.       use_raw_x_cursor = TRUE;
  1213.       x_cursor = XCreateFontCursor(dpy, XC_question_arrow);
  1214.       break;
  1215.     }
  1216.     case wxCURSOR_SIZING:
  1217.     {
  1218.       use_raw_x_cursor = TRUE;
  1219.       x_cursor = XCreateFontCursor(dpy, XC_sizing);
  1220.       break;
  1221.     }
  1222.     case wxCURSOR_WATCH:
  1223.     {
  1224.       use_raw_x_cursor = TRUE;
  1225.       x_cursor = XCreateFontCursor(dpy, XC_watch);
  1226.       break;
  1227.     }
  1228.     case wxCURSOR_SPRAYCAN:
  1229.     {
  1230.       use_raw_x_cursor = TRUE;
  1231.       x_cursor = XCreateFontCursor(dpy, XC_spraycan);
  1232.       break;
  1233.     }
  1234.     case wxCURSOR_PAINT_BRUSH:
  1235.     {
  1236.       use_raw_x_cursor = TRUE;
  1237.       x_cursor = XCreateFontCursor(dpy, XC_spraycan);
  1238.       break;
  1239.     }
  1240.     case wxCURSOR_SIZENWSE:
  1241.     case wxCURSOR_SIZENESW:
  1242.     {
  1243.       use_raw_x_cursor = TRUE;
  1244.       x_cursor = XCreateFontCursor(dpy, XC_circle);
  1245.       break;
  1246.     }
  1247.     case wxCURSOR_SIZEWE:
  1248.     {
  1249.       use_raw_x_cursor = TRUE;
  1250.       x_cursor = XCreateFontCursor(dpy, XC_sb_h_double_arrow);
  1251.       break;
  1252.     }
  1253.     case wxCURSOR_SIZENS:
  1254.     {
  1255.       use_raw_x_cursor = TRUE;
  1256.       x_cursor = XCreateFontCursor(dpy, XC_sb_v_double_arrow);
  1257.       break;
  1258.     }
  1259.     case wxCURSOR_POINT_LEFT:
  1260.     {
  1261.       use_raw_x_cursor = TRUE;
  1262.       x_cursor = XCreateFontCursor(dpy, XC_sb_left_arrow);
  1263.       break;
  1264.     }
  1265.     case wxCURSOR_POINT_RIGHT:
  1266.     {
  1267.       use_raw_x_cursor = TRUE;
  1268.       x_cursor = XCreateFontCursor(dpy, XC_sb_right_arrow);
  1269.       break;
  1270.     }
  1271.     default:
  1272.     case wxCURSOR_ARROW:
  1273.     {
  1274. #ifdef wx_xview
  1275.       x_cursor_type = OLC_BASIC_PTR;
  1276.       x_cursor = xv_create(XV_NULL, CURSOR, CURSOR_SRC_CHAR, x_cursor_type, NULL);
  1277. #endif
  1278. #ifdef wx_motif
  1279.       x_cursor = XCreateFontCursor(dpy, XC_top_left_arrow);
  1280. #endif
  1281.       break;
  1282.     }
  1283.   }
  1284. #endif
  1285. #ifdef wx_msw
  1286.   switch (cursor_type)
  1287.   {
  1288.     case wxCURSOR_WAIT:
  1289.       ms_cursor = LoadCursor(NULL, IDC_WAIT);
  1290.       break;
  1291.     case wxCURSOR_IBEAM:
  1292.       ms_cursor = LoadCursor(NULL, IDC_IBEAM);
  1293.       break;
  1294.     case wxCURSOR_CROSS:
  1295.       ms_cursor = LoadCursor(NULL, IDC_CROSS);
  1296.       break;
  1297.     case wxCURSOR_SIZENWSE:
  1298.       ms_cursor = LoadCursor(NULL, IDC_SIZENWSE);
  1299.       break;
  1300.     case wxCURSOR_SIZENESW:
  1301.       ms_cursor = LoadCursor(NULL, IDC_SIZENESW);
  1302.       break;
  1303.     case wxCURSOR_SIZEWE:
  1304.       ms_cursor = LoadCursor(NULL, IDC_SIZEWE);
  1305.       break;
  1306.     case wxCURSOR_SIZENS:
  1307.       ms_cursor = LoadCursor(NULL, IDC_SIZENS);
  1308.       break;
  1309.     case wxCURSOR_CHAR:
  1310.     {
  1311.       ms_cursor = LoadCursor(NULL, IDC_ARROW);
  1312.       break;
  1313.     }
  1314.     case wxCURSOR_HAND:
  1315.     {
  1316.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_HAND");
  1317.       break;
  1318.     }
  1319.     case wxCURSOR_BULLSEYE:
  1320.     {
  1321.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_BULLSEYE");
  1322.       break;
  1323.     }
  1324.     case wxCURSOR_PENCIL:
  1325.     {
  1326.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_PENCIL");
  1327.       break;
  1328.     }
  1329.     case wxCURSOR_MAGNIFIER:
  1330.     {
  1331.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_MAGNIFIER");
  1332.       break;
  1333.     }
  1334.     case wxCURSOR_NO_ENTRY:
  1335.     {
  1336.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_NO_ENTRY");
  1337.       break;
  1338.     }
  1339.     case wxCURSOR_LEFT_BUTTON:
  1340.     {
  1341.       ms_cursor = LoadCursor(NULL, IDC_ARROW);
  1342.       break;
  1343.     }
  1344.     case wxCURSOR_RIGHT_BUTTON:
  1345.     {
  1346.       ms_cursor = LoadCursor(NULL, IDC_ARROW);
  1347.       break;
  1348.     }
  1349.     case wxCURSOR_MIDDLE_BUTTON:
  1350.     {
  1351.       ms_cursor = LoadCursor(NULL, IDC_ARROW);
  1352.       break;
  1353.     }
  1354.     case wxCURSOR_SIZING:
  1355.     {
  1356.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_SIZING");
  1357.       break;
  1358.     }
  1359.     case wxCURSOR_WATCH:
  1360.     {
  1361.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_WATCH");
  1362.       break;
  1363.     }
  1364.     case wxCURSOR_SPRAYCAN:
  1365.     {
  1366.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_ROLLER");
  1367.       break;
  1368.     }
  1369.     case wxCURSOR_PAINT_BRUSH:
  1370.     {
  1371.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_PBRUSH");
  1372.       break;
  1373.     }
  1374.     case wxCURSOR_POINT_LEFT:
  1375.     {
  1376.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_PLEFT");
  1377.       break;
  1378.     }
  1379.     case wxCURSOR_POINT_RIGHT:
  1380.     {
  1381.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_PRIGHT");
  1382.       break;
  1383.     }
  1384.     case wxCURSOR_QUESTION_ARROW:
  1385.     {
  1386.       ms_cursor = LoadCursor(wxhInstance, "wxCURSOR_QARROW");
  1387.       break;
  1388.     }
  1389.     default:
  1390.     case wxCURSOR_ARROW:
  1391.       ms_cursor = LoadCursor(NULL, IDC_ARROW);
  1392.       break;
  1393.   }
  1394. #endif
  1395. }
  1396.  
  1397. wxCursor::~wxCursor(void)
  1398. {
  1399. #ifdef wx_motif
  1400. #endif
  1401. #ifdef wx_xview
  1402.   if (!use_raw_x_cursor)
  1403.     xv_destroy_safe(x_cursor);
  1404. #endif
  1405. }
  1406.  
  1407. // Global cursor setting
  1408. void wxSetCursor(wxCursor *cursor)
  1409. {
  1410. #ifdef wx_motif
  1411. #endif
  1412. #ifdef wx_xview
  1413.   Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
  1414.   Xv_Window root_window = xv_get(screen, XV_ROOT);
  1415.   if (cursor && cursor->x_cursor)
  1416.   {
  1417.     if (cursor->use_raw_x_cursor)
  1418.     {
  1419.       Display *dpy = (Display *)xv_get(root_window, XV_DISPLAY);
  1420.       Window win2 = xv_get(root_window, XV_XID);
  1421.  
  1422.       XDefineCursor(dpy, win2, cursor->x_cursor);
  1423.     }
  1424.     else
  1425.       xv_set(root_window, WIN_CURSOR, cursor->x_cursor, NULL);
  1426.   }
  1427.  
  1428. #endif
  1429. #ifdef wx_msw
  1430.   if (cursor)
  1431.     ::SetCursor(cursor->ms_cursor);
  1432. #endif
  1433. }
  1434.  
  1435. // Pen and Brush lists
  1436. wxPenList::~wxPenList(void)
  1437. {
  1438.   wxNode *node = First();
  1439.   while (node)
  1440.   {
  1441.     wxPen *pen = (wxPen *)node->Data();
  1442.     delete pen;
  1443.     node = First();
  1444.   }
  1445. }
  1446.  
  1447. void wxPenList::AddPen(wxPen *pen)
  1448. {
  1449.   Append(pen);
  1450. }
  1451.  
  1452. void wxPenList::RemovePen(wxPen *pen)
  1453. {
  1454.   DeleteObject(pen);
  1455. }
  1456.  
  1457. wxPen *wxPenList::FindOrCreatePen(wxColour *colour, int width, int style)
  1458. {
  1459.   wxPen *found = NULL;
  1460.   wxNode *node = First();
  1461.   while (node && !found)
  1462.   {
  1463.     wxPen *each_pen = (wxPen *)node->Data();
  1464.     if (each_pen->width == width && each_pen->style == style &&
  1465.         each_pen->colour && each_pen->colour->Red() == colour->Red() &&
  1466.         each_pen->colour->Green() == colour->Green() &&
  1467.         each_pen->colour->Blue() == colour->Blue())
  1468.       found = each_pen;
  1469.     node = node->Next();
  1470.   }
  1471.   if (found)
  1472.     return found;
  1473.   else
  1474.     return new wxPen(*colour, width, style);
  1475. }
  1476.  
  1477. wxPen *wxPenList::FindOrCreatePen(char *colour, int width, int style)
  1478. {
  1479.   wxColour *the_colour = wxTheColourDatabase->FindColour(colour);
  1480.   if (colour)
  1481.     return FindOrCreatePen(the_colour, width, style);
  1482.   else return NULL;
  1483. }
  1484.  
  1485. wxBrushList::~wxBrushList(void)
  1486. {
  1487.   wxNode *node = First();
  1488.   while (node)
  1489.   {
  1490.     wxBrush *brush = (wxBrush *)node->Data();
  1491.     delete brush;
  1492.     node = First();
  1493.   }
  1494. }
  1495.  
  1496. void wxBrushList::AddBrush(wxBrush *brush)
  1497. {
  1498.   Append(brush);
  1499. }
  1500.  
  1501. wxBrush *wxBrushList::FindOrCreateBrush(wxColour *colour, int style)
  1502. {
  1503.   wxBrush *found = NULL;
  1504.   wxNode *node = First();
  1505.   while (node && !found)
  1506.   {
  1507.     wxBrush *each_brush = (wxBrush *)node->Data();
  1508.     if (each_brush->style == style &&
  1509.         each_brush->colour && each_brush->colour->Red() == colour->Red() &&
  1510.         each_brush->colour->Green() == colour->Green() &&
  1511.         each_brush->colour->Blue() == colour->Blue())
  1512.       found = each_brush;
  1513.     node = node->Next();
  1514.   }
  1515.   if (found)
  1516.     return found;
  1517.   else
  1518.     return new wxBrush(*colour, style);
  1519. }
  1520.  
  1521. wxBrush *wxBrushList::FindOrCreateBrush(char *colour, int style)
  1522. {
  1523.   wxColour *the_colour = wxTheColourDatabase->FindColour(colour);
  1524.   if (colour)
  1525.     return FindOrCreateBrush(the_colour, style);
  1526.   else return NULL;
  1527. }
  1528.  
  1529.  
  1530. void wxBrushList::RemoveBrush(wxBrush *brush)
  1531. {
  1532.   DeleteObject(brush);
  1533. }
  1534.  
  1535. wxPoint::wxPoint(void)
  1536. {
  1537. }
  1538.  
  1539. wxPoint::wxPoint(float the_x, float the_y)
  1540. {
  1541.   x = the_x;
  1542.   y = the_y;
  1543. }
  1544.  
  1545. // Misc. functions
  1546.  
  1547. // Return TRUE if we have a colour display
  1548. Bool wxColourDisplay(void)
  1549. {
  1550. #ifdef wx_x
  1551. #ifdef wx_xview
  1552.   Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
  1553.   Xv_Window root_window = xv_get(screen, XV_ROOT);
  1554.  
  1555.   Display *dpy = (Display *)xv_get(root_window, XV_DISPLAY);
  1556. #endif
  1557. #ifdef wx_motif
  1558.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  1559. #endif
  1560.   if (DefaultDepth(dpy, DefaultScreen(dpy)) < 2)
  1561.       return FALSE;
  1562.     else
  1563.       return TRUE;
  1564. #endif
  1565. #ifdef wx_msw
  1566.   HDC dc = ::GetDC(NULL);
  1567.   Bool flag;
  1568.   if (GetDeviceCaps(dc, NUMCOLORS) > 2)
  1569.     flag = TRUE;
  1570.   else
  1571.     flag = FALSE;
  1572.   ReleaseDC(NULL, dc);
  1573.   return flag;
  1574. #endif
  1575. }
  1576.  
  1577. // Get size of display
  1578. void wxDisplaySize(int *width, int *height)
  1579. {
  1580. #ifdef wx_motif
  1581.   if (wxTheApp->topLevel)
  1582.   {
  1583.     Display *dpy = XtDisplay(wxTheApp->topLevel);
  1584.     *width = DisplayWidth(dpy, DefaultScreen(dpy));
  1585.     *height = DisplayHeight(dpy, DefaultScreen(dpy));
  1586.   }
  1587.   else
  1588.   {
  1589.     // A good bet!
  1590.     *width = 1024;
  1591.     *height = 768;
  1592.   }
  1593. #endif
  1594. #ifdef wx_xview
  1595.   Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
  1596.   Xv_Window root_window = xv_get(screen, XV_ROOT);
  1597.  
  1598.   Display *dpy = (Display *)xv_get(root_window, XV_DISPLAY);
  1599.  
  1600.   int screen_no = (int)xv_get(screen, SCREEN_NUMBER);
  1601.   *width = DisplayWidth(dpy, screen_no);
  1602.   *height = DisplayHeight(dpy, screen_no);
  1603. #endif
  1604. #ifdef wx_msw
  1605.   HDC dc = ::GetDC(NULL);
  1606.   *width = GetDeviceCaps(dc, HORZRES); *height = GetDeviceCaps(dc, VERTRES);
  1607.   ReleaseDC(NULL, dc);
  1608. #endif
  1609. }
  1610.  
  1611. wxBitmap::wxBitmap(short bits[], int the_width, int the_height, int no_bits)
  1612. {
  1613.   width = the_width;
  1614.   height = the_height;
  1615. #ifdef wx_motif
  1616.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  1617.   x_pixmap = XCreateBitmapFromData(dpy, RootWindow(dpy, DefaultScreen(dpy)), (char *)bits, width, height);
  1618. #endif
  1619. #ifdef wx_xview
  1620.   Server_image x_image = (Server_image)xv_create(NULL, SERVER_IMAGE,
  1621.                        XV_WIDTH,    width,
  1622.                        XV_HEIGHT,    height,
  1623.                        SERVER_IMAGE_BITS, bits,
  1624.                        NULL);
  1625.  
  1626. /*
  1627.  
  1628.   Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
  1629.   Xv_Window root_window = xv_get(screen, XV_ROOT);
  1630.  
  1631.   Display *dpy = (Display *)xv_get(root_window, XV_DISPLAY);
  1632.   x_pixmap = XCreateBitmapFromData(dpy, RootWindow(dpy, DefaultScreen(dpy)), (char *)bits, width, height);
  1633. */
  1634.   x_pixmap = (Pixmap)xv_get(x_image, SERVER_IMAGE_PIXMAP);
  1635. #endif
  1636.   wxTheBitmapList->Append(this);
  1637. }
  1638.  
  1639. wxBitmap::wxBitmap(char *bitmap_file)
  1640. {
  1641. #ifdef wx_motif
  1642.   int hotX, hotY;
  1643.   unsigned int w, h;
  1644.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  1645.   int value = XReadBitmapFile(dpy, RootWindow(dpy, DefaultScreen(dpy)), bitmap_file, &w, &h, &x_pixmap, &hotX, &hotY);
  1646.   width = w;
  1647.   height = h;
  1648.   if ((value == BitmapFileInvalid) || (value == BitmapOpenFailed) || (value == BitmapNoMemory))
  1649.     x_pixmap = 0;
  1650. #endif
  1651. #ifdef wx_xview
  1652.   Server_image x_image = (Server_image)xv_create(NULL, SERVER_IMAGE,
  1653.                                        SERVER_IMAGE_BITMAP_FILE, bitmap_file,
  1654.                        NULL);
  1655. /*
  1656.   int x_hot, y_hot;
  1657.   Xv_Screen screen = xv_get(xview_server, SERVER_NTH_SCREEN, 0);
  1658.   Xv_Window root_window = xv_get(screen, XV_ROOT);
  1659.  
  1660.   unsigned int w, h;
  1661.   Display *dpy = (Display *)xv_get(root_window, XV_DISPLAY);
  1662.   if (!XReadBitmapFile(dpy, RootWindow(dpy, DefaultScreen(dpy)), bitmap_file,
  1663.                        &w, &h, &x_pixmap,
  1664.                        &x_hot, &y_hot))
  1665.     x_pixmap = 0;
  1666.   width = (int)w;
  1667.   height = (int)h;
  1668. */
  1669.   x_pixmap = (Pixmap)xv_get(x_image, SERVER_IMAGE_PIXMAP);
  1670. #endif
  1671. #ifdef wx_msw
  1672.   ms_bitmap = LoadBitmap(wxhInstance, bitmap_file);
  1673.   BITMAP bm;
  1674.   GetObject(ms_bitmap, sizeof(BITMAP), (LPSTR) &bm);
  1675.   width = bm.bmWidth;
  1676.   height = bm.bmHeight;
  1677. #endif
  1678.   wxTheBitmapList->Append(this);
  1679. }
  1680.  
  1681. wxBitmap::~wxBitmap(void)
  1682. {
  1683. #ifdef wx_motif
  1684.   Display *dpy = XtDisplay(wxTheApp->topLevel);
  1685.   if (x_pixmap)
  1686.     XDestroyWindow(dpy, x_pixmap);
  1687. #endif
  1688. #ifdef wx_xview
  1689. //  xv_destroy_safe(x_image);
  1690. #endif
  1691. #ifdef wx_msw
  1692.   if (ms_bitmap)
  1693.     DeleteObject(ms_bitmap);
  1694. #endif
  1695.   wxTheBitmapList->DeleteObject(this);
  1696. }
  1697.