30 #if !defined ( __CYGWIN__ )
34 #define _T( a ) __TEXT( a )
37 #define GWL_USERDATA GWLP_USERDATA
38 #define GCL_HCURSOR GCLP_HCURSOR
45 #ifdef PL_HAVE_FREETYPE
66 #ifndef max_number_of_grey_levels_used_in_text_smoothing
67 #define max_number_of_grey_levels_used_in_text_smoothing 64
75 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 );
137 #ifdef PL_HAVE_FREETYPE
139 static void plD_pixel_wingcc(
PLStream *pls,
short x,
short y );
140 static void plD_pixelV_wingcc(
PLStream *pls,
short x,
short y );
142 static void plD_set_pixel_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour );
143 static void plD_set_pixelV_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour );
144 static void init_freetype_lv1(
PLStream *pls );
145 static void init_freetype_lv2(
PLStream *pls );
154 static int GetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int size );
155 static int SetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int dwType,
int size );
156 static void Resize(
PLStream *pls );
157 static void plD_fill_polygon_wingcc(
PLStream *pls );
158 static void CopySCRtoBMP(
PLStream *pls );
159 static void PrintPage(
PLStream *pls );
160 static void UpdatePageMetrics(
PLStream *pls,
char flag );
162 #define SetRegStringValue( a, b, c ) SetRegValue( a, b, c, REG_SZ, strlen( c ) + 1 )
163 #define SetRegBinaryValue( a, b, c, d ) SetRegValue( a, b, (char *) c, REG_BINARY, d )
164 #define SetRegIntValue( a, b, c ) SetRegValue( a, b, (char *) c, REG_DWORD, 4 )
165 #define GetRegStringValue( a, b, c, d ) GetRegValue( a, b, c, d )
166 #define GetRegIntValue( a, b, c ) GetRegValue( a, b, (char *) c, 4 )
167 #define GetRegBinaryValue( a, b, c, d ) GetRegValue( a, b, (char *) c, d )
173 #if defined ( _MSC_VER )
174 #define Debug( a ) do { if ( pls->debug ) { fprintf( stderr, ( a ) ); } } while ( 0 )
175 #define Debug2( a, b ) do { if ( pls->debug ) { fprintf( stderr, ( a ), ( b ) ); } } while ( 0 )
176 #define Debug3( a, b, c ) do { if ( pls->debug ) { fprintf( stderr, ( a ), ( b ), ( c ) ); } } while ( 0 )
177 #elif defined ( __BORLANDC__ )
178 #define Debug if ( pls->debug ) printf
179 #define Debug2 if ( pls->debug ) printf
180 #define Debug3 if ( pls->debug ) printf
182 #define Verbose( ... ) do { if ( pls->verbose ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
183 #define Debug( ... ) do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
184 #define Debug2( ... ) do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
185 #define Debug3( ... ) do { if ( pls->debug ) { fprintf( stderr, __VA_ARGS__ ); } } while ( 0 )
188 #define ReportWinError() do { \
191 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, \
192 NULL, GetLastError(), \
193 MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), (LPTSTR) &lpMsgBuf, 0, NULL ); \
194 MessageBox( NULL, lpMsgBuf, "GetLastError", MB_OK | MB_ICONINFORMATION ); \
195 LocalFree( lpMsgBuf ); } while ( 0 )
197 #define CrossHairCursor() do { \
198 dev->cursor = LoadCursor( NULL, IDC_CROSS ); \
199 SetClassLong( dev->hwnd, GCL_HCURSOR, (long) dev->cursor ); \
200 SetCursor( dev->cursor ); } while ( 0 )
202 #define NormalCursor() do { \
203 dev->cursor = LoadCursor( NULL, IDC_ARROW ); \
204 SetClassLongPtr( dev->hwnd, GCL_HCURSOR, (LONG_PTR) dev->cursor ); \
205 SetCursor( dev->cursor ); } while ( 0 )
207 #define BusyCursor() do { \
208 dev->cursor = LoadCursor( NULL, IDC_WAIT ); \
209 SetClassLongPtr( dev->hwnd, GCL_HCURSOR, (LONG_PTR) dev->cursor ); \
210 SetCursor( dev->cursor ); } while ( 0 )
212 #define PopupPrint 0x08A1
213 #define PopupNextPage 0x08A2
214 #define PopupQuit 0x08A3
219 #ifndef ENABLE_DYNDRIVERS
235 static TCHAR* szWndClass = _T(
"PlplotWin" );
244 LRESULT CALLBACK PlplotWndProc( HWND hwnd, UINT nMsg, WPARAM wParam, LPARAM lParam )
247 wingcc_Dev *dev = NULL;
259 if ( nMsg == WM_CREATE )
266 #undef GetWindowLongPtr
267 #define GetWindowLongPtr GetWindowLong
269 pls = (
PLStream *) GetWindowLongPtr( hwnd, GWL_USERDATA );
272 dev = (wingcc_Dev *) pls->
dev;
290 Debug(
"WM_DESTROY\t" );
291 PostQuitMessage( 0 );
298 Debug(
"WM_PAINT\t" );
299 if ( GetUpdateRect( dev->hwnd, &dev->paintrect,
TRUE ) )
302 BeginPaint( dev->hwnd, &dev->ps );
304 if ( ( dev->waiting == 1 ) && ( dev->already_erased == 1 ) )
306 Debug(
"Remaking\t" );
308 if ( dev->ps.fErase )
310 dev->oldcolour = SetBkColor( dev->hdc, RGB( pls->
cmap0[0].
r, pls->
cmap0[0].
g, pls->
cmap0[0].
b ) );
311 ExtTextOut( dev->hdc, 0, 0, ETO_OPAQUE, &dev->rect, _T(
"" ), 0, 0 );
312 SetBkColor( dev->hdc, dev->oldcolour );
317 dev->already_erased++;
319 else if ( ( dev->waiting == 1 ) && ( dev->already_erased == 2 ) )
321 dev->oldobject = SelectObject( dev->hdc2, dev->bitmap );
322 BitBlt( dev->hdc, dev->paintrect.left, dev->paintrect.top,
323 dev->paintrect.right, dev->paintrect.bottom,
324 dev->hdc2, dev->paintrect.left, dev->paintrect.top, SRCCOPY );
325 SelectObject( dev->hdc2, dev->oldobject );
328 EndPaint( dev->hwnd, &dev->ps );
339 Debug(
"WM_SIZE\t" );
341 if ( dev->enterresize == 0 )
347 case WM_ENTERSIZEMOVE:
350 Debug(
"WM_ENTERSIZEMOVE\t" );
351 dev->enterresize = 1;
357 case WM_EXITSIZEMOVE:
360 Debug(
"WM_EXITSIZEMOVE\t" );
362 dev->enterresize = 0;
371 if ( dev->already_erased == 0 )
373 Debug(
"WM_ERASEBKGND\t" );
381 dev->oldcolour = SetBkColor( dev->hdc, RGB( pls->
cmap0[0].
r, pls->
cmap0[0].
g, pls->
cmap0[0].
b ) );
382 ExtTextOut( dev->hdc, 0, 0, ETO_OPAQUE, &dev->rect, _T(
"" ), 0, 0 );
383 SetBkColor( dev->hdc, dev->oldcolour );
385 dev->already_erased = 1;
394 Debug(
"WM_COMMAND\t" );
401 return DefWindowProc( hwnd, nMsg, wParam, lParam );
416 #ifdef PL_HAVE_FREETYPE
417 static int freetype = 0;
418 static int smooth_text = 0;
419 static int save_reg = 0;
426 TCHAR key_name[] = _T(
"Software\\PLplot\\wingcc" );
427 TCHAR Keyword_text[] = _T(
"freetype" );
428 TCHAR Keyword_smooth[] = _T(
"smooth" );
431 DrvOpt wingcc_options[] = {
432 #ifdef PL_HAVE_FREETYPE
433 {
"text",
DRV_INT, &freetype,
"Use driver text (FreeType)" },
434 {
"smooth",
DRV_INT, &smooth_text,
"Turn text smoothing on (1) or off (0)" },
435 {
"save",
DRV_INT, &save_reg,
"Save defaults to registary" },
449 if ( pls->
dev != NULL )
450 free( (
void *) pls->
dev );
452 pls->
dev = calloc( 1, (
size_t)
sizeof ( wingcc_Dev ) );
453 if ( pls->
dev == NULL )
454 plexit(
"plD_init_wingcc_Dev: Out of memory." );
456 dev = (wingcc_Dev *) pls->
dev;
472 #ifdef PL_HAVE_FREETYPE
481 GetRegIntValue( key_name, Keyword_text, &freetype );
482 GetRegIntValue( key_name, Keyword_smooth, &smooth_text );
490 #ifdef PL_HAVE_FREETYPE
498 SetRegIntValue( key_name, Keyword_text, &freetype );
499 SetRegIntValue( key_name, Keyword_smooth, &smooth_text );
510 plspage( 0., 0., 800, 600, 0, 0 );
514 dev->height = pls->
ylength - 1;
521 memset( &dev->wndclass, 0, sizeof ( WNDCLASSEX ) );
524 dev->wndclass.lpszClassName = szWndClass;
527 dev->wndclass.cbSize =
sizeof ( WNDCLASSEX );
530 dev->wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC | CS_PARENTDC;
533 dev->wndclass.lpfnWndProc = PlplotWndProc;
537 dev->wndclass.hInstance = GetModuleHandle( NULL );
540 dev->wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
541 dev->wndclass.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
542 dev->wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
544 dev->wndclass.hbrBackground = NULL;
546 dev->wndclass.cbWndExtra =
sizeof ( pls );
553 RegisterClassEx( &dev->wndclass );
561 programlength = strlen( pls->
program ) + 1;
562 program = malloc( programlength *
sizeof ( TCHAR ) );
563 MultiByteToWideChar( CP_UTF8, 0, pls->
program, programlength, program, programlength );
570 dev->hwnd = CreateWindowEx( WS_EX_WINDOWEDGE + WS_EX_LEFT,
580 dev->wndclass.hInstance,
595 SetWindowLongPtr( dev->hwnd, GWL_USERDATA, (LONG_PTR) pls );
597 SetWindowLong( dev->hwnd, GWL_USERDATA, (LONG) pls );
600 dev->SCRN_hdc = dev->hdc = GetDC( dev->hwnd );
606 dev->PopupMenu = CreatePopupMenu();
607 AppendMenu( dev->PopupMenu, MF_STRING, PopupPrint, _T(
"Print" ) );
608 AppendMenu( dev->PopupMenu, MF_STRING, PopupNextPage, _T(
"Next Page" ) );
609 AppendMenu( dev->PopupMenu, MF_STRING, PopupQuit, _T(
"Quit" ) );
611 #ifdef PL_HAVE_FREETYPE
617 init_freetype_lv1( pls );
618 FT = (FT_Data *) pls->
FT;
619 FT->want_smooth_text = smooth_text;
632 ShowWindow( dev->hwnd, SW_SHOWDEFAULT );
633 SetForegroundWindow( dev->hwnd );
640 if ( pls->
xdpi <= 0 )
642 plspage( GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4,
643 GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4, 0, 0, 0, 0 );
658 GetClientRect( dev->hwnd, &dev->rect );
659 dev->width = dev->rect.right;
660 dev->height = dev->rect.bottom;
662 if ( dev->width > dev->height )
671 Debug2(
"Scale = %f (FLT)\n", dev->scale );
678 SetPolyFillMode( dev->hdc, ALTERNATE );
680 SetPolyFillMode( dev->hdc, WINDING );
682 #ifdef PL_HAVE_FREETYPE
685 init_freetype_lv2( pls );
697 plD_line_wingcc(
PLStream *pls,
short x1a,
short y1a,
short x2a,
short y2a )
699 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
703 points[0].x = (LONG) ( x1a / dev->scale );
704 points[1].x = (LONG) ( x2a / dev->scale );
705 points[0].y = (LONG) ( dev->height - ( y1a / dev->scale ) );
706 points[1].y = (LONG) ( dev->height - ( y2a / dev->scale ) );
708 dev->oldobject = SelectObject( dev->hdc, dev->pen );
710 if ( points[0].
x != points[1].
x || points[0].
y != points[1].
y )
712 Polyline( dev->hdc, points, 2 );
716 SetPixel( dev->hdc, points[0].x, points[0].y, dev->colour );
718 SelectObject( dev->hdc, dev->oldobject );
729 plD_polyline_wingcc(
PLStream *pls,
short *xa,
short *ya,
PLINT npts )
731 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
733 POINT *points = NULL;
737 points = GlobalAlloc( GMEM_ZEROINIT | GMEM_FIXED, (
size_t) npts *
sizeof ( POINT ) );
738 if ( points != NULL )
740 for ( i = 0; i < npts; i++ )
742 points[i].x = (LONG) ( xa[i] / dev->scale );
743 points[i].y = (LONG) ( dev->height - ( ya[i] / dev->scale ) );
745 dev->oldobject = SelectObject( dev->hdc, dev->pen );
746 Polyline( dev->hdc, points, npts );
747 SelectObject( dev->hdc, dev->oldobject );
748 GlobalFree( points );
752 plexit(
"Could not allocate memory to \"plD_polyline_wingcc\"\n" );
764 plD_fill_polygon_wingcc(
PLStream *pls )
766 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
768 POINT *points = NULL;
773 points = GlobalAlloc( GMEM_ZEROINIT, (
size_t) pls->
dev_npts * sizeof ( POINT ) );
775 if ( points == NULL )
776 plexit(
"Could not allocate memory to \"plD_fill_polygon_wingcc\"\n" );
778 for ( i = 0; i < pls->
dev_npts; i++ )
780 points[i].x = (
PLINT) ( pls->
dev_x[i] / dev->scale );
781 points[i].y = (
PLINT) ( dev->height - ( pls->
dev_y[i] / dev->scale ) );
784 dev->fillbrush = CreateSolidBrush( dev->colour );
785 hpen = CreatePen( PS_SOLID, 1, dev->colour );
786 dev->oldobject = SelectObject( dev->hdc, dev->fillbrush );
787 hpenOld = SelectObject( dev->hdc, hpen );
788 Polygon( dev->hdc, points, pls->
dev_npts );
789 SelectObject( dev->hdc, dev->oldobject );
790 DeleteObject( dev->fillbrush );
791 SelectObject( dev->hdc, hpenOld );
792 DeleteObject( hpen );
793 GlobalFree( points );
804 static void CopySCRtoBMP(
PLStream *pls )
806 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
812 if ( dev->hdc2 != NULL )
813 DeleteDC( dev->hdc2 );
814 if ( dev->bitmap != NULL )
815 DeleteObject( dev->bitmap );
817 dev->hdc2 = CreateCompatibleDC( dev->hdc );
818 GetClientRect( dev->hwnd, &dev->rect );
819 dev->bitmap = CreateCompatibleBitmap( dev->hdc, dev->rect.right, dev->rect.bottom );
820 dev->oldobject = SelectObject( dev->hdc2, dev->bitmap );
821 BitBlt( dev->hdc2, 0, 0, dev->rect.right, dev->rect.bottom, dev->hdc, 0, 0, SRCCOPY );
822 SelectObject( dev->hdc2, dev->oldobject );
830 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
832 Debug(
"End of the page\n" );
834 dev->already_erased = 2;
841 while ( GetMessage( &dev->msg, NULL, 0, 0 ) )
843 TranslateMessage( &dev->msg );
844 switch ( (
int) dev->msg.message )
848 TrackPopupMenu( dev->PopupMenu, TPM_CENTERALIGN | TPM_RIGHTBUTTON, LOWORD( dev->msg.lParam ),
849 HIWORD( dev->msg.lParam ), 0, dev->hwnd, NULL );
853 if ( ( (TCHAR) ( dev->msg.wParam ) == 32 ) ||
854 ( (TCHAR) ( dev->msg.wParam ) == 13 ) )
858 else if ( ( (TCHAR) ( dev->msg.wParam ) == 27 ) ||
859 ( (TCHAR) ( dev->msg.wParam ) ==
'q' ) ||
860 ( (TCHAR) ( dev->msg.wParam ) ==
'Q' ) )
863 PostQuitMessage( 0 );
867 case WM_LBUTTONDBLCLK:
868 Debug(
"WM_LBUTTONDBLCLK\t" );
873 switch ( LOWORD( dev->msg.wParam ) )
876 Debug(
"PopupPrint" );
880 Debug(
"PopupNextPage" );
884 Debug(
"PopupQuit" );
886 PostQuitMessage( 0 );
892 DispatchMessage( &dev->msg );
895 if ( dev->waiting == 0 )
907 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
909 FT_Data *FT = (FT_Data *) pls->
FT;
911 Debug(
"Start of Page\t" );
919 dev->already_erased = 0;
920 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
928 wingcc_Dev *dev = NULL;
930 #ifdef PL_HAVE_FREETYPE
933 FT_Data *FT = (FT_Data *) pls->
FT;
935 plD_FreeType_Destroy( pls );
938 Debug(
"plD_tidy_wingcc" );
940 if ( pls->
dev != NULL )
942 dev = (wingcc_Dev *) pls->
dev;
944 DeleteMenu( dev->PopupMenu, PopupPrint, 0 );
945 DeleteMenu( dev->PopupMenu, PopupNextPage, 0 );
946 DeleteMenu( dev->PopupMenu, PopupQuit, 0 );
947 DestroyMenu( dev->PopupMenu );
949 if ( dev->hdc2 != NULL )
950 DeleteDC( dev->hdc2 );
951 if ( dev->hdc != NULL )
952 ReleaseDC( dev->hwnd, dev->hdc );
953 if ( dev->bitmap != NULL )
954 DeleteObject( dev->bitmap );
972 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
989 if ( dev->pen != NULL )
990 DeleteObject( dev->pen );
991 dev->pen = CreatePen( PS_SOLID, pls->
width, dev->colour );
997 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1005 plD_fill_polygon_wingcc( pls );
1012 if ( *(
PLINT *) ( ptr ) == 0 )
1013 SetROP2( dev->hdc, R2_COPYPEN );
1015 SetROP2( dev->hdc, R2_XORPEN );
1018 #ifdef PL_HAVE_FREETYPE
1020 plD_render_freetype_text( pls, (
EscText *) ptr );
1044 static void Resize(
PLStream *pls )
1046 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1048 FT_Data *FT = (FT_Data *) pls->
FT;
1050 Debug(
"Resizing" );
1052 if ( dev->waiting == 1 )
1054 memcpy( &dev->oldrect, &dev->rect, sizeof ( RECT ) );
1055 GetClientRect( dev->hwnd, &dev->rect );
1056 Debug3(
"[%d %d]", dev->rect.right, dev->rect.bottom );
1058 if ( ( dev->rect.right > 0 ) && ( dev->rect.bottom > 0 ) )
1060 if ( memcmp( &dev->rect, &dev->oldrect, sizeof ( RECT ) ) != 0 )
1062 dev->already_erased = 0;
1063 dev->width = dev->rect.right;
1064 dev->height = dev->rect.bottom;
1065 if ( dev->width > dev->height )
1074 #ifdef PL_HAVE_FREETYPE
1077 FT->scale = dev->scale;
1078 FT->ymax = dev->height;
1082 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
1086 memcpy( &dev->rect, &dev->oldrect, sizeof ( RECT ) );
1100 static int SetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int dwType,
int size )
1104 DWORD lpdwDisposition;
1112 REG_OPTION_NON_VOLATILE,
1119 if ( j == ERROR_SUCCESS )
1121 RegSetValueEx( hKey, key_word, 0, dwType, buffer, size );
1122 RegCloseKey( hKey );
1136 static int GetRegValue( TCHAR *key_name, TCHAR *key_word,
char *buffer,
int size )
1143 if ( RegOpenKeyEx( HKEY_CURRENT_USER, key_name, 0, KEY_READ, &hKey ) == ERROR_SUCCESS )
1145 if ( RegQueryValueEx( hKey, key_word, 0, (LPDWORD) &dwType, buffer, (LPDWORD) &dwSize ) == ERROR_SUCCESS )
1149 RegCloseKey( hKey );
1154 #ifdef PL_HAVE_FREETYPE
1163 static void plD_pixel_wingcc(
PLStream *pls,
short x,
short y )
1165 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1167 SetPixel( dev->hdc, x, y, dev->colour );
1170 static void plD_pixelV_wingcc(
PLStream *pls,
short x,
short y )
1172 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1174 SetPixelV( dev->hdc, x, y, dev->colour );
1185 static void plD_set_pixel_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour )
1187 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1189 SetPixel( dev->hdc, x, y, colour );
1192 static void plD_set_pixelV_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour )
1194 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1196 SetPixelV( dev->hdc, x, y, colour );
1206 static PLINT plD_read_pixel_wingcc(
PLStream *pls,
short x,
short y )
1208 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1210 return ( GetPixel( dev->hdc, x, y ) );
1223 static void init_freetype_lv1(
PLStream *pls )
1227 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1229 plD_FreeType_init( pls );
1231 FT = (FT_Data *) pls->
FT;
1240 x = GetDeviceCaps( dev->hdc, RASTERCAPS );
1242 if ( x & RC_BITBLT )
1243 FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
1245 FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
1252 if ( GetDeviceCaps( dev->hdc, BITSPIXEL ) > 24 )
1254 FT->BLENDED_ANTIALIASING = 1;
1255 FT->read_pixel = (plD_read_pixel_fp) plD_read_pixel_wingcc;
1257 if ( x & RC_BITBLT )
1258 FT->set_pixel = (plD_set_pixel_fp) plD_set_pixelV_wingcc;
1260 FT->set_pixel = (plD_set_pixel_fp) plD_set_pixel_wingcc;
1289 static void init_freetype_lv2(
PLStream *pls )
1291 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1292 FT_Data *FT = (FT_Data *) pls->
FT;
1294 FT->scale = dev->scale;
1295 FT->ymax = dev->height;
1298 if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 0 ) )
1300 FT->ncol0_org = pls->
ncol0;
1301 FT->ncol0_xtra = 16777216 - ( pls->
ncol1 + pls->
ncol0 );
1312 level_save = pls->
level;
1314 pl_set_extended_cmap0( pls, FT->ncol0_width, FT->ncol0_org );
1315 pls->
level = level_save;
1317 FT->smooth_text = 1;
1319 else if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 1 ) )
1321 FT->smooth_text = 1;
1335 static void UpdatePageMetrics(
PLStream *pls,
char flag )
1337 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1339 FT_Data *FT = (FT_Data *) pls->
FT;
1344 dev->width = GetDeviceCaps( dev->hdc, HORZRES );
1345 dev->height = GetDeviceCaps( dev->hdc, VERTRES );
1349 GetClientRect( dev->hwnd, &dev->rect );
1350 dev->width = dev->rect.right;
1351 dev->height = dev->rect.bottom;
1354 if ( dev->width > dev->height )
1363 #ifdef PL_HAVE_FREETYPE
1366 FT->scale = dev->scale;
1367 FT->ymax = dev->height;
1368 if ( GetDeviceCaps( dev->hdc, RASTERCAPS ) & RC_BITBLT )
1369 FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
1371 FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
1375 pls->
xdpi = GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4;
1376 pls->
ydpi = GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4;
1389 static void PrintPage(
PLStream *pls )
1391 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1393 FT_Data *FT = (FT_Data *) pls->
FT;
1403 ZeroMemory( &docinfo,
sizeof ( docinfo ) );
1404 docinfo.cbSize =
sizeof ( docinfo );
1405 docinfo.lpszDocName = _T(
"Plplot Page" );
1411 ZeroMemory( &Printer,
sizeof ( PRINTDLG ) );
1412 Printer.lStructSize =
sizeof ( PRINTDLG );
1413 Printer.hwndOwner = dev->hwnd;
1414 Printer.Flags = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
1415 Printer.nCopies = 1;
1423 if ( PrintDlg( &Printer ) != 0 )
1434 if ( ( dev->push = GlobalAlloc( GMEM_ZEROINIT,
sizeof ( wingcc_Dev ) ) ) != NULL )
1437 memcpy( dev->push, dev, sizeof ( wingcc_Dev ) );
1439 dev->hdc = dev->PRNT_hdc = Printer.hDC;
1441 UpdatePageMetrics( pls, 1 );
1443 #ifdef PL_HAVE_FREETYPE
1446 dev->FT_smooth_text = FT->smooth_text;
1447 FT->smooth_text = 0;
1455 StartDoc( dev->hdc, &docinfo );
1463 dev->hdc = dev->SCRN_hdc;
1464 UpdatePageMetrics( pls, 0 );
1466 #ifdef PL_HAVE_FREETYPE
1469 FT->smooth_text = dev->FT_smooth_text;
1472 memcpy( dev, dev->push, sizeof ( wingcc_Dev ) );
1474 GlobalFree( dev->push );
1476 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
1490 #endif // PLD_wingccdev