⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 baseresource.cc

📁 蒙特卡洛仿真源代码很有参考价值要按照步骤进行操作
💻 CC
字号:
// Baseresource.cc for bbtools - tools to display resources in X11.////  Copyright (c) 1998-2000 John Kennis, jkennis@chello.nl////  This program is free software; you can redistribute it and/or modify//  it under the terms of the GNU General Public License as published by//  the Free Software Foundation; either version 2 of the License, or//  (at your option) any later version.////  This program 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 General Public License for more details.////  You should have received a copy of the GNU General Public License//  along with this program; if not, write to the Free Software//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.//// (See the included file COPYING / GPL-2.0)//#include <stdlib.h>#include "bbsmount.hh"#include "Baseresource.hh"#include "blackboxstyle.hh"BaseResource::BaseResource(ToolWindow *toolwindow){	XrmValue value;	char *value_type;	bbtool=toolwindow;	style.style_filename=NULL;	style.conf_filename=NULL;	if (bbtool->nobb_config) {		ReadBBtoolResource();		ResourceType=BBTOOLS;	} else {		char *homedir = getenv("HOME");		bbtool->config_filename = new char[strlen(homedir) + 32];		sprintf(bbtool->config_filename, "%s/.blackboxrc", homedir);		if ((resource_db = XrmGetFileDatabase(bbtool->config_filename))!=NULL) {			ReadBlackboxResource();			ResourceType=BLACKBOX;		} else {			ReadBBtoolResource();			ResourceType=BBTOOLS;		}	}	if (XrmGetResource(resource_db, "session.colorsPerChannel",	                   "Session.ColorsPerChannel", &value_type, &value)) {		if (sscanf(value.addr, "%d", &bbtool->colors_per_channel) != 1) {			bbtool->colors_per_channel = 4;		} else {			if (bbtool->colors_per_channel < 2) bbtool->colors_per_channel = 2;			if (bbtool->colors_per_channel > 6) bbtool->colors_per_channel = 6;		}	} else		bbtool->colors_per_channel = 4;	if (XrmGetResource(resource_db, "session.imageDither",	                   "Session.ImageDither", &value_type, &value)) {		if (! strncasecmp("true", value.addr, value.size))			bbtool->image_dither = True;		else			bbtool->image_dither = False;	} else		bbtool->image_dither = True;	if (bbtool->image_dither &&	        bbtool->getCurrentScreenInfo()->getVisual()->c_class == TrueColor	        && bbtool->getCurrentScreenInfo()->getDepth() >= 24)		bbtool->image_dither = False;	/* Need to do this here */	bbtool->setupImageControl();}void BaseResource::Load(){	LoadBBToolResource();	XrmDestroyDatabase(resource_db);}BaseResource::~BaseResource(){	delete [] style.style_filename;	delete [] style.conf_filename;	style.style_filename=NULL;	style.conf_filename=NULL;}void BaseResource::CopyColor(BColor *Color1,BColor *Color2){	Color2->setPixel(Color1->getPixel());	Color2->setRGB(Color1->getRed(),Color1->getGreen(),Color1->getBlue());}void BaseResource::CopyTexture(BTexture Texture1,BTexture *Texture2){	CopyColor(Texture1.getColor(),Texture2->getColor());	CopyColor(Texture1.getColorTo(),Texture2->getColorTo());	CopyColor(Texture1.getHiColor(),Texture2->getHiColor());	CopyColor(Texture1.getLoColor(),Texture2->getLoColor());	Texture2->setTexture(Texture1.getTexture());}void BaseResource::Reload(){	switch (ResourceType) {	case BBTOOLS:		{			ReadBBtoolResource();		}		break;	case BLACKBOX:		{			if ((resource_db = XrmGetFileDatabase(bbtool->config_filename))!=NULL)				ReadBlackboxResource();		}		break;	}	LoadBBToolResource();	XrmDestroyDatabase(resource_db);}bool BaseResource::ReadResourceFromFilename(char *rname, char *rclass){	struct stat file_status;	char *filename=NULL;	XrmValue value;	char *value_type;	if (XrmGetResource(resource_db,rname,rclass, &value_type, &value))	{		int len = strlen(value.addr);		delete [] filename;		filename = new char[len + 1];		memset(filename, 0, len + 1);		strncpy(filename, value.addr, len);		if (stat(filename,&file_status)!=0)		{			db=NULL;			delete [] filename;			return(False);		}		db = XrmGetFileDatabase(filename);		delete [] filename;		return(True);	}	db=NULL;	delete [] filename;	return(False);}void BaseResource::ReadBBtoolResource(){	if (bbtool->config_file) {		if ((resource_db = XrmGetFileDatabase(bbtool->config_file))==NULL) {			fprintf(stderr,"Could not open config file: %s\n",			        bbtool->config_file);			fprintf(stderr,"Using internal defaults.\n");		} else			bbtool->config_filename=bbtool->config_file;	} else {		delete [] style.conf_filename;		char *homedir = getenv("HOME");		int len=strlen(homedir) + strlen(BBTOOL_LOCAL);		style.conf_filename = new char[len+2];		memset(style.conf_filename, 0, len + 2);		sprintf(style.conf_filename, "%s/%s", homedir,BBTOOL_LOCAL);		if ((resource_db = XrmGetFileDatabase(style.conf_filename))==NULL) {			delete [] style.conf_filename;			int len=strlen(BBTOOL_GLOBAL);			style.conf_filename = new char[len + 1];			memset(style.conf_filename, 0, len + 1);			strncpy(style.conf_filename,BBTOOL_GLOBAL, len);			if ((resource_db = XrmGetFileDatabase(style.conf_filename))==NULL) {				fprintf(stderr,"Could not open default config file: %s\n",				        style.conf_filename);				fprintf(stderr,"Using internal defaults.\n");			} else				bbtool->config_filename=bbtool->config_file;		} else			bbtool->config_filename=bbtool->config_file;	}}void BaseResource::ReadBlackboxResource(){	if (!ReadResourceFromFilename("session.styleFile","Session.StyleFile")) {		fprintf(stderr,"Could not open blackbox style file\n");	} else		XrmCombineDatabase(db,&resource_db,False);	if (bbtool->config_file!=NULL) {		if ((db = XrmGetFileDatabase(bbtool->config_file))==NULL) {			fprintf(stderr,"Could not open config file: %s\n",			        bbtool->config_file);			return;		} else {			XrmCombineDatabase(db,&resource_db,True);		}	} else {		delete [] style.conf_filename;		char *homedir = getenv("HOME");		int len=strlen(homedir) + strlen(BBTOOL_LOCAL);		style.conf_filename = new char[len+2];		memset(style.conf_filename, 0, len + 2);		sprintf(style.conf_filename, "%s/%s", homedir,BBTOOL_LOCAL);		if ((db = XrmGetFileDatabase(style.conf_filename))==NULL) {			delete [] style.conf_filename;			int len=strlen(BBTOOL_GLOBAL);			style.conf_filename = new char[len + 1];			memset(style.conf_filename, 0, len + 1);			strncpy(style.conf_filename,BBTOOL_GLOBAL, len);			if ((db = XrmGetFileDatabase(style.conf_filename))==NULL) {				fprintf(stderr,"Could not open default config file: %s\n",				        style.conf_filename);				fprintf(stderr,"Using internal defaults.\n");				return;			} else XrmCombineDatabase(db,&resource_db,True);		} else XrmCombineDatabase(db,&resource_db,True);	}}void BaseResource::readTexture(char *rname,char *rclass, char *bbname,                               char *bbclass,char *dcolor,char *dcolorTo,                               char *dtexture,BTexture *texture){	readDatabaseTexture(rname,rclass,bbname,bbclass,dcolor,dcolorTo,dtexture,	                    texture);}void BaseResource::readDatabaseTexture(char *rname, char *rclass,                                       BTexture *texture){	XrmValue value;	char *value_type;	texture->setTexture(0);	if (XrmGetResource(resource_db, rname, rclass, &value_type,	                   &value))		bbtool->getImageControl()->parseTexture(texture, value.addr);	if (texture->getTexture() & BImage_Solid)	{		int clen = strlen(rclass) + 8, nlen = strlen(rname) + 8;		char *colorclass = new char[clen], *colorname = new char[nlen];		sprintf(colorclass, "%s.Color", rclass);		sprintf(colorname,  "%s.color", rname);		readDatabaseColor(colorname, colorclass, texture->getColor());		delete [] colorclass;		delete [] colorname;		if ((! texture->getColor()->isAllocated()) ||		        (texture->getTexture() & BImage_Flat))			return;		XColor xcol;		xcol.red = (unsigned int) (texture->getColor()->getRed() +		                           (texture->getColor()->getRed() >> 1));		if (xcol.red >= 0xff) xcol.red = 0xffff;		else xcol.red *= 0xff;		xcol.green = (unsigned int) (texture->getColor()->getGreen() +		                             (texture->getColor()->getGreen() >> 1));		if (xcol.green >= 0xff) xcol.green = 0xffff;		else xcol.green *= 0xff;		xcol.blue = (unsigned int) (texture->getColor()->getBlue() +		                            (texture->getColor()->getBlue() >> 1));		if (xcol.blue >= 0xff) xcol.blue = 0xffff;		else xcol.blue *= 0xff;		if (! XAllocColor(bbtool->getXDisplay(), bbtool->getImageControl()->getColormap(),		                  &xcol))			xcol.pixel = 0;		texture->getHiColor()->setPixel(xcol.pixel);		xcol.red =		    (unsigned int) ((texture->getColor()->getRed() >> 2) +		                    (texture->getColor()->getRed() >> 1)) * 0xff;		xcol.green =		    (unsigned int) ((texture->getColor()->getGreen() >> 2) +		                    (texture->getColor()->getGreen() >> 1)) * 0xff;		xcol.blue =		    (unsigned int) ((texture->getColor()->getBlue() >> 2) +		                    (texture->getColor()->getBlue() >> 1)) * 0xff;		if (! XAllocColor(bbtool->getXDisplay(), bbtool->getImageControl()->getColormap(),		                  &xcol))			xcol.pixel = 0;		texture->getLoColor()->setPixel(xcol.pixel);	} else if (texture->getTexture() & BImage_Gradient)	{		int clen = strlen(rclass) + 10, nlen = strlen(rname) + 10;		char *colorclass = new char[clen], *colorname = new char[nlen],		                   *colortoclass = new char[clen], *colortoname = new char[nlen];		sprintf(colorclass, "%s.Color", rclass);		sprintf(colorname,  "%s.color", rname);		sprintf(colortoclass, "%s.ColorTo", rclass);		sprintf(colortoname,  "%s.colorTo", rname);		readDatabaseColor(colorname, colorclass, texture->getColor());		readDatabaseColor(colortoname, colortoclass, texture->getColorTo());		delete [] colorclass;		delete [] colorname;		delete [] colortoclass;		delete [] colortoname;	}}void BaseResource::readColor(char *rname,char *rclass, char *bbname,                             char *bbclass,char *dcolor,BColor *color){	readDatabaseColor(rname,rclass,color);	if (!color->isAllocated())	{		readDatabaseColor(bbname,bbclass,color);		if (!color->isAllocated())			bbtool->getImageControl()->parseColor(color,dcolor);	}}void BaseResource::readDatabaseTexture(char *rname, char *rclass,                                       char *bbrname,char *bbrclass,char *dcolor,                                       char* dcolorto,char *dtexture,BTexture *texture){	XrmValue value;	char *value_type;	int clen,nlen;	texture->setTexture(0);	if (XrmGetResource(resource_db, rname, rclass, &value_type,	                   &value))		bbtool->getImageControl()->parseTexture(texture, value.addr);	else		if (XrmGetResource(resource_db, bbrname, bbrclass, &value_type,		                   &value))			bbtool->getImageControl()->parseTexture(texture, value.addr);		else			bbtool->getImageControl()->parseTexture(texture, dtexture);	if (texture->getTexture() & BImage_Solid)	{		clen = strlen(rclass) + 8;		nlen = strlen(rname) + 8;		char *colorclass = new char[clen], *colorname = new char[nlen];		clen = strlen(bbrclass) + 8;		nlen = strlen(bbrname) + 8;		char *bbcolorclass = new char[clen], *bbcolorname = new char[nlen];		sprintf(colorclass, "%s.Color", rclass);		sprintf(colorname,  "%s.color", rname);		sprintf(bbcolorclass, "%s.Color", bbrclass);		sprintf(bbcolorname,  "%s.color", bbrname);		readColor(colorname,colorclass,bbcolorname,bbcolorclass,		          dcolor,texture->getColor());		delete [] colorclass;		delete [] colorname;		delete [] bbcolorclass;		delete [] bbcolorname;		if ((! texture->getColor()->isAllocated()) ||		        (texture->getTexture() & BImage_Flat))			return;		XColor xcol;		xcol.red = (unsigned int) (texture->getColor()->getRed() +		                           (texture->getColor()->getRed() >> 1));		if (xcol.red >= 0xff) xcol.red = 0xffff;		else xcol.red *= 0xff;		xcol.green = (unsigned int) (texture->getColor()->getGreen() +		                             (texture->getColor()->getGreen() >> 1));		if (xcol.green >= 0xff) xcol.green = 0xffff;		else xcol.green *= 0xff;		xcol.blue = (unsigned int) (texture->getColor()->getBlue() +		                            (texture->getColor()->getBlue() >> 1));		if (xcol.blue >= 0xff) xcol.blue = 0xffff;		else xcol.blue *= 0xff;		if (! XAllocColor(bbtool->getXDisplay(),		                  bbtool->getImageControl()->getColormap(),&xcol))			xcol.pixel = 0;		texture->getHiColor()->setPixel(xcol.pixel);		xcol.red =		    (unsigned int) ((texture->getColor()->getRed() >> 2) +		                    (texture->getColor()->getRed() >> 1)) * 0xff;		xcol.green =		    (unsigned int) ((texture->getColor()->getGreen() >> 2) +		                    (texture->getColor()->getGreen() >> 1)) * 0xff;		xcol.blue =		    (unsigned int) ((texture->getColor()->getBlue() >> 2) +		                    (texture->getColor()->getBlue() >> 1)) * 0xff;		if (! XAllocColor(bbtool->getXDisplay(), bbtool->getImageControl()->getColormap(),		                  &xcol))			xcol.pixel = 0;		texture->getLoColor()->setPixel(xcol.pixel);	} else if (texture->getTexture() & BImage_Gradient)	{		clen = strlen(rclass) + 10;		nlen = strlen(rname) + 10;		char *colorclass = new char[clen], *colorname = new char[nlen],		                   *colortoclass = new char[clen], *colortoname = new char[nlen];		clen = strlen(bbrclass) + 10;		nlen = strlen(bbrname) + 10;		char *bbcolorclass = new char[clen], *bbcolorname = new char[nlen],		                     *bbcolortoclass = new char[clen], *bbcolortoname = new char[nlen];		sprintf(colorclass, "%s.Color", rclass);		sprintf(colorname,  "%s.color", rname);		sprintf(bbcolorclass, "%s.Color", bbrclass);		sprintf(bbcolorname,  "%s.color", bbrname);		readColor(colorname,colorclass,bbcolorname,bbcolorclass,		          dcolor,texture->getColor());		sprintf(colortoclass, "%s.ColorTo", rclass);		sprintf(colortoname,  "%s.colorTo", rname);		sprintf(bbcolortoclass, "%s.ColorTo", bbrclass);		sprintf(bbcolortoname,  "%s.colorTo", bbrname);		readColor(colortoname,colortoclass,bbcolortoname,bbcolortoclass,		          dcolorto,texture->getColorTo());		delete [] colorclass;		delete [] colorname;		delete [] colortoclass;		delete [] colortoname;		delete [] bbcolorclass;		delete [] bbcolorname;		delete [] bbcolortoclass;		delete [] bbcolortoname;	}}void BaseResource::readDatabaseColor(char *rname, char *rclass, BColor *color){	XrmValue value;	char *value_type;	if (XrmGetResource(resource_db, rname, rclass, &value_type,	                   &value))		bbtool->getImageControl()->parseColor(color, value.addr);	else		// parsing with no color string just deallocates the color, if it has		// been previously allocated		bbtool->getImageControl()->parseColor(color);}

⌨️ 快捷键说明

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