359 lines
8.6 KiB
C++
359 lines
8.6 KiB
C++
/*********************************************************/
|
|
/* 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 <fcntl.h>
|
|
#include <errno.h>
|
|
#include <io.h>
|
|
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<rc;i++)
|
|
{
|
|
if (buffer[i]=='\n')
|
|
{ line[j]=0;
|
|
::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line);
|
|
j=0;
|
|
}
|
|
else
|
|
line[j++]=buffer[i];
|
|
}
|
|
line[j]=0; //flush the buffer
|
|
::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void CTestw32Dlg::OnDestroy()
|
|
{ int rc;
|
|
CDialog::OnDestroy();
|
|
if (spool_thread!=0)
|
|
{
|
|
rc=TerminateThread(spool_thread,2);
|
|
spool_thread=0;
|
|
}
|
|
dup2(old_std,_fileno(stdout));
|
|
dup2(old_err,_fileno(stderr));
|
|
}
|