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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1993 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#) $Header: /cvsroot/nsnam/nam-1/paint.cc,v 1.14 2003/10/11 22:56:50 xuanc Exp $ (LBL)
  34.  */
  35. #ifdef WIN32
  36. #include <windows.h>
  37. #endif
  38. #include "config.h"
  39. #include "paint.h"
  40. #include "tclcl.h"
  41. Paint* Paint::instance_;
  42. Paint::Paint()
  43. {
  44. Tcl& tcl = Tcl::instance();
  45. Tk_Window tk = tcl.tkmain();
  46. Tk_Uid bg = Tk_GetOption(tk, "viewBackground", NULL);
  47. XColor* p = Tk_GetColor(tcl.interp(), tk, bg);
  48. if (p == 0)
  49. abort();
  50. background_ = p->pixel;
  51. XGCValues v;
  52. v.background = background_;
  53. v.foreground = background_;
  54. const unsigned long mask = GCForeground|GCBackground;
  55. gctab_ = new GC[PaintStaticGCSize];
  56. rgb_ = new rgb[PaintStaticGCSize];
  57. gcSize_ = PaintStaticGCSize;
  58. gctab_[0] = Tk_GetGC(tk, mask, &v);
  59. rgb_[0].colorname = strdup("black");
  60. rgb_[0].red=p->red;
  61. rgb_[0].green=p->green;
  62. rgb_[0].blue=p->blue;
  63. ngc_ = 1;
  64. thick_ = lookup("black", 3);
  65. thin_ = lookup("black", 1);
  66. xor_ = lookupXor("black", 1);
  67. }
  68. void Paint::init()
  69. {
  70. instance_ = new Paint;
  71. }
  72. GC Paint::text_gc(Font fid, const char* color)
  73. {
  74. Tcl& tcl = Tcl::instance();
  75. Tk_Window tk = tcl.tkmain();
  76. XColor *p;
  77. if (color == NULL)
  78. p = Tk_GetColor(tcl.interp(), tk, "black");
  79. else {
  80. Tk_Uid colorname;
  81. if (strcmp(color, "background") == 0)
  82. colorname = Tk_GetOption(tk, "viewBackground", NULL);
  83. else 
  84. colorname = Tk_GetUid(color);
  85. p = Tk_GetColor(tcl.interp(), tk, colorname);
  86. // Default to black
  87. if (p == 0)
  88. p = Tk_GetColor(tcl.interp(), tk, "black");
  89. }
  90. if (p == 0) {
  91. fprintf(stderr, "__FUNCTION__: Unknown color name %sn", 
  92. color);
  93. abort();
  94. }
  95. XGCValues v;
  96. v.background = background_;
  97. v.foreground = p->pixel;
  98. v.line_width = 1;
  99. v.font = fid;
  100. const unsigned long mask = GCFont|GCForeground|GCBackground|GCLineWidth;
  101. return (Tk_GetGC(tk, mask, &v));
  102. }
  103. const char* Paint::lookupName(int r, int g, int b)
  104. {
  105.         XColor color;
  106. Tcl& tcl = Tcl::instance();
  107. Tk_Window tk = tcl.tkmain();
  108. color.red = r;
  109. color.green = g;
  110. color.blue = b;
  111. XColor *p = Tk_GetColorByValue(tk,&color);
  112. return (Tk_NameOfColor(p));
  113. }
  114. int Paint::lookup(const char * color, int linewidth)
  115. {
  116. Tcl& tcl = Tcl::instance();
  117. Tk_Window tk = tcl.tkmain();
  118. Tk_Uid colorname;
  119. if (strcmp(color, "background") == 0)
  120. colorname = Tk_GetOption(tk, "viewBackground", NULL);
  121. else 
  122. colorname = Tk_GetUid(color);
  123. XColor* p = Tk_GetColor(tcl.interp(), tk, colorname);
  124. if (p == 0) {
  125. fprintf(stderr, "Nam: cannot find color %s, use default.n", 
  126. color);
  127. return (0);
  128. }
  129. XGCValues v;
  130. v.background = background_;
  131. v.foreground = p->pixel;
  132. v.line_width = linewidth;
  133. const unsigned long mask = GCForeground|GCBackground|GCLineWidth;
  134. GC gc = Tk_GetGC(tk, mask, &v);
  135. int i;
  136. for (i = 0; i < ngc_; ++i)
  137. if (gctab_[i] == gc)
  138. return (i);
  139. gctab_[i] = gc;
  140. rgb_[i].colorname = strdup(color);
  141. rgb_[i].red=p->red;
  142. rgb_[i].green=p->green;
  143. rgb_[i].blue=p->blue;
  144. ngc_ = i + 1;
  145. if (ngc_ >= gcSize_) // PaintStaticGCSize)
  146. adjust();
  147. return (i);
  148. }
  149. int Paint::lookupXor(const char * color, int linewidth)
  150. {
  151. Tcl& tcl = Tcl::instance();
  152. Tk_Window tk = tcl.tkmain();
  153. Tk_Uid colorname;
  154. if (strcmp(color, "background") == 0)
  155. colorname = Tk_GetOption(tk, "background", NULL);
  156. else 
  157. colorname = Tk_GetUid(color);
  158. XColor* p = Tk_GetColor(tcl.interp(), tk, colorname);
  159. if (p == 0) {
  160. fprintf(stderr, "Nam: cannot find color %s, use default.n", 
  161. color);
  162. return (0);
  163. }
  164. XGCValues v;
  165. v.background = background_;
  166. v.foreground = p->pixel ^ background_;
  167. v.line_width = linewidth;
  168. v.function = GXxor;
  169. const unsigned long mask = GCForeground|GCBackground|GCLineWidth|GCFunction;
  170. GC gc = Tk_GetGC(tk, mask, &v);
  171. int i;
  172. for (i = 0; i < ngc_; ++i)
  173. if (gctab_[i] == gc)
  174. return (i);
  175. gctab_[i] = gc;
  176. rgb_[i].colorname = strdup(color);
  177. rgb_[i].red=p->red;
  178. rgb_[i].green=p->green;
  179. rgb_[i].blue=p->blue;
  180. ngc_ = i + 1;
  181. if (ngc_ >= gcSize_) // PaintStaticGCSize)
  182. adjust();
  183. return (i);
  184. }
  185. void Paint::adjust()
  186. {
  187. GC *tg = new GC[ngc_ + PaintGCIncrement];
  188. rgb *tr = new rgb[ngc_ + PaintGCIncrement];
  189. gcSize_ = ngc_ + PaintGCIncrement;
  190. memcpy((char *)tg, (char *)gctab_, sizeof(GC)*ngc_);
  191. memcpy((char *)tr, (char *)rgb_, sizeof(rgb)*ngc_);
  192. delete gctab_;
  193. delete rgb_;
  194. gctab_ = tg;
  195. rgb_ = tr;
  196. }