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

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,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/animation.cc,v 1.24 2003/10/11 22:56:49 xuanc Exp $ (LBL)
  34.  */
  35. #include <memory.h>
  36. #include <tcl.h>
  37. #include <math.h>
  38. #include <string.h>
  39. #include "animation.h"
  40. #include "paint.h"
  41. #include "monitor.h"
  42. unsigned int Animation::LASTID_ = 0;
  43. Tcl_HashTable *Animation::AniHash_ = 0;
  44. unsigned int Animation::nAniHash_ = 0;
  45. // Static method
  46. Animation* Animation::find(unsigned int id)
  47. {
  48. Tcl_HashEntry *he = Tcl_FindHashEntry(AniHash_, (const char *)id);
  49. Animation *res = NULL;
  50. if (he != NULL) 
  51. res = (Animation*) Tcl_GetHashValue(he);
  52. return res;
  53. }
  54. Animation::Animation(double tim, long offset)
  55. {
  56. paint_ = 0;
  57. oldPaint_ = 0;
  58. next_ = 0;
  59. prev_ = 0;
  60. si_.time = tim;
  61. si_.offset = offset;
  62. monitor_ = NULL;
  63. id_ = Animation::LASTID_++;
  64. tags_ = NULL;
  65. nTag_ = 0;
  66. aType_ = 0 ;
  67. bb_.clear();
  68. if (Animation::AniHash_ == 0) {
  69. Animation::AniHash_ = new Tcl_HashTable;
  70. Tcl_InitHashTable(Animation::AniHash_, TCL_ONE_WORD_KEYS);
  71. }
  72. // Enter hash table for quick lookup and access
  73. int newEntry = 1;
  74. Tcl_HashEntry *he = Tcl_CreateHashEntry(AniHash_, 
  75. (const char *)id_, &newEntry);
  76. if (newEntry && (he != NULL)) {
  77. // Do not handle exception he == NULL. Don't know how.
  78. Tcl_SetHashValue(he, (ClientData)this);
  79. nAniHash_++;
  80. }
  81. }
  82. //----------------------------------------------------------------------
  83. // Animation::~Animation()
  84. //----------------------------------------------------------------------
  85. Animation::~Animation() {
  86. // if (prev_ != 0)
  87. // *prev_ = next_;
  88. // if (next_ != 0)
  89. // next_->prev_ = prev_;
  90. // The above is taken care of by calling detach
  91.   // Remove myself from the list on which I may be connected
  92.   detach();
  93. if (tags_ != NULL)
  94. delete tags_;
  95. // Remove from hash table
  96. Tcl_HashEntry *he = Tcl_FindHashEntry(AniHash_, (const char *)id_);
  97. if (he != NULL) {
  98. Tcl_DeleteHashEntry(he);
  99. nAniHash_--;
  100. }
  101. }
  102. void Animation::addTag(Animation *t)
  103. {
  104. if (tags_ == NULL) 
  105. tags_ = new Animation* [AnimationTagIncrement];
  106. else if (nTag_ % AnimationTagIncrement == 0) {
  107. // Increase tag array space
  108. Animation **tmp = new Animation* [nTag_+AnimationTagIncrement];
  109. memcpy((char *)tmp, (char *)tags_, nTag_ * sizeof(Animation*));
  110. delete tags_;
  111. tags_ = tmp;
  112. }
  113. tags_[nTag_++] = t;
  114. }
  115. void Animation::deleteTag(Animation *t)
  116. {
  117. for (int i = 0; i < nTag_; i++) {
  118. if (tags_[i] == t) {
  119. tags_[i] = tags_[nTag_ - 1];
  120. nTag_ --;
  121. }
  122. }
  123. }
  124. //----------------------------------------------------------------------
  125. // void
  126. // Animation::detach()
  127. //   - Removes animation object from its prev_/next_ linked list
  128. //   - Mostly used by the drawables_ and animations_ lists in NetModel
  129. //----------------------------------------------------------------------
  130. void
  131. Animation::detach() {
  132. if (prev_ != 0) {
  133.     // Set my previous neighbor's next_ to point to my next neighbor
  134. *prev_ = next_;
  135.   }
  136.   
  137. if (next_ != 0) {
  138.     // Set my next neighbor's prev_ to point to my previous neighbors next_
  139. next_->prev_ = prev_;
  140.   }
  141.   // When you remove this object don't forget to set all animation 
  142.   // pointers to NULL because when this object is deleted it will also 
  143.   // try to detach itself from the list
  144.   prev_ = NULL;
  145.   next_ = NULL;
  146. }
  147. //----------------------------------------------------------------------
  148. // void
  149. // Animation::insert(Animation **head)
  150. //   - Insert to the front of the list
  151. //   - This seems to be a bad implementation.  All over the nam code
  152. //     I see use of this insert method right after the next_ pointer
  153. //     is used for another list.
  154. //     For Example from netmodel.cc:
  155. //               n->next_ = nodes_;
  156. //               nodes_ = n;
  157. //               n->insert(&drawables_);
  158. //
  159. //   - It works but is very confusing as to which next_ refers to what.
  160. //----------------------------------------------------------------------
  161. void
  162. Animation::insert(Animation **head) {
  163.   //Set my next pointer to the former head of the list
  164. next_ = * head;
  165. if (next_) {
  166.     // Make the former head of the list point to my next_
  167.     // so that it can assign me to another object if it is 
  168.     // removed.
  169. next_->prev_ = &next_;
  170.   }
  171. prev_ = head;
  172. *head = this;
  173. }
  174. void Animation::update(double /*now*/)
  175. {
  176. /* do nothing */
  177. }
  178. void Animation::reset(double /*now*/)
  179. {
  180. /* do nothing */
  181. }
  182. int Animation::inside(double /*now*/, float px, float py) const
  183. {
  184. // Why not use bbox to make a generic inside???
  185. return bb_.inside(px, py);
  186. }
  187. float Animation::distance(float, float) const
  188. {
  189. // do nothing 
  190. return HUGE_VAL;
  191. }
  192. void
  193. Animation::merge(BBox & b) { 
  194. if (b.xmin > bb_.xmin)
  195. b.xmin = bb_.xmin;
  196. if (b.ymin > bb_.ymin)
  197. b.ymin = bb_.ymin;
  198. if (b.xmax < bb_.xmax)
  199. b.xmax = bb_.xmax;
  200. if (b.ymax < bb_.ymax)
  201. b.ymax = bb_.ymax;
  202. }
  203. const char* Animation::info() const
  204. {
  205. return (0);
  206. }
  207. const char* Animation::property()
  208. {
  209. return (0);
  210. }
  211. //----------------------------------------------------------------------
  212. // const char *
  213. // Animation::getProperties(char * type)
  214. //   - type is a object type. for example in queuehandle.h you can 
  215. //     have different types of queueahandles (DropTail, RED, etc)
  216. //   - Used by the editor to update the properties window when the
  217. //     type is changed
  218. //----------------------------------------------------------------------
  219. const char *
  220. Animation::getProperties(const char * type) {
  221. return property();
  222. }
  223. const char* Animation::getname() const
  224. {
  225. return (0);
  226. }
  227. const char* Animation::getfid() const
  228. {
  229. return (0);
  230. }
  231. const char* Animation::getesrc() const
  232. {
  233. return (0);
  234. }
  235. const char* Animation::getedst() const
  236. {
  237. return (0);
  238. }
  239. const char* Animation::gettype() const
  240. {
  241. return (0);
  242. }
  243. void Animation::monitor(Monitor *m, double now, char *result, int len)
  244. {
  245. }
  246. MonState *Animation::monitor_state(void)
  247. {
  248.   return NULL;
  249. }
  250. void Animation::color(const char *color)
  251. {
  252.   int pno = Paint::instance()->lookup(color, 3);
  253.   if (pno < 0) {
  254.     fprintf(stderr, "Animation::color: no such color: %s",
  255. color);
  256.     return;
  257.   }
  258.   paint(pno);
  259. }
  260. void Animation::change_color(char *clr)
  261. {
  262. oldPaint_ = paint_;
  263. color(clr);
  264. }
  265. void Animation::toggle_color() 
  266. {
  267. int pno = oldPaint_;
  268. oldPaint_ = paint_;
  269. paint_ = pno;
  270. }
  271. Animation* Animation::getLastTag()
  272. {
  273. if (nTag_ > 0) 
  274. return tags_[0]->getLastTag();
  275. else 
  276. return this;
  277. }