XColorGC.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743
  1. /*****************************************************************************/
  2. /* XColorGC GCと色の管理・問い合わせ用のライブラリ */
  3. /*****************************************************************************/
  4. #include "XColorGCP.h"
  5. #include "WonX.h"
  6. #include <string.h>
  7. /*===========================================================================*/
  8. /* XColorGCInstance 関連 */
  9. /*===========================================================================*/
  10. /*---------------------------------------------------------------------------*/
  11. /* オブジェクトの作成 */
  12. /*---------------------------------------------------------------------------*/
  13. static XColorGCInstance XColorGCInstance_Create(XDisplay x_display,
  14. XColor color)
  15. {
  16. XColorGCInstance instance;
  17. instance = (XColorGCInstance)malloc(sizeof(_XColorGCInstance));
  18. if (instance == NULL)
  19. WonX_Error("XColorGCInstance_Create", "Cannot allocate memory");
  20. instance->x_display = x_display;
  21. instance->color = color;
  22. XAllocColor(XDisplay_GetDisplay(instance->x_display),
  23. XDisplay_GetColormap(instance->x_display),
  24. &(instance->color));
  25. /* XAllocColor で instance->color.red などの内容が変わってしまうので, */
  26. /* もとに戻す.でないと,あとで同じ色をRGB値で検索しても,違った色として */
  27. /* 解釈されてしまい,検索できないので,色情報を保存する意味が無くなって */
  28. /* しまう. */
  29. instance->color.red = color.red;
  30. instance->color.green = color.green;
  31. instance->color.blue = color.blue;
  32. instance->gc = XDisplay_CreateGC(instance->x_display);
  33. XSetForeground(XDisplay_GetDisplay(instance->x_display), instance->gc,
  34. instance->color.pixel);
  35. XSetBackground(XDisplay_GetDisplay(instance->x_display), instance->gc,
  36. instance->color.pixel);
  37. return (instance);
  38. }
  39. /*---------------------------------------------------------------------------*/
  40. /* オブジェクトの削除 */
  41. /*---------------------------------------------------------------------------*/
  42. static XColorGCInstance XColorGCInstance_Destroy(XColorGCInstance instance)
  43. {
  44. unsigned long pixel;
  45. if (instance == NULL) return (NULL);
  46. if (instance->gc) XDisplay_DestroyGC(instance->x_display, instance->gc);
  47. pixel = instance->color.pixel;
  48. XFreeColors(XDisplay_GetDisplay(instance->x_display),
  49. XDisplay_GetColormap(instance->x_display),
  50. &pixel, 1, 0);
  51. free(instance);
  52. return (NULL);
  53. }
  54. /*===========================================================================*/
  55. /* XColorGCList 関連 */
  56. /*===========================================================================*/
  57. /*---------------------------------------------------------------------------*/
  58. /* オブジェクトの作成 */
  59. /*---------------------------------------------------------------------------*/
  60. static XColorGCList XColorGCList_Create(XDisplay x_display, int studying_flag)
  61. {
  62. XColorGCList list;
  63. list = (XColorGCList)malloc(sizeof(_XColorGCList));
  64. if (list == NULL) WonX_Error("XColorGCList_Create", "Cannot allocate memory");
  65. list->x_display = x_display;
  66. list->studying_flag = studying_flag;
  67. list->list = ObjList_Create();
  68. return (list);
  69. }
  70. /*---------------------------------------------------------------------------*/
  71. /* オブジェクトの削除 */
  72. /*---------------------------------------------------------------------------*/
  73. static XColorGCList XColorGCList_Destroy(XColorGCList list)
  74. {
  75. if (list == NULL) return (NULL);
  76. if (list->list) ObjList_Destroy(list->list);
  77. free(list);
  78. return (NULL);
  79. }
  80. /*---------------------------------------------------------------------------*/
  81. /* XColorGCList 中での XColorGCInstance のソート用の比較関数 */
  82. /*---------------------------------------------------------------------------*/
  83. static int XColorGCInstance_CmpToColor(XColorGCInstance gci, XColor color)
  84. {
  85. if (gci->color.red > color.red ) return ( 1);
  86. if (gci->color.red < color.red ) return (-1);
  87. if (gci->color.green > color.green) return ( 1);
  88. if (gci->color.green < color.green) return (-1);
  89. if (gci->color.blue > color.blue ) return ( 1);
  90. if (gci->color.blue < color.blue ) return (-1);
  91. return (0);
  92. }
  93. /*---------------------------------------------------------------------------*/
  94. /* リストから XColorGCInstance を得る. */
  95. /* GC の取得要求に対して,GC のリストを検索して返す. */
  96. /* 存在しない場合には,作成してリストに追加する. */
  97. /* (常に RGB 値でソートされた状態で追加する) */
  98. /* 線形探索なので,O(n^2)で遅くなる. */
  99. /*---------------------------------------------------------------------------*/
  100. static XColorGCInstance XColorGCList_GetXColorGCInstance(XColorGCList list,
  101. XColor color)
  102. {
  103. XColorGCInstance instance;
  104. ObjListData current;
  105. int cmp;
  106. for (current = ObjList_GetStart(list->list);
  107. !ObjList_IsEndEdge(list->list, current);
  108. current = ObjListData_GetNext(current)) {
  109. instance = (XColorGCInstance)ObjListData_GetObj(current);
  110. cmp = XColorGCInstance_CmpToColor(instance, color);
  111. if (cmp == 0) { /* 見つかれば,それを返す */
  112. #ifdef HIT_LIST
  113. fprintf(stderr, "S");
  114. #endif
  115. if (list->studying_flag) ObjList_MoveObjToStart(list->list, current);
  116. return (instance);
  117. } else if (cmp > 0) {
  118. if (!list->studying_flag) break;
  119. }
  120. }
  121. /* 見つからなかった場合は,作成してリストに追加する */
  122. instance = XColorGCInstance_Create(list->x_display, color);
  123. if (list->studying_flag)
  124. ObjList_InsertObjToStart(list->list, instance,
  125. (ObjDestructor)XColorGCInstance_Destroy);
  126. else
  127. ObjList_InsertObjToPrev(list->list, current, instance,
  128. (ObjDestructor)XColorGCInstance_Destroy);
  129. #ifdef HIT_LIST
  130. fprintf(stderr, "A");
  131. #endif
  132. return (instance);
  133. }
  134. /*===========================================================================*/
  135. /* XColorGCCache 関連 */
  136. /*===========================================================================*/
  137. /*---------------------------------------------------------------------------*/
  138. /* キャッシュ用バッファ */
  139. /*---------------------------------------------------------------------------*/
  140. static XColorGCCacheBuffer XColorGCCacheBuffer_Create(XColorGCInstance instance)
  141. {
  142. XColorGCCacheBuffer buffer;
  143. buffer = (XColorGCCacheBuffer)malloc(sizeof(_XColorGCCacheBuffer));
  144. if (buffer == NULL) WonX_Error("XColorGCCacheBuffer_Create",
  145. "Cannot allocate memory.");
  146. buffer->instance = instance;
  147. return (buffer);
  148. }
  149. static XColorGCCacheBuffer XColorGCCacheBuffer_Destroy(XColorGCCacheBuffer buffer)
  150. {
  151. if (buffer == NULL) return (NULL);
  152. free(buffer);
  153. return (NULL);
  154. }
  155. /*---------------------------------------------------------------------------*/
  156. /* キャッシュ */
  157. /*---------------------------------------------------------------------------*/
  158. static XColorGCCache XColorGCCache_Create(XColorGCList color_gc_list, int size)
  159. {
  160. XColorGCCache cache;
  161. cache = (XColorGCCache)malloc(sizeof(_XColorGCCache));
  162. if (cache == NULL) WonX_Error("XColorGCCache_Create",
  163. "Cannot allocate memory.");
  164. cache->size = size;
  165. cache->color_gc_list = color_gc_list;
  166. cache->buffer_list = ObjList_Create();
  167. return (cache);
  168. }
  169. static XColorGCCache XColorGCCache_Destroy(XColorGCCache cache)
  170. {
  171. if (cache == NULL) return (NULL);
  172. if (cache->buffer_list) ObjList_Destroy(cache->buffer_list);
  173. free(cache);
  174. return (NULL);
  175. }
  176. /*---------------------------------------------------------------------------*/
  177. /* キャッシュから XColorGCInstance を得る. */
  178. /*---------------------------------------------------------------------------*/
  179. static XColorGCInstance XColorGCCache_GetXColorGCInstance(XColorGCCache cache,
  180. XColor color)
  181. {
  182. ObjListData current;
  183. XColorGCCacheBuffer buffer;
  184. XColorGCInstance instance;
  185. int cmp;
  186. /* キャッシュの中を検索 */
  187. for (current = ObjList_GetStart(cache->buffer_list);
  188. !ObjList_IsEndEdge(cache->buffer_list, current);
  189. current = ObjListData_GetNext(current)) {
  190. buffer = (XColorGCCacheBuffer)ObjListData_GetObj(current);
  191. cmp = XColorGCInstance_CmpToColor(buffer->instance, color);
  192. if (cmp == 0) { /* キャッシュ中に見つけた場合 */
  193. #ifdef HIT_CACHE
  194. fprintf(stderr, "H"); /* Hit! */
  195. #endif
  196. ObjList_MoveObjToStart(cache->buffer_list, current);
  197. return (buffer->instance);
  198. }
  199. }
  200. /* キャッシュ中に見つけられなかった場合 */
  201. /* リストから検索する */
  202. instance = XColorGCList_GetXColorGCInstance(cache->color_gc_list, color);
  203. /* キャッシュに追加する */
  204. if (ObjList_GetLength(cache->buffer_list) < cache->size) {
  205. buffer = XColorGCCacheBuffer_Create(instance);
  206. ObjList_InsertObjToStart(cache->buffer_list, buffer,
  207. (ObjDestructor)XColorGCCacheBuffer_Destroy);
  208. } else {
  209. current = ObjList_GetEnd(cache->buffer_list);
  210. buffer = (XColorGCCacheBuffer)ObjListData_GetObj(current);
  211. buffer->instance = instance;
  212. ObjList_MoveObjToStart(cache->buffer_list, current);
  213. }
  214. #ifdef HIT_CACHE
  215. fprintf(stderr, "F"); /* False! */
  216. #endif
  217. return (instance);
  218. }
  219. /*===========================================================================*/
  220. /* XColorGCHash 関連 */
  221. /*===========================================================================*/
  222. static XColorGCHash XColorGCHash_Create(XDisplay x_display,
  223. int studying_flag,
  224. int cache_flag,
  225. int cache_size,
  226. int hash_number)
  227. {
  228. XColorGCHash hash;
  229. int i;
  230. hash = (XColorGCHash)malloc(sizeof(_XColorGCHash));
  231. if (hash == NULL)
  232. WonX_Error("XColorGCHash_Create", "Cannot allocate memory.");
  233. hash->number = hash_number;
  234. hash->cache_flag = cache_flag;
  235. if (cache_flag) {
  236. hash->color_gc_cache =
  237. (XColorGCCache *)malloc(sizeof(XColorGCCache) * hash->number);
  238. if (hash->color_gc_cache == NULL)
  239. WonX_Error("XColorGCHash_Create", "Cannot allocate memory.");
  240. } else {
  241. hash->color_gc_cache = NULL;
  242. }
  243. hash->color_gc_list =
  244. (XColorGCList *)malloc(sizeof(XColorGCList) * hash->number);
  245. if (hash->color_gc_list == NULL)
  246. WonX_Error("XColorGCHash_Create", "Cannot allocate memory.");
  247. for (i = 0; i < hash->number; i++) {
  248. hash->color_gc_list[i] = XColorGCList_Create(x_display, studying_flag);
  249. if (cache_flag) {
  250. hash->color_gc_cache[i] = XColorGCCache_Create(hash->color_gc_list[i],
  251. cache_size);
  252. }
  253. }
  254. return (hash);
  255. }
  256. static XColorGCHash XColorGCHash_Destroy(XColorGCHash hash)
  257. {
  258. int i;
  259. if (hash == NULL) return (NULL);
  260. if (hash->color_gc_cache) {
  261. for (i = 0; i < hash->number; i++) {
  262. if (hash->color_gc_cache[i])
  263. XColorGCCache_Destroy(hash->color_gc_cache[i]);
  264. }
  265. free(hash->color_gc_cache);
  266. }
  267. if (hash->color_gc_list) {
  268. for (i = 0; i < hash->number; i++) {
  269. if (hash->color_gc_list[i])
  270. XColorGCList_Destroy(hash->color_gc_list[i]);
  271. }
  272. free(hash->color_gc_list);
  273. }
  274. free(hash);
  275. return (NULL);
  276. }
  277. static void XColorGCHash_OutputHashStatus(XColorGCHash hash)
  278. {
  279. int i;
  280. printf ("\nHash :");
  281. for (i = 0; i < hash->number; i++) {
  282. printf("%d ", ObjList_GetLength(hash->color_gc_list[i]->list));
  283. }
  284. printf ("\n");
  285. }
  286. /*---------------------------------------------------------------------------*/
  287. /* ハッシュ関数 */
  288. /* 色を減色している場合,特定の位置だけ頻繁に使用されたりしないように注意. */
  289. /* (たとえば, */
  290. /* ((int)color.red*3 + (int)color.green*2 + (int)color.blue) % hash->number */
  291. /* のようなハッシュ関数だと,16階調に減色したときに,4096 の倍数の位置だけ */
  292. /* 頻繁に使用されてしまう. */
  293. /*---------------------------------------------------------------------------*/
  294. static int HashFunction(XColorGCHash hash, XColor color)
  295. {
  296. return ((
  297. (((int)color.red) / 3000) * 11 +
  298. (((int)color.green) % 3000) / 7 +
  299. (((int)color.blue) % 1000) / 3
  300. ) % hash->number);
  301. }
  302. /*---------------------------------------------------------------------------*/
  303. /* ハッシュから XColorGCInstance を得る. */
  304. /*---------------------------------------------------------------------------*/
  305. static XColorGCInstance XColorGCHash_GetXColorGCInstance(XColorGCHash hash,
  306. XColor color)
  307. {
  308. int n;
  309. n = HashFunction(hash, color);
  310. if (hash->cache_flag)
  311. return (XColorGCCache_GetXColorGCInstance(hash->color_gc_cache[n], color));
  312. else
  313. return (XColorGCList_GetXColorGCInstance(hash->color_gc_list[n], color));
  314. }
  315. /*===========================================================================*/
  316. /* ColorName 関連 */
  317. /*===========================================================================*/
  318. /*---------------------------------------------------------------------------*/
  319. /* オブジェクトの生成 */
  320. /*---------------------------------------------------------------------------*/
  321. static ColorName ColorName_Create(XDisplay x_display, char * name)
  322. {
  323. ColorName color_name;
  324. color_name = (ColorName)malloc(sizeof(_ColorName));
  325. if (color_name == NULL)
  326. WonX_Error("ColorName_Create", "Cannot allocate memory");
  327. color_name->name = malloc(sizeof(char) * (strlen(name) + 1));
  328. if (color_name->name == NULL)
  329. WonX_Error("ColorName_Create", "Cannot allocate memory");
  330. strcpy(color_name->name, name);
  331. XParseColor(XDisplay_GetDisplay(x_display),
  332. XDisplay_GetColormap(x_display),
  333. color_name->name, &(color_name->color));
  334. return (color_name);
  335. }
  336. /*---------------------------------------------------------------------------*/
  337. /* オブジェクトの削除 */
  338. /*---------------------------------------------------------------------------*/
  339. static ColorName ColorName_Destroy(ColorName color_name)
  340. {
  341. if (color_name == NULL) return (NULL);
  342. if (color_name->name) free(color_name->name);
  343. free(color_name);
  344. return (NULL);
  345. }
  346. /*---------------------------------------------------------------------------*/
  347. /* オブジェクトの生成 */
  348. /*---------------------------------------------------------------------------*/
  349. static ColorNameList ColorNameList_Create(XDisplay x_display)
  350. {
  351. ColorNameList list;
  352. list = (ColorNameList)malloc(sizeof(_ColorNameList));
  353. if (list == NULL)
  354. WonX_Error("ColorNameList_Create", "Cannot allocate memory");
  355. list->x_display = x_display;
  356. list->list = ObjList_Create();
  357. return (list);
  358. }
  359. /*---------------------------------------------------------------------------*/
  360. /* オブジェクトの削除 */
  361. /*---------------------------------------------------------------------------*/
  362. static ColorNameList ColorNameList_Destroy(ColorNameList list)
  363. {
  364. if (list == NULL) return (NULL);
  365. if (list->list) ObjList_Destroy(list->list);
  366. free(list);
  367. return (NULL);
  368. }
  369. /*---------------------------------------------------------------------------*/
  370. /* 文字列で与えられた色名から,RGB値を検索する. */
  371. /*---------------------------------------------------------------------------*/
  372. static XColor ColorNameList_GetColor(ColorNameList list, char * name)
  373. {
  374. ObjListData current;
  375. ColorName color_name;
  376. for (current = ObjList_GetStart(list->list);
  377. !ObjList_IsEndEdge(list->list, current);
  378. current = ObjListData_GetNext(current)) {
  379. color_name = (ColorName)ObjListData_GetObj(current);
  380. if (!strcmp(color_name->name, name)) {
  381. ObjList_MoveObjToStart(list->list, current);
  382. return (color_name->color);
  383. }
  384. }
  385. color_name = ColorName_Create(list->x_display, name);
  386. if (color_name == NULL)
  387. WonX_Error("ColorNameList_GetColor", "Cannot create ColorName");
  388. ObjList_InsertObjToStart(list->list, color_name,
  389. (ObjDestructor)ColorName_Destroy);
  390. return (color_name->color);
  391. }
  392. /*===========================================================================*/
  393. /* XColorGC 関連 */
  394. /*===========================================================================*/
  395. /*---------------------------------------------------------------------------*/
  396. /* オブジェクトの生成 */
  397. /*---------------------------------------------------------------------------*/
  398. XColorGC XColorGC_Create(XColorGCDatabase database, XColor color)
  399. {
  400. XColorGC color_gc;
  401. color_gc = (XColorGC)malloc(sizeof(_XColorGC));
  402. /* ハッシュから色とGCを検索 */
  403. color_gc->instance = XColorGCHash_GetXColorGCInstance(database->hash, color);
  404. return (color_gc);
  405. }
  406. XColorGC XColorGC_CreateFromXColorGC(XColorGCDatabase database, XColorGC c)
  407. {
  408. XColorGC color_gc;
  409. color_gc = (XColorGC)malloc(sizeof(_XColorGC));
  410. color_gc->instance = c->instance;
  411. return (color_gc);
  412. }
  413. /*---------------------------------------------------------------------------*/
  414. /* RGB 値から生成する. */
  415. /*---------------------------------------------------------------------------*/
  416. XColorGC XColorGC_CreateFromRGB(XColorGCDatabase database,
  417. int red, int green, int blue)
  418. {
  419. XColor color;
  420. color.red = red;
  421. color.green = green;
  422. color.blue = blue;
  423. color.flags = DoRed | DoGreen | DoBlue;
  424. return (XColorGC_Create(database, color));
  425. }
  426. /*---------------------------------------------------------------------------*/
  427. /* オブジェクトの削除 */
  428. /*---------------------------------------------------------------------------*/
  429. XColorGC XColorGC_Destroy(XColorGC color_gc)
  430. {
  431. if (!color_gc) return (NULL);
  432. free(color_gc);
  433. return (NULL);
  434. }
  435. /*===========================================================================*/
  436. /* 文字列読み込み用関数 */
  437. /*===========================================================================*/
  438. /*---------------------------------------------------------------------------*/
  439. /* 色の節約のための,減色用の関数. */
  440. /* 減色すると,色の共有化が進み,キャッシングの効果が大きくなる. */
  441. /* あるていど減色しないと,色が共有できないので,無駄が多くなる. */
  442. /*---------------------------------------------------------------------------*/
  443. static XColor DecreaseColor(XColor color, int gradation)
  444. {
  445. int div = RGB_MAX_VALUE / gradation + 1;
  446. color.red /= div;
  447. if (color.red >= gradation - 1) color.red = RGB_MAX_VALUE;
  448. else color.red *= div;
  449. color.green /= div;
  450. if (color.green >= gradation - 1) color.green = RGB_MAX_VALUE;
  451. else color.green *= div;
  452. color.blue /= div;
  453. if (color.blue >= gradation - 1) color.blue = RGB_MAX_VALUE;
  454. else color.blue *= div;
  455. return (color);
  456. }
  457. /*---------------------------------------------------------------------------*/
  458. /* 色とGCのデータベースから name で与えられた名前の色を検索する. */
  459. /*---------------------------------------------------------------------------*/
  460. XColorGC XColorGC_CreateFromCharacters(XColorGCDatabase database, char * name)
  461. {
  462. XColor color;
  463. if (!strcmp(name, "none") ||
  464. !strcmp(name, "None") ||
  465. !strcmp(name, "NONE") ||
  466. !strcmp(name, "back") ||
  467. !strcmp(name, "Back") ||
  468. !strcmp(name, "BACK") ||
  469. !strcmp(name, "background") ||
  470. !strcmp(name, "Background") ||
  471. !strcmp(name, "BACKGROUND")) {
  472. if (database->background_color_gc)
  473. return (XColorGC_CreateFromXColorGC(database,
  474. database->background_color_gc));
  475. else
  476. #if 1
  477. name = "none";
  478. #else
  479. name = "black";
  480. #endif
  481. }
  482. color = ColorNameList_GetColor(database->color_name_list, name);
  483. /* 色の節約のため,減色する */
  484. color = DecreaseColor(color, database->gradation);
  485. return (XColorGC_Create(database, color));
  486. }
  487. /*---------------------------------------------------------------------------*/
  488. /* XColor 構造体の取得 */
  489. /*---------------------------------------------------------------------------*/
  490. XColor XColorGC_GetColor(XColorGC color_gc)
  491. {
  492. return (color_gc->instance->color);
  493. }
  494. /*---------------------------------------------------------------------------*/
  495. /* ピクセル値の取得 */
  496. /*---------------------------------------------------------------------------*/
  497. unsigned long XColorGC_GetPixel(XColorGC color_gc)
  498. {
  499. return (color_gc->instance->color.pixel);
  500. }
  501. /*---------------------------------------------------------------------------*/
  502. /* GC の取得 */
  503. /*---------------------------------------------------------------------------*/
  504. GC XColorGC_GetGC(XColorGC color_gc)
  505. {
  506. return (color_gc->instance->gc);
  507. }
  508. /*---------------------------------------------------------------------------*/
  509. /* 色の明るさの取得 */
  510. /*---------------------------------------------------------------------------*/
  511. int GetBrightness(XColor color)
  512. {
  513. long int br;
  514. #if 0
  515. br = color.red > color.green ? color.red : color.green;
  516. br = br > color.blue ? br : color.blue;
  517. br = br * 100 / RGB_MAX_VALUE;
  518. #else
  519. br = color.red + color.green + color.blue;
  520. br = br * 100 / RGB_MAX_VALUE;
  521. #endif
  522. if (br > 100) br = 100;
  523. return ((int)br);
  524. }
  525. /*===========================================================================*/
  526. /* GC のデータベース */
  527. /*===========================================================================*/
  528. XColorGCDatabase XColorGCDatabase_Create(XDisplay x_display,
  529. int studying_flag,
  530. int cache_flag,
  531. int cache_size,
  532. int hash_number,
  533. char * background,
  534. int gradation)
  535. {
  536. XColorGCDatabase database;
  537. database = (XColorGCDatabase)malloc(sizeof(_XColorGCDatabase));
  538. if (database == NULL)
  539. WonX_Error("XColorGCDatabase_Create", "Cannot allocate memory.");
  540. database->x_display = x_display;
  541. database->gradation = gradation;
  542. database->hash = XColorGCHash_Create(database->x_display,
  543. studying_flag,
  544. cache_flag,
  545. cache_size,
  546. hash_number);
  547. database->color_name_list = ColorNameList_Create(database->x_display);
  548. /* background が "none" の場合にも正常動作するように, */
  549. /* XColorGC_CreateFromCharacters()を呼び出す前に,NULL で初期化する. */
  550. database->background_color_gc = NULL;
  551. /* 引数に database を入れて呼び出すので,必ず最後に置くこと */
  552. database->background_color_gc =
  553. XColorGC_CreateFromCharacters(database, background);
  554. /* この直後に return() が来るようにすること */
  555. return (database);
  556. }
  557. XColorGCDatabase XColorGCDatabase_Destroy(XColorGCDatabase database)
  558. {
  559. if (database == NULL) return (NULL);
  560. if (database->background_color_gc)
  561. XColorGC_Destroy(database->background_color_gc);
  562. if (database->color_name_list)
  563. ColorNameList_Destroy(database->color_name_list);
  564. if (database->hash) XColorGCHash_Destroy(database->hash);
  565. free(database);
  566. return (NULL);
  567. }
  568. XColorGC XColorGCDatabase_GetBackgroundXColorGC(XColorGCDatabase database)
  569. {
  570. return (database->background_color_gc);
  571. }
  572. /*---------------------------------------------------------------------------*/
  573. /* チューニング用 */
  574. /*---------------------------------------------------------------------------*/
  575. void XColorGCDatabase_OutputHashStatus(XColorGCDatabase database)
  576. {
  577. XColorGCHash_OutputHashStatus(database->hash);
  578. }
  579. /*****************************************************************************/
  580. /* End of File */
  581. /*****************************************************************************/