1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<title>The Ghostscript Interpreter Application Programming Interface (API)</title> 5<!-- $Id: API.htm,v 1.53 2005/10/20 19:46:22 ray Exp $ --> 6<!-- Supercedes the API in DLL.htm --> 7<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style"> 8</head> 9 10<body> 11<!-- [1.0 begin visible header] ============================================ --> 12 13<!-- [1.1 begin headline] ================================================== --> 14 15<h1>The Ghostscript Interpreter Application Programming Interface (API)</h1> 16 17<!-- [1.1 end headline] ==================================================== --> 18 19<!-- [1.2 begin table of contents] ========================================= --> 20 21<h2>Table of contents</h2> 22 23<ul> 24<li><a href="#API">What is the Ghostscript Interpreter API?</a> 25<li><a href="#Exported_functions ">Exported functions</a> 26<ul> 27<li><a href="#revision"><b><tt>gsapi_revision</tt></b></a> 28<li><a href="#new_instance"><b><tt>gsapi_new_instance</tt></b></a> 29<li><a href="#delete_instance"><b><tt>gsapi_delete_instance</tt></b></a> 30<li><a href="#set_stdio"><b><tt>gsapi_set_stdio</tt></b></a> 31<li><a href="#set_poll"><b><tt>gsapi_set_poll</tt></b></a> 32<li><a href="#set_display_callback"><b><tt>gsapi_set_display_callback</tt></b></a> 33<li><a href="#run"><b><tt>gsapi_run_string_begin</tt></b></a> 34<li><a href="#run"><b><tt>gsapi_run_string_continue</tt></b></a> 35<li><a href="#run"><b><tt>gsapi_run_string_end</tt></b></a> 36<li><a href="#run"><b><tt>gsapi_run_string_with_length</tt></b></a> 37<li><a href="#run"><b><tt>gsapi_run_string</tt></b></a> 38<li><a href="#init"><b><tt>gsapi_init_with_args</tt></b></a> 39<li><a href="#run"><b><tt>gsapi_run_*</tt></b></a> 40<li><a href="#exit"><b><tt>gsapi_exit</tt></b></a> 41<li><a href="#set_visual_tracer"><b><tt>gsapi_set_visual_tracer</tt></b></a> 42<li><a href="#return_codes">Return codes</a> 43</ul> 44<li><a href="#Example_usage">Example usage</a> 45<li><a href="#stdio">Standard input and output</a> 46<li><a href="#display">Display device</a> 47</ul> 48 49<!-- [1.2 end table of contents] =========================================== --> 50 51<!-- [1.3 begin hint] ====================================================== --> 52 53<p>For other information, see the <a href="Readme.htm">Ghostscript 54overview</a>. 55 56<p> 57<b>WARNING:</b> The API described in this document is subject to changes in 58future releases, possibly ones that are not backward compatible with what 59is described here. 60 61<!-- [1.3 end hint] ======================================================== --> 62 63<hr> 64 65<!-- [1.0 end visible header] ============================================== --> 66 67<!-- [2.0 begin contents] ================================================== --> 68 69 70<h2><a name="API"></a>What is the Ghostscript Interpreter API?</h2> 71 72<p> 73The Ghostscript interpreter can be built as a dynamic link library 74(DLL) on the Windows or OS/2 platforms, as a shared object on the 75Linux platform and as a framework on MacOS X. 76With some changes, it could be built as a static library. 77This document describes the Application Programming Interface (API) 78for the Ghostscript interpreter library. 79This should not be confused with the 80<a href="Lib.htm">Ghostscript library</a> which provides a graphics 81library but not the interpreter. 82<p> 83This supercedes the old <a href="DLL.htm">DLL</a> interface. 84<p> 85To provide the interface described in the 86<a href="Use.htm">usage documentation</a>, a smaller independent 87executable loads the DLL/shared object. 88This executable must provide all the interaction with the windowing system, 89including image windows and, if necessary, a text window. 90 91<p> 92The Ghostscript interpreter library's name and characteristics differ 93for each platform: 94 95<ul> 96<li>The Win32 DLL <b><tt>gsdll32.dll</tt></b> has 97MULTIPLE NONSHARED data segments. Under Win32s it can be used by only one 98program at a time, but under Windows 95/98 or Windows NT it can be called by 99multiple programs simultaneously. 100 101<li>The OS/2 DLL <b><tt>gsdll2.dll</tt></b> has 102MULTIPLE NONSHARED data segments and can be called by multiple programs 103simultaneously. 104 105<li>The Linux shared object <b><tt>libgs.so</tt></b> 106can be used by multiple programs simultaneously. 107 108<li>The MacOS X <b><tt>Ghostscript.framework</tt></b> can also be used 109by multiple applications at once. 110</ul> 111 112<p> 113The source for the executable is in <b><tt>dw</tt></b>*.* (Windows), 114<b><tt>dp</tt></b>*.* (OS/2) and <b><tt>dx</tt></b>*.* (Linux). 115See these source files for examples of how to use the DLL. A similar 116example for MacOS using the Carbon API is provided in <b><tt>dm</tt></b>*.*. 117 118<p> 119The source file <tt>dxmainc.c</tt> can also serve as an example of how to use the 120framework shared component on MacOS X, providing the same command-line tool it does 121on any linux, bsd or similar operating system. Just change the header includes to 122use the Ghostscript namespace: 123<blockquote><pre><tt>#include <Ghostscript/ierrors.h> 124#include <Ghostscript/iapi.h></tt></pre></blockquote> 125and link with: 126<blockquote><pre><tt>cc -o gsc dxmainc.c -framework Ghostscript</tt></pre></blockquote> 127To get a useable executable. <tt>Ghostscript.framework</tt> must be properly 128installed in the search path for this to work. 129 130<p> 131At this stage, Ghostscript does not support multiple instances 132of the interpreter within a single process. 133 134<hr> 135 136<h2><a name="Exported_functions"></a>Exported functions</h2> 137 138<p> 139The functions exported by the DLL/shared object are described 140in the header file <a href="../src/iapi.h"><b><tt>iapi.h</tt></b></a> 141and are summarised below. Omitted from the summary are 142the calling convention (e.g. __stdcall), details of return 143values and error handling. 144 145 146<ul> 147<li><b><tt> 148int 149<a href="#revision">gsapi_revision</a> 150 (gsapi_revision_t *pr, int len); 151</tt></b> 152 153<li><b><tt> 154int 155<a href="#new_instance">gsapi_new_instance</a> 156(void **pinstance, void *caller_handle); 157</tt></b> 158 159<li><b><tt> 160void 161<a href="#delete_instance">gsapi_delete_instance</a> 162(void *instance); 163</tt></b> 164 165<li><b><tt> 166int 167<a href="#set_stdio">gsapi_set_stdio</a> 168(void *instance, 169 int(*stdin_fn)(void *caller_handle, char *buf, int len), 170 int(*stdout_fn)(void *caller_handle, const char *str, int len), 171 int(*stderr_fn)(void *caller_handle, const char *str, int len)); 172</tt></b> 173 174<li><b><tt> 175int 176<a href="#set_poll">gsapi_set_poll</a> 177(void *instance, int(*poll_fn)(void *caller_handle)); 178</tt></b> 179 180<li><b><tt> 181int 182<a href="#set_display_callback">gsapi_set_display_callback</a> 183(void *instance, display_callback *callback); 184</tt></b> 185 186<li><b><tt> 187int 188<a href="#init">gsapi_init_with_args</a> 189(void *instance, int argc, char **argv); 190</tt></b> 191 192<li><b><tt> 193int 194<a href="#run">gsapi_run_string_begin</a> 195(void *instance, int user_errors, int *pexit_code); 196</tt></b> 197 198<li><b><tt> 199int 200<a href="#run">gsapi_run_string_continue</a> 201(void *instance, 202 const char *str, unsigned int length, int user_errors, int *pexit_code); 203</tt></b> 204 205<li><b><tt> 206int 207<a href="#run">gsapi_run_string_end</a> 208(void *instance, int user_errors, int *pexit_code); 209</tt></b> 210 211<li><b><tt> 212int 213<a href="#run">gsapi_run_string_with_length</a> 214(void *instance, 215 const char *str, unsigned int length, int user_errors, int *pexit_code); 216</tt></b> 217 218<li><b><tt> 219int 220<a href="#run">gsapi_run_string</a> 221(void *instance, 222 const char *str, int user_errors, int *pexit_code); 223</tt></b> 224 225<li><b><tt> 226int 227<a href="#run">gsapi_run_file</a> 228(void *instance, 229 const char *file_name, int user_errors, int *pexit_code); 230</tt></b> 231 232<li><b><tt> 233int 234<a href="#exit">gsapi_exit</a> 235(void *instance); 236</tt></b> 237 238<li><b><tt> 239int 240<a href="#set_visual_tracer">gsapi_set_visual_tracer</a> 241(gstruct vd_trace_interface_s *I); 242</tt></b> 243 244</ul> 245 246<h3><a name="revision"></a><b><tt>gsapi_revision()</tt></b></h3> 247 248<blockquote> 249This function returns the revision numbers and strings of the Ghostscript 250interpreter library; you should call it before any other interpreter 251library functions to make sure that the correct version of the 252Ghostscript interpreter has been loaded. 253 254<blockquote> 255<pre> 256typedef struct gsapi_revision_s { 257 const char *product; 258 const char *copyright; 259 long revision; 260 long revisiondate; 261} gsapi_revision_t; 262gsapi_revision_t r; 263 264if (gsapi_revision(&r, sizeof(r)) == 0) { 265 if (r.revision < 650) 266 printf("Need at least Ghostscript 6.50"); 267} 268else { 269 printf("revision structure size is incorrect"); 270} 271</pre></blockquote> 272</blockquote> 273 274 275<h3><a name="new_instance"></a><b><tt>gsapi_new_instance()</tt></b></h3> 276<blockquote> 277Create a new instance of Ghostscript. 278This instance is passed to most other gsapi functions. 279The caller_handle will be provided to callback functions. 280<b>At this stage, Ghostscript supports only one instance</b>. 281</blockquote> 282 283 284<h3><a name="delete_instance"></a><b><tt>gsapi_delete_instance()</tt></b></h3> 285<blockquote> 286Destroy an instance of Ghostscript. 287Before you call this, Ghostscript must have finished. 288If Ghostscript has been initialised, you must call 289<b><tt>gsapi_exit</tt></b> before <b><tt>gsapi_delete_instance</tt></b>. 290</blockquote> 291 292 293<h3><a name="set_stdio"></a><b><tt>gsapi_set_stdio()</tt></b></h3> 294<blockquote> 295Set the callback functions for stdio 296The stdin callback function should return the number of 297characters read, 0 for EOF, or -1 for error. 298The stdout and stderr callback functions should return 299the number of characters written. 300</blockquote> 301 302 303<h3><a name="set_poll"></a><b><tt>gsapi_set_poll()</tt></b></h3> 304<blockquote> 305Set the callback function for polling. 306This is used for handling window events or cooperative 307multitasking. This function will only be called if 308the Ghostscript interpreter was compiled with <b><tt>CHECK_INTERRUPTS</tt></b> 309as described in <b><tt><a href="../src/gpcheck.h">gpcheck.h</a></tt></b>. 310The polling function should return zero if all is well, 311and return negative if it wants ghostscript to abort. 312The polling function must be fast. 313</blockquote> 314 315<h3><a name="set_display_callback"></a><b><tt>gsapi_set_display_callback()</tt></b></h3> 316<blockquote> 317Set the callback structure for the <a href="#display">display</a> 318device. If the <a href="#display">display</a> device is used, 319this must be called after 320<b><tt>gsapi_new_instance()</tt></b> 321and before <b><tt>gsapi_init_with_args()</tt></b>. 322See <b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b> 323for more details. 324</blockquote> 325 326<h3><a name="init"></a><b><tt>gsapi_init_with_args()</tt></b></h3> 327<blockquote> 328Initialise the interpreter. 329This calls <b><tt>gs_main_init_with_args()</tt></b> in 330<b><tt><a href="../src/imainarg.c">imainarg.c</a></tt></b>. 331See below for <a href="#return_codes">return codes</a>. 332The arguments are the same as the "C" main function: 333argv[0] is ignored and the user supplied arguments 334are argv[1] to argv[argc-1]. 335</blockquote> 336 337<h3><a name="run"></a><b><tt>gsapi_run_*()</tt></b></h3> 338<blockquote> 339The <b><tt>gsapi_run_*</tt></b> functions are like 340<b><tt>gs_main_run_*</tt></b> except that the error_object is omitted. 341If these functions return <= -100, either quit or a fatal 342error has occured. You must call <b><tt>gsapi_exit()</tt></b> next. 343The only exception is <b><tt>gsapi_run_string_continue()</tt></b> 344which will return <b><tt>e_NeedInput</tt></b> if all is well. 345See below for <a href="#return_codes">return codes</a>. 346<p> 347There is a 64 KB length limit on any buffer submitted to a 348<tt>gsapi_run_*</tt> function for processing. If you have more 349than 65535 bytes of input then you must split it into smaller 350pieces and submit each in a separate 351<tt>gsapi_run_string_continue()</tt> call. 352</blockquote> 353 354<h3><a name="exit"></a><b><tt>gsapi_exit()</tt></b></h3> 355<blockquote> 356Exit the interpreter. 357This must be called on shutdown if <b><tt>gsapi_init_with_args()</tt></b> 358has been called, and just before <b><tt>gsapi_delete_instance()</tt></b>. 359</blockquote> 360 361<h3><a name="set_visual_tracer"></a><b><tt>gsapi_set_visual_tracer()</tt></b></h3> 362<blockquote> 363Pass visual tracer interface block to Ghostscript. 364See <a href="Lib.htm#Visual_trace"><b><tt>Lib.htm</tt></b></a> for reference about 365the interface block structure. 366This function is useful for debug clients only. Release clients must not call it. 367</blockquote> 368 369 370<h3><a name="return_codes"></a>Return codes</h3> 371 372<p> 373The <b><tt>gsapi_init_with_args</tt></b>, <b><tt>gsapi_run_*</tt></b> and 374<b><tt>gsapi_exit</tt></b> functions return an integer code. 375 376<p> 377<table width="80%" align="center" cellpadding=0 cellspacing=0> 378<tr><th colspan=3 bgcolor="#CCCC00"><hr><font size="+1">Return codes from <b><tt>gsapi_*()</tt></b></font><hr> 379<tr valign=bottom> 380 <th align=left>Code 381 <td> 382 <th align=left>Status 383<tr> <td colspan=3><hr> 384<tr valign=top> <td align=left>0 385 <td> 386 <td>No errors 387<tr valign=top> <td align=left>e_Quit 388 <td> 389 <td>"<b><tt>quit</tt></b>" has been executed. 390 This is not an error. 391 <b><tt>gsapi_exit()</tt></b> must be called next. 392<tr valign=top> <td align=left>e_NeedInput 393 <td> 394 <td>More input is needed by 395 <b><tt>gsapi_run_string_continue()</tt></b>. 396 This is not an error. 397<tr valign=top> <td align=left>e_Info 398 <td> 399 <td>"<b><tt>gs -h</tt></b>" has been executed. 400 This is not an error. 401 <b><tt>gsapi_exit()</tt></b> must be called next. 402<tr valign=top> <td align=left>< 0 403 <td> 404 <td>Error 405<tr valign=top> <td align=left><= -100 406 <td> 407 <td>Fatal error. 408<b><tt>gsapi_exit()</tt></b> must be called next. 409</table> 410</blockquote> 411 412<p> 413The <b><tt>gsapi_run_*()</tt></b> functions do not flush stdio. 414If you want to see output from Ghostscript you 415must do this explicitly as shown in the example below. 416 417<p> 418When executing a string with <b><tt>gsapi_run_string_*()</tt></b>, 419<b><tt>currentfile</tt></b> is the input from the string. 420Reading from <b><tt>%stdin</tt></b> uses the stdin callback. 421</blockquote> 422 423 424 425<h2><a name="Example_usage"></a>Example Usage</h2> 426Some overly simple examples of using the Ghostscript interpreter library 427are below. Some more examples including other programming languages 428may be found at 429<a href="http://www.cs.wisc.edu/~ghost/doc/gsapi.htm"> 430http://www.cs.wisc.edu/~ghost/doc/gsapi.htm</a>. 431 432<p>To use try out these examples in a development environment like Microsoft's 433developer tools or Metrowerks Codewarrior, create a new project, save the example 434source code as a <tt>.c</tt> file and add it, along with the Ghostscript dll or shared 435library. You will also need to make sure the Ghostscript headers are available, either 436by adding their location (the <tt>src</tt> directory in the Ghostscript source 437distribution) to the project's search path, or by copying ierrors.h and iapi.h into the 438same directory as the example source.</p> 439 440<h3>Example 1</h3> 441<pre> 442/* Example of using GS DLL as a ps2pdf converter. */ 443 444#if defined(_WIN32) && !defined(_Windows) 445# define _Windows 446#endif 447#ifdef _Windows 448/* add this source to a project with gsdll32.dll, or compile it directly with: 449 * cl -D_Windows -Isrc -Febin\ps2pdf.exe ps2pdf.c bin\gsdll32.lib 450 */ 451# include <windows.h> 452# define GSDLLEXPORT __declspec(dllimport) 453#endif 454 455#include "ierrors.h" 456#include "iapi.h" 457 458void *minst; 459 460int main(int argc, char *argv[]) 461{ 462 int code, code1; 463 const char * gsargv[10]; 464 int gsargc; 465 gsargv[0] = "ps2pdf"; /* actual value doesn't matter */ 466 gsargv[1] = "-dNOPAUSE"; 467 gsargv[2] = "-dBATCH"; 468 gsargv[3] = "-dSAFER"; 469 gsargv[4] = "-sDEVICE=pdfwrite"; 470 gsargv[5] = "-sOutputFile=out.pdf"; 471 gsargv[6] = "-c"; 472 gsargv[7] = ".setpdfwrite"; 473 gsargv[8] = "-f"; 474 gsargv[9] = "input.ps"; 475 gsargc=10; 476 477 code = gsapi_new_instance(&minst, NULL); 478 if (code < 0) 479 return 1; 480 code = gsapi_init_with_args(minst, gsargc, gsargv); 481 code1 = gsapi_exit(minst); 482 if ((code == 0) || (code == e_Quit)) 483 code = code1; 484 485 gsapi_delete_instance(minst); 486 487 if ((code == 0) || (code == e_Quit)) 488 return 0; 489 return 1; 490} 491</pre> 492 493<h3>Example 2</h3> 494<pre> 495/* Similar to command line gs */ 496 497#if defined(_WIN32) && !defined(_Windows) 498# define _Windows 499#endif 500#ifdef _Windows 501/* Compile directly with: 502 * cl -D_Windows -Isrc -Febin\gstest.exe gstest.c bin\gsdll32.lib 503 */ 504# include <windows.h> 505# define GSDLLEXPORT __declspec(dllimport) 506#endif 507#include <stdio.h> 508#include "ierrors.h" 509#include "iapi.h" 510 511/* stdio functions */ 512static int GSDLLCALL 513gsdll_stdin(void *instance, char *buf, int len) 514{ 515 int ch; 516 int count = 0; 517 while (count < len) { 518 ch = fgetc(stdin); 519 if (ch == EOF) 520 return 0; 521 *buf++ = ch; 522 count++; 523 if (ch == '\n') 524 break; 525 } 526 return count; 527} 528 529static int GSDLLCALL 530gsdll_stdout(void *instance, const char *str, int len) 531{ 532 fwrite(str, 1, len, stdout); 533 fflush(stdout); 534 return len; 535} 536 537static int GSDLLCALL 538gsdll_stderr(void *instance, const char *str, int len) 539{ 540 fwrite(str, 1, len, stderr); 541 fflush(stderr); 542 return len; 543} 544 545void *minst; 546const char start_string[] = "systemdict /start get exec\n"; 547 548int main(int argc, char *argv[]) 549{ 550 int code, code1; 551 int exit_code; 552 553 code = gsapi_new_instance(&minst, NULL); 554 if (code < 0) 555 return 1; 556 gsapi_set_stdio(minst, gsdll_stdin, gsdll_stdout, gsdll_stderr); 557 code = gsapi_init_with_args(minst, argc, argv); 558 if (code == 0) 559 code = gsapi_run_string(minst, start_string, 0, &exit_code); 560 code1 = gsapi_exit(minst); 561 if ((code == 0) || (code == e_Quit)) 562 code = code1; 563 564 gsapi_delete_instance(minst); 565 566 if ((code == 0) || (code == e_Quit)) 567 return 0; 568 return 1; 569} 570</pre> 571 572<h3>Example 3</h3> 573 574Replace main() in either of the above with the following code, 575showing how you can feed Ghostscript piecemeal: 576<pre> 577const char *command = "1 2 add == flush\n"; 578 579int main(int argc, char *argv[]) 580{ 581 int code, code1; 582 int exit_code; 583 584 code = gsapi_new_instance(&minst, NULL); 585 if (code < 0) 586 return 1; 587 code = gsapi_init_with_args(minst, argc, argv); 588 589 if (code == 0) { 590 gsapi_run_string_begin(minst, 0, &exit_code); 591 gsapi_run_string_continue(minst, command, strlen(command), 0, &exit_code); 592 gsapi_run_string_continue(minst, "qu", 2, 0, &exit_code); 593 gsapi_run_string_continue(minst, "it", 2, 0, &exit_code); 594 gsapi_run_string_end(minst, 0, &exit_code); 595 } 596 597 code1 = gsapi_exit(minst); 598 if ((code == 0) || (code == e_Quit)) 599 code = code1; 600 601 gsapi_delete_instance(minst); 602 603 if ((code == 0) || (code == e_Quit)) 604 return 0; 605 return 1; 606} 607</pre> 608 609 610<h2><a name="Multiple_threads"></a>Multiple threads</h2> 611The Ghostscript library should have been compiled with a 612thread safe run time library. 613Synchronisation of threads is entirely up to the caller. 614The exported <a href="#Exported_functions "><b><tt>gsapi_*()</tt></b></a> 615functions must be called from one thread only. 616 617<h2><a name="stdio"></a>Standard input and output</h2> 618<p> 619When using the Ghostscript interpreter library interface, you have a 620choice of two standard input/output methods. 621<ul> 622<li>If you do nothing, the "C" stdio will be used. 623<li>If you use <b><tt>gsapi_set_stdio()</tt></b>, all stdio will 624 be redirected to the callback functions you provide. 625 This would be used in a graphical user interface environment 626 where stdio is not available, or where you wish to process 627 Ghostscript input or output. 628</ul> 629<p> 630The callback functions are described in 631<a href="../src/iapi.h"><b><tt>iapi.h</tt></b></a>. 632 633 634<h2><a name="display"></a>Display device</h2> 635<p> 636The <b><tt>display</tt></b> device is available for use with 637the Ghostscript interpreter library. This is described in the file 638<b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b>. 639This device provides you with access to the raster output of 640Ghostscript. It is your responsibility to copy this raster 641to a display window or printer. 642<p> 643To use this device, you must provide a callback structure 644with addresses of a number of callback functions. 645The address of the callback structure is provided using 646<b><tt>gsapi_set_display_callback()</tt></b>. 647This must be called after 648<b><tt>gsapi_new_instance()</tt></b> 649and before 650<b><tt>gsapi_init_with_args()</tt></b>. 651<p> 652The callbacks are for device open, close, resize, sync, page, 653memory allocation and updating. 654Each callback function contains a handle can be set using 655<blockquote> 656 -dDisplayHandle=1234 657</blockquote> 658<p> 659The device raster format can be configured using 660<blockquote> 661 -dDisplayFormat=NNNN 662</blockquote> 663Options include 664<ul> 665<li> native, gray, RGB, CMYK or separation color spaces. 666<li> alpha byte (ignored). 667<li> 1 to 16 bits/component. 668<li> bigendian (RGB) or littleendian (BGR) order. 669<li> top first or bottom first raster. 670<li> 16 bits/pixel with 555 or 565 bitfields. 671</ul> 672The format values are described in 673<b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b>. 674The format is flexible enough to support common Windows, OS/2, Linux 675and Mac raster formats. To select the display device with a 676Windows 24-bit RGB raster: 677<pre> 678 char **nargv; 679 char arg1[64]; 680 char arg2[64]; 681 char arg3[64]; 682 code = gsapi_new_instance(&minst, NULL); 683 gsapi_set_stdio(minst, gsdll_stdin, gsdll_stdout, gsdll_stderr); 684 code = gsapi_set_display_callback(minst, &display_callback); 685 sprintf(arg1, "-sDEVICE=display"); 686 sprintf(arg2, "-dDisplayHandle=%d", 0); 687 sprintf(arg3, "-dDisplayFormat=%d", 688 DISPLAY_COLORS_RGB | DISPLAY_ALPHA_NONE | DISPLAY_DEPTH_8 | 689 DISPLAY_LITTLEENDIAN | DISPLAY_BOTTOMFIRST); 690 nargv = (char **)malloc((argc + 4) * sizeof(char *)); 691 nargv[0] = argv[0]; 692 nargv[1] = arg1; 693 nargv[2] = arg2; 694 nargv[3] = arg3; 695 memcpy(nargv + 4, argv + 1, argc * sizeof(char *)); 696 argc += 3; 697 code = gsapi_init_with_args(minst, argc, nargv); 698</pre> 699 700<p> 701The display device provides you with the address and size of the 702raster using the <b><tt>display_size()</tt></b> callback. 703You are then responsible for displaying this raster. 704Some examples are in 705<b><tt><a href="../src/dwmain.c">dwmain.c</a></tt></b> (Windows), 706<b><tt><a href="../src/dpmain.c">dpmain.c</a></tt></b> (OS/2) and 707<b><tt><a href="../src/dxmain.c">dxmain.c</a></tt></b> (X11/Linux), and 708<b><tt><a href="../src/dmmain.c">dmmain.c</a></tt></b> (MacOS Classic or Carbon). 709<p> 710On some platforms, the calling convention for the display device callbacks in 711<b><tt><a href="../src/gdevdsp.h">gdevdsp.h</a></tt></b> 712is not the same as the exported 713<a href="#Exported_functions "><b><tt>gsapi_*()</tt></b></a> 714functions in <a href="../src/iapi.h"><b><tt>iapi.h</tt></b></a>. 715 716<p> 717 718<!-- [2.0 end contents] ==================================================== --> 719 720<!-- [3.0 begin visible trailer] =========================================== --> 721<hr> 722 723 724<p> 725<small>Copyright © 2000-2004 artofcode LLC. All rights reserved.</small> 726 727<p> 728This software is provided AS-IS with no warranty, either express or 729implied. 730 731This software is distributed under license and may not be copied, 732modified or distributed except as expressly authorized under the terms 733of the license contained in the file LICENSE in this distribution. 734 735For more information about licensing, please refer to 736http://www.ghostscript.com/licensing/. For information on 737commercial licensing, go to http://www.artifex.com/licensing/ or 738contact Artifex Software, Inc., 101 Lucas Valley Road #110, 739San Rafael, CA 94903, U.S.A., +1(415)492-9861. 740 741<p> 742<small>Ghostscript version 8.53, 20 October 2005 743 744 745<!-- [3.0 end visible trailer] ============================================= --> 746 747</body> 748</html> 749