21#include <ghostscript/iapi.h>
22#include <ghostscript/ierrors.h>
23#include <cairo/cairo.h>
32#define e_VMerror gs_error_VMerror
36#define e_unregistered gs_error_unregistered
40#define e_invalidid gs_error_invalidid
64 GVJ_t *job = caller_handle;
68 return (
int)fwrite(
str, 1, (
size_t)
len, stderr);
80 errsrc =
"PostScript Level 1";
82 errsrc =
"PostScript Level 2";
86 errsrc =
"Ghostscript internal error";
89 name, funstr,
err, errsrc);
94 int rc = 0, exit_code;
100 rc = gsapi_run_file(instance, us->
name, -1, &exit_code);
121#define GS_ARGC sizeof(gs_args)/sizeof(gs_args[0])
123 gs->
surface = cairo_surface_create_similar(
124 cairo_get_target(gs->
cr),
125 CAIRO_CONTENT_COLOR_ALPHA,
126 (
int)(us->
x + us->
w),
127 (
int)(us->
y + us->
h));
129 cr = cairo_create(gs->
surface);
131 agxbuf width_height = {0};
132 agxbprint(&width_height,
"-g%0.fx%0.f", us->
x + us->
w, us->
y + us->
h);
133 gs_args[5] =
agxbuse(&width_height);
137 agxbuf cairo_context = {0};
138 agxbprint(&cairo_context,
"-sCairoContext=%p", cr);
139 gs_args[4] =
agxbuse(&cairo_context);
141 rc = gsapi_init_with_args(instance,
GS_ARGC, gs_args);
154 cairo_surface_destroy(gs->
surface);
158 rc2 = gsapi_exit(instance);
173 gsapi_revision_t gsapi_revision_info;
204#define GSAPI_REVISION_REQUIRED 863
205 rc = gsapi_revision(&gsapi_revision_info,
sizeof(gsapi_revision_t));
206 if (rc && rc < (
int)
sizeof(gsapi_revision_t)) {
207 job->
common->
errorfn(
"gs revision - struct too short %d\n", rc);
212 gsapi_revision_info.revision);
216 rc = gsapi_new_instance(&instance, job);
225 gsapi_delete_instance(instance);
240 cairo_translate(cr, b.
LL.
x - us->
x, -b.
UR.
y);
241 cairo_scale(cr, (b.
UR.
x - b.
LL.
x) / us->
w, (b.
UR.
y - b.
LL.
y) / us->
h);
242 cairo_set_source(cr, pattern);
static void agxbfree(agxbuf *xb)
free any malloced resources
static int agxbprint(agxbuf *xb, const char *fmt,...)
Printf-style output to an agxbuf.
static WUR char * agxbuse(agxbuf *xb)
static double len(glCompPoint p)
void gvusershape_file_release(usershape_t *us)
bool gvusershape_file_access(usershape_t *us)
static gvloadimage_engine_t engine_cairo
static void gvloadimage_gs_cairo(GVJ_t *job, usershape_t *us, boxf b, bool filled)
static void gs_error(GVJ_t *job, const char *name, const char *funstr, int err)
static int gvloadimage_process_surface(GVJ_t *job, usershape_t *us, gs_t *gs, void *instance)
#define GSAPI_REVISION_REQUIRED
static void gvloadimage_gs_free(usershape_t *us)
static int gs_writer(void *caller_handle, const char *str, int len)
static cairo_pattern_t * gvloadimage_gs_load(GVJ_t *job, usershape_t *us)
gvplugin_installed_t gvloadimage_gs_types[]
static int gvloadimage_process_file(GVJ_t *job, usershape_t *us, void *instance)
textitem scanner parser str
void(* errorfn)(const char *fmt,...)
cairo_pattern_t * pattern
cairo_surface_t * surface
void(* datafree)(usershape_t *us)