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

📄 avidibtcl.cpp

📁 G729语音压缩的很好的离子和示范 大家来下载吧
💻 CPP
字号:
// avidibtcl.cpp
// Emmanuel Grolleau (c) 2002
// This file is a part of AviCapTcl
// Describes the interface between the class TCLAVIFile and tcl/tk

// Version 1.0.0.0
// Last modification 02/26/2002

#include "DIBtcl.h"

#define EXTRACT_TCL_INT(obj,intptr) if (Tcl_GetIntFromObj(interp,obj,intptr)==TCL_ERROR) {return TCL_ERROR;}

// Internal functions prototypes/////////////////////////////////////////////////////////////////
int dibCmdBegin(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int dibCmdEnd(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int dibCmdDraw(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int dibCmdRefresh(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int dibCmdDestroy(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int dibCmdGetSize(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
int dibCmdSetSize(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]);
/////////////////////////////////////////////////////////////////////////////////////////////////

// Command names
static const char * CmdNames[]= {
	"begin","end","draw","refresh","destroy","getsize","setsize"
};
static const Tcl_ObjCmdProc * CmdProcs[]= {
	dibCmdBegin,dibCmdEnd,dibCmdDraw,dibCmdRefresh,dibCmdDestroy,dibCmdGetSize,dibCmdSetSize
};

static Tcl_HashTable dibCommands;
// HashTable containing the dib command names and associated functions

// Implementation
void dibInit() {
	Tcl_InitHashTable(&dibCommands, TCL_STRING_KEYS);
	int ok;
	for (int i=0;i<sizeof(CmdProcs)/sizeof(CmdProcs[0]);i++) {
		Tcl_HashEntry * entry=Tcl_CreateHashEntry(&dibCommands, CmdNames[i], &ok);
		Tcl_SetHashValue(entry, (ClientData)CmdProcs[i]);
	}
}

int dibDispatch(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj *CONST argv[]) {
	if (argc==1) {
		Tcl_SetResult(interp,"dib: no command given",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl * dib=(CDibTcl *)clientData;
	Tcl_HashEntry * entry=Tcl_FindHashEntry(&dibCommands, Tcl_GetString(argv[1]));
	if (entry==NULL) {
		// bad command
		static char msg[1024];
		memset(msg,0,1024);
		strcat(msg,"dib: bad option ");
		strcat(msg,Tcl_GetString(argv[1]));
		strcat(msg," must be:");
		for (int i=0;i<sizeof(CmdProcs)/sizeof(CmdProcs[0]);i++) {
			strcat(msg," ");
			strcat(msg,CmdNames[i]);
		}
		Tcl_SetResult(interp,msg,TCL_STATIC);
		return TCL_ERROR;

	}
	Tcl_ObjCmdProc *proc=(Tcl_ObjCmdProc*)Tcl_GetHashValue(entry);
	return (*proc)(clientData,interp,argc,argv);
}

int dibCmd(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	// Creates a new avifile widget
	if (argc<4) {
		Tcl_SetResult(interp,"syntax:dib pathname w h",TCL_STATIC);
		return TCL_ERROR;
	}
	int w,h;
	EXTRACT_TCL_INT(argv[2],&w);
	EXTRACT_TCL_INT(argv[3],&h);
	Tcl_CmdInfo cmdinfo;
	if (Tcl_GetCommandInfo(interp, Tcl_GetString(argv[1]), &cmdinfo)) {
		Tcl_SetResult(interp,"dib:object already exists",TCL_STATIC);
		return TCL_ERROR;
	}
	BOOL ok;
	CDibTcl *Dib=new CDibTcl(Tcl_GetString(argv[1]),interp,ok,w,h);
	if (!ok) {
		Tcl_SetResult(interp,"dib: error while creating window",TCL_STATIC);
		return TCL_ERROR;
	}
	Tcl_CreateObjCommand(interp, Tcl_GetString(argv[1]), dibDispatch,
		(ClientData)Dib, (Tcl_CmdDeleteProc *)NULL);
	Tcl_SetObjResult(interp,argv[1]);
	return TCL_OK;
}
int dibCmdBegin(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=3) {
		Tcl_SetResult(interp,"syntax: dibpathname begin bitmapinfo",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	LPBITMAPINFO bih=(LPBITMAPINFO)Tcl_GetByteArrayFromObj(argv[2],0);
	if (!dib->BeginDIB(bih,0)) {
		Tcl_SetResult(interp,"dib:cannot begin dib",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}
int dibCmdEnd(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=2) {
		Tcl_SetResult(interp,"syntax: dibpathname end",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	if (!dib->EndDIB()) {
		Tcl_SetResult(interp,"dib:cannot end dib",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}
int dibCmdDraw(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=3) {
		Tcl_SetResult(interp,"syntax: dibpathname draw data",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	if (!dib->DrawDIB((LPVOID)Tcl_GetByteArrayFromObj(argv[2],0))) {
		Tcl_SetResult(interp,"dib:cannot draw data to dib",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}
int dibCmdRefresh(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=2) {
		Tcl_SetResult(interp,"syntax: dibpathname refresh",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	if (!dib->Refresh()) {
		Tcl_SetResult(interp,"dib:cannot refresh dib",TCL_STATIC);
		return TCL_ERROR;
	}
	return TCL_OK;
}
int dibCmdDestroy(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=2) {
		Tcl_SetResult(interp,"syntax: dibpathname destroy",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	delete dib;
	Tcl_DeleteCommand(interp,Tcl_GetString(argv[0]));
	return TCL_OK;
}
int dibCmdGetSize(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=2) {
		Tcl_SetResult(interp,"syntax: dibpathname getsize",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	CSize s=dib->GetSize();
	Tcl_AppendElement(interp,Tcl_GetString(Tcl_NewIntObj(s.cx)));
	Tcl_AppendElement(interp,Tcl_GetString(Tcl_NewIntObj(s.cy)));
	return TCL_OK;
}
int dibCmdSetSize(ClientData clientData, Tcl_Interp *interp,int argc, Tcl_Obj *CONST argv[]) {
	if (argc!=4) {
		Tcl_SetResult(interp,"syntax: dibpathname setsize w h",TCL_STATIC);
		return TCL_ERROR;
	}
	CDibTcl *dib=(CDibTcl *)clientData;
	CSize s;
	int tmp;
	EXTRACT_TCL_INT(argv[2],&tmp);
	s.cx=tmp;
	EXTRACT_TCL_INT(argv[3],&tmp);
	s.cy=tmp;
	dib->SetSize(s);
	return TCL_OK;
}

⌨️ 快捷键说明

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