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(* plD_line_fp)(struct PLStream_struct *, short, short, short, short)
void plexit(PLCHAR_VECTOR errormsg)
void(* plD_eop_fp)(struct PLStream_struct *)
void(* plD_state_fp)(struct PLStream_struct *, PLINT)
void(* plD_tidy_fp)(struct PLStream_struct *)
#define PLESC_DOUBLEBUFFERING
PLDLLIMPEXP_DRIVER void plD_dispatch_init_wingcc(PLDispatchTable *pdt)
void plGinInit(PLGraphicsIn *gin)
void(* plD_wait_fp)(struct PLStream_struct *)
void(* plD_polyline_fp)(struct PLStream_struct *, short *, short *, PLINT)
void(* plD_esc_fp)(struct PLStream_struct *, PLINT, void *)
void(* plD_bop_fp)(struct PLStream_struct *)
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)
plD_polyline_fp pl_polyline
void(* plD_init_fp)(struct PLStream_struct *)