typedef struct _gfxsource
{
- void (*set_parameter)(struct _gfxsource*src, const char*name, const char*value);
+ void (*setparameter)(struct _gfxsource*src, const char*name, const char*value);
struct _gfxdocument* (*open)(struct _gfxsource*src, const char*filename);
void (*destroy)(struct _gfxsource*src);
void*internal;
int num_pages;
void* (*get)(struct _gfxdocument*gfx, const char*name);
void (*destroy)(struct _gfxdocument*gfx);
- void (*set_parameter)(struct _gfxdocument*gfx, const char*name, const char*value);
+ void (*setparameter)(struct _gfxdocument*gfx, const char*name, const char*value);
char* (*getinfo)(struct _gfxdocument*gfx, const char*key);
struct _gfxpage* (*getpage)(struct _gfxdocument*gfx, int page);
void (*prepare)(struct _gfxdocument*gfx, gfxdevice_t*device);
jpeg_save(data, img->width, img->height, quality, filename);
}
+gfxparams_t* gfxparams_new()
+{
+ return (gfxparams_t*)rfx_calloc(sizeof(gfxparams_t));
+}
+
+void gfxparams_store(gfxparams_t*params, const char*key, const char*value)
+{
+ gfxparam_t*o = params->params;
+ while(o) {
+ if(!strcmp(key, o->key)) {
+ /* overwrite old value */
+ free((void*)o->value);
+ o->value = strdup(value);
+ return;
+ }
+ o = o->next;
+ }
+ gfxparam_t*p = (gfxparam_t*)malloc(sizeof(gfxparam_t));
+ p->key = strdup(key);
+ p->value = strdup(value);
+ p->next = 0;
+
+ if(params->last) {
+ params->last->next = p;
+ params->last = p;
+ } else {
+ params->params = p;
+ params->last = p;
+ }
+}
+
+void gfxparams_free(gfxparams_t*params)
+{
+ gfxparam_t*p = params->params;
+ while(p) {
+ gfxparam_t*next = p->next;
+ free((void*)p->key);
+ if(p->value) free((void*)p->value);
+ free(p);
+ p = next;
+ }
+}
+
gfxline_t*gfxline_makecircle(double x,double y,double rx, double ry);
void gfxline_show(gfxline_t*line, FILE*fi);
+typedef struct _gfxparam {
+ const char*key;
+ const char*value;
+ struct _gfxparam* next;
+} gfxparam_t;
+typedef struct _gfxparams {
+ gfxparam_t*params;
+ gfxparam_t*last;
+} gfxparams_t;
+gfxparams_t* gfxparams_new();
+void gfxparams_store(gfxparams_t*params, const char*name, const char*value);
+void gfxparams_free(gfxparams_t*params);
+
#ifdef __cplusplus
}
#endif
static int globalparams_count=0;
-typedef struct _parameter
-{
- struct _parameter *next;
- const char*name;
- const char*value;
-} parameter_t;
-typedef struct _parameterlist
-{
- parameter_t* device_config;
- parameter_t* device_config_next;
-} parameterlist_t;
-
typedef struct _pdf_page_info
{
int xMin, yMin, xMax, yMax;
char config_bitmap_optimizing;
char config_full_bitmap_optimizing;
char config_print;
- parameterlist_t parameters;
+ gfxparams_t* parameters;
int protect;
int nocopy;
typedef struct _gfxsource_internal
{
- parameterlist_t parameters;
+ gfxparams_t* parameters;
} gfxsource_internal_t;
#endif
}
-static void storeDeviceParameter(parameterlist_t*i, const char*name, const char*value)
-{
- parameter_t*o = i->device_config;
- while(o) {
- if(!strcmp(name, o->name)) {
- /* overwrite old value */
- free((void*)o->value);
- o->value = strdup(value);
- return;
- }
- o = o->next;
- }
- parameter_t*p = new parameter_t();
- p->name = strdup(name);
- p->value = strdup(value);
- p->next = 0;
-
- if(i->device_config_next) {
- i->device_config_next->next = p;
- i->device_config_next = p;
- } else {
- i->device_config = p;
- i->device_config_next = p;
- }
-}
-
-
-
void pdfpage_destroy(gfxpage_t*pdf_page)
{
pdf_page_internal_t*i= (pdf_page_internal_t*)pdf_page->internal;
outputDev = (CommonOutputDev*)d;
}
/* pass global parameters to PDF driver*/
- parameter_t*p = i->parameters.device_config;
+ gfxparam_t*p = i->parameters->params;
while(p) {
- outputDev->setParameter(p->name, p->value);
+ outputDev->setParameter(p->key, p->value);
p = p->next;
}
- p = pi->parameters.device_config;
+ p = pi->parameters->params;
while(p) {
- outputDev->setParameter(p->name, p->value);
+ outputDev->setParameter(p->key, p->value);
p = p->next;
}
i->pagemap_pos = pdfpage;
}
-void pdf_doc_set_parameter(gfxdocument_t*gfx, const char*name, const char*value)
+void pdf_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value)
{
pdf_doc_internal_t*i= (pdf_doc_internal_t*)gfx->internal;
if(!strcmp(name, "pagemap")) {
} else if(!strcmp(name, "asprint")) {
i->config_print = 1;
} else {
- storeDeviceParameter(&i->parameters, name, value);
+ gfxparams_store(i->parameters, name, value);
}
}
extern int config_fontquality;
extern int config_bigchar;
-static void pdf_set_parameter(gfxsource_t*src, const char*name, const char*value)
+static void pdf_setparameter(gfxsource_t*src, const char*name, const char*value)
{
gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal;
+
+ gfxparams_store(i->parameters, name, value);
msg("<verbose> setting parameter %s to \"%s\"", name, value);
if(!strncmp(name, "fontdir", strlen("fontdir"))) {
pdf_doc_internal_t*i= (pdf_doc_internal_t*)malloc(sizeof(pdf_doc_internal_t));
memset(i, 0, sizeof(pdf_doc_internal_t));
i->parent = src;
+ i->parameters = gfxparams_new();
pdf_doc->internal = i;
char*userPassword=0;
pdf_doc->get = 0;
pdf_doc->destroy = pdf_doc_destroy;
- pdf_doc->set_parameter = pdf_doc_set_parameter;
+ pdf_doc->setparameter = pdf_doc_setparameter;
pdf_doc->getinfo = pdf_doc_getinfo;
pdf_doc->getpage = pdf_doc_getpage;
pdf_doc->prepare = pdf_doc_prepare;
if(!src->internal)
return;
gfxsource_internal_t*i = (gfxsource_internal_t*)src->internal;
-
- parameter_t*p = i->parameters.device_config;
- while(p) {
- parameter_t*next = p->next;
- if(p->name) free((void*)p->name);p->name = 0;
- if(p->value) free((void*)p->value);p->value =0;
- p->next = 0;delete p;
- p = next;
- }
- i->parameters.device_config=i->parameters.device_config_next=0;
+
+ gfxparams_free(i->parameters);
+ i->parameters=0;
free(src->internal);src->internal=0;
{
gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t));
memset(src, 0, sizeof(gfxsource_t));
- src->set_parameter = pdf_set_parameter;
+ src->setparameter = pdf_setparameter;
src->open = pdf_open;
src->destroy = pdf_destroy;
- src->internal = malloc(sizeof(gfxsource_internal_t));
- memset(src->internal, 0, sizeof(gfxsource_internal_t));
+ gfxsource_internal_t*i = (gfxsource_internal_t*)rfx_calloc(sizeof(gfxsource_internal_t));
+ src->internal = (void*)i;
+ i->parameters = gfxparams_new();
if(!globalParams) {
globalParams = new GFXGlobalParams();
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key,&value))
return NULL;
- self->doc->set_parameter(self->doc, key, value);
+ self->doc->setparameter(self->doc, key, value);
return PY_NONE;
}
char*key=0,*value=0;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss", kwlist, &key, &value))
return NULL;
- pdfdriver->set_parameter(pdfdriver,key,value);
+ pdfdriver->setparameter(pdfdriver,key,value);
return PY_NONE;
}
char*filename=0;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename))
return NULL;
- pdfdriver->set_parameter(pdfdriver,"font", filename);
+ pdfdriver->setparameter(pdfdriver,"font", filename);
return PY_NONE;
}
char*filename=0;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename))
return NULL;
- pdfdriver->set_parameter(pdfdriver,"fontdir", filename);
+ pdfdriver->setparameter(pdfdriver,"fontdir", filename);
return PY_NONE;
}
free(gfx);gfx=0;
}
-void image_doc_set_parameter(gfxdocument_t*gfx, const char*name, const char*value)
+void image_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value)
{
image_doc_internal_t*i= (image_doc_internal_t*)gfx->internal;
}
return image_page;
}
-static void image_set_parameter(gfxsource_t*src, const char*name, const char*value)
+static void image_setparameter(gfxsource_t*src, const char*name, const char*value)
{
msg("<verbose> (gfxsource_image) setting parameter %s to \"%s\"", name, value);
}
image_doc->internal = i;
image_doc->get = 0;
image_doc->destroy = image_doc_destroy;
- image_doc->set_parameter = image_doc_set_parameter;
+ image_doc->setparameter = image_doc_setparameter;
image_doc->getpage = image_doc_getpage;
return image_doc;
{
gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t));
memset(src, 0, sizeof(gfxsource_t));
- src->set_parameter = image_set_parameter;
+ src->setparameter = image_setparameter;
src->open = image_open;
return src;
}
free(gfx);gfx=0;
}
-void swf_doc_set_parameter(gfxdocument_t*gfx, const char*name, const char*value)
+void swf_doc_setparameter(gfxdocument_t*gfx, const char*name, const char*value)
{
swf_doc_internal_t*i= (swf_doc_internal_t*)gfx->internal;
}
return swf_page;
}
-void swf_set_parameter(gfxsource_t*src, const char*name, const char*value)
+void swf_setparameter(gfxsource_t*src, const char*name, const char*value)
{
msg("<verbose> setting parameter %s to \"%s\"", name, value);
}
swf_doc->internal = i;
swf_doc->get = 0;
swf_doc->destroy = swf_doc_destroy;
- swf_doc->set_parameter = swf_doc_set_parameter;
+ swf_doc->setparameter = swf_doc_setparameter;
swf_doc->getpage = swf_doc_getpage;
return swf_doc;
{
gfxsource_t*src = (gfxsource_t*)malloc(sizeof(gfxsource_t));
memset(src, 0, sizeof(gfxsource_t));
- src->set_parameter = swf_set_parameter;
+ src->setparameter = swf_setparameter;
src->open = swf_open;
src->destroy = swf_destroy;
return src;
HEAD
volatile VALUE f = font_is_cached(i, font);
- if(!f) {f=convert_font(font);cache_font(i,font,v);}
+ if(!f) {f=convert_font(font);cache_font(i,font,f);}
forward(v, id_addfont, 1, f);
}
{
HEAD
volatile VALUE f = font_is_cached(i, font);
- if(!f) {f=convert_font(font);cache_font(i,font,v);}
+ if(!f) {f=convert_font(font);cache_font(i,font,f);}
volatile VALUE v_color = convert_color(color);
volatile VALUE v_matrix = convert_matrix(matrix);
dev.endpage = rb_endpage;
dev.finish = rb_finish;
+ dev.startpage(&dev, page->page->width, page->page->height);
page->page->render(page->page, &dev);
+ dev.endpage(&dev);
return cls;
}
+// ---------------------- global functions ----------------------------------
+
+VALUE gfx_setparameter(VALUE module, VALUE _key, VALUE _value)
+{
+ Check_Type(_key, T_STRING);
+ Check_Type(_value, T_STRING);
+ const char*key = StringValuePtr(_key);
+ const char*value = StringValuePtr(_value);
+ pdfdriver->setparameter(pdfdriver, key, value);
+ swfdriver->setparameter(swfdriver, key, value);
+ imagedriver->setparameter(imagedriver, key, value);
+ return GFX;
+}
// --------------------------------------------------------------------------
GFX = rb_define_module("GFX");
+ rb_define_module_function(GFX, "setparameter", gfx_setparameter, 2);
+
DocumentPage = rb_define_class_under(GFX, "DocumentPage", rb_cObject);
rb_define_method(DocumentPage, "width", page_width, 0);
rb_define_method(DocumentPage, "height", page_height, 0);
require 'gfx'
-#pdf = GFX::PDF.new('test.pdf')
-pdf = GFX::PDF.new('/home/kramm/paper5.pdf')
+pdf = GFX::PDF.new('file.pdf')
class TestRender < GFX::Device
def startpage(width,height)
if(c && *c && c[1]) {
*c = 0;
c++;
- driver->set_parameter(driver, s,c);
+ driver->setparameter(driver, s,c);
} else {
- driver->set_parameter(driver, s,"1");
+ driver->setparameter(driver, s,"1");
}
free(s);
return 1;
}
is_in_range(0x7fffffff, pagerange);
if(pagerange)
- driver->set_parameter(driver, "pages", pagerange);
+ driver->setparameter(driver, "pages", pagerange);
if(!filename) {
args_callback_usage(argv[0]);
if(c && *c && c[1]) {
*c = 0;
c++;
- driver->set_parameter(driver, s,c);
+ driver->setparameter(driver, s,c);
} else {
- driver->set_parameter(driver, s,"1");
+ driver->setparameter(driver, s,"1");
}
free(s);
return 1;
is_in_range(0x7fffffff, pagerange);
if(pagerange)
- driver->set_parameter(driver, "pages", pagerange);
+ driver->setparameter(driver, "pages", pagerange);
if(!filename) {
args_callback_usage(argv[0]);
}
gfxdocument_t* doc = driver->open(driver, filename);
- //doc->set_parameter(doc, "drawonlyshapes", "1");
- doc->set_parameter(doc, "disable_polygon_conversion", "1");
+ //doc->setparameter(doc, "drawonlyshapes", "1");
+ doc->setparameter(doc, "disable_polygon_conversion", "1");
if(!doc) {
msg("<error> Couldn't open %s", filename);
} else if(!strcmp(s,"help")) {
printf("PDF Parameters:\n");
gfxsource_t*pdf = gfxsource_pdf_create();
- pdf->set_parameter(pdf, "help", "");
+ pdf->setparameter(pdf, "help", "");
gfxdevice_t swf;
gfxdevice_swf_init(&swf);
printf("SWF Parameters:\n");
/* pass global parameters to PDF driver*/
parameter_t*p = device_config;
while(p) {
- driver->set_parameter(driver, p->name, p->value);
+ driver->setparameter(driver, p->name, p->value);
p = p->next;
}
}
if(pagerange)
- driver->set_parameter(driver, "pages", pagerange);
+ driver->setparameter(driver, "pages", pagerange);
/* add fonts */
for(t=0;t<fontpathpos;t++) {
- driver->set_parameter(driver, "fontdir", fontpaths[t]);
+ driver->setparameter(driver, "fontdir", fontpaths[t]);
}
if(info_only) {
/* pass global parameters document */
p = device_config;
while(p) {
- pdf->set_parameter(pdf, p->name, p->value);
+ pdf->setparameter(pdf, p->name, p->value);
p = p->next;
}
if(is_in_range(pagenr, pagerange)) {
char mapping[80];
sprintf(mapping, "%d:%d", pagenr, frame);
- pdf->set_parameter(pdf, "pagemap", mapping);
+ pdf->setparameter(pdf, "pagemap", mapping);
pagenum++;
}
if(pagenum == xnup*ynup || (pagenr == pdf->num_pages && pagenum>1)) {
gfxsource_t*src = gfxsource_swf_create();
for(p=params;p;p=p->next) {
- src->set_parameter(src, p->name, p->value);
+ src->setparameter(src, p->name, p->value);
}
gfxdocument_t*doc = src->open(src, filename);
for(p=params;p;p=p->next) {
- doc->set_parameter(doc, p->name, p->value);
+ doc->setparameter(doc, p->name, p->value);
}
if(!doc) {
fprintf(stderr,"Couldn't open %s\n", filename);