diff options
Diffstat (limited to 'contrib/groff/src/devices/grodvi')
-rw-r--r-- | contrib/groff/src/devices/grodvi/Makefile.sub | 4 | ||||
-rw-r--r-- | contrib/groff/src/devices/grodvi/dvi.cc | 82 | ||||
-rw-r--r-- | contrib/groff/src/devices/grodvi/grodvi.man | 239 |
3 files changed, 283 insertions, 42 deletions
diff --git a/contrib/groff/src/devices/grodvi/Makefile.sub b/contrib/groff/src/devices/grodvi/Makefile.sub index 0e5d32c..74e627d 100644 --- a/contrib/groff/src/devices/grodvi/Makefile.sub +++ b/contrib/groff/src/devices/grodvi/Makefile.sub @@ -1,6 +1,6 @@ -PROG=grodvi +PROG=grodvi$(EXEEXT) MAN1=grodvi.n XLIBS=$(LIBDRIVER) $(LIBGROFF) MLIB=$(LIBM) -OBJS=dvi.o +OBJS=dvi.$(OBJEXT) CCSRCS=$(srcdir)/dvi.cc diff --git a/contrib/groff/src/devices/grodvi/dvi.cc b/contrib/groff/src/devices/grodvi/dvi.cc index b5b7c49..8412636 100644 --- a/contrib/groff/src/devices/grodvi/dvi.cc +++ b/contrib/groff/src/devices/grodvi/dvi.cc @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -44,8 +44,6 @@ width in the tfm file. */ #define SIZESCALE 100 #define MULTIPLIER 1 -#define FILL_MAX 1000 - class dvi_font : public font { dvi_font(const char *); public: @@ -123,6 +121,7 @@ class dvi_printer : public printer { output_font output_font_table[FONTS_MAX]; font *cur_font; int cur_point_size; + color cur_color; int pushed; int pushed_h; int pushed_v; @@ -132,6 +131,7 @@ class dvi_printer : public printer { void define_font(int); void set_font(int); void possibly_begin_line(); + void set_color(color *); protected: enum { id_byte = 2, @@ -179,9 +179,8 @@ public: class draw_dvi_printer : public dvi_printer { int output_pen_size; - int fill; void set_line_thickness(const environment *); - void fill_next(); + void fill_next(const environment *); public: draw_dvi_printer(); ~draw_dvi_printer(); @@ -214,7 +213,7 @@ dvi_printer::~dvi_printer() draw_dvi_printer::draw_dvi_printer() -: output_pen_size(-1), fill(FILL_MAX) +: output_pen_size(-1) { } @@ -302,9 +301,45 @@ int scale(int x, int z) return sw; } +void dvi_printer::set_color(color *col) +{ + cur_color = *col; + char buf[256]; + unsigned int components[4]; + color_scheme cs = col->get_components(components); + switch (cs) { + case DEFAULT: + sprintf(buf, "color gray 0"); + break; + case RGB: + sprintf(buf, "color rgb %.3g %.3g %.3g", + double(Red) / color::MAX_COLOR_VAL, + double(Green) / color::MAX_COLOR_VAL, + double(Blue) / color::MAX_COLOR_VAL); + break; + case CMY: + col->get_cmyk(&Cyan, &Magenta, &Yellow, &Black); + // fall through + case CMYK: + sprintf(buf, "color cmyk %.3g %.3g %.3g %.3g", + double(Cyan) / color::MAX_COLOR_VAL, + double(Magenta) / color::MAX_COLOR_VAL, + double(Yellow) / color::MAX_COLOR_VAL, + double(Black) / color::MAX_COLOR_VAL); + break; + case GRAY: + sprintf(buf, "color gray %.3g", + double(Gray) / color::MAX_COLOR_VAL); + break; + } + do_special(buf); +} -void dvi_printer::set_char(int index, font *f, const environment *env, int w, const char *name) +void dvi_printer::set_char(int index, font *f, const environment *env, + int w, const char *name) { + if (*env->col != cur_color) + set_color(env->col); int code = f->get_code(index); if (env->size != cur_point_size || f != cur_font) { cur_font = f; @@ -345,7 +380,7 @@ void dvi_printer::set_char(int index, font *f, const environment *env, int w, co possibly_begin_line(); end_h = env->hpos + w; cur_h += scale(f->get_width(index, UNITWIDTH)/MULTIPLIER, - cur_point_size*RES_7227); + cur_point_size*RES_7227); if (cur_h > max_h) max_h = cur_h; if (cur_v > max_v) @@ -464,6 +499,8 @@ void dvi_printer::begin_page(int i) out4(0); out4(last_bop); last_bop = tem; + if (cur_color != default_color) + set_color(&cur_color); // By convention position (0,0) in a dvi file is placed at (1in, 1in). cur_h = font::res; cur_v = font::res; @@ -472,6 +509,7 @@ void dvi_printer::begin_page(int i) void dvi_printer::end_page(int) { + set_color(&default_color); if (pushed) end_of_line(); out1(eop); @@ -629,10 +667,17 @@ void draw_dvi_printer::set_line_thickness(const environment *env) } } -void draw_dvi_printer::fill_next() +void draw_dvi_printer::fill_next(const environment *env) { + unsigned int g; + if (env->fill->is_default()) + g = 0; + else { + // currently, only BW support + env->fill->get_gray(&g); + } char buf[256]; - sprintf(buf, "sh %.3f", double(fill)/FILL_MAX); + sprintf(buf, "sh %.3g", 1 - double(g)/color::MAX_COLOR_VAL); do_special(buf); } @@ -652,7 +697,7 @@ void draw_dvi_printer::draw(int code, int *p, int np, const environment *env) } moveto(env->hpos+p[0]/2, env->vpos); if (fill_flag) - fill_next(); + fill_next(env); else set_line_thickness(env); int rad; @@ -685,7 +730,7 @@ void draw_dvi_printer::draw(int code, int *p, int np, const environment *env) } moveto(env->hpos+p[0]/2, env->vpos); if (fill_flag) - fill_next(); + fill_next(env); sprintf(buf, "%s 0 0 %d %d 0 6.28319", (fill_flag ? "ia" : "ar"), milliinches(p[0]/2), @@ -707,7 +752,7 @@ void draw_dvi_printer::draw(int code, int *p, int np, const environment *env) } moveto(env->hpos, env->vpos); if (fill_flag) - fill_next(); + fill_next(env); else set_line_thickness(env); do_special("pa 0 0"); @@ -790,17 +835,6 @@ void draw_dvi_printer::draw(int code, int *p, int np, const environment *env) } break; } - case 'f': - { - if (np != 1 && np != 2) { - error("1 argument required for fill"); - break; - } - fill = p[0]; - if (fill < 0 || fill > FILL_MAX) - fill = FILL_MAX; - break; - } case 'R': { if (np != 2) { diff --git a/contrib/groff/src/devices/grodvi/grodvi.man b/contrib/groff/src/devices/grodvi/grodvi.man index a4488ce..f732a42 100644 --- a/contrib/groff/src/devices/grodvi/grodvi.man +++ b/contrib/groff/src/devices/grodvi/grodvi.man @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2000, 2001 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2002 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,6 +16,8 @@ versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. .. +. +. .ie t .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X .el .ds tx TeX .\" Like TP, but if specified indent is more than half @@ -24,9 +26,13 @@ the original English. .ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP .el .TP "\\$1" .. +. +. .TH GRODVI @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" .SH NAME grodvi \- convert groff output to TeX dvi format +. +. .SH SYNOPSIS .B grodvi [ @@ -36,18 +42,22 @@ grodvi \- convert groff output to TeX dvi format ] [ .BI \-F dir ] [ -.IR files \|.\|.\|. +.IR files \|.\|.\|.\& ] .PP It is possible to have whitespace between a command line option and its parameter. +. +. .SH DESCRIPTION .B grodvi is a driver for .B groff that produces \*(tx dvi format. +. Normally it should be run by .BR groff\ \-Tdvi . +. This will run .BR @g@troff\ \-Tdvi ; it will also input the macros @@ -56,115 +66,312 @@ if the input is being preprocessed with .B @g@eqn it will also input .BR @FONTDIR@/devdvi/eqnchar . +. .LP The dvi file generated by .B grodvi can be printed by any correctly-written dvi driver. +. The troff drawing primitives are implemented -using the tpic version 2 specials. +using the tpic version\~2 specials. +. If the driver does not support these, the -.B \eD +.B \[rs]D commands will not produce any output. +. .LP There is an additional drawing command available: +. .TP -.BI \eD'R\ dh\ dv ' +.BI \[rs]D'R\ dh\ dv ' Draw a rule (solid black rectangle), with one corner at the current position, and the diagonally opposite corner -at the current position +at the current position .RI +( dh , dv ). -Afterwards the current position will be at the opposite corner. This -produces a rule in the dvi file and so can be printed even with a +. +Afterwards the current position will be at the opposite corner. +. +This produces a rule in the dvi file and so can be printed even with a driver that does not support the tpic specials unlike the other -.B \eD +.B \[rs]D commands. +. .LP The groff command -.BI \eX' anything ' +.BI \[rs]X' anything ' is translated into the same command in the dvi file as would be produced by -.BI \especial{ anything } +.BI \[rs]special{ anything } in \*(tx; -.I anything may not contain a newline. +.I anything +may not contain a newline. +. +.LP +For inclusion of EPS image files, +.B grodvi +loads +.B pspic.tmac +automatically, providing the +.B PSPIC +macro. +. +Please check +.B grops (@MAN1EXT@) +for a detailed description of this macro. +. .LP Font files for .B grodvi can be created from tfm files using .BR tfmtodit (@MAN1EXT@). +. The font description file should contain the following additional commands: +. .Tp \w'\fBinternalname'u+2n .BI internalname\ name The name of the tfm file (without the .B .tfm extension) is .IR name . +. .TP .BI checksum\ n The checksum in the tfm file is .IR n . +. .TP .BI designsize\ n The designsize in the tfm file is .IR n . +. .LP These are automatically generated by .B tfmtodit. +. +.LP +The default color for +.B \[rs]m +and +.B \[rs]M +is black. +. +Currently, the drawing color for +.B \[rs]D +commands is always black, and fill color values are translated to gray. +. .LP In .B troff the -.B \eN +.B \[rs]N escape sequence can be used to access characters by their position in the corresponding tfm file; all characters in the tfm file can be accessed this way. +. +. .SH OPTIONS .TP .B \-d Do not use tpic specials to implement drawing commands. +. Horizontal and vertical lines will be implemented by rules. +. Other drawing commands will be ignored. +. .TP .B \-v Print the version number. +. .TP .BI \-w n Set the default line thickness to .I n -thousandths of an em. +thousandths of an em. +If this option isn't specified, the line thickness defaults to 0.04\~em. +. .TP .BI \-F dir Prepend directory -.IB dir /devdvi -to the search path for font and device description files. +.IB dir /dev name +to the search path for font and device description files; +.I name +is the name of the device, usually +.BR dvi . +. +. +.SH USAGE +There are styles called +.BR R , +.BR I , +.BR B , +and +.B BI +mounted at font positions 1 to 4. +The fonts are grouped into families +.B T +and +.B H +having members in each of these styles: +. +.de FT +.if '\\*(.T'dvi' .ft \\$1 +.. +. +.RS +.TP +.B TR +.FT TR +CM Roman (cmr10) +.FT +. +.TP +.B TI +.FT TI +CM Text Italic (cmti10) +.FT +. +.TP +.B TB +.FT TB +CM Bold Extended Roman (cmbx10) +.FT +. +.TP +.B TBI +.FT TBI +CM Bold Extended Text Italic (cmbxti10) +.FT +. +.TP +.B HR +.FT HR +CM Sans Serif (cmss10) +.FT +. +.TP +.B HI +.FT HI +CM Slanted Sans Serif (cmssi10) +.FT +. +.TP +.B HB +.FT HB +CM Sans Serif Bold Extended (cmssbx10) +.FT +. +.TP +.B HBI +.FT HBI +CM Slanted Sans Serif Bold Extended (cmssbxo10) +.FT +.RE +. +.LP +There are also the following fonts which are not members of a family: +. +.RS +.TP +.B CW +CM Typewriter Text (cmtt10) +.FT CW +.FT +. +.TP +.B CWI +CM Italic Typewriter Text (cmitt10) +.FT CWI +.FT +.RE +. +.LP +Special fonts are +.B MI +(cmmi10), +.B S +(cmsy10), +.B EX +(cmex10), +and, perhaps surprisingly, +.BR TR , +.BR TI , +and +.BR CW , +due to the different font encodings of text fonts. +. +For italic fonts, +.B CWI +is used instead of +.BR CW . +. +.LP +Finally, the symbol fonts of the American Mathematical Society are available +as special fonts +.B SA +(msam10) and +.B SB +(msbm10). +. +These two fonts are not mounted by default. +. +.LP +Using the option +.B \-mec +(loading the file +.BR ec.tmac ) +EC and TC fonts are used. +. +The design of the EC family is very similar to that of the CM fonts; +additionally, they give a much better coverage of groff symbols. +. +Note that +.B ec.tmac +must be called before any language-specific files; it doesn't take care of +hcode values. +. +. .SH FILES .TP .B @FONTDIR@/devdvi/DESC Device description file. +. .TP .BI @FONTDIR@/devdvi/ F Font description file for font .IR F . +. .TP .B @MACRODIR@/dvi.tmac Macros for use with .BR grodvi . +. +.TP +.B @MACRODIR@/ec.tmac +Macros to switch to EC fonts. +. +. .SH BUGS Dvi files produced by .B grodvi use a different resolution (57816 units per inch) to those produced by \*(tx. +. Incorrectly written drivers which assume the resolution used by \*(tx, rather than using the resolution specified in the dvi file will not work with .BR grodvi . +. .LP When using the .B \-d option with boxed tables, vertical and horizontal lines can sometimes protrude by one pixel. +. This is a consequence of the way \*(tx requires that the heights and widths of rules be rounded. +. +. .SH "SEE ALSO" .BR tfmtodit (@MAN1EXT@), .BR groff (@MAN1EXT@), |