📄 avidibtcl.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 + -