color.c

来自「gsac程序包」· C语言 代码 · 共 522 行 · 第 1/2 页

C
522
字号
/* File>>> color.c---- %M% -- version %I% (IMEC)            last updated: %E%---- Copyright (c) 1993-- IMEC vzw-- Kapeldreef 75-- B-3001 LEUVEN-- BELGIUM---- Author   : A. Demaree---- Date     : February 1, 1993---- Function :---- Comment  :---- Review   :--*//* Revision history	09 01 99 - put in the second pass at getting colors for		depth = 8 displays - required for Laptop running Gnome        12 08 00 - put in a check for 24 bit color*//*-------------------------------------------------------------------------------- Global include files------------------------------------------------------------------------------*/#include <stdlib.h>#include <stdio.h>#include <string.h>#include <X11/Xlib.h>/*-------------------------------------------------------------------------------- Local include files------------------------------------------------------------------------------*/#include "xviglocal.h"/*-------------------------------------------------------------------------------- Static variable declarations------------------------------------------------------------------------------*/static Colormap colormap;static XColor *color;static int nr_of_colors;static int def_colmap[XviG_NR_OF_COLORS][3] =                              { {   0,   0,   0 },     /* black        */                                { 255, 255, 255 },     /* white        */                                { 255,   0,   0 },     /* red          */                                {   0, 255,   0 },     /* green        */                                {   0,   0, 255 },     /* blue         */                                {   0, 255, 255 },     /* cyan         */                                { 255,   0, 255 },     /* magenta      */                                { 255, 255,   0 },     /* yellow       */                                { 255, 127,   0 },     /* orange       */                                { 127, 255,   0 },     /* green-yellow */                                {   0, 255, 127 },     /* green-cyan   */                                {   0, 127, 255 },     /* blue-cyan    */                                { 127,   0, 255 },     /* blue-magenta */                                { 255,   0, 127 },     /* red-magenta  */                                {  95,  95,  95 },     /* dark-gray    */                                { 175, 175, 175 } };   /* light-gray   *//*-------------------------------------------------------------------------------- Local function declarations------------------------------------------------------------------------------*//* RBH REQUIREMENTS FOR XVIG */static int dodither = 0;struct mydith {	int patt;	int fore;	int back;	int stip;};static int actualbg ;#ifndef RBH_NR_OF_DITHERS#define RBH_NR_OF_DITHERS  22#endifstatic struct mydith dith[35];/* order of allocating CALPLOT colors to permit	successful dithering later */static int calcol[35] =	{0, 34, 1, 33, 17, 11, 23, 6, 27,	12, 3, 8, 20, 30, 14, 25, 32,	2, 4, 5, 7, 10, 16, 19, 22, 29,	9, 13, 15, 18, 21, 24, 26, 28, 31};  static void resetdither();static void Fill01(int colmap[][3], int nr);static void rgb_to_hsv(float r, float g, float b , float *h, float *s, float *v);#define ABS(a)   ( (a) > 0   ? (a):-(a) )  /*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/void XviG_SetColor(int nr){  int local_nr;  int k,l,m,n;  unsigned long fg_color;  unsigned long bg_color;  unsigned long f_color;  unsigned long b_color;  int nr_tmp;  nr_tmp = nr % nr_of_colors;  /* safety for Xoring and color map stuff */  if(RBH_xoring_state == ON){	if(color[Abs(nr_tmp)].pixel == 0L){    /* anything XOR'd with 0 will not change */		local_nr = 1;			/* so you will not see an XOR line or color */	} else {				/* we do not want invisibility of cursors */		local_nr = nr_tmp;	}  } else {	local_nr = nr_tmp;  }if(!dodither){	if (XviG_cursor_mode){		fg_color = color[Abs(local_nr)].pixel;		bg_color = color[Abs(0)].pixel;	} else {		fg_color = color[Abs(local_nr)].pixel;		bg_color = color[Abs(0)].pixel;	}	XSetForeground(XviG_display, XviG_gc, fg_color);	XSetForeground(XviG_display, XviG_gc_fill, fg_color);	if(actualbg == 0){		/* black background - we need a white Xhair */	XviG_xhair_color = color[Abs(local_nr)].pixel		^ BlackPixel(XviG_display, XviG_screen_nr);	} else {	XviG_xhair_color = color[Abs(local_nr)].pixel		^ WhitePixel(XviG_display, XviG_screen_nr);	}/*fprintf(stderr,"fg_color: %ld\n",fg_color);fprintf(stderr,"bg_color: %ld\n",bg_color);fprintf(stderr,"   local_nr %d, color[Abs(local_nr)].pixel %ld\n",local_nr,color[Abs(local_nr)].pixel);fprintf(stderr,"   XviG_xhair_color: %ld\n",XviG_xhair_color);fprintf(stderr,"   BlackPixel(XviG_display, XviG_screen_nr) %ld\n",BlackPixel(XviG_display, XviG_screen_nr));*/} else {  /* do dither */    XSetLineAttributes(XviG_display, XviG_gc,                       1, LineSolid, CapButt, JoinMiter);		k = dith[Abs(local_nr)].fore;		l = dith[Abs(local_nr)].back;		f_color = color[k].pixel;		b_color = color[l].pixel;		if (XviG_cursor_mode){			fg_color = f_color				^ BlackPixel(XviG_display, XviG_screen_nr);			bg_color = b_color				^ BlackPixel(XviG_display, XviG_screen_nr);		} else {			fg_color = f_color;			bg_color = b_color;		}		if(dith[Abs(local_nr)].stip == 0){			/* use original color */			RBH_SetDither(0);		} else {			/* use dither */			RBH_SetDither(dith[Abs(local_nr)].patt);		}		XSetForeground(XviG_display, XviG_gc, fg_color);		XSetForeground(XviG_display, XviG_gc_fill, fg_color);		XSetBackground(XviG_display, XviG_gc, bg_color);		XSetBackground(XviG_display, XviG_gc_fill, bg_color);	if(actualbg == 0){		/* black background - we need a white Xhair */	XviG_xhair_color = color[Abs(local_nr)].pixel		^ BlackPixel(XviG_display, XviG_screen_nr);	} else {	XviG_xhair_color = color[Abs(local_nr)].pixel		^ WhitePixel(XviG_display, XviG_screen_nr);	}	}	/*	-- Save this color to set it back after an XviG_ClearWindow call	*/	XviG_save_color = fg_color;}/*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/int XviG_CreateColors(int colmap[][3],                       int nr, int depth){  int gotcolors = 0;	float h, s, v;	float r,g,b;	float hh, ss, vv;	float rr,gg,bb;	int found = 0;	int k,nr2;  XColor kolor;  if (nr == 0)  {    colmap = def_colmap;    nr_of_colors = XviG_NR_OF_COLORS;  }  else    nr_of_colors = nr;  color = (XColor *) malloc(nr_of_colors * sizeof(XColor));  /*  -- Create a color map and allocate the colors in the color map  */  colormap = DefaultColormap(XviG_display, XviG_screen_nr);  {    int i,ii;    int j;	actualbg = colmap[0][0];    for(ii = 0; ii < nr_of_colors; ii++)    {	i = calcol[ii];	color[i].red   = 257*colmap[i][0];	color[i].green = 257*colmap[i][1];	color[i].blue  = 257*colmap[i][2];	color[i].flags = DoRed | DoGreen | DoBlue;	/* initialize the dither matrix stuff */	dith[ i].patt =  0 ; 	dith[ i].fore = -1 ; 	dith[ i].back = -1 ; 	dith[ i].stip = -1 ;       if (XAllocColor(XviG_display, colormap, &color[i])){        gotcolors++;	dith[i].fore = i;	dith[i].back = i;	dith[i].stip = 0;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?