/*********************************************************/ /* Test program driver for freetype on Win32 Platform */ /* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/ /* */ /*********************************************************/ // testw32Dlg.cpp : implementation file // #include "stdafx.h" #include "testw32.h" #include "testw32dlg.h" #include "gdriver.h" #include "gevents.h" #include #include #include CWnd *button_OK,*button_Cancel; DWORD thrd_spool; // output spooler HANDLE spool_thread; //Sync data: extern "C" { HANDLE evgetevent,evdriverdisplaybitmap,this_cwnd,main_thread,listbox,bitmap; TEvent evevent; char *ev_buffer; int ev_lines,ev_columns; char *save_buffer; int save_lines,save_cols,exit_code; int ftview(int,char**); int ftdump(int,char**); int ftlint(int,char**); int ftstring(int,char**); int ftstrpnm(int,char**); int ftzoom(int,char**); int call_test_program(int (*)(int,char**),int,char **); } //pipe handling variables int pipe_std[2]={2*0},pipe_err[2]={2*0},error; int old_std,old_err; //end of pipe handling variables #define TEST_PROG_N 4 //Sync data end char ProgramName[16]; char fontname[16]; char fullfont[MAX_PATH]; char *argv[255]; int argc; DWORD WINAPI ThreadHead(LPVOID ); DWORD WINAPI ThreadSpool(LPVOID ); void readpipe(int); #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern main(int,char **); extern int X_Link; ///////////////////////////////////////////////////////////////////////////// // CTestw32Dlg dialog CTestw32Dlg::CTestw32Dlg(CWnd* pParent /*=NULL*/) : CDialog(CTestw32Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CTestw32Dlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTestw32Dlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestw32Dlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTestw32Dlg, CDialog) //{{AFX_MSG_MAP(CTestw32Dlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_SELECT_ACTION, OnSelectAction) ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestw32Dlg message handlers BOOL CTestw32Dlg::OnInitDialog() { int error; FILE *retf; CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here //save CWnd objects for utility fns; evgetevent=CreateEvent(NULL,FALSE,FALSE,"Get_Event"); evdriverdisplaybitmap=CreateEvent(NULL,FALSE,FALSE,"Driver_Display_Bitmap"); listbox=(GetDlgItem(IDC_LIST_BOX))->m_hWnd; bitmap=(GetDlgItem(IDC_BITMAP))->m_hWnd; button_OK=GetDlgItem(IDOK); button_Cancel=GetDlgItem(IDCANCEL); error=_pipe(pipe_std,1024,_O_TEXT); // error=_pipe(pipe_err,1024,_O_TEXT); // enable piping if(-1==_fileno(stdout)) {retf=freopen("throwaway_stdout.tmp","wt",stdout); } if(-1==_fileno(stderr)) {retf=freopen("throwaway_stderr.tmp","wt",stderr); } old_std=dup(_fileno(stdout)); old_err=dup(_fileno(stderr)); error=dup2(pipe_std[1],_fileno(stdout)); error=dup2(pipe_std[1],_fileno(stderr)); //error=dup2(pipe_err[1],_fileno(stderr)); save_buffer=NULL; // error=write(pipe_std[1],"Pipe_test:Write\n",16); // error=fprintf(stdout,"Pipe_test:fprintf"); // error=fflush(stdout); // activate spooler spool_thread=CreateThread(NULL,0,ThreadSpool,NULL,0,&thrd_spool); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTestw32Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CTestw32Dlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CTestw32Dlg::OnOK() { DWORD thrd_id; char Options[256]; char *p,*pb,*pe; int i; // TODO: Add extra validation here GetDlgItemText(IDC_TEST_PROGRAM,ProgramName,sizeof(ProgramName)-1); GetDlgItemText(IDC_OPTIONS,Options,sizeof(Options)-1); argv[0]=ProgramName; p=Options; i=1; while (*p!=0) { while (*p==' ') p++; pb=p; while (*p>' ') p++; pe=p; if (pe>pb) { argv[i]=new char[1+pe-pb]; strncpy(argv[i],pb,pe-pb); argv[i][pe-pb]=0; i++; } } argv[0]=ProgramName; argc=i; main_thread=CreateThread(NULL,0,ThreadHead,NULL,0,&thrd_id); // CDialog::OnOK(); } DWORD WINAPI ThreadHead(LPVOID Parm) { int i,rc; struct { char pname[16]; int (*program)(int,char**); } tab[TEST_PROG_N]= { {"FTVIEW",&ftview}, {"FTDUMP",&ftdump}, {"FTLINT",&ftlint}, {"FTSTRING",&ftstring} // {"FTSTRPNM",&ftstrpnm}, // {"FTZOOM",&ftzoom} }; //disable Ok button rc=button_OK->EnableWindow(FALSE); rc=button_Cancel->EnableWindow(FALSE); for (i=0;(i< TEST_PROG_N) &&strcmp(tab[i].pname,ProgramName);i++); if (i>= TEST_PROG_N) { MessageBox(NULL,"Please select a valid Test Program Name","FreeType Test ",MB_ICONQUESTION); } else call_test_program(tab[i].program,argc,(char **)&argv); //enable buttons again rc=button_OK->EnableWindow(TRUE); rc=button_Cancel->EnableWindow(TRUE); rc=fflush(stdout); rc=fflush(stderr); ExitThread(1); return 1; } void translate_command(char nChar) { int rc,i; // TODO: Add your message handler code here and/or call default typedef struct _Translator { char key; GEvent event_class; int event_info; } Translator; #define NUM_Translators 20 static const Translator trans[ NUM_Translators] = { { 'q', event_Quit, 0 }, { (char)27, event_Quit, 0 }, { 'x', event_Rotate_Glyph, -1 }, { 'c', event_Rotate_Glyph, 1 }, { 'v', event_Rotate_Glyph, -16 }, { 'b', event_Rotate_Glyph, 16 }, { '{', event_Change_Glyph, -10000 }, { '}', event_Change_Glyph, 10000 }, { '(', event_Change_Glyph, -1000 }, { ')', event_Change_Glyph, 1000 }, { '9', event_Change_Glyph, -100 }, { '0', event_Change_Glyph, 100 }, { 'i', event_Change_Glyph, -10 }, { 'o', event_Change_Glyph, 10 }, { 'k', event_Change_Glyph, -1 }, { 'l', event_Change_Glyph, 1 }, { '+', event_Scale_Glyph, 10 }, { '-', event_Scale_Glyph, -10 }, { 'u', event_Scale_Glyph, 1 }, { 'j', event_Scale_Glyph, -1 } }; for ( i = 0; i < NUM_Translators; i++ ) { if ( nChar == trans[i].key ) { evevent.what = trans[i].event_class; evevent.info = trans[i].event_info; break; } } if (i>= NUM_Translators) { evevent.what=event_Keyboard; evevent.what=nChar; } rc=SetEvent(evgetevent); } void CTestw32Dlg::OnSelectAction() { char c[2]; GetDlgItemText(IDC_ACTION,c,2); translate_command(c[0]); } DWORD WINAPI ThreadSpool(LPVOID Parm) { while(1) { if (pipe_std[0]) readpipe(pipe_std[0]); // will never get out of there !!!! // if (pipe_err[0]) readpipe(pipe_err[0]); Sleep(1000); } return 1; } void readpipe(int h) { int i,j,rc; char buffer[1024],line[1024]; rc=1; while(rc) { rc=read(h,buffer,sizeof(buffer)); if (rc) { j=0; for(i=0;i