#include "mdvi.h"
#include "private.h"
+#include "color.h"
typedef int (*DviCommand) __PROTO((DviContext *, int));
if(dvi->buffer.data == NULL) {
/* first allocation */
dvi->buffer.size = Max(DVI_BUFLEN, n);
- dvi->buffer.data = (Uchar *)xmalloc(dvi->buffer.size);
+ dvi->buffer.data = (Uchar *)mdvi_malloc(dvi->buffer.size);
dvi->buffer.length = 0;
dvi->buffer.frozen = 0;
} else if(dvi->buffer.pos < dvi->buffer.length) {
static void dreset(DviContext *dvi)
{
if(!dvi->buffer.frozen && dvi->buffer.data)
- xfree(dvi->buffer.data);
+ mdvi_free(dvi->buffer.data);
dvi->buffer.data = NULL;
dvi->buffer.size = 0;
dvi->buffer.length = 0;
hdpi = FROUND(dvi->params.mag * dvi->params.dpi * scale / dsize);
vdpi = FROUND(dvi->params.mag * dvi->params.vdpi * scale / dsize);
n = duget1(dvi) + duget1(dvi);
- name = xmalloc(n + 1);
+ name = mdvi_malloc(n + 1);
dread(dvi, name, n);
name[n] = 0;
DEBUG((DBG_FONTS, "requesting font %d = `%s' at %.1fpt (%dx%d dpi)\n",
ref = font_reference(&dvi->params, arg, name, checksum, hdpi, vdpi, scale);
if(ref == NULL) {
error(_("could not load font `%s'\n"), name);
- xfree(name);
+ mdvi_free(name);
return NULL;
}
- xfree(name);
+ mdvi_free(name);
return ref;
}
if(len >= 4 && STREQ(name+len-4, ".dvi")) {
DEBUG((DBG_DVI|DBG_FILES, "opendvi: Trying `%s'\n", name));
if(access(name, R_OK) == 0)
- return xstrdup(name);
+ return mdvi_strdup(name);
}
/* try appending .dvi */
- file = xmalloc(len + 5);
+ file = mdvi_malloc(len + 5);
strcpy(file, name);
strcpy(file+len, ".dvi");
DEBUG((DBG_DVI|DBG_FILES, "opendvi: Trying `%s'\n", file));
DEBUG((DBG_DVI|DBG_FILES, "opendvi: Trying `%s'\n", file));
if(access(file, R_OK) == 0)
return file;
- xfree(file);
+ mdvi_free(file);
return NULL;
}
font_drop_chain(dvi->fonts);
/* destroy our font map */
if(dvi->fontmap)
- xfree(dvi->fontmap);
+ mdvi_free(dvi->fontmap);
dvi->currfont = NULL;
/* and use the ones we just loaded */
dvi->dvivconv = newdvi->dvivconv;
dvi->modtime = newdvi->modtime;
- if(dvi->fileid) xfree(dvi->fileid);
+ if(dvi->fileid) mdvi_free(dvi->fileid);
dvi->fileid = newdvi->fileid;
dvi->dvi_page_w = newdvi->dvi_page_w;
dvi->dvi_page_h = newdvi->dvi_page_h;
- xfree(dvi->pagemap);
+ mdvi_free(dvi->pagemap);
dvi->pagemap = newdvi->pagemap;
dvi->npages = newdvi->npages;
if(dvi->currpage > dvi->npages-1)
dvi->currpage = 0;
- xfree(dvi->stack);
+ mdvi_free(dvi->stack);
dvi->stack = newdvi->stack;
dvi->stacksize = newdvi->stacksize;
/* remove fonts that are not being used anymore */
font_free_unused(&dvi->device);
- xfree(newdvi->filename);
- xfree(newdvi);
+ mdvi_free(newdvi->filename);
+ mdvi_free(newdvi);
DEBUG((DBG_DVI, "%s: reload successful\n", dvi->filename));
if(dvi->device.refresh)
break;
case MDVI_SET_GAMMA:
np.gamma = va_arg(ap, double);
- if(np.pixels) {
- xfree(np.pixels);
- np.pixels = 0;
- np.npixels = 0;
- }
reset_font = MDVI_FONTSEL_GREY;
break;
case MDVI_SET_DENSITY:
p = fopen(filename, "r");
if(p == NULL) {
perror(file);
- xfree(filename);
+ mdvi_free(filename);
return NULL;
}
dvi = xalloc(DviContext);
dvi->params.orientation = par->orientation;
dvi->params.fg = par->fg;
dvi->params.bg = par->bg;
- dvi->params.pixels = NULL;
- dvi->params.npixels = 0;
/* initialize colors */
dvi->curr_fg = par->fg;
/* get the comment from the preamble */
n = fuget1(p);
- dvi->fileid = xmalloc(n + 1);
+ dvi->fileid = mdvi_malloc(n + 1);
fread(dvi->fileid, 1, n, p);
dvi->fileid[n] = 0;
DEBUG((DBG_DVI, "%s: %s\n", filename, dvi->fileid));
for(i = 1; i <= 10; i++)
page[i] = fsget4(p);
page[0] = offset;
- offset = (long)fuget4(p);
+ offset = fsget4(p);
/* check if the page is selected */
if(spec && mdvi_page_selected(spec, page, n) == 0) {
DEBUG((DBG_DVI, "Page %d (%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld.%ld) ignored by request\n",
dvi->device.set_color = dummy_dev_set_color;
dvi->device.device_data = NULL;
- /* initialize associations */
- mdvi_hash_init(&dvi->assoc);
-
DEBUG((DBG_DVI, "%s read successfully\n", filename));
return dvi;
font_free_unused(&dvi->device);
}
if(dvi->fontmap)
- xfree(dvi->fontmap);
+ mdvi_free(dvi->fontmap);
if(dvi->filename)
- xfree(dvi->filename);
+ mdvi_free(dvi->filename);
if(dvi->stack)
- xfree(dvi->stack);
+ mdvi_free(dvi->stack);
if(dvi->pagemap)
- xfree(dvi->pagemap);
+ mdvi_free(dvi->pagemap);
if(dvi->fileid)
- xfree(dvi->fileid);
+ mdvi_free(dvi->fileid);
if(dvi->in)
fclose(dvi->in);
if(dvi->buffer.data && !dvi->buffer.frozen)
- xfree(dvi->buffer.data);
+ mdvi_free(dvi->buffer.data);
if(dvi->color_stack)
- xfree(dvi->color_stack);
- mdvi_assoc_flush(dvi);
+ mdvi_free(dvi->color_stack);
- xfree(dvi);
+ mdvi_free(dvi);
}
void mdvi_setpage(DviContext *dvi, int pageno)
dvi->curr_layer = 0;
if(dvi->buffer.data && !dvi->buffer.frozen)
- xfree(dvi->buffer.data);
+ mdvi_free(dvi->buffer.data);
/* reset our buffer */
dvi->buffer.data = NULL;
(a), (b) > 0 ? '+' : '-', \
(b) > 0 ? (b) : -(b), (c)
+/*
+ * Draw rules with some sort of antialias support. Usefult for high-rate
+ * scale factors.
+ */
+
+static void draw_shrink_rule (DviContext *dvi, int x, int y, Uint w, Uint h, int f)
+{
+ int hs, vs, npixels;
+ Ulong fg, bg;
+ Ulong *pixels;
+
+ hs = dvi->params.hshrink;
+ vs = dvi->params.vshrink;
+ fg = dvi->params.fg;
+ bg = dvi->params.bg;
+
+ if (MDVI_ENABLED(dvi, MDVI_PARAM_ANTIALIASED)) {
+ npixels = vs * hs + 1;
+ pixels = get_color_table(&dvi->device, npixels, bg, fg,
+ dvi->params.gamma, dvi->params.density);
+
+ if (pixels) {
+ int color;
+
+ /* Lines with width 1 should be perfectly visible
+ * in shrink about 15. That is the reason of constant
+ */
+
+ color = (pow (vs / h * hs, 2) + pow (hs / w * vs, 2)) / 225;
+ if (color < npixels) {
+ fg = pixels[color];
+ } else {
+ fg = pixels[npixels - 1];
+ }
+ }
+ }
+
+ mdvi_push_color (dvi, fg, bg);
+ dvi->device.draw_rule(dvi, x, y, w, h, f);
+ mdvi_pop_color (dvi);
+
+ return;
+}
+
/*
* The only commands that actually draw something are:
* set_char, set_rule
break;
}
- dvi->device.draw_rule(dvi,
- dvi->pos.hh - x, dvi->pos.vv - y, w, h, 1);
+ draw_shrink_rule(dvi, dvi->pos.hh - x, dvi->pos.vv - y, w, h, 1);
}
int set_char(DviContext *dvi, int opcode)
b, a, w, h));
/* the `draw' functions expect the origin to be at the top left
* corner of the rule, not the bottom left, as in DVI files */
- if(dvi->curr_layer <= dvi->params.layer)
- dvi->device.draw_rule(dvi,
- dvi->pos.hh, dvi->pos.vv - h + 1, w, h, 1);
+ if(dvi->curr_layer <= dvi->params.layer) {
+ draw_shrink_rule(dvi,
+ dvi->pos.hh, dvi->pos.vv - h + 1, w, h, 1);
+ }
} else {
SHOWCMD((dvi, opcode == DVI_SET_RULE ? "setrule" : "putrule", -1,
"(moving left only, by %d)\n", b));
Int32 arg;
arg = dugetn(dvi, opcode - DVI_XXX1 + 1);
- s = xmalloc(arg + 1);
+ s = mdvi_malloc(arg + 1);
dread(dvi, s, arg);
s[arg] = 0;
mdvi_do_special(dvi, s);
SHOWCMD((dvi, "XXXX", opcode - DVI_XXX1 + 1,
"[%s]", s));
- xfree(s);
+ mdvi_free(s);
return 0;
}