/usr/include/libdjvu/ddjvuapi.h is in libdjvulibre-dev 3.5.25.4-4+b1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 | /*
//C- -------------------------------------------------------------------
//C- DjVuLibre-3.5
//C- Copyright (c) 2002 Leon Bottou and Yann Le Cun.
//C- Copyright (c) 2001 AT&T
//C-
//C- This software is subject to, and may be distributed under, the
//C- GNU General Public License, either Version 2 of the license,
//C- or (at your option) any later version. The license should have
//C- accompanied the software or you may obtain a copy of the license
//C- from the Free Software Foundation at http://www.fsf.org .
//C-
//C- This program is distributed in the hope that it will be useful,
//C- but WITHOUT ANY WARRANTY; without even the implied warranty of
//C- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//C- GNU General Public License for more details.
//C-
//C- DjVuLibre-3.5 is derived from the DjVu(r) Reference Library from
//C- Lizardtech Software. Lizardtech Software has authorized us to
//C- replace the original DjVu(r) Reference Library notice by the following
//C- text (see doc/lizard2002.djvu and doc/lizardtech2007.djvu):
//C-
//C- ------------------------------------------------------------------
//C- | DjVu (r) Reference Library (v. 3.5)
//C- | Copyright (c) 1999-2001 LizardTech, Inc. All Rights Reserved.
//C- | The DjVu Reference Library is protected by U.S. Pat. No.
//C- | 6,058,214 and patents pending.
//C- |
//C- | This software is subject to, and may be distributed under, the
//C- | GNU General Public License, either Version 2 of the license,
//C- | or (at your option) any later version. The license should have
//C- | accompanied the software or you may obtain a copy of the license
//C- | from the Free Software Foundation at http://www.fsf.org .
//C- |
//C- | The computer code originally released by LizardTech under this
//C- | license and unmodified by other parties is deemed "the LIZARDTECH
//C- | ORIGINAL CODE." Subject to any third party intellectual property
//C- | claims, LizardTech grants recipient a worldwide, royalty-free,
//C- | non-exclusive license to make, use, sell, or otherwise dispose of
//C- | the LIZARDTECH ORIGINAL CODE or of programs derived from the
//C- | LIZARDTECH ORIGINAL CODE in compliance with the terms of the GNU
//C- | General Public License. This grant only confers the right to
//C- | infringe patent claims underlying the LIZARDTECH ORIGINAL CODE to
//C- | the extent such infringement is reasonably necessary to enable
//C- | recipient to make, have made, practice, sell, or otherwise dispose
//C- | of the LIZARDTECH ORIGINAL CODE (or portions thereof) and not to
//C- | any greater extent that may be necessary to utilize further
//C- | modifications or combinations.
//C- |
//C- | The LIZARDTECH ORIGINAL CODE is provided "AS IS" WITHOUT WARRANTY
//C- | OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
//C- | TO ANY WARRANTY OF NON-INFRINGEMENT, OR ANY IMPLIED WARRANTY OF
//C- | MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
//C- +------------------------------------------------------------------
*/
#ifndef DDJVUAPI_H
#define DDJVUAPI_H
#ifdef __cplusplus
extern "C" {
#endif
#if 0
}
#endif
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#ifndef DDJVUAPI
# ifdef WIN32
# ifdef DLL_EXPORT
# define DDJVUAPI __declspec(dllexport)
# else
# define DDJVUAPI __declspec(dllimport)
# endif
# endif
#endif
#ifndef DDJVUAPI
# define DDJVUAPI /**/
#endif
#ifndef TRUE
# define TRUE (1)
#endif
#ifndef FALSE
# define FALSE (0)
#endif
/* -------------------------------------------------- */
/* DDJVU API */
/* -------------------------------------------------- */
/* The DDJVU API provides for efficiently decoding and
displaying DjVu documents. It provides for displaying
images without waiting for the complete DjVu data. Images
can be displayed as soon as sufficient data is
available. A higher quality image might later be
displayed when further data is available. The DjVu
library achieves this using a complicated scheme
involving multiple threads. The DDJVU API hides this
complexity with a familiar event model.
*/
/* Compiler symbol DDJVUAPI_VERSION tracks
backward compatible additions to the DDJVU API.
Version Change
-----------------------------
21 Added:
reentrant version of miniexp input/output
20 Added:
ddjvu_get_version_string()
ddjvu_format_set_white()
ddjvu_anno_get_xmp()
19 Added:
ddjvu_document_create_by_filename_utf8()
18 Added:
ddjvu_document_get_{anno,pagedump,filedump}()
Modifed (binary compatible):
ddjvu_document_get_{fileinfo,pageinfo}()
ddjvu_document_save() [--pages, --indirect=]
Deprecated:
ddjvu_document_search_pageno()
ddjvu_page_get_{short,long}_description()
17 Added:
ddjvu_page_get_initial_rotation(), ddjvu_code_get_version()
ddjvu_document_{get_filenum,get_fileinfo}}()
ddjvu_document_{search_pageno,check_pagedata}()
ddjvu_rectmapper_t and related functions.
16 Added:
miniexp.h and related functions.
15 Added:
ddjvu_document_get_pageinfo()
ddjvu_document_print()
14 Initial version.
*/
#define DDJVUAPI_VERSION 21
typedef struct ddjvu_context_s ddjvu_context_t;
typedef union ddjvu_message_s ddjvu_message_t;
typedef struct ddjvu_job_s ddjvu_job_t;
typedef struct ddjvu_document_s ddjvu_document_t;
typedef struct ddjvu_page_s ddjvu_page_t;
typedef struct ddjvu_format_s ddjvu_format_t;
typedef struct ddjvu_rect_s ddjvu_rect_t;
typedef struct ddjvu_rectmapper_s ddjvu_rectmapper_t;
/* GENERAL CONVENTIONS:
- all strings use locale encoding (unless specified otherwise).
- all filenames are unencoded byte strings,
- all errors are signaled with error event messages,
- all functions returning a pointer might return a null pointer.
HEADER:
Always use the following idiom to include this file.
#include <libdjvu/ddjvuapi.h>
#include <libdjvu/miniexp.h>
This file does not declare functions ddjvu_get_DjVuImage()
and djvu_get_DjVuDocument() unless you include files
"DjVuImage.h" and "DjVuDocument.h" before this file.
PREREQUISITES:
- Please read the djvu man page: <"tools/djvu.1">.
- Please browse the file format specifications
<"doc/djvu3changes.txt"> and <"doc/djvu3spec.djvu">.
*/
/* -------------------------------------------------- */
/* DDJVU_CONTEXT_T */
/* -------------------------------------------------- */
/* There is usually only one <ddjvu_context_t> object.
This object holds global data structures such as the
cache of decoded pages, or the list of pending
event messages.
*/
/* ddjvu_get_version_string() ---
Returns a string that described the underlying code. */
DDJVUAPI const char*
ddjvu_get_version_string(void);
/* ddjvu_context_create ---
Creates a <ddjvu_context_t> object.
Argument <programname> is the name of the calling executable. */
DDJVUAPI ddjvu_context_t *
ddjvu_context_create(const char *programname);
/* ddjvu_context_release ---
Release a reference to a <ddjvu_context_t> object.
The calling program should no longer reference this object.
The object itself will be destroyed as soon as no other object
or thread needs it. */
DDJVUAPI void
ddjvu_context_release(ddjvu_context_t *context);
/* ------- CACHE ------- */
/* ddjvu_cache_set_size ---
Sets the maximum size of the cache of decoded page data.
The argument is expressed in bytes. */
DDJVUAPI void
ddjvu_cache_set_size(ddjvu_context_t *context,
unsigned long cachesize);
/* ddjvu_cache_get_size ---
Returns the maximum size of the cache. */
DDJVUAPI unsigned long
ddjvu_cache_get_size(ddjvu_context_t *context);
/* ddjvu_cache_clear ---
Clears all cached data. */
DDJVUAPI void
ddjvu_cache_clear(ddjvu_context_t *context);
/* ------- MESSAGE QUEUE ------- */
/* Messages produced by the ddjvu api accumulate into
the message queue. Processing messages is not optional!
A typical message handling routine looks like this:
void handle_ddjvu_messages(ddjvu_context_t *ctx, int wait)
{
const ddjvu_message_t *msg;
if (wait)
ddjvu_message_wait(ctx);
while ((msg = ddjvu_message_peek(ctx)))
{
switch(msg->m_any.tag)
{
case DDJVU_ERROR: .... ; break;
case DDJVU_INFO: .... ; break;
case DDJVU_NEWSTREAM: .... ; break;
....
default: break;
}
ddjvu_message_pop(ctx);
}
}
*/
/* ddjvu_message_peek ---
Returns a pointer to the next DDJVU message.
This function returns 0 if no message is available.
It does not remove the message from the queue. */
DDJVUAPI ddjvu_message_t *
ddjvu_message_peek(ddjvu_context_t *context);
/* ddjvu_message_wait ---
Returns a pointer to the next DDJVU message.
This function waits until a message is available.
It does not remove the message from the queue. */
DDJVUAPI ddjvu_message_t *
ddjvu_message_wait(ddjvu_context_t *context);
/* ddjvu_message_pop ---
Removes one message from the queue.
This function must be called after processing the message.
Pointers returned by previous calls to <ddjvu_message_peek>
or <ddjvu_message_wait> are no longer valid after
calling <ddjvu_message_pop>. */
DDJVUAPI void
ddjvu_message_pop(ddjvu_context_t *context);
/* ddjvu_message_set_callback ---
Defines a callback function invoked whenever
a new message is posted to the ddjvuapi message queue,
and returns a pointer to the previous callback function.
This callback function can be called at any time
while other code is executing. Do not call ddjvuapi
functions from this callback. It should simply signal
the main application event loop that new ddjvuapi messages
are available. Under WIN32, this is usually achieved
by posting a user window message. Under UNIX, this is
usually achieved using a pipe: the callback writes
a single byte into the pipe; the main application loop
monitors the reading end of the pipe and detects
the presence of data. */
typedef void
(*ddjvu_message_callback_t)(ddjvu_context_t *context, void *closure);
DDJVUAPI void
ddjvu_message_set_callback(ddjvu_context_t *context,
ddjvu_message_callback_t callback,
void *closure);
/* -------------------------------------------------- */
/* DDJVU_JOB_T */
/* -------------------------------------------------- */
/* Many essential ddjvuapi functions initiate asynchronous operations.
These "jobs" run in seperate threads and report their
progress by posting messages into the ddjvu context event queue.
Jobs are sometimes represented by a ddjvu_job_t object. */
/* ddjvu_job_status ---
Returns the status of the specified job. */
typedef enum {
DDJVU_JOB_NOTSTARTED, /* operation was not even started */
DDJVU_JOB_STARTED, /* operation is in progress */
DDJVU_JOB_OK, /* operation terminated successfully */
DDJVU_JOB_FAILED, /* operation failed because of an error */
DDJVU_JOB_STOPPED /* operation was interrupted by user */
} ddjvu_status_t;
DDJVUAPI ddjvu_status_t
ddjvu_job_status(ddjvu_job_t *job);
#define ddjvu_job_done(job) \
(ddjvu_job_status(job) >= DDJVU_JOB_OK)
#define ddjvu_job_error(job) \
(ddjvu_job_status(job) >= DDJVU_JOB_FAILED)
/* ddjvu_job_stop ---
Attempts to cancel the specified job.
This is a best effort function.
There no guarantee that the job will
actually stop.
*/
DDJVUAPI void
ddjvu_job_stop(ddjvu_job_t *job);
/* ddjvu_job_set_user_data ---
ddjvu_job_get_user_data ---
Each job can store an arbitrary pointer
that callers can use for any purpose. These two
functions provide for accessing or setting this pointer.
This pointer is cleared when the job is released */
DDJVUAPI void
ddjvu_job_set_user_data(ddjvu_job_t *job, void *userdata);
DDJVUAPI void *
ddjvu_job_get_user_data(ddjvu_job_t *job);
/* ddjvu_job_release ---
Releases a reference to a job object and clears its user
data field. This does not cause the job to stop executing.
The calling program should no longer reference this object.
The object itself will be destroyed as soon as no
other object or thread needs it.
*/
DDJVUAPI void
ddjvu_job_release(ddjvu_job_t *job);
/* -------------------------------------------------- */
/* DDJVU_MESSAGE_T */
/* -------------------------------------------------- */
/* ddjvu_message_t ---
This union type represents messages delivered by the
DDJVU API. Each member of the union pertains to a
specific kind of message. Member <m_any> represents the
information common to all kinds of messages. Given a
pointer <p> to a <djvu_message_t>, the message kind can
be accessed as <"p->m_any.tag">. */
/* ddjvu_message_tag_t ---
This enumerated type identifies each kind of
message delivered by the DDJVU API. */
typedef enum {
DDJVU_ERROR,
DDJVU_INFO,
DDJVU_NEWSTREAM,
DDJVU_DOCINFO,
DDJVU_PAGEINFO,
DDJVU_RELAYOUT,
DDJVU_REDISPLAY,
DDJVU_CHUNK,
DDJVU_THUMBNAIL,
DDJVU_PROGRESS,
} ddjvu_message_tag_t;
/* ddjvu_message_t::m_any ---
This structure is a member of the union <djvu_message_t>.
It represents the information common to all kinds of
messages. Member <tag> indicates the kind of message.
Members <context>, <document>, <page>, and <job> indicate
the origin of the message. These fields contain null
pointers when they are not relevant.
These fields are also cleared when the corresponding
object is released with <ddjvu_{job,page,document}_release>.
If the message has not yet been passed to the user
with <ddjvu_message_{peek,wait}>, it is silently
removed from the message queue. */
typedef struct ddjvu_message_any_s {
ddjvu_message_tag_t tag;
ddjvu_context_t *context;
ddjvu_document_t *document;
ddjvu_page_t *page;
ddjvu_job_t *job;
} ddjvu_message_any_t;
/* ddjvu_message_t::m_error ---
Error messages are generated whenever the decoder or the
DDJVU API encounters an error condition. All errors are
reported as error messages because they can occur
asynchronously. Member <message> is the error message.
Members <function>, <filename> and <lineno>
indicates the place where the error was detected. */
struct ddjvu_message_error_s { /* ddjvu_message_t::m_error */
ddjvu_message_any_t any;
const char *message;
const char *function;
const char *filename;
int lineno;
};
/* ddjvu_message_t::m_info ---
This messages provides informational text indicating
the progress of the decoding process. This might
be displayed in the browser status bar. */
struct ddjvu_message_info_s { /* ddjvu_message_t::m_info */
ddjvu_message_any_t any;
const char *message;
};
/* -------------------------------------------------- */
/* DDJVU_DOCUMENT_T */
/* -------------------------------------------------- */
/* ddjvu_document_create ---
Creates a decoder for a DjVu document and starts
decoding. This function returns immediately. The
decoding job then generates messages to request the raw
data and to indicate the state of the decoding process.
Argument <url> specifies an optional URL for the document.
The URL follows the usual syntax (<"protocol://machine/path">).
It should not end with a slash. It only serves two purposes:
- The URL is used as a key for the cache of decoded pages.
- The URL is used to document <m_newstream> messages.
Setting argument <cache> to <TRUE> indicates that decoded pages
should be cached when possible. This only works when
argument <url> is not the null pointer.
It is important to understand that the URL is not used to
access the data. The document generates <m_newstream>
messages to indicate which data is needed. The caller must
then provide the raw data using <ddjvu_stream_write>
and <ddjvu_stream_close>.
Localized characters in argument <url> should be in
urlencoded UTF-8 (like "%2A"). What is happening for non
ascii characters is unclear (probably UTF-8). */
DDJVUAPI ddjvu_document_t *
ddjvu_document_create(ddjvu_context_t *context,
const char *url,
int cache);
/* ddjvu_document_create_by_filename ---
Creates a document for a DjVu document stored in a file.
The document will directly access the specified DjVu file
or related files without generating <m_newstream> messages.
The standard function expects the filename in locale encoding.
The utf8 variant expects an utf8 encoded filename. */
DDJVUAPI ddjvu_document_t *
ddjvu_document_create_by_filename(ddjvu_context_t *context,
const char *filename,
int cache);
DDJVUAPI ddjvu_document_t *
ddjvu_document_create_by_filename_utf8(ddjvu_context_t *context,
const char *filename,
int cache);
/* ddjvu_document_job ---
Access the job object in charge of decoding the document header.
In fact <ddjvu_document_t> is a subclass of <ddjvu_job_t>
and this function is a type cast. */
DDJVUAPI ddjvu_job_t *
ddjvu_document_job(ddjvu_document_t *document);
/* ddjvu_document_release ---
Release a reference to a <ddjvu_document_t> object.
The calling program should no longer reference this object.
The object itself will be destroyed as soon as no other object
or thread needs it. */
#define ddjvu_document_release(document) \
ddjvu_job_release(ddjvu_document_job(document))
/* ddjvu_document_set_user_data ---
ddjvu_document_get_user_data ---
Each <ddjvu_document_t> object can store an arbitray pointer
that callers can use for any purpose. These two functions
provide for accessing or setting this pointer. */
#define ddjvu_document_set_user_data(document,userdata) \
ddjvu_job_set_user_data(ddjvu_document_job(document),userdata)
#define ddjvu_document_get_user_data(document) \
ddjvu_job_get_user_data(ddjvu_document_job(document))
/* ddjvu_document_decoding_status ---
ddjvu_document_decoding_done, ddjvu_document_decoding_error ---
This function returns the status of the document header decoding job */
#define ddjvu_document_decoding_status(document) \
ddjvu_job_status(ddjvu_document_job(document))
#define ddjvu_document_decoding_done(document) \
(ddjvu_document_decoding_status(document) >= DDJVU_JOB_OK)
#define ddjvu_document_decoding_error(document) \
(ddjvu_document_decoding_status(document) >= DDJVU_JOB_FAILED)
/* ------- STREAMS ------- */
/* ddjvu_message_t::m_newstream ---
Newstream messages are generated whenever the decoder
needs to access raw DjVu data. The caller must then
provide the requested data using <ddjvu_stream_write>
and <ddjvu_stream_close>.
In the case of indirect documents, a single decoder
might simultaneously request several streams of data.
Each stream is identified by a small integer <streamid>.
The first <m_newstream> message always has member
<streamid> set to zero and member <name> set to the null
pointer. It indicates that the decoder needs to access
the data in the main DjVu file. In fact, data can be
written to stream <0> as soon as the <ddjvu_document_t>
object is created.
Further <m_newstream> messages are generated to access
the auxiliary files of indirect or indexed DjVu
documents. Member <name> then provides the basename of
the auxiliary file.
Member <url> is set according to the url argument
provided to function <ddjvu_document_create>. The first
newstream message always contain the url passed to
<ddjvu_document_create>. Subsequent newstream messages
contain the url of the auxiliary files for indirect or
indexed DjVu documents. */
struct ddjvu_message_newstream_s { /* ddjvu_message_t::m_newstream */
ddjvu_message_any_t any;
int streamid;
const char *name;
const char *url;
};
/* ddjvu_stream_write ---
Provide raw data to the DjVu decoder.
This function should be called as soon as the data is available,
for instance when receiving DjVu data from a network connection.
*/
DDJVUAPI void
ddjvu_stream_write(ddjvu_document_t *document,
int streamid,
const char *data,
unsigned long datalen );
/* ddjvu_stream_close ---
Indicates that no more data will be provided on a
particular stream. Argument <stop> most likely should be
set to <FALSE>. Setting argument <stop> to <TRUE>
indicates that the user has interrupted the data transfer
(for instance by pressing the stop button of a browser)
and that the decoding threads should be stopped as
soon as feasible. */
DDJVUAPI void
ddjvu_stream_close(ddjvu_document_t *document,
int streamid,
int stop );
/* ------- QUERIES ------- */
/* ddjvu_message_t::m_docinfo ---
The <m_docinfo> message indicates that basic information
about the document has been obtained and decoded.
Not much can be done before this happens.
Call <ddjvu_document_decoding_status> to determine
whether the operation was successful. */
struct ddjvu_message_docinfo_s {
ddjvu_message_any_t any;
};
/* ddjvu_document_get_type ---
Returns the type of a DjVu document.
This function might return <DDJVU_DOCTYPE_UNKNOWN>
when called before receiving a <m_docinfo> message. */
typedef enum {
DDJVU_DOCTYPE_UNKNOWN=0,
DDJVU_DOCTYPE_SINGLEPAGE,
DDJVU_DOCTYPE_BUNDLED,
DDJVU_DOCTYPE_INDIRECT,
DDJVU_DOCTYPE_OLD_BUNDLED, /* obsolete */
DDJVU_DOCTYPE_OLD_INDEXED, /* obsolete */
} ddjvu_document_type_t;
DDJVUAPI ddjvu_document_type_t
ddjvu_document_get_type(ddjvu_document_t *document);
/* ddjvu_document_get_pagenum ---
Returns the number of pages in a DjVu document.
This function might return 1 when called
before receiving a <m_docinfo> message */
DDJVUAPI int
ddjvu_document_get_pagenum(ddjvu_document_t *document);
/* ------- ADVANCED ------- */
/* ddjvu_document_get_filenum --
Returns the number of component files.
This function might return 0 when called
before receiving a <m_docinfo> message */
DDJVUAPI int
ddjvu_document_get_filenum(ddjvu_document_t *document);
/* ddjvu_document_get_fileinfo --
Returns information about component file <fileno>.
This function might return <DDJVU_JOB_STARTED> when
called before receiving a <m_docinfo> message.
String pointers in the returned data structure
might be null. Strings are UTF8 encoded and remain
allocated as long as the ddjvu_document_t object exists.
Changes for ddjvuapi=18
- Redefined as a macro passing the structure size.
*/
typedef struct ddjvu_fileinfo_s {
char type; /* [P]age, [T]humbnails, [I]nclude. */
int pageno; /* Negative when not applicable. */
int size; /* Negative when unknown. */
const char *id; /* File identifier. */
const char *name; /* Name for indirect documents. */
const char *title; /* Page title. */
} ddjvu_fileinfo_t;
#define ddjvu_document_get_fileinfo(d,f,i) \
ddjvu_document_get_fileinfo_imp(d,f,i,sizeof(ddjvu_fileinfo_t))
DDJVUAPI ddjvu_status_t
ddjvu_document_get_fileinfo_imp(ddjvu_document_t *document, int fileno,
ddjvu_fileinfo_t *info, unsigned int infosz);
/* ddjvu_document_search_pageno --- DEPRECATED. */
DDJVUAPI int ddjvu_document_search_pageno(ddjvu_document_t*, const char*);
/* ddjvu_document_check_pagedata ---
Returns a non zero result if the data for page <pageno>
is already in memory. When this is the case, functions
<ddjvu_document_get_pageinfo> and <ddjvu_document_get_pagetext>
return the information immediately.
This function causes the emission of <m_pageinfo> messages
with zero in the <m_any.page> field whenever a new file
is completely downloaded. */
DDJVUAPI int
ddjvu_document_check_pagedata(ddjvu_document_t *document, int pageno);
/* ddjvu_document_get_pageinfo ---
Attempts to obtain information about page <pageno>
without decoding the page. If the information is available,
the function returns <DDJVU_JOB_OK> and fills the <info> structure.
Otherwise it starts fetching page data and returns <DDJVU_JOB_STARTED>.
This function causes the emission of <m_pageinfo> messages
with zero in the <m_any.page> field.
Typical synchronous usage:
ddjvu_status_t r;
ddjvu_pageinfo_t info;
while ((r=ddjvu_document_get_pageinfo(doc,pageno,&info))<DDJVU_JOB_OK)
handle_ddjvu_messages(ctx, TRUE);
if (r>=DDJVU_JOB_FAILED)
signal_error();
Changes for ddjvuapi=18
- Redefined as a macro passing the structure size.
- Added fields 'rotation' and 'version'.
*/
typedef struct ddjvu_pageinfo_s {
int width; /* page width (in pixels) */
int height; /* page height (in pixels) */
int dpi; /* page resolution (in dots per inche) */
int rotation; /* initial page orientation */
int version; /* page version */
} ddjvu_pageinfo_t;
#define ddjvu_document_get_pageinfo(d,p,i) \
ddjvu_document_get_pageinfo_imp(d,p,i,sizeof(ddjvu_pageinfo_t))
DDJVUAPI ddjvu_status_t
ddjvu_document_get_pageinfo_imp(ddjvu_document_t *document, int pageno,
ddjvu_pageinfo_t *info, unsigned int infosz );
/* ddjvu_document_get_pagedump --
This function returns a UTF8 encoded text describing the contents
of page <pageno> using the same format as command <djvudump>.
The returned string must be deallocated using <free()>.
It returns <0> when the information is not yet available.
It may then cause then the emission of <m_pageinfo>
messages with null <m_any.page>.
*/
DDJVUAPI char *
ddjvu_document_get_pagedump(ddjvu_document_t *document, int pageno);
/* ddjvu_document_get_filedump --
This function returns a UTF8 encoded text describing the contents
of file <fileno> using the same format as command <djvudump>.
The returned string must be deallocated using <free()>.
It returns <0> when the information is not yet available.
It may then cause then the emission of <m_pageinfo>
messages with null <m_any.page>.
*/
DDJVUAPI char *
ddjvu_document_get_filedump(ddjvu_document_t *document, int fileno);
/* -------------------------------------------------- */
/* DJVU_PAGE_T */
/* -------------------------------------------------- */
/* ddjvu_page_create_by_pageno ---
Each page of a document can be accessed by creating a
<ddjvu_page_t> object with this function. Argument
<pageno> indicates the page number, starting with page
<0> to <pagenum-1>. This function may return NULL
when called before receiving the <m_docinfo> message.
Calling this function also initiates the data transfer
and the decoding threads for the specified page.
Various messages will document the progress of these
operations. Error messages will be generated if
the page does not exists. */
DDJVUAPI ddjvu_page_t *
ddjvu_page_create_by_pageno(ddjvu_document_t *document,
int pageno);
/* ddjvu_page_create_by_pageid ---
This function is similar to <ddjvu_page_create_by_pageno>
but identifies the desired page by name instead of page
number. */
DDJVUAPI ddjvu_page_t *
ddjvu_page_create_by_pageid(ddjvu_document_t *document,
const char *pageid);
/* ddjvu_page_job ---
Access the job object in charge of decoding the document header.
In fact <ddjvu_page_t> is a subclass of <ddjvu_job_t>
and this function is a type cast. */
DDJVUAPI ddjvu_job_t *
ddjvu_page_job(ddjvu_page_t *page);
/* ddjvu_page_release ---
Release a reference to a <ddjvu_page_t> object.
The calling program should no longer reference this object.
The object itself will be destroyed as soon as no other object
or thread needs it. */
#define ddjvu_page_release(page) \
ddjvu_job_release(ddjvu_page_job(page))
/* ddjvu_page_set_user_data ---
ddjvu_page_get_user_data ---
Each <ddjvu_paqge_t> object can store an arbitray pointer
that callers can use for any purpose. These two functions
provide for accessing or setting this pointer. */
#define ddjvu_page_set_user_data(page,userdata) \
ddjvu_job_set_user_data(ddjvu_page_job(page),userdata)
#define ddjvu_page_get_user_data(page) \
ddjvu_job_get_user_data(ddjvu_page_job(page))
/* ddjvu_page_decoding_status ---
ddjvu_page_decoding_done ---
ddjvu_page_decoding_error ---
These calls return the status of the page decoding job. */
#define ddjvu_page_decoding_status(page) \
ddjvu_job_status(ddjvu_page_job(page))
#define ddjvu_page_decoding_done(page) \
(ddjvu_page_decoding_status(page) >= DDJVU_JOB_OK)
#define ddjvu_page_decoding_error(page) \
(ddjvu_page_decoding_status(page) >= DDJVU_JOB_FAILED)
/* ------- MESSAGES ------- */
/* ddjvu_message_t::m_pageinfo ---
The page decoding process generates this message
- when basic page information is available and
before any <m_relayout> or <m_redisplay> message,
- when the page decoding thread terminates.
You can distinguish both cases using
function ddjvu_page_decoding_status().
Messages <m_pageinfo> are also generated as a consequence of
functions such as <ddjvu_document_get_pageinfo>.
The field <m_any.page> of such message is null.
*/
struct ddjvu_message_pageinfo_s { /* ddjvu_message_t::m_pageinfo */
ddjvu_message_any_t any;
};
/* ddjvu_message_t::m_relayout ---
This message is generated when a DjVu viewer
should recompute the layout of the page viewer
because the page size and resolution information has
been updated. */
struct ddjvu_message_relayout_s { /* ddjvu_message_t::m_relayout */
ddjvu_message_any_t any;
};
/* ddjvu_message_t::m_redisplay ---
This message is generated when a DjVu viewer
should call <ddjvu_page_render> and redisplay
the page. This happens, for instance, when newly
decoded DjVu data provides a better image. */
struct ddjvu_message_redisplay_s { /* ddjvu_message_t::m_redisplay */
ddjvu_message_any_t any;
};
/* ddjvu_message_t::m_chunk ---
This message indicates that an additional chunk
of DjVu data has been decoded. Member <chunkid>
indicates the type of the DjVu chunk. */
struct ddjvu_message_chunk_s { /* ddjvu_message_t::m_chunk */
ddjvu_message_any_t any;
const char *chunkid;
};
/* About page messages --
Both the <m_relayout> and <m_redisplay> messages are derived from the
<m_chunk> message. They are intended for driving a djvu image viewer.
When receiving <m_relayout>, the viewer should get the image size, decide
zoom factors, and place the image area, scrollbars, toolbars, and other gui
objects. When receiving <m_redisplay>, the viewer should invalidate the
image area so that the gui toolkit calls the repaint event handler. This
handler should call ddjvu_page_render() and paint the part of the
image that needs repainting. */
/* ------- QUERIES ------- */
/* ddjvu_page_get_width ---
Returns the page width in pixels. Calling this function
before receiving a <m_pageinfo> message always yields <0>. */
DDJVUAPI int
ddjvu_page_get_width(ddjvu_page_t *page);
/* ddjvu_page_get_height---
Returns the page height in pixels. Calling this function
before receiving a <m_pageinfo> message always yields <0>. */
DDJVUAPI int
ddjvu_page_get_height(ddjvu_page_t *page);
/* ddjvu_page_get_resolution ---
Returns the page resolution in pixels per inch (dpi).
Calling this function before receiving a <m_pageinfo>
message yields a meaningless but plausible value. */
DDJVUAPI int
ddjvu_page_get_resolution(ddjvu_page_t *page);
/* ddjvu_page_get_gamma ---
Returns the gamma of the display for which this page was designed.
Calling this function before receiving a <m_pageinfo>
message yields a meaningless but plausible value. */
DDJVUAPI double
ddjvu_page_get_gamma(ddjvu_page_t *page);
/* ddjvu_page_get_version ---
Returns the version of the djvu file format.
Calling this function before receiving a <m_pageinfo>
message yields a meaningless but plausible value. */
DDJVUAPI int
ddjvu_page_get_version(ddjvu_page_t *page);
/* ddjvu_code_get_version ---
Returns the version of the djvu file format
implemented by this library. More or less graceful
degradation might arise if this is smaller than
the number returned by <ddjvu_page_get_version>. */
DDJVUAPI int
ddjvu_code_get_version(void);
/* ddjvu_page_get_type ---
Returns the type of the page data.
Calling this function before the termination of the
decoding process might returns <DDJVU_PAGETYPE_UNKNOWN>. */
typedef enum {
DDJVU_PAGETYPE_UNKNOWN,
DDJVU_PAGETYPE_BITONAL,
DDJVU_PAGETYPE_PHOTO,
DDJVU_PAGETYPE_COMPOUND,
} ddjvu_page_type_t;
DDJVUAPI ddjvu_page_type_t
ddjvu_page_get_type(ddjvu_page_t *page);
/* ddjvu_page_get_{short,long}_description --- DEPRECATED */
DDJVUAPI char *ddjvu_page_get_short_description(ddjvu_page_t *);
DDJVUAPI char *ddjvu_page_get_long_description(ddjvu_page_t *);
/* ddjvu_page_set_rotation ---
Changes the counter-clockwise rotation angle for a DjVu page.
Calling this function before receiving a <m_pageinfo>
message has no good effect. */
typedef enum {
DDJVU_ROTATE_0 = 0,
DDJVU_ROTATE_90 = 1,
DDJVU_ROTATE_180 = 2,
DDJVU_ROTATE_270 = 3,
} ddjvu_page_rotation_t;
DDJVUAPI void
ddjvu_page_set_rotation(ddjvu_page_t *page,
ddjvu_page_rotation_t rot);
/* ddjvu_page_get_rotation ---
Returns the counter-clockwise rotation angle for the DjVu page.
The rotation is automatically taken into account
by <ddjvu_page_render>, <ddjvu_page_get_width>
and <ddjvu_page_get_height>. */
DDJVUAPI ddjvu_page_rotation_t
ddjvu_page_get_rotation(ddjvu_page_t *page);
/* ddjvu_page_get_initial_rotation ---
Returns the page rotation specified by the
orientation flags in the DjVu file.
[brain damage warning] This is useful because
maparea coordinates in the annotation chunks
are expressed relative to the rotated coordinates
whereas text coordinates in the hidden text data
are expressed relative to the unrotated coordinates. */
DDJVUAPI ddjvu_page_rotation_t
ddjvu_page_get_initial_rotation(ddjvu_page_t *page);
/* ------- RENDER ------- */
/* ddjvu_render_mode_t ---
Various ways to render a page. */
typedef enum {
DDJVU_RENDER_COLOR = 0, /* color page or stencil */
DDJVU_RENDER_BLACK, /* stencil or color page */
DDJVU_RENDER_COLORONLY, /* color page or fail */
DDJVU_RENDER_MASKONLY, /* stencil or fail */
DDJVU_RENDER_BACKGROUND, /* color background layer */
DDJVU_RENDER_FOREGROUND, /* color foreground layer */
} ddjvu_render_mode_t;
/* ddjvu_rect_t ---
This structure specifies the location of a rectangle.
Coordinates are usually expressed in pixels relative to
the BOTTOM LEFT CORNER (but see ddjvu_format_set_y_direction).
Members <x> and <y> indicate the position of the bottom left
corner of the rectangle Members <w> and <h> indicate the
width and height of the rectangle. */
struct ddjvu_rect_s {
int x, y;
unsigned int w, h;
};
/* ddjvu_page_render --
Renders a segment of a page with arbitrary scale.
Argument <mode> indicates what image layers
should be rendered.
Conceptually this function renders the full page
into a rectangle <pagerect> and copies the
pixels specified by rectangle <renderrect>
into the buffer starting at position <imagebuffer>.
The actual code is much more efficient than that.
The final image is written into buffer <imagebuffer>.
Argument <pixelformat> specifies the expected pixel format.
Argument <rowsize> specifies the number of BYTES from
one row to the next in the buffer. The buffer must be
large enough to accomodate the desired image.
This function makes a best effort to compute an image
that reflects the most recently decoded data. It might
return <FALSE> to indicate that no image could be
computed at this point, and that nothing was written into
the buffer. */
DDJVUAPI int
ddjvu_page_render(ddjvu_page_t *page,
const ddjvu_render_mode_t mode,
const ddjvu_rect_t *pagerect,
const ddjvu_rect_t *renderrect,
const ddjvu_format_t *pixelformat,
unsigned long rowsize,
char *imagebuffer );
/* -------------------------------------------------- */
/* COORDINATE TRANSFORMS */
/* -------------------------------------------------- */
/* ddjvu_rectmapper_create --
Creates a <ddjvu_rectmapper_t> data structure
representing an affine coordinate transformation that
maps points from rectangle <input> to rectangle <output>.
The transformation maintains the positions relative
to the coordinates of the rectangle corners. */
DDJVUAPI ddjvu_rectmapper_t *
ddjvu_rectmapper_create(ddjvu_rect_t *input, ddjvu_rect_t *output);
/* ddjvu_rectmapper_modify ---
Modifies the coordinate transform <mapper> by redefining
which corners of the output rectangle match those of the
input rectangle. This function first applies a counter-clockwise
rotation of <rotation> quarter-turns, and then reverses the X
(resp. Y) coordinates when <mirrorx> (resp. <mirrory>) is non zero. */
DDJVUAPI void
ddjvu_rectmapper_modify(ddjvu_rectmapper_t *mapper,
int rotation, int mirrorx, int mirrory);
/* ddjvu_rectmapper_release ---
Destroys the <ddjvu_rect_mapper_t> structure
returned by <ddjvu_rect_mapper_create>. */
DDJVUAPI void
ddjvu_rectmapper_release(ddjvu_rectmapper_t *mapper);
/* ddjvu_map_point, ddjvu_map_rect ---
Applies the coordinate transform
to a point or a rectangle */
DDJVUAPI void
ddjvu_map_point(ddjvu_rectmapper_t *mapper, int *x, int *y);
DDJVUAPI void
ddjvu_map_rect(ddjvu_rectmapper_t *mapper, ddjvu_rect_t *rect);
/* ddjvu_unmap_point, ddjvu_unmap_rect ---
Applies the inverse coordinate transform
to a point or a rectangle */
DDJVUAPI void
ddjvu_unmap_point(ddjvu_rectmapper_t *mapper, int *x, int *y);
DDJVUAPI void
ddjvu_unmap_rect(ddjvu_rectmapper_t *mapper, ddjvu_rect_t *rect);
/* -------------------------------------------------- */
/* DJVU_FORMAT_T */
/* -------------------------------------------------- */
/* ddjvu_format_style_t ---
Enumerated type for pixel formats. */
typedef enum {
DDJVU_FORMAT_BGR24, /* truecolor 24 bits in BGR order */
DDJVU_FORMAT_RGB24, /* truecolor 24 bits in RGB order */
DDJVU_FORMAT_RGBMASK16, /* truecolor 16 bits with masks */
DDJVU_FORMAT_RGBMASK32, /* truecolor 32 bits with masks */
DDJVU_FORMAT_GREY8, /* greylevel 8 bits */
DDJVU_FORMAT_PALETTE8, /* paletized 8 bits (6x6x6 color cube) */
DDJVU_FORMAT_MSBTOLSB, /* packed bits, msb on the left */
DDJVU_FORMAT_LSBTOMSB, /* packed bits, lsb on the left */
} ddjvu_format_style_t;
/* ddjvu_format_create ---
Creates a <ddjvu_format_t> object describing a pixel format.
Argument <style> describes the generic pixel format.
Argument <args> is an array of <nargs> unsigned ints
providing additionnal information:
- When style is <RGBMASK*>, argument <nargs> must be <3> or <4>.
The three first entries of array <args> are three contiguous
bit masks for the red, green, and blue components of each pixel.
The resulting color is then xored with the optional fourth entry.
- When style is <PALETTE*>, argument <nargs> must be <216>
and array <args> contains the 6*6*6 entries of a web
color cube.
- Otherwise <nargs> must be <0>. */
DDJVUAPI ddjvu_format_t *
ddjvu_format_create(ddjvu_format_style_t style,
int nargs, unsigned int *args);
/* ddjvu_format_set_row_order ---
Sets a flag indicating whether the rows in the pixel buffer
are stored starting from the top or the bottom of the image.
Default ordering starts from the bottom of the image.
This is the opposite of the X11 convention. */
DDJVUAPI void
ddjvu_format_set_row_order(ddjvu_format_t *format, int top_to_bottom);
/* ddjvu_format_set_y_direction ---
Sets a flag indicating whether the y coordinates in the drawing
area are oriented from bottom to top, or from top to botttom.
The default is bottom to top, similar to PostScript.
This is the opposite of the X11 convention. */
DDJVUAPI void
ddjvu_format_set_y_direction(ddjvu_format_t *format, int top_to_bottom);
/* ddjvu_format_set_ditherbits ---
Specifies the final depth of the image on the screen.
This is used to decide which dithering algorithm should be used.
The default is usually appropriate. */
DDJVUAPI void
ddjvu_format_set_ditherbits(ddjvu_format_t *format, int bits);
/* ddjvu_format_set_gamma ---
Sets the gamma of the display for which the pixels are
intended. This will be combined with the gamma stored in
DjVu documents in order to compute a suitable color
correction. The default value is 2.2. */
DDJVUAPI void
ddjvu_format_set_gamma(ddjvu_format_t *format, double gamma);
/* ddjvu_format_set_white ---
Sets the whitepoint of the display for which the pixels are
intended. This will be combined with the gamma stored in
DjVu documents in order to compute a suitable color
correction. The default value is 0xff,0xff,0xff. */
DDJVUAPI void
ddjvu_format_set_white(ddjvu_format_t *format,
unsigned char b, unsigned char g, unsigned char r);
/* ddjvu_format_release ---
Release a reference to a <ddjvu_format_t> object.
The calling program should no longer reference this object. */
DDJVUAPI void
ddjvu_format_release(ddjvu_format_t *format);
/* -------------------------------------------------- */
/* THUMBNAILS */
/* -------------------------------------------------- */
/* ddjvu_thumbnail_status ---
Determine whether a thumbnail is available for page <pagenum>.
Calling this function with non zero argument <start> initiates
a thumbnail calculation job. Regardless of its success,
the completion of the job is signalled by a subsequent
<m_thumbnail> message. */
DDJVUAPI ddjvu_status_t
ddjvu_thumbnail_status(ddjvu_document_t *document, int pagenum, int start);
/* ddjvu_message_t::m_thumbnail ---
This message is sent when additional thumbnails are available. */
struct ddjvu_message_thumbnail_s { /* ddjvu_message_t::m_thumbnail */
ddjvu_message_any_t any;
int pagenum;
};
/* ddjvu_thumbnail_render ---
Renders a thumbnail for page <pagenum>.
Argument <imagebuffer> must be large enough to contain
an image of size <*wptr> by <*hptr> using pixel format
<pixelformat>. Argument <rowsize> specifies the number
of BYTES from one row to the next in the buffer.
This function returns <FALSE> when no thumbnail is available.
Otherwise it returns <TRUE>, adjusts <*wptr> and <*hptr> to
reflect the thumbnail size, and, if the pointer <imagebuffer>
is non zero, writes the pixel data into the image buffer. */
DDJVUAPI int
ddjvu_thumbnail_render(ddjvu_document_t *document, int pagenum,
int *wptr, int *hptr,
const ddjvu_format_t *pixelformat,
unsigned long rowsize,
char *imagebuffer);
/* -------------------------------------------------- */
/* SAVE AND PRINT JOBS */
/* -------------------------------------------------- */
/* ddjvu_message_t::m_progress ---
These messages are generated to indicate progress
towards the completion of a print or save job. */
struct ddjvu_message_progress_s {
ddjvu_message_any_t any;
ddjvu_status_t status;
int percent;
};
/* ddjvu_document_print ---
Converts specified pages of a djvu document into postscript.
This function works asynchronously in a separate thread.
You can use the following idiom for synchronous operation:
ddjvu_job_t *job = ddjvu_document_print(....);
while (! ddjvu_job_done(job) )
handle_ddjvu_messages(context, TRUE);
The postscript data is written to stdio file <output>.
Arguments <optc> and <optv> specify printing options.
All options described on the <djvups> man page are
recognized, except <"-help"> and <"-verbose">.
*/
DDJVUAPI ddjvu_job_t *
ddjvu_document_print(ddjvu_document_t *document, FILE *output,
int optc, const char * const * optv);
/* ddjvu_document_save ---
Saves the djvu document as a bundled djvu file.
This function works asynchronously in a separate thread.
You can use the following idiom for synchronous operation:
ddjvu_job_t *job = ddjvu_document_save(....);
while (! ddjvu_job_done(job) )
handle_ddjvu_messages(context, TRUE);
The bundled djvu data is written to file <output>
which must be seekable. Arguments <optc> and <optv>
can be used to pass the following options:
* Option "-pages=<pagespec>" specify a subset of pages
using the same syntax as program <ddjvu>.
Reordering or duplicating pages is prohibited.
* Option "-indirect=<filename>" causes the creation
of an indirect document with index file <filename>
and auxiliary files in the same directory.
The file name is UTF-8 encoded.
When this option is specified, the argument <output>
is ignored and should be NULL.
*/
DDJVUAPI ddjvu_job_t *
ddjvu_document_save(ddjvu_document_t *document, FILE *output,
int optc, const char * const * optv);
/* -------------------------------------------------- */
/* S-EXPRESSIONS */
/* -------------------------------------------------- */
/* DjVu files can contain ancillary information such as
document outline, hidden text, hyperlinks, and metadata.
Program <djvused> provides for manipulating such
information. Like <djvused>, the DDJVU API represents
this information using a lisp s-expressions. See file
<"libdjvu/miniexp.h"> for the s-expression documentation
and manipulation functions. See the <djvused> man page
for the specification of the s-expressions representing
outlines, hidden text and annotations. It often help
to print s-expressions using function <miniexp_pprint>.
WARNING: All strings in s-expression are UTF-8 encoded.
Strings returned by miniexp_to_str might have to be
converted to the locale encoding. */
/* miniexp_t --
Opaque type representing s-expressions.
The same definition also appears in
file <"libdjvu/miniexp.h">. */
#ifndef MINIEXP_H
typedef struct miniexp_s* miniexp_t;
#endif
/* ddjvu_miniexp_release --
This function controls the allocation of the
s-expressions returned by functions from the DDJVU
API. It indicates that the s-expression <expr> is no
longer needed and can be deallocated as soon as
necessary. Otherwise the s-expression remains allocated
as long as the document object exists. */
DDJVUAPI void
ddjvu_miniexp_release(ddjvu_document_t *document, miniexp_t expr);
/* ddjvu_document_get_outline --
This function tries to obtain the document outline.
If this information is available, it returns a
s-expression with the same syntax as function
<print-outline> of program <djvused>.
Otherwise it returns <miniexp_dummy> until
the document header gets fully decoded.
Typical synchronous usage:
miniexp_t r;
while ((r=ddjvu_document_get_outline(doc))==miniexp_dummy)
handle_ddjvu_messages(ctx, TRUE);
This function returns the empty list <miniexp_nil> when
the document contains no outline information. It can also
return symbols <failed> or <stopped> when an error occurs
while accessing the desired information. */
DDJVUAPI miniexp_t
ddjvu_document_get_outline(ddjvu_document_t *document);
/* ddjvu_document_get_anno --
This function returns the document-wide annotations.
This corresponds to a proposed change in the djvu format.
When no new-style document-wide annotations are available
and <compat> is true, this function searches a shared
annotation chunk and returns its contents.
This function returns <miniexp_dummy> if the information
is not yet available. It may then cause the emission
of <m_pageinfo> messages with null <m_any.page>.
This function returns the empty list <miniexp_nil> when
the document does not contain page annotations. It can also
return symbols <failed> or <stopped> when an error occurs
while accessing the desired information. */
DDJVUAPI miniexp_t
ddjvu_document_get_anno(ddjvu_document_t *document, int compat);
/* ddjvu_document_get_pagetext --
This function tries to obtain the text information for
page <pageno>. If this information is available, it
returns a s-expression with the same syntax as function
<print-txt> of program <djvused>. Otherwise it starts
fetching the page data and returns <miniexp_dummy>.
This function causes the emission of <m_pageinfo> messages
with zero in the <m_any.page> field.
Typical synchronous usage:
miniexp_t r;
while ((r=ddjvu_document_get_pagetext(doc,pageno,0))==miniexp_dummy)
handle_ddjvu_messages(ctx, TRUE);
This function returns the empty list <miniexp_nil> when
the page contains no text information. It can also return
symbols <failed> or <stopped> when an error occurs while
accessing the desired information.
Argument <maxdetail> controls the level of detail in the
returned s-expression. Values "page", "column", "region", "para",
"line", and "word" restrict the output to the specified granularity.
All other values produce a s-expression that represents
the hidden text data as finely as possible. */
DDJVUAPI miniexp_t
ddjvu_document_get_pagetext(ddjvu_document_t *document, int pageno,
const char *maxdetail);
/* ddjvu_document_get_pageanno --
This function tries to obtain the annotations for
page <pageno>. If this information is available, it
returns a s-expression with the same syntax as function
<print-ant> of program <djvused>. Otherwise it starts
fetching the page data and returns <miniexp_dummy>.
This function causes the emission of <m_pageinfo> messages
with zero in the <m_any.page> field.
Typical synchronous usage:
miniexp_t r;
while ((r = ddjvu_document_get_pageanno(doc,pageno))==miniexp_dummy)
handle_ddjvu_messages(ctx, TRUE);
This function returns the empty list <miniexp_nil> when
the page contains no annotations. It can also return
symbols <failed> or <stopped> when an error occurs while
accessing the desired information. */
DDJVUAPI miniexp_t
ddjvu_document_get_pageanno(ddjvu_document_t *document, int pageno);
/* --- Helper functions to parse annotations --- */
/* ddjvu_anno_get_bgcolor --
Parse the annotations and extracts the desired
background color as a color string ("#FFFFFF").
See <(background ...)> in the djvused man page.
Returns zero if this information is not specified. */
DDJVUAPI const char *
ddjvu_anno_get_bgcolor(miniexp_t annotations);
/* ddjvu_anno_get_zoom --
Parse the annotations and extracts the desired zoom factor.
See <(zoom ...)> in the djvused man page.
Returns zero if this information is not specified. */
DDJVUAPI const char *
ddjvu_anno_get_zoom(miniexp_t annotations);
/* ddjvu_anno_get_mode --
Parse the annotations and extracts the desired display mode.
See <(mode ...)> in the djvused man page.
Returns zero if this information is not specified. */
DDJVUAPI const char *
ddjvu_anno_get_mode(miniexp_t annotations);
/* ddjvu_anno_get_horizalign --
Parse the annotations and extracts how the page
image should be aligned horizontally.
See <(align ...)> in the djvused man page.
Returns zero if this information is not specified. */
DDJVUAPI const char *
ddjvu_anno_get_horizalign(miniexp_t annotations);
/* ddjvu_anno_get_vertalign --
Parse the annotations and extracts how the page
image should be aligned vertically.
See <(align ...)> in the djvused man page.
Returns zero if this information is not specified. */
DDJVUAPI const char *
ddjvu_anno_get_vertalign(miniexp_t annotations);
/* ddjvu_anno_get_hyperlinks --
Parse the annotations and returns a zero terminated
array of <(maparea ...)> s-expressions.
The caller should free this array with function <free>.
These s-expressions remain allocated as long
as the annotations remain allocated.
See also <(maparea ...)> in the djvused man page. */
DDJVUAPI miniexp_t *
ddjvu_anno_get_hyperlinks(miniexp_t annotations);
/* ddjvu_anno_get_metadata_keys --
Parse the annotations and returns a zero terminated
array of key symbols for the page metadata.
The caller should free this array with function <free>.
See also <(metadata ...)> in the djvused man page. */
DDJVUAPI miniexp_t *
ddjvu_anno_get_metadata_keys(miniexp_t annotations);
/* ddjvu_anno_get_metadata --
Parse the annotations and returns the metadata string
corresponding to the metadata key symbol <key>.
The string remains allocated as long as the
annotations s-expression remain allocated.
Returns zero if no such key is present. */
DDJVUAPI const char *
ddjvu_anno_get_metadata(miniexp_t annotations, miniexp_t key);
/* ddjvu_anno_get_xmp --
Parse the annotations and returns the xmp metadata string.
The string remains allocated as long as the
annotations s-expression remain allocated.
Returns zero if no such key is present. */
DDJVUAPI const char *
ddjvu_anno_get_xmp(miniexp_t annotations);
/* -------------------------------------------------- */
/* DJVU_MESSAGE_T */
/* -------------------------------------------------- */
/* We can now define the djvu_message_t union */
union ddjvu_message_s {
struct ddjvu_message_any_s m_any;
struct ddjvu_message_error_s m_error;
struct ddjvu_message_info_s m_info;
struct ddjvu_message_newstream_s m_newstream;
struct ddjvu_message_docinfo_s m_docinfo;
struct ddjvu_message_pageinfo_s m_pageinfo;
struct ddjvu_message_chunk_s m_chunk;
struct ddjvu_message_relayout_s m_relayout;
struct ddjvu_message_redisplay_s m_redisplay;
struct ddjvu_message_thumbnail_s m_thumbnail;
struct ddjvu_message_progress_s m_progress;
};
/* -------------------------------------------------- */
/* BACKDOORS */
/* -------------------------------------------------- */
#ifdef __cplusplus
} // extern "C"
#endif
/* ddjvu_get_DjVuImage ---
ddjvu_get_DjVuDocument ---
These functions provide an access to the libdjvu objects
associated with the ddjvuapi objects. These backdoors can
be useful for advanced manipulations. These two functions
are declared in C++ when file <"ddjvuapi.h"> is included
after the libdjvu header files <"DjVuImage.h"> and
<"DjVuDocument.h">. */
#ifdef __cplusplus
# ifndef NOT_USING_DJVU_NAMESPACE
# ifdef _DJVUIMAGE_H
DDJVUAPI GP<DjVuImage>
ddjvu_get_DjVuImage(ddjvu_page_t *page);
# endif
# ifdef _DJVUDOCUMENT_H
DDJVUAPI GP<DjVuDocument>
ddjvu_get_DjVuDocument(ddjvu_document_t *document);
# endif
# endif
#endif
#endif /* DDJVUAPI_H */
|