/***************************************************************************** ** Copyright (C) 1998-2001 Ljubomir Milanovic & Horst Wagner ** This file is part of the g2 library ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public ** License as published by the Free Software Foundation; either ** version 2.1 of the License, or (at your option) any later version. ** ** This library is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public ** License along with this library; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ #include #include #include #include "g2.h" #include "g2_device.h" #include "g2_physical_device.h" #include "g2_util.h" #include "g2_funix.h" /* * * Flush output * */ void g2_flush_pd(g2_physical_device *pd) { if(pd->ff[g2_Flush].fun!=NULL) { pd->ff[g2_Flush].fun(pd->pid, pd->pdp); } else { /* emulate ... with .... */ } } /* * * Save output * */ void g2_save_pd(g2_physical_device *pd) { if(pd->ff[g2_Save].fun!=NULL) { pd->ff[g2_Save].fun(pd->pid, pd->pdp); } else { /* emulate ... with .... */ } } /* * * Clear device * */ void g2_clear_pd(g2_physical_device *pd) { if(pd->ff[g2_Clear].fun!=NULL) { pd->ff[g2_Clear].fun(pd->pid, pd->pdp); } else { /* emulate ... with .... */ } } /* * * Set pen * */ void g2_pen_pd(g2_physical_device *pd, int color) { if(pd->ff[g2_Pen].fun!=NULL) { pd->ff[g2_Pen].fun(pd->pid, pd->pdp, color); } else { /* emulate ... with .... */ } } /* * * Set background color * */ void g2_set_background_pd(g2_physical_device *pd, int color) { if(pd->ff[g2_SetBackground].fun!=NULL) { pd->ff[g2_SetBackground].fun(pd->pid, pd->pdp, color); } else { /* emulate ... with .... */ } } /* * * Set ink * */ int g2_ink_pd(g2_physical_device *pd, double red, double green, double blue) { int rv=-1; if(pd->ff[g2_Ink].fun!=NULL) { rv=pd->ff[g2_Ink].fun(pd->pid, pd->pdp, red, green, blue); } else { /* emulate ... with .... */ } return rv; } /* * * Clear palette * */ void g2_clear_palette_pd(g2_physical_device *pd) { if(pd->ff[g2_ClearPalette].fun!=NULL) { pd->ff[g2_ClearPalette].fun(pd->pid, pd->pdp); } else { /* emulate ... with .... */ } } /* * * Allocate basic colors * */ void g2_allocate_basic_colors_pd(g2_physical_device *pd) { double ct[3]={0.0, 0.5, 1.0}; int r, g, b; if(pd->ff[g2_Ink].fun!=NULL) { pd->ff[g2_Ink].fun(pd->pid, pd->pdp, /* white */ 1.0, 1.0, 1.0); pd->ff[g2_Ink].fun(pd->pid, pd->pdp, /* black */ 0.0, 0.0, 0.0); for(r=0;r<3;r++) for(g=0;g<3;g++) for(b=0;b<3;b++) if((r==2 && g==2 && b==2) || (r==0 && g==0 && b==0)) continue; else pd->ff[g2_Ink].fun(pd->pid, pd->pdp, ct[r], ct[g], ct[b]); } } /* * * Set font size * */ void g2_set_font_size_pd(g2_physical_device *pd, double size) { int is; double ds; if(pd->ff[g2_SetFontSize].fun!=NULL) { switch(pd->coor_type) { case g2_IntCoor: is=dtoi(size*fabs(pd->a22)); /* to pd coordinates */ pd->ff[g2_SetFontSize].fun(pd->pid, pd->pdp, is); break; case g2_DoubleCoor: ds=size*fabs(pd->a22); /* to pd coordinates */ pd->ff[g2_SetFontSize].fun(pd->pid, pd->pdp, ds); break; } } else { /* emulate ... with .... */ } } /* * * Set line width * */ void g2_set_line_width_pd(g2_physical_device *pd, double w) { int iw; double dw; if(pd->ff[g2_SetLineWidth].fun!=NULL) { switch(pd->coor_type) { case g2_IntCoor: iw=dtoi(w*fabs(pd->a22)); /* to pd coordinates */ pd->ff[g2_SetLineWidth].fun(pd->pid, pd->pdp, iw); break; case g2_DoubleCoor: dw=w*fabs(pd->a22); /* to pd coordinates */ pd->ff[g2_SetLineWidth].fun(pd->pid, pd->pdp, dw); break; } } else { /* emulate ... with .... */ } } /* * * Set dash * */ void g2_set_dash_pd(g2_physical_device *pd, int N, double *dashes) { int j; double *dd=NULL; int *id=NULL; if(pd->ff[g2_SetDash].fun!=NULL) { switch(pd->coor_type) { case g2_IntCoor: if(dashes!=NULL) { id=g2_malloc(N*sizeof(int)); for(j=0;ja22)); pd->ff[g2_SetDash].fun(pd->pid, pd->pdp, N, id); g2_free(id); } else pd->ff[g2_SetDash].fun(pd->pid, pd->pdp, 0, NULL); break; case g2_DoubleCoor: if(dashes!=NULL) { dd=g2_malloc(N*sizeof(double)); for(j=0;ja22); pd->ff[g2_SetDash].fun(pd->pid, pd->pdp, N, dd); g2_free(dd); break; } else pd->ff[g2_SetDash].fun(pd->pid, pd->pdp, 0, NULL); } } else { /* emulate ... with .... */ } } /* * * Query pointer position and button state * */ void g2_query_pointer_pd(g2_physical_device *pd, double *x, double *y, unsigned int *button) { int ix, iy; double dx, dy; if(pd->ff[g2_QueryPointer].fun!=NULL) { switch(pd->coor_type) { case g2_IntCoor: pd->ff[g2_QueryPointer].fun(pd->pid, pd->pdp, &ix, &iy, button); g2_pdc2uc(pd, ix, iy, x, y); break; case g2_DoubleCoor: pd->ff[g2_QueryPointer].fun(pd->pid, pd->pdp, &dx, &dy, button); g2_pdc2uc(pd, dx, dy, x, y); break; } } else { /* no emulation for query pointer */ } } /* * * Get low level handles * */ void g2_get_pd_handles_pd(g2_physical_device *pd, void *handles[G2_PD_HANDLES_SIZE]) { if(pd->ff[g2_GetPDHandles].fun!=NULL) { pd->ff[g2_GetPDHandles].fun(pd->pid, pd->pdp, handles); } else { /* no emulation for low level handles */ } }