28 #if !defined ( __CYGWIN__ )    32 #define _T( a )    __TEXT( a )    35 #define GWL_USERDATA    GWLP_USERDATA    36 #define GCL_HCURSOR     GCLP_HCURSOR    43 #ifdef PL_HAVE_FREETYPE    64 #ifndef max_number_of_grey_levels_used_in_text_smoothing    65 #define max_number_of_grey_levels_used_in_text_smoothing    64    73 PLDLLIMPEXP_DRIVER const char* plD_DEVICE_INFO_wingcc = 
"wingcc:Win32 (GCC):1:wingcc:9:wingcc\n";
   125     struct wingcc_Dev *push;           
   133 void plD_line_wingcc( 
PLStream *, 
short, 
short, 
short, 
short );
   134 void plD_polyline_wingcc( 
PLStream *, 
short *, 
short *, 
PLINT );
   142 #ifdef PL_HAVE_FREETYPE   144 static void plD_pixel_wingcc( 
PLStream *
pls, 
short x, 
short y );
   145 static void plD_pixelV_wingcc( 
PLStream *
pls, 
short x, 
short y );
   147 static void plD_set_pixel_wingcc( 
PLStream *
pls, 
short x, 
short y, 
PLINT colour );
   148 static void plD_set_pixelV_wingcc( 
PLStream *
pls, 
short x, 
short y, 
PLINT colour );
   159 static int GetRegValue( TCHAR *key_name, TCHAR *key_word, 
char *
buffer, 
int size );
   160 static int SetRegValue( TCHAR *key_name, TCHAR *key_word, 
char *
buffer, 
int dwType, 
int size );
   162 static void plD_fill_polygon_wingcc( 
PLStream *
pls );
   165 static void UpdatePageMetrics( 
PLStream *
pls, 
char flag );
   167 #define SetRegStringValue( a, b, c )       SetRegValue( a, b, c, REG_SZ, strlen( c ) + 1 )   168 #define SetRegBinaryValue( a, b, c, d )    SetRegValue( a, b, (char *) c, REG_BINARY, d )   169 #define SetRegIntValue( a, b, c )          SetRegValue( a, b, (char *) c, REG_DWORD, 4 )   170 #define GetRegStringValue( a, b, c, d )    GetRegValue( a, b, c, d )   171 #define GetRegIntValue( a, b, c )          GetRegValue( a, b, (char *) c, 4 )   172 #define GetRegBinaryValue( a, b, c, d )    GetRegValue( a, b, (char *) c, d )   178 #if defined ( _MSC_VER )   179   #define Debug( a )           do { if ( pls->debug ) { fprintf( stderr, ( a ) ); } } while ( 0 )   180   #define Debug2( a, b )       do { if ( pls->debug ) { fprintf( stderr, ( a ), ( b ) ); } } while ( 0 )   181   #define Debug3( a, b, c )    do { if ( pls->debug ) { fprintf( stderr, ( a ), ( b ), ( c ) ); } } while ( 0 )   182 #elif defined ( __BORLANDC__ )   183   #define Debug     if ( pls->debug ) printf   184   #define Debug2    if ( pls->debug ) printf   185   #define Debug3    if ( pls->debug ) printf   187   #define Verbose( ... )     do { if ( pls->verbose ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )   188   #define Debug( ... )       do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )   189   #define Debug2( ... )      do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )   190   #define Debug3( ... )      do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )   193 #define ReportWinError()     do {                                                       \   196             FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,                \   197             NULL, GetLastError(),                                                       \   198             MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR) &lpMsgBuf, 0, NULL ); \   199         MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK | MB_ICONINFORMATION );       \   200         LocalFree( lpMsgBuf ); } while ( 0 )   202 #define CrossHairCursor()    do {                                   \   203         dev->cursor = LoadCursor( NULL, IDC_CROSS );                \   204         SetClassLong( dev->hwnd, GCL_HCURSOR, (long) dev->cursor ); \   205         SetCursor( dev->cursor ); } while ( 0 )   207 #define NormalCursor()       do {                                          \   208         dev->cursor = LoadCursor( NULL, IDC_ARROW );                       \   209         SetClassLongPtr( dev->hwnd, GCL_HCURSOR, (LONG_PTR) dev->cursor ); \   210         SetCursor( dev->cursor ); } while ( 0 )   212 #define BusyCursor()         do {                                          \   213         dev->cursor = LoadCursor( NULL, IDC_WAIT );                        \   214         SetClassLongPtr( dev->hwnd, GCL_HCURSOR, (LONG_PTR) dev->cursor ); \   215         SetCursor( dev->cursor ); } while ( 0 )   217 #define PopupPrint       0x08A1   218 #define PopupNextPage    0x08A2   219 #define PopupQuit        0x08A3   224 #ifndef ENABLE_DYNDRIVERS   241 static TCHAR* szWndClass = _T( 
"PlplotWin" );
   250 LRESULT CALLBACK PlplotWndProc( HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam )
   253     wingcc_Dev *dev = NULL;
   265     if ( nMsg == WM_CREATE )
   272 #undef GetWindowLongPtr   273 #define GetWindowLongPtr    GetWindowLong   275         pls = (
PLStream *) GetWindowLongPtr( hwnd, GWL_USERDATA ); 
   278             dev = (wingcc_Dev *) pls->
dev;
   296             Debug( 
"WM_DESTROY\t" );
   297         PostQuitMessage( 0 );
   304             Debug( 
"WM_PAINT\t" );
   305             if ( GetUpdateRect( dev->hwnd, &dev->paintrect, 
TRUE ) )
   308                 BeginPaint( dev->hwnd, &dev->ps );
   310                 if ( ( dev->waiting == 1 ) && ( dev->already_erased == 1 ) )
   312                     Debug( 
"Remaking\t" );
   314                     if ( dev->ps.fErase )
   316                         dev->oldcolour = SetBkColor( dev->hdc, RGB( pls->
cmap0[0].
r, pls->
cmap0[0].
g, pls->
cmap0[0].
b ) );
   317                         ExtTextOut( dev->hdc, 0, 0, ETO_OPAQUE, &dev->rect, _T( 
"" ), 0, 0 );
   318                         SetBkColor( dev->hdc, dev->oldcolour );
   323                     dev->already_erased++;
   325                 else if ( ( dev->waiting == 1 ) && ( dev->already_erased == 2 ) )
   327                     dev->oldobject = SelectObject( dev->hdc2, dev->bitmap );
   328                     BitBlt( dev->hdc, dev->paintrect.left, dev->paintrect.top,
   329                         dev->paintrect.right, dev->paintrect.bottom,
   330                         dev->hdc2, dev->paintrect.left, dev->paintrect.top, SRCCOPY );
   331                     SelectObject( dev->hdc2, dev->oldobject );
   334                 EndPaint( dev->hwnd, &dev->ps );
   345             Debug( 
"WM_SIZE\t" );
   347             if ( dev->enterresize == 0 )
   353     case WM_ENTERSIZEMOVE:
   356             Debug( 
"WM_ENTERSIZEMOVE\t" );
   357             dev->enterresize = 1;
   363     case WM_EXITSIZEMOVE:
   366             Debug( 
"WM_EXITSIZEMOVE\t" );
   368             dev->enterresize = 0;     
   377             if ( dev->already_erased == 0 )
   379                 Debug( 
"WM_ERASEBKGND\t" );
   387                 dev->oldcolour = SetBkColor( dev->hdc, RGB( pls->
cmap0[0].
r, pls->
cmap0[0].
g, pls->
cmap0[0].
b ) );
   388                 ExtTextOut( dev->hdc, 0, 0, ETO_OPAQUE, &dev->rect, _T( 
"" ), 0, 0 );
   389                 SetBkColor( dev->hdc, dev->oldcolour );
   391                 dev->already_erased = 1;
   400             Debug( 
"WM_COMMAND\t" );
   407     return DefWindowProc( hwnd, nMsg, wParam, lParam );
   422 #ifdef PL_HAVE_FREETYPE   423     static int freetype    = 0;
   424     static int smooth_text = 0;
   425     static int save_reg    = 0;
   432     TCHAR key_name[]       = _T( 
"Software\\PLplot\\wingcc" );
   433     TCHAR Keyword_text[]   = _T( 
"freetype" );
   434     TCHAR Keyword_smooth[] = _T( 
"smooth" );
   437     DrvOpt wingcc_options[] = {
   438 #ifdef PL_HAVE_FREETYPE   439         { 
"text",   
DRV_INT, &freetype,    
"Use driver text (FreeType)"            },
   440         { 
"smooth", 
DRV_INT, &smooth_text, 
"Turn text smoothing on (1) or off (0)" },
   441         { 
"save",   
DRV_INT, &save_reg,    
"Save defaults to registary"            },
   455     if ( pls->
dev != NULL )
   456         free( (
void *) pls->
dev );
   458     pls->
dev = calloc( 1, (
size_t) 
sizeof ( wingcc_Dev ) );
   459     if ( pls->
dev == NULL )
   460         plexit( 
"plD_init_wingcc_Dev: Out of memory." );
   462     dev = (wingcc_Dev *) pls->
dev;
   478 #ifdef PL_HAVE_FREETYPE   487     GetRegIntValue( key_name, Keyword_text, &freetype );
   488     GetRegIntValue( key_name, Keyword_smooth, &smooth_text );
   496 #ifdef PL_HAVE_FREETYPE   504         SetRegIntValue( key_name, Keyword_text, &freetype );
   505         SetRegIntValue( key_name, Keyword_smooth, &smooth_text );
   516         plspage( 0., 0., 800, 600, 0, 0 );
   520     dev->height = pls->
ylength - 1;
   527     memset( &dev->wndclass, 0, sizeof ( WNDCLASSEX ) );
   530     dev->wndclass.lpszClassName = szWndClass;
   533     dev->wndclass.cbSize = 
sizeof ( WNDCLASSEX );
   536     dev->wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC | CS_PARENTDC;
   539     dev->wndclass.lpfnWndProc = PlplotWndProc;
   543     dev->wndclass.hInstance = GetModuleHandle( NULL );
   546     dev->wndclass.hIcon   = LoadIcon( NULL, IDI_APPLICATION );
   547     dev->wndclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   548     dev->wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
   550     dev->wndclass.hbrBackground = NULL;
   552     dev->wndclass.cbWndExtra = 
sizeof ( 
pls );
   559     RegisterClassEx( &dev->wndclass );
   567     programlength = strlen( pls->
program ) + 1;
   568     program       = malloc( programlength * 
sizeof ( TCHAR ) );
   569     MultiByteToWideChar( CP_UTF8, 0, pls->
program, programlength, program, programlength );
   576     dev->hwnd = CreateWindowEx( WS_EX_WINDOWEDGE + WS_EX_LEFT,
   586         dev->wndclass.hInstance,                            
   601     SetWindowLongPtr( dev->hwnd, GWL_USERDATA, (LONG_PTR) pls );
   603     SetWindowLong( dev->hwnd, GWL_USERDATA, (LONG) pls );
   606     dev->SCRN_hdc = dev->hdc = GetDC( dev->hwnd );
   612     dev->PopupMenu = CreatePopupMenu();
   613     AppendMenu( dev->PopupMenu, MF_STRING, PopupPrint, _T( 
"Print" ) );
   614     AppendMenu( dev->PopupMenu, MF_STRING, PopupNextPage, _T( 
"Next Page" ) );
   615     AppendMenu( dev->PopupMenu, MF_STRING, PopupQuit, _T( 
"Quit" ) );
   617 #ifdef PL_HAVE_FREETYPE   623         init_freetype_lv1( pls );
   624         FT = (FT_Data *) pls->
FT;
   625         FT->want_smooth_text = smooth_text;
   638     ShowWindow( dev->hwnd, SW_SHOWDEFAULT );
   639     SetForegroundWindow( dev->hwnd );
   646     if ( pls->
xdpi <= 0 ) 
   648         plspage( GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4,
   649             GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4, 0, 0, 0, 0 );
   664     GetClientRect( dev->hwnd, &dev->rect );
   665     dev->width  = dev->rect.right;
   666     dev->height = dev->rect.bottom;
   668     if ( dev->width > dev->height )           
   677     Debug2( 
"Scale = %f (FLT)\n", dev->scale );
   684         SetPolyFillMode( dev->hdc, ALTERNATE );
   686         SetPolyFillMode( dev->hdc, WINDING );
   688 #ifdef PL_HAVE_FREETYPE   691         init_freetype_lv2( pls );
   703 plD_line_wingcc( 
PLStream *pls, 
short x1a, 
short y1a, 
short x2a, 
short y2a )
   705     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   709     points[0].x = (LONG) ( x1a / dev->scale );
   710     points[1].x = (LONG) ( x2a / dev->scale );
   711     points[0].y = (LONG) ( dev->height - ( y1a / dev->scale ) );
   712     points[1].y = (LONG) ( dev->height - ( y2a / dev->scale ) );
   714     dev->oldobject = SelectObject( dev->hdc, dev->pen );
   716     if ( points[0].x != points[1].x || points[0].y != points[1].y )
   718         Polyline( dev->hdc, points, 2 );
   722         SetPixel( dev->hdc, points[0].x, points[0].y, dev->colour );
   724     SelectObject( dev->hdc, dev->oldobject );
   735 plD_polyline_wingcc( 
PLStream *pls, 
short *xa, 
short *ya, 
PLINT npts )
   737     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   739     POINT      *points = NULL;
   743         points = GlobalAlloc( GMEM_ZEROINIT | GMEM_FIXED, (
size_t) npts * 
sizeof ( POINT ) );
   744         if ( points != NULL )
   746             for ( i = 0; i < npts; i++ )
   748                 points[i].x = (LONG) ( xa[i] / dev->scale );
   749                 points[i].y = (LONG) ( dev->height - ( ya[i] / dev->scale ) );
   751             dev->oldobject = SelectObject( dev->hdc, dev->pen );
   752             Polyline( dev->hdc, points, npts );
   753             SelectObject( dev->hdc, dev->oldobject );
   754             GlobalFree( points );
   758             plexit( 
"Could not allocate memory to \"plD_polyline_wingcc\"\n" );
   770 plD_fill_polygon_wingcc( 
PLStream *pls )
   772     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   774     POINT      *points = NULL;
   779         points = GlobalAlloc( GMEM_ZEROINIT, (
size_t) pls->
dev_npts * sizeof ( POINT ) );
   781         if ( points == NULL )
   782             plexit( 
"Could not allocate memory to \"plD_fill_polygon_wingcc\"\n" );
   784         for ( i = 0; i < pls->
dev_npts; i++ )
   786             points[i].x = (
PLINT) ( pls->
dev_x[i] / dev->scale );
   787             points[i].y = (
PLINT) ( dev->height - ( pls->
dev_y[i] / dev->scale ) );
   790         dev->fillbrush = CreateSolidBrush( dev->colour );
   791         hpen           = CreatePen( PS_SOLID, 1, dev->colour );
   792         dev->oldobject = SelectObject( dev->hdc, dev->fillbrush );
   793         hpenOld        = SelectObject( dev->hdc, hpen );
   794         Polygon( dev->hdc, points, pls->
dev_npts );
   795         SelectObject( dev->hdc, dev->oldobject );
   796         DeleteObject( dev->fillbrush );
   797         SelectObject( dev->hdc, hpenOld );
   798         DeleteObject( hpen );
   799         GlobalFree( points );
   810 static void CopySCRtoBMP( 
PLStream *pls )
   812     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   818     if ( dev->hdc2 != NULL )
   819         DeleteDC( dev->hdc2 );
   820     if ( dev->bitmap != NULL )
   821         DeleteObject( dev->bitmap );
   823     dev->hdc2 = CreateCompatibleDC( dev->hdc );
   824     GetClientRect( dev->hwnd, &dev->rect );
   825     dev->bitmap    = CreateCompatibleBitmap( dev->hdc, dev->rect.right, dev->rect.bottom );
   826     dev->oldobject = SelectObject( dev->hdc2, dev->bitmap );
   827     BitBlt( dev->hdc2, 0, 0, dev->rect.right, dev->rect.bottom, dev->hdc, 0, 0, SRCCOPY );
   828     SelectObject( dev->hdc2, dev->oldobject );
   836     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   838     Debug( 
"End of the page\n" );
   840     dev->already_erased = 2;
   851     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   853     FT_Data    *FT = (FT_Data *) pls->
FT;
   855     Debug( 
"Start of Page\t" );
   863     dev->already_erased = 0;
   864     RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
   872     wingcc_Dev *dev = NULL;
   874 #ifdef PL_HAVE_FREETYPE   877         FT_Data *FT = (FT_Data *) pls->
FT;
   879         plD_FreeType_Destroy( pls );
   882     Debug( 
"plD_tidy_wingcc" );
   884     if ( pls->
dev != NULL )
   886         dev = (wingcc_Dev *) pls->
dev;
   888         DeleteMenu( dev->PopupMenu, PopupPrint, 0 );
   889         DeleteMenu( dev->PopupMenu, PopupNextPage, 0 );
   890         DeleteMenu( dev->PopupMenu, PopupQuit, 0 );
   891         DestroyMenu( dev->PopupMenu );
   893         if ( dev->hdc2 != NULL )
   894             DeleteDC( dev->hdc2 );
   895         if ( dev->hdc != NULL )
   896             ReleaseDC( dev->hwnd, dev->hdc );
   897         if ( dev->bitmap != NULL )
   898             DeleteObject( dev->bitmap );
   907     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   909     Debug( 
"Wait for user input\n" );
   912     while ( dev->waiting == 1 && GetMessage( &dev->msg, NULL, 0, 0 ) )
   914         TranslateMessage( &dev->msg );
   915         switch ( (
int) dev->msg.message )
   919             TrackPopupMenu( dev->PopupMenu, TPM_CENTERALIGN | TPM_RIGHTBUTTON, LOWORD( dev->msg.lParam ),
   920                 HIWORD( dev->msg.lParam ), 0, dev->hwnd, NULL );
   924             if ( ( (TCHAR) ( dev->msg.wParam ) == 32 ) ||
   925                  ( (TCHAR) ( dev->msg.wParam ) == 13 ) )
   929             else if ( ( (TCHAR) ( dev->msg.wParam ) == 27 ) ||
   930                       ( (TCHAR) ( dev->msg.wParam ) == 
'q' ) ||
   931                       ( (TCHAR) ( dev->msg.wParam ) == 
'Q' ) )
   934                 PostQuitMessage( 0 );
   938         case WM_LBUTTONDBLCLK:
   939             Debug( 
"WM_LBUTTONDBLCLK\t" );
   944             switch ( LOWORD( dev->msg.wParam ) )
   947                 Debug( 
"PopupPrint" );
   951                 Debug( 
"PopupNextPage" );
   955                 Debug( 
"PopupQuit" );
   957                 PostQuitMessage( 0 );
   963             DispatchMessage( &dev->msg );
   979     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
   994     if ( dev->pen != NULL )
   995         DeleteObject( dev->pen );
   996     dev->pen = CreatePen( PS_SOLID, pls->
width, dev->colour );
  1008     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1015     crosshair = LoadCursor( GetModuleHandle( NULL ), IDC_CROSS );
  1016     previous  = SetCursor( crosshair );
  1018     while ( gin->
pX < 0 )
  1020         GetMessage( &dev->msg, NULL, 0, 0 );
  1021         TranslateMessage( &dev->msg );
  1022         switch ( (
int) dev->msg.message )
  1024         case WM_LBUTTONDOWN:
  1025             if ( dev->msg.wParam & MK_LBUTTON )
  1027                 gin->
pX = dev->msg.pt.x;
  1028                 gin->
pY = dev->msg.pt.y;
  1029                 gin->
dX = (
PLFLT) gin->
pX / ( dev->width - 1 );
  1030                 gin->
dY = 1.0 - (
PLFLT) gin->
pY / ( dev->height - 1 );
  1038             gin->
pX = dev->msg.pt.x;
  1039             gin->
pY = dev->msg.pt.y;
  1040             gin->
dX = (
PLFLT) gin->
pX / ( dev->width - 1 );
  1041             gin->
dY = 1.0 - (
PLFLT) gin->
pY / ( dev->height - 1 );
  1045             gin->
keysym = dev->msg.wParam;
  1052     SetCursor( previous );
  1074     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1083         plD_fill_polygon_wingcc( pls );
  1090         if ( *(
PLINT *) ( ptr ) == 0 )
  1091             SetROP2( dev->hdc, R2_COPYPEN );
  1093             SetROP2( dev->hdc, R2_XORPEN );
  1096 #ifdef PL_HAVE_FREETYPE  1098         plD_render_freetype_text( pls, (
EscText *) ptr );
  1122 static void Resize( 
PLStream *pls )
  1124     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1126     FT_Data    *FT = (FT_Data *) pls->
FT;
  1128     Debug( 
"Resizing" );
  1130     if ( dev->waiting == 1 )     
  1132         memcpy( &dev->oldrect, &dev->rect, sizeof ( RECT ) );
  1133         GetClientRect( dev->hwnd, &dev->rect );
  1134         Debug3( 
"[%d %d]", dev->rect.right, dev->rect.bottom );
  1136         if ( ( dev->rect.right > 0 ) && ( dev->rect.bottom > 0 ) )            
  1138             if ( memcmp( &dev->rect, &dev->oldrect, sizeof ( RECT ) ) != 0 )  
  1140                 dev->already_erased = 0;
  1141                 dev->width          = dev->rect.right;
  1142                 dev->height         = dev->rect.bottom;
  1143                 if ( dev->width > dev->height )     
  1152 #ifdef PL_HAVE_FREETYPE  1155                     FT->scale = dev->scale;
  1156                     FT->ymax  = dev->height;
  1160             RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
  1164             memcpy( &dev->rect, &dev->oldrect, sizeof ( RECT ) ); 
  1178 static int SetRegValue( TCHAR *key_name, TCHAR *key_word, 
char *
buffer, 
int dwType, 
int size )
  1182     DWORD lpdwDisposition;
  1190         REG_OPTION_NON_VOLATILE,                   
  1197     if ( j == ERROR_SUCCESS )
  1199         RegSetValueEx( hKey, key_word, 0, dwType, buffer, size );
  1200         RegCloseKey( hKey );
  1214 static int GetRegValue( TCHAR *key_name, TCHAR *key_word, 
char *buffer, 
int size )
  1221     if ( RegOpenKeyEx( HKEY_CURRENT_USER, key_name, 0, KEY_READ, &hKey ) == ERROR_SUCCESS )
  1223         if ( RegQueryValueEx( hKey, key_word, 0, (LPDWORD) &dwType, buffer, (LPDWORD) &dwSize ) == ERROR_SUCCESS )
  1227         RegCloseKey( hKey );
  1232 #ifdef PL_HAVE_FREETYPE  1241 static void plD_pixel_wingcc( 
PLStream *pls, 
short x, 
short y )
  1243     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1245     SetPixel( dev->hdc, x, y, dev->colour );
  1248 static void plD_pixelV_wingcc( 
PLStream *pls, 
short x, 
short y )
  1250     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1252     SetPixelV( dev->hdc, x, y, dev->colour );
  1263 static void plD_set_pixel_wingcc( 
PLStream *pls, 
short x, 
short y, 
PLINT colour )
  1265     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1267     SetPixel( dev->hdc, x, y, colour );
  1270 static void plD_set_pixelV_wingcc( 
PLStream *pls, 
short x, 
short y, 
PLINT colour )
  1272     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1274     SetPixelV( dev->hdc, x, y, colour );
  1284 static PLINT plD_read_pixel_wingcc( 
PLStream *pls, 
short x, 
short y )
  1286     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1288     return ( GetPixel( dev->hdc, x, y ) );
  1301 static void init_freetype_lv1( 
PLStream *pls )
  1305     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1307     plD_FreeType_init( pls );
  1309     FT = (FT_Data *) pls->
FT;
  1318     x = GetDeviceCaps( dev->hdc, RASTERCAPS );
  1320     if ( x & RC_BITBLT )
  1321         FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
  1323         FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
  1330     if ( GetDeviceCaps( dev->hdc, BITSPIXEL ) > 24 )
  1332         FT->BLENDED_ANTIALIASING = 1;
  1333         FT->read_pixel           = (plD_read_pixel_fp) plD_read_pixel_wingcc;
  1335         if ( x & RC_BITBLT )
  1336             FT->set_pixel = (plD_set_pixel_fp) plD_set_pixelV_wingcc;
  1338             FT->set_pixel = (plD_set_pixel_fp) plD_set_pixel_wingcc;
  1367 static void init_freetype_lv2( 
PLStream *pls )
  1369     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1370     FT_Data    *FT  = (FT_Data *) pls->
FT;
  1372     FT->scale    = dev->scale;
  1373     FT->ymax     = dev->height;
  1376     if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 0 ) )           
  1378         FT->ncol0_org   = pls->
ncol0;                                                   
  1379         FT->ncol0_xtra  = 16777216 - ( pls->
ncol1 + pls->
ncol0 );                       
  1380         FT->ncol0_width = max_number_of_grey_levels_used_in_text_smoothing;             
  1381         FT->ncol0_width = max_number_of_grey_levels_used_in_text_smoothing;             
  1390             level_save = pls->
level;
  1392             pl_set_extended_cmap0( pls, FT->ncol0_width, FT->ncol0_org ); 
  1393             pls->
level = level_save;
  1395         FT->smooth_text = 1;                                                       
  1397     else if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 1 ) ) 
  1399         FT->smooth_text = 1;
  1413 static void UpdatePageMetrics( 
PLStream *pls, 
char flag )
  1415     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1417     FT_Data    *FT = (FT_Data *) pls->
FT;
  1422         dev->width  = GetDeviceCaps( dev->hdc, HORZRES ); 
  1423         dev->height = GetDeviceCaps( dev->hdc, VERTRES );
  1427         GetClientRect( dev->hwnd, &dev->rect );
  1428         dev->width  = dev->rect.right;
  1429         dev->height = dev->rect.bottom;
  1432     if ( dev->width > dev->height )     
  1441   #ifdef PL_HAVE_FREETYPE  1444         FT->scale = dev->scale;
  1445         FT->ymax  = dev->height;
  1446         if ( GetDeviceCaps( dev->hdc, RASTERCAPS ) & RC_BITBLT )
  1447             FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
  1449             FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
  1453     pls->
xdpi = GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4;
  1454     pls->
ydpi = GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4;
  1467 static void PrintPage( 
PLStream *pls )
  1469     wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
  1471     FT_Data    *FT = (FT_Data *) pls->
FT;
  1481     ZeroMemory( &docinfo, 
sizeof ( docinfo ) );
  1482     docinfo.cbSize      = 
sizeof ( docinfo );
  1483     docinfo.lpszDocName = _T( 
"Plplot Page" );
  1489     ZeroMemory( &Printer, 
sizeof ( PRINTDLG ) );
  1490     Printer.lStructSize = 
sizeof ( PRINTDLG );
  1491     Printer.hwndOwner   = dev->hwnd;
  1492     Printer.Flags       = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
  1493     Printer.nCopies     = 1;
  1501     if ( PrintDlg( &Printer ) != 0 )
  1512         if ( ( dev->push = GlobalAlloc( GMEM_ZEROINIT, 
sizeof ( wingcc_Dev ) ) ) != NULL )
  1515             memcpy( dev->push, dev, sizeof ( wingcc_Dev ) );
  1517             dev->hdc = dev->PRNT_hdc = Printer.hDC; 
  1519             UpdatePageMetrics( pls, 1 );
  1521           #ifdef PL_HAVE_FREETYPE  1524                 dev->FT_smooth_text = FT->smooth_text; 
  1525                 FT->smooth_text     = 0;
  1533             StartDoc( dev->hdc, &docinfo );
  1541             dev->hdc = dev->SCRN_hdc;  
  1542             UpdatePageMetrics( pls, 0 );
  1544           #ifdef PL_HAVE_FREETYPE  1547                 FT->smooth_text = dev->FT_smooth_text;
  1550             memcpy( dev, dev->push, sizeof ( wingcc_Dev ) ); 
  1552             GlobalFree( dev->push );
  1554             RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
  1568 #endif                          // PLD_wingccdev int plParseDrvOpts(DrvOpt *acc_opt)
void plexit(PLCHAR_VECTOR errormsg)
#define PLESC_DOUBLEBUFFERING
void(* plD_tidy_fp)(struct PLStream_struct *)
PLDLLIMPEXP_DRIVER void plD_dispatch_init_wingcc(PLDispatchTable *pdt)
void plGinInit(PLGraphicsIn *gin)
void(* plD_init_fp)(struct PLStream_struct *)
void(* plD_eop_fp)(struct PLStream_struct *)
void(* plD_wait_fp)(struct PLStream_struct *)
void(* plD_line_fp)(struct PLStream_struct *, short, short, short, short)
void(* plD_esc_fp)(struct PLStream_struct *, PLINT, void *)
void(* plD_polyline_fp)(struct PLStream_struct *, short *, short *, PLINT)
static PLCHAR_VECTOR program
void plP_setpxl(PLFLT xpmm, PLFLT ypmm)
#define PLDLLIMPEXP_DRIVER
static PLStream * pls[PL_NSTREAMS]
void plP_setphy(PLINT xmin, PLINT xmax, PLINT ymin, PLINT ymax)
void plRemakePlot(PLStream *pls)
void(* plD_bop_fp)(struct PLStream_struct *)
plD_polyline_fp pl_polyline
void(* plD_state_fp)(struct PLStream_struct *, PLINT)