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";
121 struct wingcc_Dev *push;
129 void plD_line_wingcc(
PLStream *,
short,
short,
short,
short );
130 void plD_polyline_wingcc(
PLStream *,
short *,
short *,
PLINT );
138 #ifdef PL_HAVE_FREETYPE
140 static void plD_pixel_wingcc(
PLStream *
pls,
short x,
short y );
141 static void plD_pixelV_wingcc(
PLStream *
pls,
short x,
short y );
143 static void plD_set_pixel_wingcc(
PLStream *
pls,
short x,
short y,
PLINT colour );
144 static void plD_set_pixelV_wingcc(
PLStream *
pls,
short x,
short y,
PLINT colour );
155 static int GetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int size );
156 static int SetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int dwType,
int size );
158 static void plD_fill_polygon_wingcc(
PLStream *
pls );
161 static void UpdatePageMetrics(
PLStream *
pls,
char flag );
163 #define SetRegStringValue( a, b, c ) SetRegValue( a, b, c, REG_SZ, strlen( c ) + 1 )
164 #define SetRegBinaryValue( a, b, c, d ) SetRegValue( a, b, (char *) c, REG_BINARY, d )
165 #define SetRegIntValue( a, b, c ) SetRegValue( a, b, (char *) c, REG_DWORD, 4 )
166 #define GetRegStringValue( a, b, c, d ) GetRegValue( a, b, c, d )
167 #define GetRegIntValue( a, b, c ) GetRegValue( a, b, (char *) c, 4 )
168 #define GetRegBinaryValue( a, b, c, d ) GetRegValue( a, b, (char *) c, d )
174 #if defined ( _MSC_VER )
175 #define Debug( a ) do { if ( pls->debug ) { fprintf( stderr, ( a ) ); } } while ( 0 )
176 #define Debug2( a, b ) do { if ( pls->debug ) { fprintf( stderr, ( a ), ( b ) ); } } while ( 0 )
177 #define Debug3( a, b, c ) do { if ( pls->debug ) { fprintf( stderr, ( a ), ( b ), ( c ) ); } } while ( 0 )
178 #elif defined ( __BORLANDC__ )
179 #define Debug if ( pls->debug ) printf
180 #define Debug2 if ( pls->debug ) printf
181 #define Debug3 if ( pls->debug ) printf
183 #define Verbose( ... ) do { if ( pls->verbose ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
184 #define Debug( ... ) do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
185 #define Debug2( ... ) do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
186 #define Debug3( ... ) do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
189 #define ReportWinError() do { \
192 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, \
193 NULL, GetLastError(), \
194 MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR) &lpMsgBuf, 0, NULL ); \
195 MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK | MB_ICONINFORMATION ); \
196 LocalFree( lpMsgBuf ); } while ( 0 )
198 #define CrossHairCursor() do { \
199 dev->cursor = LoadCursor( NULL, IDC_CROSS ); \
200 SetClassLong( dev->hwnd, GCL_HCURSOR, (long) dev->cursor ); \
201 SetCursor( dev->cursor ); } while ( 0 )
203 #define NormalCursor() do { \
204 dev->cursor = LoadCursor( NULL, IDC_ARROW ); \
205 SetClassLongPtr( dev->hwnd, GCL_HCURSOR, (LONG_PTR) dev->cursor ); \
206 SetCursor( dev->cursor ); } while ( 0 )
208 #define BusyCursor() do { \
209 dev->cursor = LoadCursor( NULL, IDC_WAIT ); \
210 SetClassLongPtr( dev->hwnd, GCL_HCURSOR, (LONG_PTR) dev->cursor ); \
211 SetCursor( dev->cursor ); } while ( 0 )
213 #define PopupPrint 0x08A1
214 #define PopupNextPage 0x08A2
215 #define PopupQuit 0x08A3
220 #ifndef ENABLE_DYNDRIVERS
237 static TCHAR* szWndClass = _T(
"PlplotWin" );
246 LRESULT CALLBACK PlplotWndProc( HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam )
249 wingcc_Dev *dev = NULL;
261 if ( nMsg == WM_CREATE )
268 #undef GetWindowLongPtr
269 #define GetWindowLongPtr GetWindowLong
271 pls = (
PLStream *) GetWindowLongPtr( hwnd, GWL_USERDATA );
274 dev = (wingcc_Dev *) pls->
dev;
292 Debug(
"WM_DESTROY\t" );
293 PostQuitMessage( 0 );
300 Debug(
"WM_PAINT\t" );
301 if ( GetUpdateRect( dev->hwnd, &dev->paintrect,
TRUE ) )
304 BeginPaint( dev->hwnd, &dev->ps );
306 if ( ( dev->waiting == 1 ) && ( dev->already_erased == 1 ) )
308 Debug(
"Remaking\t" );
310 if ( dev->ps.fErase )
312 dev->oldcolour = SetBkColor( dev->hdc, RGB( pls->
cmap0[0].
r, pls->
cmap0[0].
g, pls->
cmap0[0].
b ) );
313 ExtTextOut( dev->hdc, 0, 0, ETO_OPAQUE, &dev->rect, _T(
"" ), 0, 0 );
314 SetBkColor( dev->hdc, dev->oldcolour );
319 dev->already_erased++;
321 else if ( ( dev->waiting == 1 ) && ( dev->already_erased == 2 ) )
323 dev->oldobject = SelectObject( dev->hdc2, dev->bitmap );
324 BitBlt( dev->hdc, dev->paintrect.left, dev->paintrect.top,
325 dev->paintrect.right, dev->paintrect.bottom,
326 dev->hdc2, dev->paintrect.left, dev->paintrect.top, SRCCOPY );
327 SelectObject( dev->hdc2, dev->oldobject );
330 EndPaint( dev->hwnd, &dev->ps );
341 Debug(
"WM_SIZE\t" );
343 if ( dev->enterresize == 0 )
349 case WM_ENTERSIZEMOVE:
352 Debug(
"WM_ENTERSIZEMOVE\t" );
353 dev->enterresize = 1;
359 case WM_EXITSIZEMOVE:
362 Debug(
"WM_EXITSIZEMOVE\t" );
364 dev->enterresize = 0;
373 if ( dev->already_erased == 0 )
375 Debug(
"WM_ERASEBKGND\t" );
383 dev->oldcolour = SetBkColor( dev->hdc, RGB( pls->
cmap0[0].
r, pls->
cmap0[0].
g, pls->
cmap0[0].
b ) );
384 ExtTextOut( dev->hdc, 0, 0, ETO_OPAQUE, &dev->rect, _T(
"" ), 0, 0 );
385 SetBkColor( dev->hdc, dev->oldcolour );
387 dev->already_erased = 1;
396 Debug(
"WM_COMMAND\t" );
403 return DefWindowProc( hwnd, nMsg, wParam, lParam );
418 #ifdef PL_HAVE_FREETYPE
419 static int freetype = 0;
420 static int smooth_text = 0;
421 static int save_reg = 0;
428 TCHAR key_name[] = _T(
"Software\\PLplot\\wingcc" );
429 TCHAR Keyword_text[] = _T(
"freetype" );
430 TCHAR Keyword_smooth[] = _T(
"smooth" );
433 DrvOpt wingcc_options[] = {
434 #ifdef PL_HAVE_FREETYPE
435 {
"text",
DRV_INT, &freetype,
"Use driver text (FreeType)" },
436 {
"smooth",
DRV_INT, &smooth_text,
"Turn text smoothing on (1) or off (0)" },
437 {
"save",
DRV_INT, &save_reg,
"Save defaults to registary" },
451 if ( pls->
dev != NULL )
452 free( (
void *) pls->
dev );
454 pls->
dev = calloc( 1, (
size_t)
sizeof ( wingcc_Dev ) );
455 if ( pls->
dev == NULL )
456 plexit(
"plD_init_wingcc_Dev: Out of memory." );
458 dev = (wingcc_Dev *) pls->
dev;
474 #ifdef PL_HAVE_FREETYPE
483 GetRegIntValue( key_name, Keyword_text, &freetype );
484 GetRegIntValue( key_name, Keyword_smooth, &smooth_text );
492 #ifdef PL_HAVE_FREETYPE
500 SetRegIntValue( key_name, Keyword_text, &freetype );
501 SetRegIntValue( key_name, Keyword_smooth, &smooth_text );
512 plspage( 0., 0., 800, 600, 0, 0 );
516 dev->height = pls->
ylength - 1;
523 memset( &dev->wndclass, 0, sizeof ( WNDCLASSEX ) );
526 dev->wndclass.lpszClassName = szWndClass;
529 dev->wndclass.cbSize =
sizeof ( WNDCLASSEX );
532 dev->wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC | CS_PARENTDC;
535 dev->wndclass.lpfnWndProc = PlplotWndProc;
539 dev->wndclass.hInstance = GetModuleHandle( NULL );
542 dev->wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
543 dev->wndclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
544 dev->wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
546 dev->wndclass.hbrBackground = NULL;
548 dev->wndclass.cbWndExtra =
sizeof (
pls );
555 RegisterClassEx( &dev->wndclass );
563 programlength = strlen( pls->
program ) + 1;
564 program = malloc( programlength *
sizeof ( TCHAR ) );
565 MultiByteToWideChar( CP_UTF8, 0, pls->
program, programlength, program, programlength );
572 dev->hwnd = CreateWindowEx( WS_EX_WINDOWEDGE + WS_EX_LEFT,
582 dev->wndclass.hInstance,
597 SetWindowLongPtr( dev->hwnd, GWL_USERDATA, (LONG_PTR) pls );
599 SetWindowLong( dev->hwnd, GWL_USERDATA, (LONG) pls );
602 dev->SCRN_hdc = dev->hdc = GetDC( dev->hwnd );
608 dev->PopupMenu = CreatePopupMenu();
609 AppendMenu( dev->PopupMenu, MF_STRING, PopupPrint, _T(
"Print" ) );
610 AppendMenu( dev->PopupMenu, MF_STRING, PopupNextPage, _T(
"Next Page" ) );
611 AppendMenu( dev->PopupMenu, MF_STRING, PopupQuit, _T(
"Quit" ) );
613 #ifdef PL_HAVE_FREETYPE
619 init_freetype_lv1( pls );
620 FT = (FT_Data *) pls->
FT;
621 FT->want_smooth_text = smooth_text;
634 ShowWindow( dev->hwnd, SW_SHOWDEFAULT );
635 SetForegroundWindow( dev->hwnd );
642 if ( pls->
xdpi <= 0 )
644 plspage( GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4,
645 GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4, 0, 0, 0, 0 );
660 GetClientRect( dev->hwnd, &dev->rect );
661 dev->width = dev->rect.right;
662 dev->height = dev->rect.bottom;
664 if ( dev->width > dev->height )
673 Debug2(
"Scale = %f (FLT)\n", dev->scale );
680 SetPolyFillMode( dev->hdc, ALTERNATE );
682 SetPolyFillMode( dev->hdc, WINDING );
684 #ifdef PL_HAVE_FREETYPE
687 init_freetype_lv2( pls );
699 plD_line_wingcc(
PLStream *pls,
short x1a,
short y1a,
short x2a,
short y2a )
701 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
705 points[0].x = (LONG) ( x1a / dev->scale );
706 points[1].x = (LONG) ( x2a / dev->scale );
707 points[0].y = (LONG) ( dev->height - ( y1a / dev->scale ) );
708 points[1].y = (LONG) ( dev->height - ( y2a / dev->scale ) );
710 dev->oldobject = SelectObject( dev->hdc, dev->pen );
712 if ( points[0].x != points[1].x || points[0].y != points[1].y )
714 Polyline( dev->hdc, points, 2 );
718 SetPixel( dev->hdc, points[0].x, points[0].y, dev->colour );
720 SelectObject( dev->hdc, dev->oldobject );
731 plD_polyline_wingcc(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
733 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
735 POINT *points = NULL;
739 points = GlobalAlloc( GMEM_ZEROINIT | GMEM_FIXED, (
size_t) npts *
sizeof ( POINT ) );
740 if ( points != NULL )
742 for ( i = 0; i < npts; i++ )
744 points[i].x = (LONG) ( xa[i] / dev->scale );
745 points[i].y = (LONG) ( dev->height - ( ya[i] / dev->scale ) );
747 dev->oldobject = SelectObject( dev->hdc, dev->pen );
748 Polyline( dev->hdc, points, npts );
749 SelectObject( dev->hdc, dev->oldobject );
750 GlobalFree( points );
754 plexit(
"Could not allocate memory to \"plD_polyline_wingcc\"\n" );
766 plD_fill_polygon_wingcc(
PLStream *pls )
768 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
770 POINT *points = NULL;
775 points = GlobalAlloc( GMEM_ZEROINIT, (
size_t) pls->
dev_npts * sizeof ( POINT ) );
777 if ( points == NULL )
778 plexit(
"Could not allocate memory to \"plD_fill_polygon_wingcc\"\n" );
780 for ( i = 0; i < pls->
dev_npts; i++ )
782 points[i].x = (
PLINT) ( pls->
dev_x[i] / dev->scale );
783 points[i].y = (
PLINT) ( dev->height - ( pls->
dev_y[i] / dev->scale ) );
786 dev->fillbrush = CreateSolidBrush( dev->colour );
787 hpen = CreatePen( PS_SOLID, 1, dev->colour );
788 dev->oldobject = SelectObject( dev->hdc, dev->fillbrush );
789 hpenOld = SelectObject( dev->hdc, hpen );
790 Polygon( dev->hdc, points, pls->
dev_npts );
791 SelectObject( dev->hdc, dev->oldobject );
792 DeleteObject( dev->fillbrush );
793 SelectObject( dev->hdc, hpenOld );
794 DeleteObject( hpen );
795 GlobalFree( points );
806 static void CopySCRtoBMP(
PLStream *pls )
808 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
814 if ( dev->hdc2 != NULL )
815 DeleteDC( dev->hdc2 );
816 if ( dev->bitmap != NULL )
817 DeleteObject( dev->bitmap );
819 dev->hdc2 = CreateCompatibleDC( dev->hdc );
820 GetClientRect( dev->hwnd, &dev->rect );
821 dev->bitmap = CreateCompatibleBitmap( dev->hdc, dev->rect.right, dev->rect.bottom );
822 dev->oldobject = SelectObject( dev->hdc2, dev->bitmap );
823 BitBlt( dev->hdc2, 0, 0, dev->rect.right, dev->rect.bottom, dev->hdc, 0, 0, SRCCOPY );
824 SelectObject( dev->hdc2, dev->oldobject );
832 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
834 Debug(
"End of the page\n" );
836 dev->already_erased = 2;
847 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
849 FT_Data *FT = (FT_Data *) pls->
FT;
851 Debug(
"Start of Page\t" );
859 dev->already_erased = 0;
860 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
868 wingcc_Dev *dev = NULL;
870 #ifdef PL_HAVE_FREETYPE
873 FT_Data *FT = (FT_Data *) pls->
FT;
875 plD_FreeType_Destroy( pls );
878 Debug(
"plD_tidy_wingcc" );
880 if ( pls->
dev != NULL )
882 dev = (wingcc_Dev *) pls->
dev;
884 DeleteMenu( dev->PopupMenu, PopupPrint, 0 );
885 DeleteMenu( dev->PopupMenu, PopupNextPage, 0 );
886 DeleteMenu( dev->PopupMenu, PopupQuit, 0 );
887 DestroyMenu( dev->PopupMenu );
889 if ( dev->hdc2 != NULL )
890 DeleteDC( dev->hdc2 );
891 if ( dev->hdc != NULL )
892 ReleaseDC( dev->hwnd, dev->hdc );
893 if ( dev->bitmap != NULL )
894 DeleteObject( dev->bitmap );
903 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
905 Debug(
"Wait for user input\n" );
908 while ( dev->waiting == 1 && GetMessage( &dev->msg, NULL, 0, 0 ) )
910 TranslateMessage( &dev->msg );
911 switch ( (
int) dev->msg.message )
915 TrackPopupMenu( dev->PopupMenu, TPM_CENTERALIGN | TPM_RIGHTBUTTON, LOWORD( dev->msg.lParam ),
916 HIWORD( dev->msg.lParam ), 0, dev->hwnd, NULL );
920 if ( ( (TCHAR) ( dev->msg.wParam ) == 32 ) ||
921 ( (TCHAR) ( dev->msg.wParam ) == 13 ) )
925 else if ( ( (TCHAR) ( dev->msg.wParam ) == 27 ) ||
926 ( (TCHAR) ( dev->msg.wParam ) ==
'q' ) ||
927 ( (TCHAR) ( dev->msg.wParam ) ==
'Q' ) )
930 PostQuitMessage( 0 );
934 case WM_LBUTTONDBLCLK:
935 Debug(
"WM_LBUTTONDBLCLK\t" );
940 switch ( LOWORD( dev->msg.wParam ) )
943 Debug(
"PopupPrint" );
947 Debug(
"PopupNextPage" );
951 Debug(
"PopupQuit" );
953 PostQuitMessage( 0 );
959 DispatchMessage( &dev->msg );
975 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
990 if ( dev->pen != NULL )
991 DeleteObject( dev->pen );
992 dev->pen = CreatePen( PS_SOLID, pls->
width, dev->colour );
1004 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1011 crosshair = LoadCursor( GetModuleHandle( NULL ), IDC_CROSS );
1012 previous = SetCursor( crosshair );
1014 while ( gin->
pX < 0 )
1016 GetMessage( &dev->msg, NULL, 0, 0 );
1017 TranslateMessage( &dev->msg );
1018 switch ( (
int) dev->msg.message )
1020 case WM_LBUTTONDOWN:
1021 if ( dev->msg.wParam & MK_LBUTTON )
1023 gin->
pX = dev->msg.pt.x;
1024 gin->
pY = dev->msg.pt.y;
1025 gin->
dX = (
PLFLT) gin->
pX / ( dev->width - 1 );
1026 gin->
dY = 1.0 - (
PLFLT) gin->
pY / ( dev->height - 1 );
1034 gin->
pX = dev->msg.pt.x;
1035 gin->
pY = dev->msg.pt.y;
1036 gin->
dX = (
PLFLT) gin->
pX / ( dev->width - 1 );
1037 gin->
dY = 1.0 - (
PLFLT) gin->
pY / ( dev->height - 1 );
1041 gin->
keysym = dev->msg.wParam;
1048 SetCursor( previous );
1070 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1081 plD_fill_polygon_wingcc( pls );
1088 if ( *(
PLINT *) ( ptr ) == 0 )
1089 SetROP2( dev->hdc, R2_COPYPEN );
1091 SetROP2( dev->hdc, R2_XORPEN );
1094 #ifdef PL_HAVE_FREETYPE
1096 plD_render_freetype_text( pls, (
EscText *) ptr );
1120 static void Resize(
PLStream *pls )
1122 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1124 FT_Data *FT = (FT_Data *) pls->
FT;
1126 Debug(
"Resizing" );
1128 if ( dev->waiting == 1 )
1130 memcpy( &dev->oldrect, &dev->rect, sizeof ( RECT ) );
1131 GetClientRect( dev->hwnd, &dev->rect );
1132 Debug3(
"[%d %d]", dev->rect.right, dev->rect.bottom );
1134 if ( ( dev->rect.right > 0 ) && ( dev->rect.bottom > 0 ) )
1136 if ( memcmp( &dev->rect, &dev->oldrect, sizeof ( RECT ) ) != 0 )
1138 dev->already_erased = 0;
1139 dev->width = dev->rect.right;
1140 dev->height = dev->rect.bottom;
1141 if ( dev->width > dev->height )
1150 #ifdef PL_HAVE_FREETYPE
1153 FT->scale = dev->scale;
1154 FT->ymax = dev->height;
1158 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
1162 memcpy( &dev->rect, &dev->oldrect, sizeof ( RECT ) );
1176 static int SetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int dwType,
int size )
1180 DWORD lpdwDisposition;
1188 REG_OPTION_NON_VOLATILE,
1195 if ( j == ERROR_SUCCESS )
1197 RegSetValueEx( hKey, key_word, 0, dwType, buffer, size );
1198 RegCloseKey( hKey );
1212 static int GetRegValue( TCHAR *key_name, TCHAR *key_word,
char *buffer,
int size )
1219 if ( RegOpenKeyEx( HKEY_CURRENT_USER, key_name, 0, KEY_READ, &hKey ) == ERROR_SUCCESS )
1221 if ( RegQueryValueEx( hKey, key_word, 0, (LPDWORD) &dwType, buffer, (LPDWORD) &dwSize ) == ERROR_SUCCESS )
1225 RegCloseKey( hKey );
1230 #ifdef PL_HAVE_FREETYPE
1239 static void plD_pixel_wingcc(
PLStream *pls,
short x,
short y )
1241 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1243 SetPixel( dev->hdc, x, y, dev->colour );
1246 static void plD_pixelV_wingcc(
PLStream *pls,
short x,
short y )
1248 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1250 SetPixelV( dev->hdc, x, y, dev->colour );
1261 static void plD_set_pixel_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour )
1263 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1265 SetPixel( dev->hdc, x, y, colour );
1268 static void plD_set_pixelV_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour )
1270 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1272 SetPixelV( dev->hdc, x, y, colour );
1282 static PLINT plD_read_pixel_wingcc(
PLStream *pls,
short x,
short y )
1284 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1286 return ( GetPixel( dev->hdc, x, y ) );
1299 static void init_freetype_lv1(
PLStream *pls )
1303 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1305 plD_FreeType_init( pls );
1307 FT = (FT_Data *) pls->
FT;
1316 x = GetDeviceCaps( dev->hdc, RASTERCAPS );
1318 if ( x & RC_BITBLT )
1319 FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
1321 FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
1328 if ( GetDeviceCaps( dev->hdc, BITSPIXEL ) > 24 )
1330 FT->BLENDED_ANTIALIASING = 1;
1331 FT->read_pixel = (plD_read_pixel_fp) plD_read_pixel_wingcc;
1333 if ( x & RC_BITBLT )
1334 FT->set_pixel = (plD_set_pixel_fp) plD_set_pixelV_wingcc;
1336 FT->set_pixel = (plD_set_pixel_fp) plD_set_pixel_wingcc;
1365 static void init_freetype_lv2(
PLStream *pls )
1367 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1368 FT_Data *FT = (FT_Data *) pls->
FT;
1370 FT->scale = dev->scale;
1371 FT->ymax = dev->height;
1374 if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 0 ) )
1376 FT->ncol0_org = pls->
ncol0;
1377 FT->ncol0_xtra = 16777216 - ( pls->
ncol1 + pls->
ncol0 );
1378 FT->ncol0_width = max_number_of_grey_levels_used_in_text_smoothing;
1379 FT->ncol0_width = max_number_of_grey_levels_used_in_text_smoothing;
1388 level_save = pls->
level;
1390 pl_set_extended_cmap0( pls, FT->ncol0_width, FT->ncol0_org );
1391 pls->
level = level_save;
1393 FT->smooth_text = 1;
1395 else if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 1 ) )
1397 FT->smooth_text = 1;
1411 static void UpdatePageMetrics(
PLStream *pls,
char flag )
1413 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1415 FT_Data *FT = (FT_Data *) pls->
FT;
1420 dev->width = GetDeviceCaps( dev->hdc, HORZRES );
1421 dev->height = GetDeviceCaps( dev->hdc, VERTRES );
1425 GetClientRect( dev->hwnd, &dev->rect );
1426 dev->width = dev->rect.right;
1427 dev->height = dev->rect.bottom;
1430 if ( dev->width > dev->height )
1439 #ifdef PL_HAVE_FREETYPE
1442 FT->scale = dev->scale;
1443 FT->ymax = dev->height;
1444 if ( GetDeviceCaps( dev->hdc, RASTERCAPS ) & RC_BITBLT )
1445 FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
1447 FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
1451 pls->
xdpi = GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4;
1452 pls->
ydpi = GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4;
1465 static void PrintPage(
PLStream *pls )
1467 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1469 FT_Data *FT = (FT_Data *) pls->
FT;
1479 ZeroMemory( &docinfo,
sizeof ( docinfo ) );
1480 docinfo.cbSize =
sizeof ( docinfo );
1481 docinfo.lpszDocName = _T(
"Plplot Page" );
1487 ZeroMemory( &Printer,
sizeof ( PRINTDLG ) );
1488 Printer.lStructSize =
sizeof ( PRINTDLG );
1489 Printer.hwndOwner = dev->hwnd;
1490 Printer.Flags = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
1491 Printer.nCopies = 1;
1499 if ( PrintDlg( &Printer ) != 0 )
1510 if ( ( dev->push = GlobalAlloc( GMEM_ZEROINIT,
sizeof ( wingcc_Dev ) ) ) != NULL )
1513 memcpy( dev->push, dev, sizeof ( wingcc_Dev ) );
1515 dev->hdc = dev->PRNT_hdc = Printer.hDC;
1517 UpdatePageMetrics( pls, 1 );
1519 #ifdef PL_HAVE_FREETYPE
1522 dev->FT_smooth_text = FT->smooth_text;
1523 FT->smooth_text = 0;
1531 StartDoc( dev->hdc, &docinfo );
1539 dev->hdc = dev->SCRN_hdc;
1540 UpdatePageMetrics( pls, 0 );
1542 #ifdef PL_HAVE_FREETYPE
1545 FT->smooth_text = dev->FT_smooth_text;
1548 memcpy( dev, dev->push, sizeof ( wingcc_Dev ) );
1550 GlobalFree( dev->push );
1552 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
1566 #endif // PLD_wingccdev