217 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <windows.h>
 | |
| #include <commdlg.h>
 | |
| 
 | |
| #include <malloc.h>
 | |
| #include <memory.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| 
 | |
| #include "fonttest.h"
 | |
| 
 | |
| #include "dialogs.h"
 | |
| 
 | |
| 
 | |
| //*****************************************************************************
 | |
| //*************************   D R A W   GLYPHSET     **************************
 | |
| //*****************************************************************************
 | |
| 
 | |
| 
 | |
| //************************************************************************//
 | |
| //                                                                        //
 | |
| // Function :  DrawGlyphSet                                               //
 | |
| //                                                                        //
 | |
| // Parameters: handles to the window and DC                               //
 | |
| //                                                                        //
 | |
| // Thread safety: none.                                                   //
 | |
| //                                                                        //
 | |
| // Task performed:  This function displays the dialog box to choose a new //
 | |
| //                  font. It then gets the number of Glyphs the font has  //
 | |
| //                  by reading the fontdata. It calls a function to       //
 | |
| //                  display all the fonts and performs the necessary      //
 | |
| //                  cleanup.                                              //
 | |
| //                                                                        //
 | |
| //************************************************************************//
 | |
| 
 | |
| 
 | |
| void DrawGlyphSet( HWND hwnd, HDC hdc )
 | |
| {
 | |
| HFONT  hFont, hFontOld;          // Handle to the new and old fonts                   
 | |
|   
 | |
| DWORD  dwrc;                     // For the call to the GetFontData
 | |
| CHAR  szTable[] = "maxp";  // Name of the table we are interested in.
 | |
| DWORD dwTable = *(LPDWORD)szTable;
 | |
| DWORD dwSize;
 | |
| 
 | |
| BYTE pNumGlyphs[2] = {0x00, 0x01};// default value of 256 for the number of glyphs
 | |
| WORD *wpNumGlyphs;
 | |
| 
 | |
| 
 | |
|     if (!isCharCodingUnicode)
 | |
|         hFont    = CreateFontIndirectWrapperA( &elfdvA );
 | |
|     else
 | |
|         hFont    = CreateFontIndirectWrapperW( &elfdvW );
 | |
| 
 | |
|     if( !hFont )
 | |
|     {
 | |
|         dprintf( "Couldn't create font");
 | |
|         return;
 | |
|     }
 | |
| 
 | |
| 
 | |
|     if ( hFontOld = SelectObject( hdc, hFont ))
 | |
|     {
 | |
|         // Get the size of buffer required to hold the font data
 | |
|         dwSize = GetFontData(hdc, dwTable, 0, NULL, 0);
 | |
| 
 | |
|         wpNumGlyphs = (WORD *) pNumGlyphs;
 | |
| 
 | |
|         if((dwSize != (DWORD)(-1)) && (dwSize < 64))
 | |
|         {
 | |
|             BYTE hpData[64];
 | |
| 
 | |
|             dprintf( "Calling GetFontData" );
 | |
|             dprintf( "  dwTable   = 0x%.8lX (%s)", dwTable, szTable);
 | |
|             dprintf( "  dwBufSize = %ld",     dwSize  );
 | |
| 
 | |
|             // Get the actual font-data.
 | |
|             dwrc = GetFontData( hdc, dwTable, 0, hpData, dwSize );
 | |
| 
 | |
|             // Take care of the reverse-Indian !!
 | |
|             pNumGlyphs[0] = *(hpData+5);
 | |
|             pNumGlyphs[1] = *(hpData+4);
 | |
| 
 | |
|             dprintf( "  dwrc = %ld", dwrc );
 | |
|         }
 | |
| 
 | |
|         dprintf( "  Total Number of Glyphs = %d", *wpNumGlyphs);
 | |
| 
 | |
|         // Display all the glyphs.
 | |
|         VDisplayGlyphs( hwnd, hdc, *wpNumGlyphs );
 | |
|         hFont = SelectObject(hdc, hFontOld);
 | |
|     }
 | |
| 
 | |
|     DeleteObject(hFont);
 | |
|        
 | |
| }
 | |
| 
 | |
| 
 | |
| //************************************************************************//
 | |
| //                                                                        //
 | |
| // Function :  VDisplayGlyphs                                             //
 | |
| //                                                                        //
 | |
| // Parameters: handles to the window and DC, number of glyphs in the font //
 | |
| //                                                                        //
 | |
| // Thread safety: none.                                                   //
 | |
| //                                                                        //
 | |
| // Task performed:  This function displays all the fonts by calling       //
 | |
| //                  ExtTextOut and specifying that the fonts are specified//
 | |
| //                  by the index. 16 fonts are shown on every line.       //
 | |
| //                                                                        //
 | |
| //************************************************************************//
 | |
| 
 | |
| 
 | |
| void VDisplayGlyphs( HWND hwnd, HDC hdc, WORD wNumGlyphs )
 | |
| {
 | |
| TEXTMETRIC tm;
 | |
| WORD ach[16];
 | |
| LONG apdx[16];
 | |
| LONG y = 0;
 | |
| WORD i;
 | |
| WORD iGlyphs;
 | |
| 
 | |
| 
 | |
|     GetTextMetrics(hdc, &tm);
 | |
|     iGlyphs = min(16, wNumGlyphs);
 | |
| 	   
 | |
|     for (i = 0; i < iGlyphs ; i++)
 | |
|         {
 | |
|         apdx[i] = tm.tmMaxCharWidth;       // Spacing between two characters 
 | |
|         ach[i] = i;                        // Init the string
 | |
|         }
 | |
| 
 | |
|     SetBkMode( hdc, iBkMode );
 | |
|     SetBkColor( hdc, dwRGBBackground );
 | |
|     SetTextColor( hdc, dwRGBText );
 | |
|     SetTextAlign( hdc, TA_TOP | TA_LEFT );
 | |
| 
 | |
|     // Actual display of the glyphs, in batches of 16.
 | |
|     while (wNumGlyphs > 0)
 | |
|     {
 | |
|         iGlyphs = min(16, wNumGlyphs);
 | |
| 
 | |
|         ExtTextOut( hdc, 0, y, ETO_GLYPH_INDEX, NULL, (LPSTR)ach, iGlyphs, apdx );
 | |
| 
 | |
|         wNumGlyphs -= iGlyphs;
 | |
|         y+= tm.tmHeight;
 | |
| 
 | |
|         iGlyphs = min(16, wNumGlyphs);
 | |
| 
 | |
|         for (i = 0; i < iGlyphs ; i++)
 | |
|         {
 | |
|             ach[i] += 16;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| //*****************************************************************************
 | |
| //*********************   GlyphSet   W N D   P R O C   ***********************
 | |
| //*****************************************************************************
 | |
| 
 | |
| //************************************************************************//
 | |
| //                                                                        //
 | |
| // Function :  GlyphSetWndProc                                            //
 | |
| //                                                                        //
 | |
| // Parameters: handles to the window and the message parameters           //
 | |
| //                                                                        //
 | |
| // Thread safety: none.                                                   //
 | |
| //                                                                        //
 | |
| // Task performed:  Handles window messages when the user selects or      //
 | |
| //                  deselects the glyphset option.                        //
 | |
| //                                                                        //
 | |
| //************************************************************************//
 | |
| 
 | |
| 
 | |
| LRESULT CALLBACK GlyphSetWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
 | |
|  {
 | |
|   HDC         hdc;
 | |
|   PAINTSTRUCT ps;
 | |
|   HCURSOR     hCursor;
 | |
| 
 | |
| 
 | |
|   switch( msg )
 | |
|    {
 | |
|     case WM_PAINT:
 | |
|            hCursor = SetCursor( LoadCursor( NULL, MAKEINTRESOURCE(IDC_WAIT) ) );
 | |
|            ShowCursor( TRUE );
 | |
| 
 | |
|            hdc = BeginPaint( hwnd, &ps );
 | |
|            SetDCMapMode( hdc, wMappingMode );
 | |
| 
 | |
|            SetTextCharacterExtra( hdc, nCharExtra );
 | |
| 
 | |
|            DrawDCAxis( hwnd, hdc, TRUE);
 | |
| 
 | |
|            DrawGlyphSet( hwnd, hdc );
 | |
| 
 | |
|            CleanUpDC( hdc );
 | |
| 
 | |
|            SelectObject( hdc, GetStockObject( BLACK_PEN ) );
 | |
|            EndPaint( hwnd, &ps );
 | |
| 
 | |
|            ShowCursor( FALSE );
 | |
|            SetCursor( hCursor );
 | |
| 
 | |
|            return 0;
 | |
| 
 | |
|     case WM_DESTROY:
 | |
|            return 0;
 | |
|    }
 | |
| 
 | |
| 
 | |
|   return DefWindowProc( hwnd, msg, wParam, lParam );
 | |
| }
 |