PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/cssed-0.4.0/libcroco/parser/cr-fonts.c

#
C | 767 lines | 629 code | 106 blank | 32 comment | 70 complexity | f47dbac36271c8b01c2f82cc5c04471f MD5 | raw file
Possible License(s): GPL-2.0
  1. /* -*- Mode: C; indent-tabs-mode:nil; c-basic-offset: 8-*- */
  2. /*
  3. * This file is part of The Croco Library
  4. *
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of version 2.1 of
  8. * the GNU Lesser General Public
  9. * License as published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the
  17. * GNU Lesser General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  20. * USA
  21. *
  22. *See COPYRIGHTS file for copyright information
  23. */
  24. #include "cr-fonts.h"
  25. #include <string.h>
  26. static enum CRStatus
  27. cr_font_family_to_string_real (CRFontFamily * a_this,
  28. gboolean a_walk_list, GString ** a_string)
  29. {
  30. guchar *name = NULL;
  31. enum CRStatus result = CR_OK;
  32. if (!*a_string) {
  33. *a_string = g_string_new (NULL);
  34. g_return_val_if_fail (*a_string,
  35. CR_INSTANCIATION_FAILED_ERROR);
  36. }
  37. if (!a_this) {
  38. g_string_append (*a_string, "NULL");
  39. return CR_OK;
  40. }
  41. switch (a_this->type) {
  42. case FONT_FAMILY_SANS_SERIF:
  43. name = (guchar *) "sans-serif";
  44. break;
  45. case FONT_FAMILY_SERIF:
  46. name = (guchar *) "sans-serif";
  47. break;
  48. case FONT_FAMILY_CURSIVE:
  49. name = (guchar *) "cursive";
  50. break;
  51. case FONT_FAMILY_FANTASY:
  52. name = (guchar *) "fantasy";
  53. break;
  54. case FONT_FAMILY_MONOSPACE:
  55. name = (guchar *) "monospace";
  56. break;
  57. case FONT_FAMILY_NON_GENERIC:
  58. name = (guchar *) a_this->name;
  59. break;
  60. default:
  61. name = (guchar *) NULL;
  62. break;
  63. }
  64. if (name) {
  65. if (a_this->prev) {
  66. g_string_append_printf (*a_string, ", %s", name);
  67. } else {
  68. g_string_append (*a_string, name);
  69. }
  70. }
  71. if (a_walk_list == TRUE && a_this->next) {
  72. result = cr_font_family_to_string_real (a_this->next,
  73. TRUE, a_string);
  74. }
  75. return result;
  76. }
  77. static const gchar *
  78. cr_predefined_absolute_font_size_to_string (enum CRPredefinedAbsoluteFontSize
  79. a_code)
  80. {
  81. gchar *str = NULL;
  82. switch (a_code) {
  83. case FONT_SIZE_XX_SMALL:
  84. str = (gchar *) "xx-small";
  85. break;
  86. case FONT_SIZE_X_SMALL:
  87. str = (gchar *) "x-small";
  88. break;
  89. case FONT_SIZE_SMALL:
  90. str = (gchar *) "small";
  91. break;
  92. case FONT_SIZE_MEDIUM:
  93. str = (gchar *) "medium";
  94. break;
  95. case FONT_SIZE_LARGE:
  96. str = (gchar *) "large";
  97. break;
  98. case FONT_SIZE_X_LARGE:
  99. str = (gchar *) "x-large";
  100. break;
  101. case FONT_SIZE_XX_LARGE:
  102. str = (gchar *) "xx-large";
  103. break;
  104. default:
  105. str = (gchar *) "unknown absolute font size value";
  106. }
  107. return str;
  108. }
  109. static const gchar *
  110. cr_relative_font_size_to_string (enum CRRelativeFontSize a_code)
  111. {
  112. gchar *str = NULL;
  113. switch (a_code) {
  114. case FONT_SIZE_LARGER:
  115. str = (gchar *) "larger";
  116. break;
  117. case FONT_SIZE_SMALLER:
  118. str = (gchar *) "smaller";
  119. break;
  120. default:
  121. str = (gchar *) "unknown relative font size value";
  122. break;
  123. }
  124. return str;
  125. }
  126. CRFontFamily *
  127. cr_font_family_new (enum CRFontFamilyType a_type, guchar * a_name)
  128. {
  129. CRFontFamily *result = NULL;
  130. result = g_try_malloc (sizeof (CRFontFamily));
  131. if (!result) {
  132. cr_utils_trace_info ("Out of memory");
  133. return NULL;
  134. }
  135. memset (result, 0, sizeof (CRFontFamily));
  136. result->type = a_type;
  137. cr_font_family_set_name (result, a_name);
  138. return result;
  139. }
  140. guchar *
  141. cr_font_family_to_string (CRFontFamily * a_this,
  142. gboolean a_walk_font_family_list)
  143. {
  144. enum CRStatus status = CR_OK;
  145. guchar *result = NULL;
  146. GString *stringue = NULL;
  147. if (!a_this) {
  148. result = g_strdup ("NULL");
  149. g_return_val_if_fail (result, NULL);
  150. return result;
  151. }
  152. status = cr_font_family_to_string_real (a_this,
  153. a_walk_font_family_list,
  154. &stringue);
  155. if (status == CR_OK && stringue) {
  156. result = stringue->str;
  157. g_string_free (stringue, FALSE);
  158. stringue = NULL;
  159. } else {
  160. if (stringue) {
  161. g_string_free (stringue, TRUE);
  162. stringue = NULL;
  163. }
  164. }
  165. return result;
  166. }
  167. enum CRStatus
  168. cr_font_family_set_name (CRFontFamily * a_this, guchar * a_name)
  169. {
  170. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR);
  171. /*
  172. *only non generic font families can have a name
  173. */
  174. if (a_this->type != FONT_FAMILY_NON_GENERIC) {
  175. return CR_BAD_PARAM_ERROR;
  176. }
  177. if (a_this->name) {
  178. g_free (a_this->name);
  179. a_this->name = NULL;
  180. }
  181. a_this->name = a_name;
  182. return CR_OK;
  183. }
  184. CRFontFamily *
  185. cr_font_family_append (CRFontFamily * a_this,
  186. CRFontFamily * a_family_to_append)
  187. {
  188. CRFontFamily *cur_ff = NULL;
  189. g_return_val_if_fail (a_family_to_append, NULL);
  190. if (!a_this)
  191. return a_family_to_append;
  192. for (cur_ff = a_this; cur_ff && cur_ff->next; cur_ff = cur_ff->next) ;
  193. cur_ff->next = a_family_to_append;
  194. a_family_to_append->prev = cur_ff;
  195. return a_this;
  196. }
  197. CRFontFamily *
  198. cr_font_family_prepend (CRFontFamily * a_this,
  199. CRFontFamily * a_family_to_prepend)
  200. {
  201. g_return_val_if_fail (a_this && a_family_to_prepend, NULL);
  202. if (!a_this)
  203. return a_family_to_prepend;
  204. a_family_to_prepend->next = a_this;
  205. a_this->prev = a_family_to_prepend;
  206. return CR_OK;
  207. }
  208. enum CRStatus
  209. cr_font_family_destroy (CRFontFamily * a_this)
  210. {
  211. CRFontFamily *cur_ff = NULL;
  212. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR);
  213. for (cur_ff = a_this; cur_ff && cur_ff->next; cur_ff = cur_ff->next) ;
  214. for (; cur_ff; cur_ff = cur_ff->prev) {
  215. if (a_this->name) {
  216. g_free (a_this->name);
  217. a_this->name = NULL;
  218. }
  219. if (cur_ff->next) {
  220. g_free (cur_ff->next);
  221. }
  222. if (cur_ff->prev == NULL) {
  223. g_free (a_this);
  224. }
  225. }
  226. return CR_OK;
  227. }
  228. /***************************************************
  229. *'font-size' manipulation functions definitions
  230. ***************************************************/
  231. CRFontSize *
  232. cr_font_size_new (void)
  233. {
  234. CRFontSize *result = NULL;
  235. result = g_try_malloc (sizeof (CRFontSize));
  236. if (!result) {
  237. cr_utils_trace_info ("Out of memory");
  238. return NULL;
  239. }
  240. memset (result, 0, sizeof (CRFontSize));
  241. return result;
  242. }
  243. enum CRStatus
  244. cr_font_size_clear (CRFontSize * a_this)
  245. {
  246. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR);
  247. switch (a_this->type) {
  248. case PREDEFINED_ABSOLUTE_FONT_SIZE:
  249. case RELATIVE_FONT_SIZE:
  250. case INHERITED_FONT_SIZE:
  251. memset (a_this, 0, sizeof (CRFontSize));
  252. break;
  253. case ABSOLUTE_FONT_SIZE:
  254. memset (a_this, 0, sizeof (CRFontSize));
  255. break;
  256. default:
  257. return CR_UNKNOWN_TYPE_ERROR;
  258. }
  259. return CR_OK;
  260. }
  261. enum CRStatus
  262. cr_font_size_copy (CRFontSize * a_dst, CRFontSize * a_src)
  263. {
  264. g_return_val_if_fail (a_dst && a_src, CR_BAD_PARAM_ERROR);
  265. switch (a_src->type) {
  266. case PREDEFINED_ABSOLUTE_FONT_SIZE:
  267. case RELATIVE_FONT_SIZE:
  268. case INHERITED_FONT_SIZE:
  269. cr_font_size_clear (a_dst);
  270. memcpy (a_dst, a_src, sizeof (CRFontSize));
  271. break;
  272. case ABSOLUTE_FONT_SIZE:
  273. cr_font_size_clear (a_dst);
  274. cr_num_copy (&a_dst->value.absolute,
  275. &a_src->value.absolute);
  276. a_dst->type = a_src->type;
  277. break;
  278. default:
  279. return CR_UNKNOWN_TYPE_ERROR;
  280. }
  281. return CR_OK;
  282. }
  283. enum CRStatus
  284. cr_font_size_set_predefined_absolute_font_size (CRFontSize *a_this,
  285. enum CRPredefinedAbsoluteFontSize a_predefined)
  286. {
  287. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ;
  288. g_return_val_if_fail (a_predefined >= PREDEFINED_ABSOLUTE_FONT_SIZE
  289. && a_predefined < NB_FONT_SIZE_TYPE,
  290. CR_BAD_PARAM_ERROR) ;
  291. a_this->type = PREDEFINED_ABSOLUTE_FONT_SIZE ;
  292. a_this->value.predefined = a_predefined ;
  293. return CR_OK ;
  294. }
  295. enum CRStatus
  296. cr_font_size_set_relative_font_size (CRFontSize *a_this,
  297. enum CRRelativeFontSize a_relative)
  298. {
  299. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ;
  300. g_return_val_if_fail (a_relative >= FONT_SIZE_LARGER
  301. && a_relative < NB_RELATIVE_FONT_SIZE,
  302. CR_BAD_PARAM_ERROR) ;
  303. a_this->type = RELATIVE_FONT_SIZE ;
  304. a_this->value.relative = a_relative ;
  305. return CR_OK ;
  306. }
  307. enum CRStatus
  308. cr_font_size_set_absolute_font_size (CRFontSize *a_this,
  309. enum CRNumType a_num_type,
  310. gdouble a_value)
  311. {
  312. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ;
  313. g_return_val_if_fail (a_num_type >= NUM_AUTO
  314. && a_num_type < NB_NUM_TYPE,
  315. CR_BAD_PARAM_ERROR) ;
  316. a_this->type = ABSOLUTE_FONT_SIZE ;
  317. cr_num_set (&a_this->value.absolute,
  318. a_value, a_num_type) ;
  319. return CR_OK ;
  320. }
  321. enum CRStatus
  322. cr_font_size_set_to_inherit (CRFontSize *a_this)
  323. {
  324. g_return_val_if_fail (a_this, CR_BAD_PARAM_ERROR) ;
  325. cr_font_size_clear (a_this) ;
  326. a_this->type = INHERITED_FONT_SIZE ;
  327. return CR_OK ;
  328. }
  329. gboolean
  330. cr_font_size_is_set_to_inherit (CRFontSize *a_this)
  331. {
  332. g_return_val_if_fail (a_this, FALSE) ;
  333. return a_this->type == INHERITED_FONT_SIZE ;
  334. }
  335. gchar *
  336. cr_font_size_to_string (CRFontSize * a_this)
  337. {
  338. gchar *str = NULL;
  339. if (!a_this) {
  340. str = g_strdup ("NULL");
  341. g_return_val_if_fail (str, NULL);
  342. return str;
  343. }
  344. switch (a_this->type) {
  345. case PREDEFINED_ABSOLUTE_FONT_SIZE:
  346. str = g_strdup (cr_predefined_absolute_font_size_to_string
  347. (a_this->value.predefined));
  348. break;
  349. case ABSOLUTE_FONT_SIZE:
  350. str = cr_num_to_string (&a_this->value.absolute);
  351. break;
  352. case RELATIVE_FONT_SIZE:
  353. str = g_strdup (cr_relative_font_size_to_string
  354. (a_this->value.relative));
  355. break;
  356. case INHERITED_FONT_SIZE:
  357. str = g_strdup ("inherit");
  358. break;
  359. default:
  360. break;
  361. }
  362. return str;
  363. }
  364. void
  365. cr_font_size_get_smaller_predefined_font_size (enum CRPredefinedAbsoluteFontSize a_font_size,
  366. enum CRPredefinedAbsoluteFontSize *a_smaller_size)
  367. {
  368. enum CRPredefinedAbsoluteFontSize result = FONT_SIZE_MEDIUM ;
  369. g_return_if_fail (a_smaller_size) ;
  370. g_return_if_fail (a_font_size < NB_PREDEFINED_ABSOLUTE_FONT_SIZES
  371. && a_font_size >= FONT_SIZE_XX_SMALL) ;
  372. switch (a_font_size) {
  373. case FONT_SIZE_XX_SMALL:
  374. result = FONT_SIZE_XX_SMALL ;
  375. break ;
  376. case FONT_SIZE_X_SMALL:
  377. result = FONT_SIZE_XX_SMALL ;
  378. break ;
  379. case FONT_SIZE_SMALL:
  380. result = FONT_SIZE_X_SMALL;
  381. break ;
  382. case FONT_SIZE_MEDIUM:
  383. result = FONT_SIZE_SMALL;
  384. break ;
  385. case FONT_SIZE_LARGE:
  386. result = FONT_SIZE_MEDIUM;
  387. break ;
  388. case FONT_SIZE_X_LARGE:
  389. result = FONT_SIZE_LARGE;
  390. break ;
  391. case FONT_SIZE_XX_LARGE:
  392. result = FONT_SIZE_XX_LARGE;
  393. break ;
  394. case FONT_SIZE_INHERIT:
  395. cr_utils_trace_info ("can't return a smaller size for FONT_SIZE_INHERIT") ;
  396. result = FONT_SIZE_MEDIUM ;
  397. break ;
  398. default:
  399. cr_utils_trace_info ("Unknown FONT_SIZE") ;
  400. result = FONT_SIZE_MEDIUM ;
  401. break ;
  402. }
  403. *a_smaller_size = result ;
  404. }
  405. void
  406. cr_font_size_get_larger_predefined_font_size (enum CRPredefinedAbsoluteFontSize a_font_size,
  407. enum CRPredefinedAbsoluteFontSize *a_larger_size)
  408. {
  409. enum CRPredefinedAbsoluteFontSize result = FONT_SIZE_MEDIUM ;
  410. g_return_if_fail (a_larger_size) ;
  411. g_return_if_fail (a_font_size >= FONT_SIZE_XX_SMALL
  412. && a_font_size < NB_PREDEFINED_ABSOLUTE_FONT_SIZES) ;
  413. switch (a_font_size) {
  414. case FONT_SIZE_XX_SMALL:
  415. result = FONT_SIZE_X_SMALL ;
  416. break ;
  417. case FONT_SIZE_X_SMALL:
  418. result = FONT_SIZE_SMALL ;
  419. break ;
  420. case FONT_SIZE_SMALL:
  421. result = FONT_SIZE_MEDIUM;
  422. break ;
  423. case FONT_SIZE_MEDIUM:
  424. result = FONT_SIZE_LARGE;
  425. break ;
  426. case FONT_SIZE_LARGE:
  427. result = FONT_SIZE_X_LARGE;
  428. break ;
  429. case FONT_SIZE_X_LARGE:
  430. result = FONT_SIZE_XX_LARGE ;
  431. break ;
  432. case FONT_SIZE_XX_LARGE:
  433. result = FONT_SIZE_XX_LARGE;
  434. break ;
  435. case FONT_SIZE_INHERIT:
  436. cr_utils_trace_info ("can't return a bigger size for FONT_SIZE_INHERIT") ;
  437. result = FONT_SIZE_MEDIUM ;
  438. break ;
  439. default:
  440. cr_utils_trace_info ("Unknown FONT_SIZE") ;
  441. result = FONT_SIZE_MEDIUM ;
  442. break ;
  443. }
  444. *a_larger_size = result ;
  445. }
  446. gboolean
  447. cr_font_size_is_predefined_absolute_font_size (enum CRPredefinedAbsoluteFontSize a_font_size)
  448. {
  449. if (a_font_size >= FONT_SIZE_XX_SMALL
  450. && a_font_size < NB_PREDEFINED_ABSOLUTE_FONT_SIZES) {
  451. return TRUE ;
  452. } else {
  453. return FALSE ;
  454. }
  455. }
  456. gchar *
  457. cr_font_size_adjust_to_string (CRFontSizeAdjust * a_this)
  458. {
  459. gchar *str = NULL;
  460. if (!a_this) {
  461. str = g_strdup ("NULL");
  462. g_return_val_if_fail (str, NULL);
  463. return str;
  464. }
  465. switch (a_this->type) {
  466. case FONT_SIZE_ADJUST_NONE:
  467. str = g_strdup ("none");
  468. break;
  469. case FONT_SIZE_ADJUST_NUMBER:
  470. if (a_this->num)
  471. str = cr_num_to_string (a_this->num);
  472. else
  473. str = g_strdup ("unknow font-size-adjust property value"); // Should raise an error no?
  474. break;
  475. case FONT_SIZE_ADJUST_INHERIT:
  476. str = g_strdup ("inherit");
  477. }
  478. return str;
  479. }
  480. const gchar *
  481. cr_font_style_to_string (enum CRFontStyle a_code)
  482. {
  483. gchar *str = NULL;
  484. switch (a_code) {
  485. case FONT_STYLE_NORMAL:
  486. str = (gchar *) "normal";
  487. break;
  488. case FONT_STYLE_ITALIC:
  489. str = (gchar *) "italic";
  490. break;
  491. case FONT_STYLE_OBLIQUE:
  492. str = (gchar *) "oblique";
  493. break;
  494. case FONT_STYLE_INHERIT:
  495. str = (gchar *) "inherit";
  496. break;
  497. default:
  498. str = (gchar *) "unknown font style value";
  499. break;
  500. }
  501. return str;
  502. }
  503. const gchar *
  504. cr_font_variant_to_string (enum CRFontVariant a_code)
  505. {
  506. gchar *str = NULL;
  507. switch (a_code) {
  508. case FONT_VARIANT_NORMAL:
  509. str = (gchar *) "normal";
  510. break;
  511. case FONT_VARIANT_SMALL_CAPS:
  512. str = (gchar *) "small-caps";
  513. break;
  514. case FONT_VARIANT_INHERIT:
  515. str = (gchar *) "inherit";
  516. break;
  517. }
  518. return str;
  519. }
  520. enum CRFontWeight
  521. cr_font_weight_get_bolder (enum CRFontWeight a_weight)
  522. {
  523. if (a_weight >= NB_FONT_WEIGHTS) {
  524. return FONT_WEIGHT_900 ;
  525. } else if (a_weight < FONT_WEIGHT_NORMAL) {
  526. return FONT_WEIGHT_NORMAL ;
  527. } else if (a_weight == FONT_WEIGHT_BOLDER
  528. || a_weight == FONT_WEIGHT_BOLDER) {
  529. cr_utils_trace_info ("FONT_WEIGHT_BOLDER or FONT_WEIGHT_LIGHTER should not appear here") ;
  530. return FONT_WEIGHT_NORMAL ;
  531. } else {
  532. return a_weight << 1 ;
  533. }
  534. }
  535. const gchar *
  536. cr_font_weight_to_string (enum CRFontWeight a_code)
  537. {
  538. gchar *str = NULL;
  539. switch (a_code) {
  540. case FONT_WEIGHT_NORMAL:
  541. str = (gchar *) "normal";
  542. break;
  543. case FONT_WEIGHT_BOLD:
  544. str = (gchar *) "bold";
  545. break;
  546. case FONT_WEIGHT_BOLDER:
  547. str = (gchar *) "bolder";
  548. break;
  549. case FONT_WEIGHT_LIGHTER:
  550. str = (gchar *) "lighter";
  551. break;
  552. case FONT_WEIGHT_100:
  553. str = (gchar *) "100";
  554. break;
  555. case FONT_WEIGHT_200:
  556. str = (gchar *) "200";
  557. break;
  558. case FONT_WEIGHT_300:
  559. str = (gchar *) "300";
  560. break;
  561. case FONT_WEIGHT_400:
  562. str = (gchar *) "400";
  563. break;
  564. case FONT_WEIGHT_500:
  565. str = (gchar *) "500";
  566. break;
  567. case FONT_WEIGHT_600:
  568. str = (gchar *) "600";
  569. break;
  570. case FONT_WEIGHT_700:
  571. str = (gchar *) "700";
  572. break;
  573. case FONT_WEIGHT_800:
  574. str = (gchar *) "800";
  575. break;
  576. case FONT_WEIGHT_900:
  577. str = (gchar *) "900";
  578. break;
  579. case FONT_WEIGHT_INHERIT:
  580. str = (gchar *) "inherit";
  581. break;
  582. default:
  583. str = (gchar *) "unknown font-weight property value";
  584. break;
  585. }
  586. return str;
  587. }
  588. const gchar *
  589. cr_font_stretch_to_string (enum CRFontStretch a_code)
  590. {
  591. gchar *str = NULL;
  592. switch (a_code) {
  593. case FONT_STRETCH_NORMAL:
  594. str = (gchar *) "normal";
  595. break;
  596. case FONT_STRETCH_WIDER:
  597. str = (gchar *) "wider";
  598. break;
  599. case FONT_STRETCH_NARROWER:
  600. str = (gchar *) "narrower";
  601. break;
  602. case FONT_STRETCH_ULTRA_CONDENSED:
  603. str = (gchar *) "ultra-condensed";
  604. break;
  605. case FONT_STRETCH_EXTRA_CONDENSED:
  606. str = (gchar *) "extra-condensed";
  607. break;
  608. case FONT_STRETCH_CONDENSED:
  609. str = (gchar *) "condensed";
  610. break;
  611. case FONT_STRETCH_SEMI_CONDENSED:
  612. str = (gchar *) "semi-condensed";
  613. break;
  614. case FONT_STRETCH_SEMI_EXPANDED:
  615. str = (gchar *) "semi-expanded";
  616. break;
  617. case FONT_STRETCH_EXPANDED:
  618. str = (gchar *) "expanded";
  619. break;
  620. case FONT_STRETCH_EXTRA_EXPANDED:
  621. str = (gchar *) "extra-expaned";
  622. break;
  623. case FONT_STRETCH_ULTRA_EXPANDED:
  624. str = (gchar *) "ultra-expanded";
  625. break;
  626. case FONT_STRETCH_INHERIT:
  627. str = (gchar *) "inherit";
  628. break;
  629. }
  630. return str;
  631. }
  632. void
  633. cr_font_size_destroy (CRFontSize * a_font_size)
  634. {
  635. g_return_if_fail (a_font_size);
  636. g_free (a_font_size) ;
  637. }
  638. /*******************************************************
  639. *'font-size-adjust' manipulation function definition
  640. *******************************************************/
  641. CRFontSizeAdjust *
  642. cr_font_size_adjust_new (void)
  643. {
  644. CRFontSizeAdjust *result = NULL;
  645. result = g_try_malloc (sizeof (CRFontSizeAdjust));
  646. if (!result) {
  647. cr_utils_trace_info ("Out of memory");
  648. return NULL;
  649. }
  650. memset (result, 0, sizeof (CRFontSizeAdjust));
  651. return result;
  652. }
  653. void
  654. cr_font_size_adjust_destroy (CRFontSizeAdjust * a_this)
  655. {
  656. g_return_if_fail (a_this);
  657. if (a_this->type == FONT_SIZE_ADJUST_NUMBER && a_this->num) {
  658. cr_num_destroy (a_this->num);
  659. a_this->num = NULL;
  660. }
  661. }