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 );
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 );
141 static PLINT plD_read_pixel_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;
987 if ( dev->pen != NULL )
988 DeleteObject( dev->pen );
989 dev->pen = CreatePen( PS_SOLID, pls->
width, dev->colour );
1001 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1008 crosshair = LoadCursor( GetModuleHandle( NULL ), IDC_CROSS );
1009 previous = SetCursor( crosshair );
1011 while ( gin->
pX < 0 )
1013 GetMessage( &dev->msg, NULL, 0, 0 );
1014 TranslateMessage( &dev->msg );
1015 switch ( (
int) dev->msg.message )
1017 case WM_LBUTTONDOWN:
1018 if ( dev->msg.wParam & MK_LBUTTON )
1020 gin->
pX = dev->msg.pt.x;
1021 gin->
pY = dev->msg.pt.y;
1022 gin->
dX = (
PLFLT) gin->
pX / ( dev->width - 1 );
1023 gin->
dY = 1.0 - (
PLFLT) gin->
pY / ( dev->height - 1 );
1031 gin->
pX = dev->msg.pt.x;
1032 gin->
pY = dev->msg.pt.y;
1033 gin->
dX = (
PLFLT) gin->
pX / ( dev->width - 1 );
1034 gin->
dY = 1.0 - (
PLFLT) gin->
pY / ( dev->height - 1 );
1038 gin->
keysym = dev->msg.wParam;
1045 SetCursor( previous );
1067 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1078 plD_fill_polygon_wingcc( pls );
1085 if ( *(
PLINT *) ( ptr ) == 0 )
1086 SetROP2( dev->hdc, R2_COPYPEN );
1088 SetROP2( dev->hdc, R2_XORPEN );
1091 #ifdef PL_HAVE_FREETYPE
1093 plD_render_freetype_text( pls, (
EscText *) ptr );
1117 static void Resize(
PLStream *pls )
1119 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1121 FT_Data *FT = (FT_Data *) pls->
FT;
1123 Debug(
"Resizing" );
1125 if ( dev->waiting == 1 )
1127 memcpy( &dev->oldrect, &dev->rect, sizeof ( RECT ) );
1128 GetClientRect( dev->hwnd, &dev->rect );
1129 Debug3(
"[%d %d]", dev->rect.right, dev->rect.bottom );
1131 if ( ( dev->rect.right > 0 ) && ( dev->rect.bottom > 0 ) )
1133 if ( memcmp( &dev->rect, &dev->oldrect, sizeof ( RECT ) ) != 0 )
1135 dev->already_erased = 0;
1136 dev->width = dev->rect.right;
1137 dev->height = dev->rect.bottom;
1138 if ( dev->width > dev->height )
1147 #ifdef PL_HAVE_FREETYPE
1150 FT->scale = dev->scale;
1151 FT->ymax = dev->height;
1155 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
1159 memcpy( &dev->rect, &dev->oldrect, sizeof ( RECT ) );
1173 static int SetRegValue( TCHAR *key_name, TCHAR *key_word,
char *
buffer,
int dwType,
int size )
1177 DWORD lpdwDisposition;
1185 REG_OPTION_NON_VOLATILE,
1192 if ( j == ERROR_SUCCESS )
1194 RegSetValueEx( hKey, key_word, 0, dwType, buffer, size );
1195 RegCloseKey( hKey );
1209 static int GetRegValue( TCHAR *key_name, TCHAR *key_word,
char *buffer,
int size )
1216 if ( RegOpenKeyEx( HKEY_CURRENT_USER, key_name, 0, KEY_READ, &hKey ) == ERROR_SUCCESS )
1218 if ( RegQueryValueEx( hKey, key_word, 0, (LPDWORD) &dwType, buffer, (LPDWORD) &dwSize ) == ERROR_SUCCESS )
1222 RegCloseKey( hKey );
1227 #ifdef PL_HAVE_FREETYPE
1236 static void plD_pixel_wingcc(
PLStream *pls,
short x,
short y )
1238 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1240 SetPixel( dev->hdc, x, y, dev->colour );
1243 static void plD_pixelV_wingcc(
PLStream *pls,
short x,
short y )
1245 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1247 SetPixelV( dev->hdc, x, y, dev->colour );
1258 static void plD_set_pixel_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour )
1260 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1262 SetPixel( dev->hdc, x, y, colour );
1265 static void plD_set_pixelV_wingcc(
PLStream *pls,
short x,
short y,
PLINT colour )
1267 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1269 SetPixelV( dev->hdc, x, y, colour );
1279 static PLINT plD_read_pixel_wingcc(
PLStream *pls,
short x,
short y )
1281 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1283 return ( GetPixel( dev->hdc, x, y ) );
1296 static void init_freetype_lv1(
PLStream *pls )
1300 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1302 plD_FreeType_init( pls );
1304 FT = (FT_Data *) pls->
FT;
1313 x = GetDeviceCaps( dev->hdc, RASTERCAPS );
1315 if ( x & RC_BITBLT )
1316 FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
1318 FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
1325 if ( GetDeviceCaps( dev->hdc, BITSPIXEL ) > 24 )
1327 FT->BLENDED_ANTIALIASING = 1;
1328 FT->read_pixel = (plD_read_pixel_fp) plD_read_pixel_wingcc;
1330 if ( x & RC_BITBLT )
1331 FT->set_pixel = (plD_set_pixel_fp) plD_set_pixelV_wingcc;
1333 FT->set_pixel = (plD_set_pixel_fp) plD_set_pixel_wingcc;
1362 static void init_freetype_lv2(
PLStream *pls )
1364 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1365 FT_Data *FT = (FT_Data *) pls->
FT;
1367 FT->scale = dev->scale;
1368 FT->ymax = dev->height;
1371 if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 0 ) )
1373 FT->ncol0_org = pls->
ncol0;
1374 FT->ncol0_xtra = 16777216 - ( pls->
ncol1 + pls->
ncol0 );
1375 FT->ncol0_width = max_number_of_grey_levels_used_in_text_smoothing;
1376 FT->ncol0_width = max_number_of_grey_levels_used_in_text_smoothing;
1385 level_save = pls->
level;
1387 pl_set_extended_cmap0( pls, FT->ncol0_width, FT->ncol0_org );
1388 pls->
level = level_save;
1390 FT->smooth_text = 1;
1392 else if ( ( FT->want_smooth_text == 1 ) && ( FT->BLENDED_ANTIALIASING == 1 ) )
1394 FT->smooth_text = 1;
1408 static void UpdatePageMetrics(
PLStream *pls,
char flag )
1410 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1412 FT_Data *FT = (FT_Data *) pls->
FT;
1417 dev->width = GetDeviceCaps( dev->hdc, HORZRES );
1418 dev->height = GetDeviceCaps( dev->hdc, VERTRES );
1422 GetClientRect( dev->hwnd, &dev->rect );
1423 dev->width = dev->rect.right;
1424 dev->height = dev->rect.bottom;
1427 if ( dev->width > dev->height )
1436 #ifdef PL_HAVE_FREETYPE
1439 FT->scale = dev->scale;
1440 FT->ymax = dev->height;
1441 if ( GetDeviceCaps( dev->hdc, RASTERCAPS ) & RC_BITBLT )
1442 FT->pixel = (plD_pixel_fp) plD_pixelV_wingcc;
1444 FT->pixel = (plD_pixel_fp) plD_pixel_wingcc;
1448 pls->
xdpi = GetDeviceCaps( dev->hdc, HORZRES ) / GetDeviceCaps( dev->hdc, HORZSIZE ) * 25.4;
1449 pls->
ydpi = GetDeviceCaps( dev->hdc, VERTRES ) / GetDeviceCaps( dev->hdc, VERTSIZE ) * 25.4;
1462 static void PrintPage(
PLStream *pls )
1464 wingcc_Dev *dev = (wingcc_Dev *) pls->
dev;
1466 FT_Data *FT = (FT_Data *) pls->
FT;
1476 ZeroMemory( &docinfo,
sizeof ( docinfo ) );
1477 docinfo.cbSize =
sizeof ( docinfo );
1478 docinfo.lpszDocName = _T(
"Plplot Page" );
1484 ZeroMemory( &Printer,
sizeof ( PRINTDLG ) );
1485 Printer.lStructSize =
sizeof ( PRINTDLG );
1486 Printer.hwndOwner = dev->hwnd;
1487 Printer.Flags = PD_NOPAGENUMS | PD_NOSELECTION | PD_RETURNDC;
1488 Printer.nCopies = 1;
1496 if ( PrintDlg( &Printer ) != 0 )
1507 if ( ( dev->push = GlobalAlloc( GMEM_ZEROINIT,
sizeof ( wingcc_Dev ) ) ) != NULL )
1510 memcpy( dev->push, dev, sizeof ( wingcc_Dev ) );
1512 dev->hdc = dev->PRNT_hdc = Printer.hDC;
1514 UpdatePageMetrics( pls, 1 );
1516 #ifdef PL_HAVE_FREETYPE
1519 dev->FT_smooth_text = FT->smooth_text;
1520 FT->smooth_text = 0;
1528 StartDoc( dev->hdc, &docinfo );
1536 dev->hdc = dev->SCRN_hdc;
1537 UpdatePageMetrics( pls, 0 );
1539 #ifdef PL_HAVE_FREETYPE
1542 FT->smooth_text = dev->FT_smooth_text;
1545 memcpy( dev, dev->push, sizeof ( wingcc_Dev ) );
1547 GlobalFree( dev->push );
1549 RedrawWindow( dev->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ERASENOW );
1563 #endif // PLD_wingccdev