Newsgroup: it.comp.lang.c++
Titolo: Render di font True Type

Nello sviluppo di un'applicazione per slide show mi sono trovato di fronte ad un
caso curioso (un mio errore, un bug del sistema operativo ? mah ...).
Infatti il codice che allego al testo, compilato sia con VC++ 5.0 che con CygWin
B19, funziona correttamente in Windows 98 e NT 4.0, ma in Windows 95 le due
GetGlyphOutline() ritornano errore 87 (parametro incorretto).
La cosa curiosa e' che usando GGO_BITMAP invece di GGO_GRAY2_BITMAP
funzionano, cosi' come continuano a non funzionare se si usa
GGO_GRAY4_BITMAP e GGO_GRAY8_BITMAP.
Qualche suggerimento ?
Grazie in anticipo
    Davide Devoti
////////////////////// Inizio Codice ////////////////////
   HFONT f, f1;
   char str_error[100];
   HDC dc;
   GLYPHMETRICS gm;
   char *buffer;
   int rows, cols;
   int cols1;
   MAT2 mat2;
   int size2;
   u_char code='A';
   int y=10;
   dc=GetDC(main_window);
   f=CreateFont(-33, 0, 0, 0, FW_NORMAL, FALSE, \
   FALSE, FALSE, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS,
   PROOF_QUALITY , VARIABLE_PITCH | FF_DONTCARE, "Arial");
   if (f==NULL) {
        sprintf(str_error,"Error %d getting font\n",GetLastError());
        TextOut(dc, 10, y, str_error, strlen(str_error));
        y+=20;
   }
   f1=SelectObject(dc, f);
   if (f1==NULL) {
        sprintf(str_error,"Error %d setting font\n",GetLastError());
        TextOut(dc, 10, y, str_error, strlen(str_error));
        y+=20;
   }
   mat2.eM11.value=mat2.eM22.value=1;
   mat2.eM12.value=mat2.eM21.value=0;
   mat2.eM12.fract=mat2.eM21.fract=mat2.eM22.fract=mat2.eM11.fract=0;
   if ((size2=GetGlyphOutline(dc, code, GGO_GRAY2_BITMAP, &gm, 0,
               NULL, &mat2))==GDI_ERROR) {
        sprintf(str_error, "Errore %d nella glyph outline per la size (char
%d)\n",
                        GetLastError(), code);
        TextOut(dc, 10, y, str_error, strlen(str_error));
        y+=20;
        size2=10000;
   }
   buffer=malloc(size2);
   if (GetGlyphOutline(dc, code, GGO_GRAY2_BITMAP, &gm, size2, buffer,
            &mat2)==GDI_ERROR) {
        sprintf(str_error, "Errore %d nella glyph outline per la size (char
%d)\n",
                GetLastError(), code);
        TextOut(dc, 10, y, str_error, strlen(str_error));
        y+=20;
   }
   rows=gm.gmBlackBoxY;
   cols=gm.gmBlackBoxX;
   cols1=cols;
  while (((cols>>1) & 0x01) || (cols & 0x01))
    cols++;
   SelectObject(dc, f1);
   DeleteObject(f);
   sprintf(str_error, "Get Glyph data finished\n");
   TextOut(dc, 10, y, str_error, strlen(str_error));
   ReleaseDC(main_window, dc);
   }
////////////////Fine Codice //////////////




Grazie in anticipo
    Davide Devoti



   mat2.eM11.value=mat2.eM22.value=1;
   mat2.eM12.value=mat2.eM21.value=0;
   mat2.eM12.fract=mat2.eM21.fract=mat2.eM22.fract=mat2.eM11.fract=0;

        sprintf(str_error, "Errore %d nella size (char %d)\n",
                        GetLastError(), code);
        TextOut(dc, 10, y, str_error, strlen(str_error));
        y+=20;
        size2=10000;
   }
   buffer=malloc(size2);
   if (GetGlyphOutline(dc, code, GGO_GRAY2_BITMAP, &gm, size2, buffer,
            &mat2)==GDI_ERROR) {
        sprintf(str_error, "Errore %d nella size (char %d)\n",
                GetLastError(), code);
        TextOut(dc, 10, y, str_error, strlen(str_error));
        y+=20;
   }
   rows=gm.gmBlackBoxY;
   cols=gm.gmBlackBoxX;
   cols1=cols;
  while (((cols>>1) & 0x01) || (cols & 0x01))
    cols++;
   SelectObject(dc, f1);
   DeleteObject(f);
   sprintf(str_error, "Get Glyph data finished\n");
   TextOut(dc, 10, y, str_error, strlen(str_error));
   ReleaseDC(main_window, dc);
   }
////////////////Fine Codice //////////////
--
Posted from root@[194.243.156.4]
via Mailgate.ORG Server - 
http://www.mailgate.org