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 + -
显示快捷键?