| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright © 2009,2010 Red Hat, Inc. | 2 * Copyright © 2009,2010 Red Hat, Inc. |
| 3 * Copyright © 2011,2012 Google, Inc. | 3 * Copyright © 2011,2012 Google, Inc. |
| 4 * | 4 * |
| 5 * This is part of HarfBuzz, a text shaping library. | 5 * This is part of HarfBuzz, a text shaping library. |
| 6 * | 6 * |
| 7 * Permission is hereby granted, without written agreement and without | 7 * Permission is hereby granted, without written agreement and without |
| 8 * license or royalty fees, to use, copy, modify, and distribute this | 8 * license or royalty fees, to use, copy, modify, and distribute this |
| 9 * software and its documentation for any purpose, provided that the | 9 * software and its documentation for any purpose, provided that the |
| 10 * above copyright notice and the following two paragraphs appear in | 10 * above copyright notice and the following two paragraphs appear in |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 57 |
| 58 /** | 58 /** |
| 59 * hb_tag_from_string: | 59 * hb_tag_from_string: |
| 60 * @str: (array length=len) (element-type uint8_t): | 60 * @str: (array length=len) (element-type uint8_t): |
| 61 * @len: | 61 * @len: |
| 62 * | 62 * |
| 63 * | 63 * |
| 64 * | 64 * |
| 65 * Return value: | 65 * Return value: |
| 66 * | 66 * |
| 67 * Since: 1.0 | 67 * Since: 0.9.2 |
| 68 **/ | 68 **/ |
| 69 hb_tag_t | 69 hb_tag_t |
| 70 hb_tag_from_string (const char *str, int len) | 70 hb_tag_from_string (const char *str, int len) |
| 71 { | 71 { |
| 72 char tag[4]; | 72 char tag[4]; |
| 73 unsigned int i; | 73 unsigned int i; |
| 74 | 74 |
| 75 if (!str || !len || !*str) | 75 if (!str || !len || !*str) |
| 76 return HB_TAG_NONE; | 76 return HB_TAG_NONE; |
| 77 | 77 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 | 115 |
| 116 /** | 116 /** |
| 117 * hb_direction_from_string: | 117 * hb_direction_from_string: |
| 118 * @str: (array length=len) (element-type uint8_t): | 118 * @str: (array length=len) (element-type uint8_t): |
| 119 * @len: | 119 * @len: |
| 120 * | 120 * |
| 121 * | 121 * |
| 122 * | 122 * |
| 123 * Return value: | 123 * Return value: |
| 124 * | 124 * |
| 125 * Since: 1.0 | 125 * Since: 0.9.2 |
| 126 **/ | 126 **/ |
| 127 hb_direction_t | 127 hb_direction_t |
| 128 hb_direction_from_string (const char *str, int len) | 128 hb_direction_from_string (const char *str, int len) |
| 129 { | 129 { |
| 130 if (unlikely (!str || !len || !*str)) | 130 if (unlikely (!str || !len || !*str)) |
| 131 return HB_DIRECTION_INVALID; | 131 return HB_DIRECTION_INVALID; |
| 132 | 132 |
| 133 /* Lets match loosely: just match the first letter, such that | 133 /* Lets match loosely: just match the first letter, such that |
| 134 * all of "ltr", "left-to-right", etc work! | 134 * all of "ltr", "left-to-right", etc work! |
| 135 */ | 135 */ |
| 136 char c = TOLOWER (str[0]); | 136 char c = TOLOWER (str[0]); |
| 137 for (unsigned int i = 0; i < ARRAY_LENGTH (direction_strings); i++) | 137 for (unsigned int i = 0; i < ARRAY_LENGTH (direction_strings); i++) |
| 138 if (c == direction_strings[i][0]) | 138 if (c == direction_strings[i][0]) |
| 139 return (hb_direction_t) (HB_DIRECTION_LTR + i); | 139 return (hb_direction_t) (HB_DIRECTION_LTR + i); |
| 140 | 140 |
| 141 return HB_DIRECTION_INVALID; | 141 return HB_DIRECTION_INVALID; |
| 142 } | 142 } |
| 143 | 143 |
| 144 /** | 144 /** |
| 145 * hb_direction_to_string: | 145 * hb_direction_to_string: |
| 146 * @direction: | 146 * @direction: |
| 147 * | 147 * |
| 148 * | 148 * |
| 149 * | 149 * |
| 150 * Return value: (transfer none): | 150 * Return value: (transfer none): |
| 151 * | 151 * |
| 152 * Since: 1.0 | 152 * Since: 0.9.2 |
| 153 **/ | 153 **/ |
| 154 const char * | 154 const char * |
| 155 hb_direction_to_string (hb_direction_t direction) | 155 hb_direction_to_string (hb_direction_t direction) |
| 156 { | 156 { |
| 157 if (likely ((unsigned int) (direction - HB_DIRECTION_LTR) | 157 if (likely ((unsigned int) (direction - HB_DIRECTION_LTR) |
| 158 < ARRAY_LENGTH (direction_strings))) | 158 < ARRAY_LENGTH (direction_strings))) |
| 159 return direction_strings[direction - HB_DIRECTION_LTR]; | 159 return direction_strings[direction - HB_DIRECTION_LTR]; |
| 160 | 160 |
| 161 return "invalid"; | 161 return "invalid"; |
| 162 } | 162 } |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 | 281 |
| 282 /** | 282 /** |
| 283 * hb_language_from_string: | 283 * hb_language_from_string: |
| 284 * @str: (array length=len) (element-type uint8_t): | 284 * @str: (array length=len) (element-type uint8_t): |
| 285 * @len: | 285 * @len: |
| 286 * | 286 * |
| 287 * | 287 * |
| 288 * | 288 * |
| 289 * Return value: (transfer none): | 289 * Return value: (transfer none): |
| 290 * | 290 * |
| 291 * Since: 1.0 | 291 * Since: 0.9.2 |
| 292 **/ | 292 **/ |
| 293 hb_language_t | 293 hb_language_t |
| 294 hb_language_from_string (const char *str, int len) | 294 hb_language_from_string (const char *str, int len) |
| 295 { | 295 { |
| 296 char strbuf[64]; | |
| 297 | |
| 298 if (!str || !len || !*str) | 296 if (!str || !len || !*str) |
| 299 return HB_LANGUAGE_INVALID; | 297 return HB_LANGUAGE_INVALID; |
| 300 | 298 |
| 299 hb_language_item_t *item = NULL; |
| 301 if (len >= 0) | 300 if (len >= 0) |
| 302 { | 301 { |
| 303 /* NUL-terminate it. */ | 302 /* NUL-terminate it. */ |
| 303 char strbuf[64]; |
| 304 len = MIN (len, (int) sizeof (strbuf) - 1); | 304 len = MIN (len, (int) sizeof (strbuf) - 1); |
| 305 memcpy (strbuf, str, len); | 305 memcpy (strbuf, str, len); |
| 306 strbuf[len] = '\0'; | 306 strbuf[len] = '\0'; |
| 307 str = strbuf; | 307 item = lang_find_or_insert (strbuf); |
| 308 } | 308 } |
| 309 | 309 else |
| 310 hb_language_item_t *item = lang_find_or_insert (str); | 310 item = lang_find_or_insert (str); |
| 311 | 311 |
| 312 return likely (item) ? item->lang : HB_LANGUAGE_INVALID; | 312 return likely (item) ? item->lang : HB_LANGUAGE_INVALID; |
| 313 } | 313 } |
| 314 | 314 |
| 315 /** | 315 /** |
| 316 * hb_language_to_string: | 316 * hb_language_to_string: |
| 317 * @language: | 317 * @language: |
| 318 * | 318 * |
| 319 * | 319 * |
| 320 * | 320 * |
| 321 * Return value: (transfer none): | 321 * Return value: (transfer none): |
| 322 * | 322 * |
| 323 * Since: 1.0 | 323 * Since: 0.9.2 |
| 324 **/ | 324 **/ |
| 325 const char * | 325 const char * |
| 326 hb_language_to_string (hb_language_t language) | 326 hb_language_to_string (hb_language_t language) |
| 327 { | 327 { |
| 328 /* This is actually NULL-safe! */ | 328 /* This is actually NULL-safe! */ |
| 329 return language->s; | 329 return language->s; |
| 330 } | 330 } |
| 331 | 331 |
| 332 /** | 332 /** |
| 333 * hb_language_get_default: | 333 * hb_language_get_default: |
| 334 * | 334 * |
| 335 * | 335 * |
| 336 * | 336 * |
| 337 * Return value: (transfer none): | 337 * Return value: (transfer none): |
| 338 * | 338 * |
| 339 * Since: 1.0 | 339 * Since: 0.9.2 |
| 340 **/ | 340 **/ |
| 341 hb_language_t | 341 hb_language_t |
| 342 hb_language_get_default (void) | 342 hb_language_get_default (void) |
| 343 { | 343 { |
| 344 static hb_language_t default_language = HB_LANGUAGE_INVALID; | 344 static hb_language_t default_language = HB_LANGUAGE_INVALID; |
| 345 | 345 |
| 346 hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language)
; | 346 hb_language_t language = (hb_language_t) hb_atomic_ptr_get (&default_language)
; |
| 347 if (unlikely (language == HB_LANGUAGE_INVALID)) { | 347 if (unlikely (language == HB_LANGUAGE_INVALID)) { |
| 348 language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); | 348 language = hb_language_from_string (setlocale (LC_CTYPE, NULL), -1); |
| 349 (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, langua
ge); | 349 (void) hb_atomic_ptr_cmpexch (&default_language, HB_LANGUAGE_INVALID, langua
ge); |
| 350 } | 350 } |
| 351 | 351 |
| 352 return default_language; | 352 return default_language; |
| 353 } | 353 } |
| 354 | 354 |
| 355 | 355 |
| 356 /* hb_script_t */ | 356 /* hb_script_t */ |
| 357 | 357 |
| 358 /** | 358 /** |
| 359 * hb_script_from_iso15924_tag: | 359 * hb_script_from_iso15924_tag: |
| 360 * @tag: | 360 * @tag: |
| 361 * | 361 * |
| 362 * | 362 * |
| 363 * | 363 * |
| 364 * Return value: | 364 * Return value: |
| 365 * | 365 * |
| 366 * Since: 1.0 | 366 * Since: 0.9.2 |
| 367 **/ | 367 **/ |
| 368 hb_script_t | 368 hb_script_t |
| 369 hb_script_from_iso15924_tag (hb_tag_t tag) | 369 hb_script_from_iso15924_tag (hb_tag_t tag) |
| 370 { | 370 { |
| 371 if (unlikely (tag == HB_TAG_NONE)) | 371 if (unlikely (tag == HB_TAG_NONE)) |
| 372 return HB_SCRIPT_INVALID; | 372 return HB_SCRIPT_INVALID; |
| 373 | 373 |
| 374 /* Be lenient, adjust case (one capital letter followed by three small letters
) */ | 374 /* Be lenient, adjust case (one capital letter followed by three small letters
) */ |
| 375 tag = (tag & 0xDFDFDFDFu) | 0x00202020u; | 375 tag = (tag & 0xDFDFDFDFu) | 0x00202020u; |
| 376 | 376 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 401 | 401 |
| 402 /** | 402 /** |
| 403 * hb_script_from_string: | 403 * hb_script_from_string: |
| 404 * @s: (array length=len) (element-type uint8_t): | 404 * @s: (array length=len) (element-type uint8_t): |
| 405 * @len: | 405 * @len: |
| 406 * | 406 * |
| 407 * | 407 * |
| 408 * | 408 * |
| 409 * Return value: | 409 * Return value: |
| 410 * | 410 * |
| 411 * Since: 1.0 | 411 * Since: 0.9.2 |
| 412 **/ | 412 **/ |
| 413 hb_script_t | 413 hb_script_t |
| 414 hb_script_from_string (const char *s, int len) | 414 hb_script_from_string (const char *s, int len) |
| 415 { | 415 { |
| 416 return hb_script_from_iso15924_tag (hb_tag_from_string (s, len)); | 416 return hb_script_from_iso15924_tag (hb_tag_from_string (s, len)); |
| 417 } | 417 } |
| 418 | 418 |
| 419 /** | 419 /** |
| 420 * hb_script_to_iso15924_tag: | 420 * hb_script_to_iso15924_tag: |
| 421 * @script: | 421 * @script: |
| 422 * | 422 * |
| 423 * | 423 * |
| 424 * | 424 * |
| 425 * Return value: | 425 * Return value: |
| 426 * | 426 * |
| 427 * Since: 1.0 | 427 * Since: 0.9.2 |
| 428 **/ | 428 **/ |
| 429 hb_tag_t | 429 hb_tag_t |
| 430 hb_script_to_iso15924_tag (hb_script_t script) | 430 hb_script_to_iso15924_tag (hb_script_t script) |
| 431 { | 431 { |
| 432 return (hb_tag_t) script; | 432 return (hb_tag_t) script; |
| 433 } | 433 } |
| 434 | 434 |
| 435 /** | 435 /** |
| 436 * hb_script_get_horizontal_direction: | 436 * hb_script_get_horizontal_direction: |
| 437 * @script: | 437 * @script: |
| 438 * | 438 * |
| 439 * | 439 * |
| 440 * | 440 * |
| 441 * Return value: | 441 * Return value: |
| 442 * | 442 * |
| 443 * Since: 1.0 | 443 * Since: 0.9.2 |
| 444 **/ | 444 **/ |
| 445 hb_direction_t | 445 hb_direction_t |
| 446 hb_script_get_horizontal_direction (hb_script_t script) | 446 hb_script_get_horizontal_direction (hb_script_t script) |
| 447 { | 447 { |
| 448 /* http://goo.gl/x9ilM */ | 448 /* http://goo.gl/x9ilM */ |
| 449 switch ((hb_tag_t) script) | 449 switch ((hb_tag_t) script) |
| 450 { | 450 { |
| 451 /* Unicode-1.1 additions */ | 451 /* Unicode-1.1 additions */ |
| 452 case HB_SCRIPT_ARABIC: | 452 case HB_SCRIPT_ARABIC: |
| 453 case HB_SCRIPT_HEBREW: | 453 case HB_SCRIPT_HEBREW: |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 /* hb_version */ | 538 /* hb_version */ |
| 539 | 539 |
| 540 /** | 540 /** |
| 541 * hb_version: | 541 * hb_version: |
| 542 * @major: (out): Library major version component. | 542 * @major: (out): Library major version component. |
| 543 * @minor: (out): Library minor version component. | 543 * @minor: (out): Library minor version component. |
| 544 * @micro: (out): Library micro version component. | 544 * @micro: (out): Library micro version component. |
| 545 * | 545 * |
| 546 * Returns library version as three integer components. | 546 * Returns library version as three integer components. |
| 547 * | 547 * |
| 548 * Since: 1.0 | 548 * Since: 0.9.2 |
| 549 **/ | 549 **/ |
| 550 void | 550 void |
| 551 hb_version (unsigned int *major, | 551 hb_version (unsigned int *major, |
| 552 unsigned int *minor, | 552 unsigned int *minor, |
| 553 unsigned int *micro) | 553 unsigned int *micro) |
| 554 { | 554 { |
| 555 *major = HB_VERSION_MAJOR; | 555 *major = HB_VERSION_MAJOR; |
| 556 *minor = HB_VERSION_MINOR; | 556 *minor = HB_VERSION_MINOR; |
| 557 *micro = HB_VERSION_MICRO; | 557 *micro = HB_VERSION_MICRO; |
| 558 } | 558 } |
| 559 | 559 |
| 560 /** | 560 /** |
| 561 * hb_version_string: | 561 * hb_version_string: |
| 562 * | 562 * |
| 563 * Returns library version as a string with three components. | 563 * Returns library version as a string with three components. |
| 564 * | 564 * |
| 565 * Return value: library version string. | 565 * Return value: library version string. |
| 566 * | 566 * |
| 567 * Since: 1.0 | 567 * Since: 0.9.2 |
| 568 **/ | 568 **/ |
| 569 const char * | 569 const char * |
| 570 hb_version_string (void) | 570 hb_version_string (void) |
| 571 { | 571 { |
| 572 return HB_VERSION_STRING; | 572 return HB_VERSION_STRING; |
| 573 } | 573 } |
| 574 | 574 |
| 575 /** | 575 /** |
| 576 * hb_version_atleast: | 576 * hb_version_atleast: |
| 577 * @major: | 577 * @major: |
| 578 * @minor: | 578 * @minor: |
| 579 * @micro: | 579 * @micro: |
| 580 * | 580 * |
| 581 * | 581 * |
| 582 * | 582 * |
| 583 * Return value: | 583 * Return value: |
| 584 * | 584 * |
| 585 * Since: 0.9.30 | 585 * Since: 0.9.30 |
| 586 **/ | 586 **/ |
| 587 hb_bool_t | 587 hb_bool_t |
| 588 hb_version_atleast (unsigned int major, | 588 hb_version_atleast (unsigned int major, |
| 589 unsigned int minor, | 589 unsigned int minor, |
| 590 unsigned int micro) | 590 unsigned int micro) |
| 591 { | 591 { |
| 592 return HB_VERSION_ATLEAST (major, minor, micro); | 592 return HB_VERSION_ATLEAST (major, minor, micro); |
| 593 } | 593 } |
| OLD | NEW |