/******************************************************************************
*
* ELMER, A Computational Fluid Dynamics Program.
*
* Copyright 1st April 1995 - , Center for Scientific Computing,
* Finland.
*
* All rights reserved. No part of this program may be used,
* reproduced or transmitted in any form or by any means
* without the written permission of CSC.
*
******************************************************************************/
/*******************************************************************************
*
* Postscript driver of the MATC graphics.
*
*******************************************************************************
*
* Author: Juha Ruokolainen
*
* Address: Center for Scientific Computing
* Tietotie 6, P.O. BOX 405
* 02101 Espoo, Finland
* Tel. +358 0 457 2723
* Telefax: +358 0 457 2302
* EMail: Juha.Ruokolainen@csc.fi
*
* Date: 30 May 1996
*
* Modified by:
*
* Date of modification:
*
******************************************************************************/
/*
* $Id: dri_ps.c,v 1.2 2005/05/27 12:26:19 vierinen Exp $
*
* $Log: dri_ps.c,v $
* Revision 1.2 2005/05/27 12:26:19 vierinen
* changed header install location
*
* Revision 1.1.1.1 2005/04/14 13:29:14 vierinen
* initial matc automake package
*
* Revision 1.2 1998/08/01 12:34:32 jpr
*
* Added Id, started Log.
*
*
*/
#include "elmer/matc.h"
#define GRA_PS_FILE "matc.ps"
#define GRA_PS_MAXC 16
static unsigned char gra_ps_rgb[GRA_PS_MAXC][3] =
{
{ 255, 255, 255 },
{ 0, 0, 0 },
{ 0, 83, 255 },
{ 0, 166, 255 },
{ 0, 255, 255 },
{ 0, 83, 0 },
{ 0, 166, 0 },
{ 0, 255, 0 },
{ 255, 255, 0 },
{ 255, 166, 0 },
{ 255, 83, 0 },
{ 255, 0, 0 },
{ 255, 0, 255 },
{ 255, 83, 255 },
{ 255, 166, 255 },
{ 0, 0, 0 }
};
static double sh = -1,
fs = -1,
pip180 = 3.14158/180.0;
void gra_ps_open(dev) int dev;
{
int i;
if (gra_state.out_fp == NULL)
{
if ((gra_state.out_fp = fopen(GRA_PS_FILE, "w")) == NULL)
{
gra_state.driver = GRA_DRV_NULL;
error("gra: open: Can't open output file...\n");
}
}
fprintf(gra_state.out_fp, "%%!PS-Adobe-1.0\n");
fprintf(gra_state.out_fp, "/m { moveto } def\n");
fprintf(gra_state.out_fp, "/l { lineto } def\n");
fprintf(gra_state.out_fp, "/d { stroke } def\n");
fprintf(gra_state.out_fp, "/t { show } def\n");
fprintf(gra_state.out_fp, "/c { setrgbcolor } def\n");
fprintf(gra_state.out_fp, "/p { eofill } def\n");
fprintf(gra_state.out_fp, "/f { findfont } def\n");
fprintf(gra_state.out_fp, "/h { scalefont } def\n");
fprintf(gra_state.out_fp, "/x { setfont } def\n");
fprintf(gra_state.out_fp, "/w { setlinewidth } def\n");
fprintf(gra_state.out_fp, "/s { gsave } def\n");
fprintf(gra_state.out_fp, "/r { grestore } def\n");
fprintf(gra_state.out_fp, "/a { rotate } def\n");
fprintf(gra_state.out_fp,
"gsave clippath pathbbox 2 copy lt { exch } if 0.9 mul dup scale 0.07 dup translate\n");
fprintf(gra_state.out_fp, "%g w\n", 0.001);
for(i = 0; i < GRA_PS_MAXC; i++)
{
gra_ps_defcolor(i, gra_ps_rgb[i][0]/255.0,
gra_ps_rgb[i][1]/255.0,
gra_ps_rgb[i][2]/255.0);
}
fprintf(gra_state.out_fp, "newpath\n");
fprintf(gra_state.out_fp, "c1\n");
sh = -1;
}
void gra_ps_close()
{
fprintf(gra_state.out_fp, "showpage grestore\n");
gra_close_sys();
}
void gra_ps_clear()
{
/* fprintf(gra_state.out_fp, "showpage\n"); */
gra_state.cur_point.x =
gra_state.cur_point.y = 0;
}
void gra_ps_flush()
{
}
void gra_ps_reset()
{
}
void gra_ps_defcolor(index, r, g, b) int index; double r, g, b;
{
fprintf(gra_state.out_fp, "/c%d {%.3g %.3g %.3g c} def\n", index, r, g, b);
if (gra_state.cur_color == index)
{
fprintf(gra_state.out_fp, "c%d\n", index);
}
}
void gra_ps_color(index) int index;
{
if (gra_state.cur_color != index)
{
fprintf(gra_state.out_fp, "c%d\n", index);
gra_state.cur_color = index;
}
}
void gra_ps_polyline(n, p) int n; Point *p;
{
double *xn,*yn,zn, vx, vy;
int i, np, nn, ni;
if (n > 1)
{
xn = (double *)ALLOCMEM(n*sizeof(double));
yn = (double *)ALLOCMEM(n*sizeof(double));
for(i = 1; i < n; i++)
{
gra_mtrans(p[i].x,p[i].y,p[i].z,&xn[i],&yn[i],&zn);
}
gra_state.cur_point.x = xn[n];
gra_state.cur_point.y = yn[n];
nn = n;
ni = 0;
while(nn > 1)
{
gra_mtrans(p[ni].x,p[ni].y,p[ni].z,&xn[ni],&yn[ni],&zn);
if (clip_line(&nn,&xn[ni],&yn[ni]) > 1)
{
gra_window_to_viewport(xn[ni],yn[ni],zn,&vx,&vy);
fprintf(gra_state.out_fp,"%.3g %.3g m\n", vx, vy);
for(np=0,i=1; i < nn; i++)
{
gra_window_to_viewport(xn[i+ni],yn[i+ni],zn,&vx,&vy);
if (np++ > 32 && i != n-1)
{
fprintf(gra_state.out_fp,
"%.3g %.3g l %.3g %.3g m\n", vx, vy, vx, vy);
np = 0;
}
else
fprintf(gra_state.out_fp,"%.3g %.3g l\n", vx, vy);
}
fprintf(gra_state.out_fp,"d\n");
ni += nn - 1;
}
else
ni++;
nn = n - ni;
}
FREEMEM(yn);
FREEMEM(xn);
}
}
void gra_ps_draw(p) Point *p;
{
double vx,vy,xn[2],yn[2],zn;
int n = 2;
xn[0] = gra_state.cur_point.x;
yn[0] = gra_state.cur_point.y;
gra_mtrans(p[0].x,p[0].y,p[0].z,&xn[1],&yn[1],&zn);
gra_state.cur_point.x = xn[1];
gra_state.cur_point.y = yn[1];
if (clip_line(&n, xn, yn) > 1)
{
gra_window_to_viewport(xn[0],yn[0],zn,&vx,&vy);
fprintf(gra_state.out_fp,"%.3g %.3g m ",vx,vy);
gra_window_to_viewport(xn[1],yn[1],zn,&vx,&vy);
fprintf(gra_state.out_fp,"%.3g %.3g l d\n",vx,vy);
}
}
void gra_ps_move(p) Point *p;
{
double wx,wy,wz;
gra_mtrans(p[0].x,p[0].y,p[0].z,&wx,&wy,&wz);
gra_state.cur_point.x = wx;
gra_state.cur_point.y = wy;
}
void gra_ps_polymarker(index, n, p) int index, n; Point *p;
{
double vx,vy,wx,wy,wz;
int *x, *y,
i,nm;
if (gra_state.cur_marker != index)
{
gra_state.cur_marker = index;
}
if (n > 0)
{
x = (int *)ALLOCMEM(n*sizeof(int));
y = (int *)ALLOCMEM(n*sizeof(int));
for(i=nm=0; i < n; i++)
{
gra_mtrans(p[i].x,p[i].y,p[i].z,&wx,&wy,&wz);
gra_state.cur_point.x = wx;
gra_state.cur_point.y = wy;
if (wx >= CL_XMIN && wx <= CL_XMAX &&
wy >= CL_YMIN && wy <= CL_YMAX)
{
gra_window_to_viewport(wx,wy,wz,&vx,&vy);
nm++;
}
}
FREEMEM(x);
FREEMEM(y);
}
}
void gra_ps_marker(index, p) int index; Point *p;
{
double wx,wy,wz;
gra_mtrans(p[0].x,p[0].y,p[0].z,&wx,&wy,&wz);
gra_state.cur_point.x = wx;
gra_state.cur_point.y = wy;
}
void gra_ps_areafill(n, p) int n; Point *p;
{
double vx,vy,*xn,*yn,zn;
int i, nn;
if (n > 2)
{
xn = (double *)ALLOCMEM((2*n+2)*sizeof(double));
yn = (double *)ALLOCMEM((2*n+2)*sizeof(double));
for(i = 0; i < n; i++)
{
gra_mtrans(p[i].x,p[i].y,p[i].z,&xn[i],&yn[i],&zn);
}
gra_state.cur_point.x = xn[0];
gra_state.cur_point.y = yn[0];
nn = n;
clip_poly(&nn,xn,yn);
if (nn > 2)
{
gra_window_to_viewport(xn[0],yn[0],zn,&vx,&vy);
fprintf(gra_state.out_fp,"%.3g %.3g m\n", vx, vy);
for(i = 1; i < nn; i++)
{
gra_window_to_viewport(xn[i],yn[i],zn,&vx,&vy);
fprintf(gra_state.out_fp,"%.3g %.3g l\n", vx, vy);
}
fprintf(gra_state.out_fp,"p\n");
}
FREEMEM((char *)yn);
FREEMEM((char *)xn);
}
}
void gra_ps_image(w, h, d, r) int w, h, d; unsigned char *r;
{
int i, j, k;
if (d != 8)
{
error("gra: ps: driver does (currently) support only 8 bits/pixel.\n");
return;
}
fprintf(gra_state.out_fp, "gsave\n/picstr %d string def\n", w);
fprintf(gra_state.out_fp, "%.3g %.3g translate %.3g %.3g scale\n",
gra_state.viewport.xlow,
gra_state.viewport.ylow,
gra_state.viewport.xhigh-gra_state.viewport.xlow,
gra_state.viewport.yhigh-gra_state.viewport.ylow);
fprintf(gra_state.out_fp, "%d %d %d [%d 0 0 %d 0 0]\n",w,h,d,w,h);
fprintf(gra_state.out_fp, "{ currentfile picstr readhexstring pop } image\n");
for(i = k = 0; i < h; i++)
{
for(j = 0; j < w; j++)
{
fprintf(gra_state.out_fp,"%02x", *r++);
k++;
if (k >= 40)
{
fprintf(gra_state.out_fp,"\n");
k = 0;
}
}
}
fprintf(gra_state.out_fp," grestore\n");
}
void gra_ps_text(h, r, str) double h, r; char *str;
{
double wx = gra_state.cur_point.x;
double wy = gra_state.cur_point.y;
double wz =0.0;
double vx,vy;
if (!(wx >= CL_XMIN && wx <= CL_XMAX &&
wy >= CL_YMIN && wy <= CL_YMAX ) ) return;
gra_window_to_viewport(wx,wy,wz,&vx,&vy);
fprintf(gra_state.out_fp,"%.3g %.3g m\n", vx, vy );
if ( sh != h )
{
fs = (gra_state.viewport.xhigh-gra_state.viewport.xlow) /
(gra_state.window.xhigh-gra_state.window.xlow);
fs *= 1.65 * h;
sh = h;
fprintf(gra_state.out_fp,"/Times-Roman f %g h x\n", fs);
}
if ( r != 0.0 )
fprintf(gra_state.out_fp,"s %.3g a (%s) t r\n", r, str );
else
fprintf(gra_state.out_fp, "(%s) t\n", str );
gra_state.cur_point.x += cos(r*pip180)*fs*strlen(str);
gra_state.cur_point.y += sin(r*pip180)*fs*strlen(str);
}
syntax highlighted by Code2HTML, v. 0.9.1