0022819: Redesign of OpenGl driver
[occt.git] / src / OpenGl / OpenGl_togl_begin_layer_mode.cxx
1 /***********************************************************************
2
3 FONCTION :
4 ----------
5 file OpenGl_togl_begin_layer_mode.c :
6
7 REMARQUES:
8 ----------
9
10 HISTORIQUE DES MODIFICATIONS   :
11 --------------------------------
12 01-12-98 : CAL ; Creation. S4062. Ajout des layers.
13 02.14.100 : JR : Warnings on WNT truncations from double to float
14
15 ************************************************************************/
16
17 /*----------------------------------------------------------------------*/
18 /*
19 * Includes
20 */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25 #ifdef HAVE_STDLIB_H
26 #include <stdlib.h>
27 #endif
28 #if defined(HAVE_MALLOC_H) || defined(WNT)
29 #include <malloc.h>
30 #endif
31
32 #include <OpenGl_tgl_all.hxx>
33
34 #include <math.h>
35 #include <GL/gl.h>
36 #include <stdio.h>
37
38 #include <InterfaceGraphic_Labels.hxx>
39 #include <InterfaceGraphic_Graphic3d.hxx>
40 #include <InterfaceGraphic_Visual3d.hxx>
41
42 #include <OpenGl_tsm_ws.hxx>
43 #include <OpenGl_txgl.hxx>
44 #include <OpenGl_tgl_tox.hxx>
45 #include <OpenGl_tgl_funcs.hxx>
46 #include <OpenGl_telem_filters.hxx>
47 #include <OpenGl_telem.hxx>
48 #include <OpenGl_telem_util.hxx>
49 #include <OpenGl_telem_view.hxx>
50
51 #include <OpenGl_TextRender.hxx>
52
53 /*OCC6247*/
54 #include <OpenGl_telem_attri.hxx>
55 #include <OpenGl_LightBox.hxx>
56
57 #include <Visual3d_Layer.hxx>
58
59 #include <OpenGl_Extension.hxx>
60 #include <OpenGl_PrinterContext.hxx>
61
62 /*----------------------------------------------------------------------*/
63 /*
64 * Constantes
65 */
66
67 #define NO_PRINT
68 #define NOTRACE
69 #define NO_DEBUG
70 #define NO_TRACE_MAT
71 #define NO_TRACE_TEXT
72
73 #define IsNotModified 0
74 #define IsModified 1
75
76 /*----------------------------------------------------------------------*/
77 /*
78 * Variables externes
79 */
80
81 extern GLuint linestyleBase;
82 extern GLuint fontBase;
83
84 #if defined(__sun)  || defined (__osf__) || defined (__hp) || defined (__sgi)
85 #else
86 extern PFNGLBLENDEQUATIONEXTPROC glBlendEquationOp;
87 #endif
88 /*----------------------------------------------------------------------*/
89 /*
90 * Prototypes fonctions
91 */
92
93 /*----------------------------------------------------------------------*/
94 /*
95 * Prototypes Private functions
96 */
97
98 /*----------------------------------------------------------------------*/
99 /*
100 * Variables statiques
101 */
102
103 static CALL_DEF_LAYER ACLayer;
104
105 static GLboolean layerOpen      = GL_FALSE;
106 static float     layerHeight    = -1.;
107 static float     layerWidth     = -1.;
108 static int       layerPoints    = 0;
109 static Tchar    *layerFont      = NULL;
110 static int       layerType      = -1;
111 static int       layerFontFlag  = IsModified;
112 static int       layerFontType  = 0;
113 static float     layerRed       = -1.;
114 static float     layerGreen     = -1.;
115 static float     layerBlue      = -1.;
116 static float     layerFontRed   = -1.;
117 static float     layerFontGreen = -1.;
118 static float     layerFontBlue  = -1.;
119
120 static OSD_FontAspect FTGLLayerFontAspect = OSD_FA_Regular;
121 static Tint           FTGLLayerFontHeight = 16;
122 static Tint           FTGLLayerFontAscent = 0;
123 static Tint           FTGLLayerFontDescent = 0;
124 static Tint           FTGLLayerFontWidth = 0;
125 static Tfloat         FTGLLayerFontXScale = 1.f;
126 static Tfloat         FTGLLayerFontYScale = 1.f;
127 static Tchar          FTGLLayerFontName[100];
128 static Tint           FTGLLayerFontCurrent = 0;
129
130 /*----------------------------------------------------------------------*/
131 void EXPORT
132 call_togl_layer2d
133 (
134  CALL_DEF_LAYER * alayer
135  )
136 {
137   //call_def_ptrLayer ptrLayer;
138
139 #ifdef PRINT
140   printf ("call_togl_layer2d\n");
141 #endif
142   alayer->ptrLayer = (call_def_ptrLayer) malloc (sizeof (CALL_DEF_PTRLAYER)); 
143   alayer->ptrLayer->listIndex = glGenLists (1);
144   ACLayer = *alayer;
145 }
146
147 /*----------------------------------------------------------------------*/
148 void EXPORT
149 call_togl_removelayer2d
150 (
151  CALL_DEF_LAYER * alayer
152  )
153 {
154   if (alayer->ptrLayer == NULL) return;
155   if (alayer->ptrLayer->listIndex == 0) return;
156 #ifdef PRINT
157   printf ("call_togl_removelayer2d %d\n", ptrLayer->listIndex);
158 #endif
159
160   /*
161   * On detruit la display-list associee au layer.
162   */
163   glDeleteLists (alayer->ptrLayer->listIndex, 1);
164   alayer->ptrLayer->listIndex = 0;
165   ACLayer = *alayer;
166 }
167
168 /*----------------------------------------------------------------------*/
169 void EXPORT
170 call_togl_clear_layer2d (
171                          CALL_DEF_LAYER * aLayer
172                          )
173 {
174   if (aLayer->ptrLayer == NULL) return;
175   if (aLayer->ptrLayer->listIndex == 0) return;
176 #ifdef PRINT
177   printf ("call_togl_clear_layer2d %d\n", ptrLayer->listIndex);
178 #endif
179
180   /*
181   * On clear la display-list associee au layer.
182   */
183   /*
184   * On detruit la display-list associee au layer.
185   */
186   glDeleteLists (aLayer->ptrLayer->listIndex, 1);
187   aLayer->ptrLayer->listIndex = 0;
188   /*
189   * On cree la display-list associee au layer.
190   */
191   aLayer->ptrLayer->listIndex = glGenLists (1);
192   //alayer->ptrLayer = /*(void *) */ptrLayer;
193   ACLayer = *aLayer;
194 }
195
196 /*----------------------------------------------------------------------*/
197 void EXPORT
198 call_togl_redraw_layer2d (
199                           CALL_DEF_VIEW * aview,
200                           CALL_DEF_LAYER * alayer
201                           )
202 {
203   float left, right, bottom, top;
204   float delta, ratio;
205   int attach;
206 #ifdef TRACE_MAT
207   GLdouble modelMatrix[16], projMatrix[16];
208   GLint viewport[4];
209   int i, j;
210 #endif
211   GLsizei dispWidth, dispHeight;
212   GLboolean isl = IsLightOn(); /*OCC6247*/
213
214   if ( aview->DefBitmap.bitmap ) {
215     dispWidth = aview->DefBitmap.width;
216     dispHeight = aview->DefBitmap.height;
217   }
218   else {
219     dispWidth = (GLsizei) alayer->viewport[0];
220     dispHeight = (GLsizei) alayer->viewport[1];
221   }
222
223   if (alayer->ptrLayer == NULL) return;
224   if (alayer->ptrLayer->listIndex == 0) return;
225 #ifdef PRINT
226   printf ("call_togl_redraw_layer2d %d\n", ptrLayer->listIndex);
227   printf ("\twindow size %f %f\n",
228     aview->DefWindow.dx, aview->DefWindow.dy);
229   printf ("\tviewport %f %f\n", (float) dispWidth, (float) dispHeight);
230 #endif
231
232   if(isl) {
233     LightOff(); /*OCC6247*/
234   }
235
236   /*
237   * On positionne la projection
238   */
239   glMatrixMode( GL_MODELVIEW );
240   glPushMatrix ();
241   glLoadIdentity ();
242
243   glMatrixMode (GL_PROJECTION);
244   glPushMatrix ();
245   glLoadIdentity ();
246
247   if (alayer->sizeDependent == 0)
248     glViewport (0, 0, dispWidth, dispHeight);
249
250   left = alayer->ortho[0],
251     right = alayer->ortho[1],
252     bottom = alayer->ortho[2],
253     top = alayer->ortho[3];
254   attach = alayer->attach;
255 #ifdef TRACE
256   printf ("\tattach %d ortho %f %f %f %f %d\n",
257     attach, left, right, bottom, top);
258 #endif
259   if (alayer->sizeDependent == 0)
260     ratio = (float) dispWidth/dispHeight;
261   else
262     ratio = aview->DefWindow.dx/aview->DefWindow.dy;
263   if (ratio >= 1.0) { /* fenetre horizontale */
264     delta = (float )((top - bottom)/2.0);
265     switch (attach) {
266       case 0: /* Aspect_TOC_BOTTOM_LEFT */
267         top = bottom + 2*delta/ratio;
268         break;
269       case 1: /* Aspect_TOC_BOTTOM_RIGHT */
270         top = bottom + 2*delta/ratio;
271         break;
272       case 2: /* Aspect_TOC_TOP_LEFT */
273         bottom = top - 2*delta/ratio;
274         break;
275       case 3: /* Aspect_TOC_TOP_RIGHT */
276         bottom = top - 2*delta/ratio;
277         break;
278     }
279   }
280   else { /* fenetre verticale */
281     delta = (float )((right - left)/2.0);
282     switch (attach) {
283       case 0: /* Aspect_TOC_BOTTOM_LEFT */
284         right = left + 2*delta*ratio;
285         break;
286       case 1: /* Aspect_TOC_BOTTOM_RIGHT */
287         left = right - 2*delta*ratio;
288         break;
289       case 2: /* Aspect_TOC_TOP_LEFT */
290         right = left + 2*delta*ratio;
291         break;
292       case 3: /* Aspect_TOC_TOP_RIGHT */
293         left = right - 2*delta*ratio;
294         break;
295     }
296   }
297 #ifdef TRACE
298   printf ("\tratio %f new ortho %f %f %f %f\n",
299     ratio, left, right, bottom, top);
300 #endif
301
302 #ifdef WNT
303   // Check printer context that exists only for print operation
304   OpenGl_PrinterContext* aPrinterContext = 
305     OpenGl_PrinterContext::GetPrinterContext (GET_GL_CONTEXT());
306
307   if (aPrinterContext)
308   {
309     // additional transformation matrix could be applied to
310     // render only those parts of viewport that will be
311     // passed to a printer as a current "frame" to provide
312     // tiling; scaling of graphics by matrix helps render a
313     // part of a view (frame) in same viewport, but with higher
314     // resolution
315     GLfloat aProjMatrix[16];
316     aPrinterContext->GetProjTransformation (aProjMatrix);
317     glLoadMatrixf ((GLfloat*) aProjMatrix);
318
319     // printing operation also assumes other viewport dimension
320     // to comply with transformation matrix or graphics scaling
321     // factors for tiling for layer redraw
322     GLsizei anViewportX = 0;
323     GLsizei anViewportY = 0;
324     aPrinterContext->GetLayerViewport (anViewportX, anViewportY);
325     if (anViewportX != 0 && anViewportY != 0)
326       glViewport (0, 0, anViewportX, anViewportY);
327   }
328 #endif 
329
330   glOrtho (left, right, bottom, top, -1.0, 1.0);
331
332 #ifdef TRACE_MAT
333   glGetIntegerv (GL_VIEWPORT, viewport);
334   glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
335   glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
336   printf ("viewport :\n");
337   printf ("\t");
338   for (i = 0; i < 4; i++)
339     printf ("%d ", viewport[i]);
340   printf ("\n");
341   printf ("modelMatrix :\n");
342   for (i = 0; i < 4; i++) {
343     printf ("\t");
344     for (j = 0; j < 4; j++)
345       printf ("%f ", modelMatrix[i*4+j]);
346     printf ("\n");
347   }
348   printf ("projMatrix :\n");
349   for (i = 0; i < 4; i++) {
350     printf ("\t");
351     for (j = 0; j < 4; j++)
352       printf ("%f ", projMatrix[i*4+j]);
353     printf ("\n");
354   }
355 #endif
356
357   /*
358   * On trace la display-list associee au layer.
359   */
360 #ifdef TRACE
361   if (glIsList (alayer->ptrLayer->listIndex))
362     printf ("\t%d is a list\n", alayer->ptrLayer->listIndex);
363   else
364     printf ("\t%d is not a list\n", alayer->ptrLayer->listIndex);
365 #endif
366   glPushAttrib (
367     GL_LIGHTING_BIT | GL_LINE_BIT | GL_POLYGON_BIT |
368     GL_DEPTH_BUFFER_BIT | GL_CURRENT_BIT | GL_TEXTURE_BIT );
369   glDisable (GL_DEPTH_TEST);
370   glCallList (alayer->ptrLayer->listIndex);
371
372
373   //calling dynamic render of LayerItems
374   if ( alayer->ptrLayer->layerData ) {
375     ACLayer = *alayer;
376     Visual3d_Layer* layer = (Visual3d_Layer*)alayer->ptrLayer->layerData;
377     layer->RenderLayerItems();
378     ACLayer.ptrLayer = NULL;
379   }
380
381
382   glPopAttrib ();
383
384   /*
385   * On retire la projection
386   */
387   glMatrixMode (GL_PROJECTION);
388   glPopMatrix ();
389
390   glMatrixMode( GL_MODELVIEW );
391   glPopMatrix ();
392
393   /*
394   * Restauration du Viewport en cas de modification
395   */
396   if (alayer->sizeDependent == 0) 
397     glViewport (0, 0,
398     (GLsizei) aview->DefWindow.dx,
399     (GLsizei) aview->DefWindow.dy);
400
401   glFlush ();
402
403   if(isl) {
404     LightOn(); /*OCC6247*/
405   }
406
407 }
408
409 /*----------------------------------------------------------------------*/
410 void EXPORT
411 call_togl_begin_layer2d
412 (
413  CALL_DEF_LAYER * alayer
414  )
415 {
416   call_def_ptrLayer ptrLayer;
417
418   ACLayer = *alayer;
419
420   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
421   if (ptrLayer == NULL) return;
422   if (ptrLayer->listIndex == 0) return;
423 #ifdef PRINT
424   printf ("call_togl_begin_layer2d %d\n", ptrLayer->listIndex);
425 #endif
426
427   //abd
428   glEnable(GL_TEXTURE_2D);
429   GLboolean stat = glIsEnabled( GL_TEXTURE_2D );
430
431   glNewList (ptrLayer->listIndex, GL_COMPILE);
432   layerOpen = GL_TRUE;
433 }
434
435 /*----------------------------------------------------------------------*/
436 void EXPORT
437 call_togl_end_layer2d
438 (
439  )
440 {
441   call_def_ptrLayer ptrLayer;
442
443   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
444   if (ptrLayer == NULL) return;
445   if (ptrLayer->listIndex == 0) return;
446 #ifdef PRINT
447   printf ("call_togl_end_layer2d %d\n", ptrLayer->listIndex);
448 #endif
449
450   /*
451   * On ferme la display-list associee au layer.
452   */
453   if (layerOpen) 
454     glEndList ();
455   layerOpen = GL_FALSE;
456
457   ACLayer.ptrLayer = NULL;
458 }
459
460 /*----------------------------------------------------------------------*/
461 void EXPORT
462 call_togl_begin_polyline2d (
463                             )
464 {
465   call_def_ptrLayer ptrLayer;
466
467   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
468   if (ptrLayer == NULL) return;
469   if (ptrLayer->listIndex == 0) return;
470 #ifdef PRINT
471   printf ("call_togl_begin_polyline2d %d\n", ptrLayer->listIndex);
472 #endif
473
474   layerPoints = 0;
475   glBegin (GL_LINE_STRIP);
476 }
477
478 /*----------------------------------------------------------------------*/
479 void EXPORT
480 call_togl_end_polyline2d (
481                           )
482 {
483   call_def_ptrLayer ptrLayer;
484
485   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
486   if (ptrLayer == NULL) return;
487   if (ptrLayer->listIndex == 0) return;
488 #ifdef PRINT
489   printf ("call_togl_end_polyline2d %d\n", ptrLayer->listIndex);
490 #endif
491
492   glEnd ();
493 }
494
495 /*----------------------------------------------------------------------*/
496 void EXPORT
497 call_togl_begin_polygon2d (
498                            )
499 {
500   call_def_ptrLayer ptrLayer;
501
502   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
503   if (ptrLayer == NULL) return;
504   if (ptrLayer->listIndex == 0) return;
505 #ifdef PRINT
506   printf ("call_togl_begin_polygon2d %d\n", ptrLayer->listIndex);
507 #endif
508
509   layerPoints = 0;
510   glBegin (GL_POLYGON);
511 }
512
513 /*----------------------------------------------------------------------*/
514 void EXPORT
515 call_togl_end_polygon2d (
516                          )
517 {
518   call_def_ptrLayer ptrLayer;
519
520   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
521   if (ptrLayer == NULL) return;
522   if (ptrLayer->listIndex == 0) return;
523 #ifdef PRINT
524   printf ("call_togl_end_polygon2d %d\n", ptrLayer->listIndex);
525 #endif
526
527   glEnd ();
528 }
529
530 /*----------------------------------------------------------------------*/
531 void EXPORT
532 call_togl_edge2d (
533                   float x,
534                   float y
535                   )
536 {
537   call_def_ptrLayer ptrLayer;
538
539   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
540   if (ptrLayer == NULL) return;
541   if (ptrLayer->listIndex == 0) return;
542 #ifdef PRINT
543   printf ("call_togl_edge2d %d\n", ptrLayer->listIndex);
544   printf ("\tcoord %f %f\n", x, y);
545 #endif
546
547   layerPoints ++;
548   glVertex3f (x, y, 0.);
549 }
550
551 /*----------------------------------------------------------------------*/
552 void EXPORT
553 call_togl_draw2d
554 (
555  float x,
556  float y
557  )
558 {
559   call_def_ptrLayer ptrLayer;
560
561   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
562   if (ptrLayer == NULL) return;
563   if (ptrLayer->listIndex == 0) return;
564 #ifdef PRINT
565   printf ("call_togl_draw2d %d\n", ptrLayer->listIndex);
566   printf ("\tcoord %f %f\n", x, y);
567 #endif
568
569   layerPoints ++;
570   glVertex3f (x, y, 0.);
571 }
572
573 /*----------------------------------------------------------------------*/
574 void EXPORT
575 call_togl_move2d
576 (
577  float x,
578  float y
579  )
580 {
581   call_def_ptrLayer ptrLayer;
582
583   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
584   if (ptrLayer == NULL) return;
585   if (ptrLayer->listIndex == 0) return;
586 #ifdef PRINT
587   printf ("call_togl_move2d %d\n", ptrLayer->listIndex);
588   printf ("\tcoord %f %f\n", x, y);
589 #endif
590
591   if (layerPoints != 0) {
592     call_togl_end_polyline2d ();
593     call_togl_begin_polyline2d ();
594   }
595
596   layerPoints ++;
597   glVertex3f (x, y, 0.);
598 }
599
600 /*----------------------------------------------------------------------*/
601 void EXPORT
602 call_togl_rectangle2d
603 (
604  float x,
605  float y,
606  float w,
607  float h
608  )
609 {
610   call_def_ptrLayer ptrLayer;
611
612   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
613   if (ptrLayer == NULL) return;
614   if (ptrLayer->listIndex == 0) return;
615 #ifdef PRINT
616   printf ("call_togl_rectangle2d %d\n", ptrLayer->listIndex);
617   printf ("\trectangle %f %f %f %f\n", x, y, w, h);
618 #endif
619
620   glRectf (x, y, x + w, y + h);
621 }
622
623 /*----------------------------------------------------------------------*/
624 void EXPORT
625 call_togl_text2d ( Techar *s,
626                   float x,
627                   float y,
628                   float height )
629 {
630 #ifndef WNT
631   Tint dispWidth, dispHeight;
632 #endif
633   GLdouble objx1, objy1, objz1;
634
635   call_def_ptrLayer ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
636   if (!ptrLayer) return;
637   if (ptrLayer->listIndex == 0) return;
638 #ifdef TRACE_TEXT
639   printf ("call_togl_text2d %d\n", ptrLayer->listIndex);
640   printf ("\ttext %s %f %f %f\n", s, x, y, height);
641 #endif
642
643   OpenGl_TextRender* textRender=OpenGl_TextRender::instance();
644
645   FTGLLayerFontCurrent = textRender->FindFont( FTGLLayerFontName,
646                                                FTGLLayerFontAspect,
647                                                FTGLLayerFontHeight,
648                                                FTGLLayerFontXScale,
649                                                FTGLLayerFontYScale );
650
651   objx1 = x,
652   objy1 = y,
653   objz1 = 0.0;
654
655   //szv: conversion of Techar to wchar_t
656   wchar_t *s1 = (wchar_t*)s;
657   if (sizeof(Techar) != sizeof(wchar_t))
658   {
659     Tint i = 0; while (s[i++]);
660     s1 = new wchar_t[i];
661     i = 0; while (s1[i++] = (wchar_t)(*s++));
662   }
663
664   /*
665   * On traite les differents types d'affichage de texte
666   */
667   switch (layerFontType) {
668   case 0 : /* Aspect_TODT_Normal */
669 #ifdef DEBUG
670     printf ("---------------------\n");
671     printf ("texte normal %f %f\n", objx1, objy1);
672 #endif
673
674     textRender->RenderText(s1, fontBase, 1, (float )objx1, (float )objy1, 0.f );
675
676     break;
677   case 1 : /* Aspect_TODT_SubTitle */
678 #ifdef OK
679 #ifdef DEBUG
680     printf ("---------------------\n");
681     printf ("texte subtitle %f %f\n", objx1, objy1);
682 #endif
683     glGetIntegerv (GL_VIEWPORT, viewport);
684     glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
685     glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
686 #ifdef TRACE_MAT
687     printf ("viewport :\n");
688     printf ("\t");
689     for (i = 0; i < 4; i++)
690       printf ("%d ", viewport[i]);
691     printf ("\n");
692     printf ("modelMatrix :\n");
693     for (i = 0; i < 4; i++) {
694       printf ("\t");
695       for (j = 0; j < 4; j++)
696         printf ("%f ", modelMatrix[i*4+j]);
697       printf ("\n");
698     }
699     printf ("projMatrix :\n");
700     for (i = 0; i < 4; i++) {
701       printf ("\t");
702       for (j = 0; j < 4; j++)
703         printf ("%f ", projMatrix[i*4+j]);
704       printf ("\n");
705     }
706 #endif
707     /*
708     * dimensionString("Methode cadre", &sWidth, &sAscent, &sDescent);
709     */
710     sWidth = 2.;
711     sAscent = .2;
712     sDescent = .2;
713
714     objx2 = objx1; objy2 = objy1; objz2 = objz1;
715     objx3 = objx1; objy3 = objy1; objz3 = objz1;
716     objx4 = objx1; objy4 = objy1; objz4 = objz1;
717     objx5 = objx1; objy5 = objy1; objz5 = objz1;
718
719     status = gluProject (objx1, objy1, objz1,
720                          modelMatrix, projMatrix, viewport,
721                          &winx1, &winy1, &winz1);
722
723     winx2 = winx1;
724     winy2 = winy1-sDescent;
725     winz2 = winz1+0.00001;
726     status = gluUnProject (winx2, winy2, winz2,
727                            modelMatrix, projMatrix, viewport,
728                            &objx2, &objy2, &objz2);
729
730     winx2 = winx1 + sWidth;
731     winy2 = winy1-sDescent;
732     winz2 = winz1+0.00001; /* il vaut mieux F+B / 1000000 ? */
733     status = gluUnProject (winx2, winy2, winz2,
734                            modelMatrix, projMatrix, viewport,
735                            &objx3, &objy3, &objz3);
736
737     winx2 = winx1 + sWidth;
738     winy2 = winy1 + sAscent;
739     winz2 = winz1+0.00001;
740     status = gluUnProject (winx2, winy2, winz2,
741                            modelMatrix, projMatrix, viewport,
742                            &objx4, &objy4, &objz4);
743
744     winx2 = winx1;
745     winy2 = winy1+ sAscent;
746     winz2 = winz1+0.00001;
747     status = gluUnProject (winx2, winy2, winz2,
748                            modelMatrix, projMatrix, viewport,
749                            &objx5, &objy5, &objz5);
750
751     glColor3f (layerFontRed, layerFontGreen, layerFontBlue);
752     glBegin(GL_POLYGON);
753     glVertex3d(objx2, objy2, objz2);
754     glVertex3d(objx3, objy3, objz3);
755     glVertex3d(objx4, objy4, objz4);
756     glVertex3d(objx5, objy5, objz5);
757     glEnd();
758     glColor3f (layerRed, layerGreen, layerBlue);
759 #endif /* OK */
760
761     textRender->RenderText(s1, fontBase, 1, (float )objx1, (float )objy1, 0.f); 
762
763     break;
764   case 2 : /* Aspect_TODT_Dekale */
765 #ifdef OK
766 #ifdef DEBUG
767     printf ("---------------------\n");
768     printf ("texte dekale %f %f\n", objx1, objy1);
769 #endif
770     glGetIntegerv (GL_VIEWPORT, viewport);
771     glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
772     glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
773 #ifdef DEBUG
774     printf ("viewport :\n");
775     printf ("\t");
776     for (i = 0; i < 4; i++)
777       printf ("%d ", viewport[i]);
778     printf ("\n");
779     printf ("modelMatrix :\n");
780     for (i = 0; i < 4; i++) {
781       printf ("\t");
782       for (j = 0; j < 4; j++)
783         printf ("%f ", modelMatrix[i*4+j]);
784       printf ("\n");
785     }
786     printf ("projMatrix :\n");
787     for (i = 0; i < 4; i++) {
788       printf ("\t");
789       for (j = 0; j < 4; j++)
790         printf ("%f ", projMatrix[i*4+j]);
791       printf ("\n");
792     }
793 #endif
794     status = gluProject (objx1, objy1, objz1,
795       modelMatrix, projMatrix, viewport,
796       &winx1, &winy1, &winz1);
797 #ifdef DEBUG
798     printf ("status %s\n", (status == GL_FALSE ? "ko" : "ok"));
799 #endif
800     winx2 = winx1+1;
801     winy2 = winy1+1;
802     winz2 = winz1+0.00001;
803     status = gluUnProject (winx2, winy2, winz2,
804       modelMatrix, projMatrix, viewport,
805       &objx2, &objy2, &objz2);
806 #ifdef DEBUG
807     printf ("status %s\n", (status == GL_FALSE ? "ko" : "ok"));
808 #endif
809     glColor3f (layerFontRed, layerFontGreen, layerFontBlue);
810
811
812     OpenGl_TextRender* textRender=OpenGl_TextRender::instance();
813     textRender->RenderText(s1, fontBase, 1, objx2, objy2, 0.f);
814
815
816     winx2 = winx1-1;
817     winy2 = winy1-1;
818     winz2 = winz1+0.00001;
819     status = gluUnProject (winx2, winy2, winz2,
820       modelMatrix, projMatrix, viewport,
821       &objx2, &objy2, &objz2);
822 #ifdef DEBUG
823     printf ("status %s\n", (status == GL_FALSE ? "ko" : "ok"));
824 #endif
825
826     textRender->RenderText(s1, fontBase, 1, objx2, objy2, 0.f);
827
828
829     winx2 = winx1-1;
830     winy2 = winy1+1;
831     winz2 = winz1+0.00001;
832     status = gluUnProject (winx2, winy2, winz2,
833       modelMatrix, projMatrix, viewport,
834       &objx2, &objy2, &objz2);
835 #ifdef DEBUG
836     printf ("status %s\n", (status == GL_FALSE ? "ko" : "ok"));
837 #endif
838
839
840     textRender->RenderText(s1, fontBase, 1, objx2, objy2, 0.f);
841
842     winx2 = winx1+1;
843     winy2 = winy1-1;
844     winz2 = winz1+0.00001;
845     status = gluUnProject (winx2, winy2, winz2,
846       modelMatrix, projMatrix, viewport,
847       &objx2, &objy2, &objz2);
848 #ifdef DEBUG
849     printf ("status %s\n", (status == GL_FALSE ? "ko" : "ok"));
850 #endif
851
852     textRender->RenderText(s1, fontBase, 1, objx2, objy2, 0.f);
853
854     glColor3f (layerRed, layerGreen, layerBlue);
855 #endif /* OK */
856
857     textRender->RenderText(s1, fontBase, 1, (float )objx1, (float )objy1, 0.f);
858
859 #ifdef DEBUG
860     printf ("---------------------\n");
861 #endif
862     break;
863   case 3 : /* Aspect_TODT_Blend */
864 #ifdef OK
865 #ifndef WNT
866 #ifndef __sun
867     if ( (PFNGLBLENDEQUATIONEXTPROC)glBlendEquationOp == (PFNGLBLENDEQUATIONEXTPROC)INVALID_EXT_FUNCTION_PTR )
868     {
869       if(QueryExtension("GL_EXT_blend_logic_op"))   
870         glBlendEquationOp = (PFNGLBLENDEQUATIONEXTPROC)glXGetProcAddress((GLubyte*)"glBlendEquationOp");
871       else
872         glBlendEquationOp = NULL;
873     }
874
875     if ( glBlendEquationOp )
876 #endif //__sun
877     {
878       glEnable(GL_BLEND);
879 #ifndef __sun
880       glBlendEquationOp(GL_LOGIC_OP);
881 #else
882       glBlendEquation(GL_LOGIC_OP);
883 #endif //__sun
884       glLogicOp(GL_XOR); 
885       glColor3f (layerRed, layerGreen, layerBlue);
886       glRasterPos2f (objx1, objy1);             
887       glDisable (GL_BLEND);
888     }
889 #else
890     glColor3f (layerRed, layerGreen, layerBlue);
891
892     textRender->RenderText(s1, fontBase, 1, (float )objx1, (float )objy1, 0.f);
893
894
895 #endif //WNT
896
897 #else /* OK */
898 #ifdef DEBUG
899     printf ("---------------------\n");
900     printf ("texte blend %f %f\n", objx1, objy1);
901 #endif
902
903     textRender->RenderText(s1, fontBase, 1, (float )objx1, (float )objy1, 0.f);
904
905 #ifdef DEBUG
906     printf ("---------------------\n");
907 #endif
908 #endif /* OK */
909     break;
910   }
911   //szv: delete temporary wide string
912   if (sizeof(Techar) != sizeof(wchar_t))
913     delete[] s1;
914 }
915
916 void EXPORT
917 call_togl_textsize2d
918 (
919  Techar *s,
920  float height,
921  float *width,
922  float *ascent,
923  float *descent
924  )
925 {
926 #ifndef WNT
927   Tint dispWidth, dispHeight;
928 #endif
929
930   call_def_ptrLayer ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
931   if (!ptrLayer) return;
932   if (ptrLayer->listIndex == 0) return;
933
934   OpenGl_TextRender* textRender =  OpenGl_TextRender::instance();
935
936   if ( FTGLLayerFontHeight != height || layerFontFlag == IsModified || FTGLLayerFontCurrent == 0 )
937   {
938     layerFontFlag = IsNotModified;
939     FTGLLayerFontHeight = height;  
940     FTGLLayerFontCurrent = textRender -> FindFont(FTGLLayerFontName, FTGLLayerFontAspect, FTGLLayerFontHeight);
941   }
942
943   //szv: conversion of Techar to wchar_t
944   wchar_t *s1 = (wchar_t*)s, *s2 = 0;
945   if (sizeof(Techar) != sizeof(wchar_t))
946   {
947     Tint i = 0; while (s[i++]);
948     s1 = s2 = new wchar_t[i];
949     i = 0; while (s1[i++] = (wchar_t)(*s++));
950   }
951   textRender->StringSize(s1, &FTGLLayerFontWidth, &FTGLLayerFontAscent, &FTGLLayerFontDescent);
952   //szv: delete temporary wide string
953   if (s2) delete[] s2;
954
955   *width = (float) FTGLLayerFontWidth;
956   *ascent = (float) FTGLLayerFontAscent;
957   *descent = (float) FTGLLayerFontDescent;
958
959 }
960
961 /*----------------------------------------------------------------------*/
962 void EXPORT
963 call_togl_set_color
964 (
965  float r,
966  float g,
967  float b
968  )
969 {
970   call_def_ptrLayer ptrLayer;
971
972   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
973   if (ptrLayer == NULL) return;
974   if (ptrLayer->listIndex == 0) return;
975 #ifdef PRINT
976   printf ("call_togl_set_color %d\n", ptrLayer->listIndex);
977   printf ("\tcolor %f %f %f\n", r, g, b);
978 #endif
979
980   layerRed = r,
981     layerGreen = g,
982     layerBlue = b;
983   glColor3f (r, g, b);
984 }
985
986 /*----------------------------------------------------------------------*/
987 void EXPORT
988 call_togl_set_transparency
989 (
990  float a
991  )
992 {
993   call_def_ptrLayer ptrLayer;
994
995   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
996   if (ptrLayer == NULL) return;
997   if (ptrLayer->listIndex == 0) return;
998 #ifdef PRINT
999   printf ("call_togl_set_transparency %d\n", ptrLayer->listIndex);
1000   printf ("\ttransparency %f\n", a);
1001 #endif
1002
1003   glEnable (GL_BLEND);
1004   glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1005   glColor4f (layerRed, layerGreen, layerBlue, a);
1006 }
1007
1008 /*----------------------------------------------------------------------*/
1009 void EXPORT
1010 call_togl_unset_transparency
1011 (
1012  )
1013 {
1014   call_def_ptrLayer ptrLayer;
1015
1016   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
1017   if (ptrLayer == NULL) return;
1018   if (ptrLayer->listIndex == 0) return;
1019 #ifdef PRINT
1020   printf ("call_togl_set_untransparency %d\n", ptrLayer->listIndex);
1021 #endif
1022
1023   glDisable (GL_BLEND);
1024 }
1025
1026 /*----------------------------------------------------------------------*/
1027 void EXPORT
1028 call_togl_set_line_attributes
1029 (
1030  long type,
1031  float width
1032  )
1033 {
1034   call_def_ptrLayer ptrLayer;
1035
1036   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
1037   if (ptrLayer == NULL) return;
1038   if (ptrLayer->listIndex == 0) return;
1039 #ifdef PRINT
1040   printf ("call_togl_set_line_attributes %d\n", ptrLayer->listIndex);
1041   printf ("\ttype, width %d %f\n", type, width);
1042 #endif
1043   if (layerType != type) {
1044     layerType = type;
1045     if (layerType == 0) { /* TOL_SOLID */
1046       glDisable (GL_LINE_STIPPLE);
1047     }
1048     else {
1049       if (layerType) {
1050         glCallList (linestyleBase+layerType);
1051         glEnable (GL_LINE_STIPPLE);
1052       }
1053     }
1054   }
1055   if (layerWidth != width) {
1056     layerWidth = width;
1057     glLineWidth ((GLfloat) layerWidth);
1058   }
1059 }
1060
1061 /*----------------------------------------------------------------------*/
1062 void EXPORT
1063 call_togl_set_text_attributes
1064 (
1065  Tchar* font,
1066  long type,
1067  float r,
1068  float g,
1069  float b
1070  )
1071 {
1072   call_def_ptrLayer ptrLayer;
1073
1074   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
1075   if (ptrLayer == NULL) return;
1076   if (ptrLayer->listIndex == 0) return;
1077 #ifdef PRINT
1078   printf ("call_togl_set_text_attributes %d\n", ptrLayer->listIndex);
1079   printf ("\tfont %s type %ld\n", font, type);
1080   printf ("\tcolor %f %f %f\n", r, g, b);
1081 #endif
1082
1083   if ( strcmp( (char*)FTGLLayerFontName, (char*)font ) != 0 ) {
1084     FTGLLayerFontName[0] = '\0';
1085     strcat( (char*)FTGLLayerFontName, (char*)font );
1086     FTGLLayerFontAspect = OSD_FA_Regular;
1087
1088     OpenGl_TextRender*  textRender =  OpenGl_TextRender::instance();
1089     FTGLLayerFontCurrent = textRender -> FindFont(FTGLLayerFontName, FTGLLayerFontAspect, FTGLLayerFontHeight);
1090
1091     layerFontType = type;
1092     layerFontRed = r;
1093     layerFontGreen = g;
1094     layerFontBlue = b;         
1095     layerFontFlag = IsModified; 
1096   }
1097   else 
1098     return;                                   
1099 }
1100
1101 void call_togl_set_text_attributes( Tchar* font,
1102                                     Tint height,
1103                                     OSD_FontAspect aspect,
1104                                     float r,
1105                                     float g,
1106                                     float b )
1107 {
1108   call_def_ptrLayer ptrLayer;
1109
1110   ptrLayer = (call_def_ptrLayer) ACLayer.ptrLayer;
1111   if (ptrLayer == NULL) return;
1112   if (ptrLayer->listIndex == 0) return;
1113
1114 #ifdef PRINT
1115   printf ("call_togl_set_text_attributes %d\n", ptrLayer->listIndex);
1116   printf ("\tfont %s type \n", font);
1117   printf ("\tcolor %f %f %f\n", r, g, b);
1118 #endif
1119   /*
1120   * On gere le type de font (ASCII !)
1121   */
1122   if ( strcmp( (char*)FTGLLayerFontName, (char*)font ) != 0 &&
1123        FTGLLayerFontAspect == aspect && 
1124        FTGLLayerFontHeight == height
1125       ) 
1126   {
1127     FTGLLayerFontName[0] = '\0';
1128     strcat( (char*)FTGLLayerFontName, (char*)font );
1129     FTGLLayerFontHeight = height;
1130     FTGLLayerFontAspect = aspect;
1131     layerFontFlag = IsModified;
1132     FTGLLayerFontXScale = FTGLLayerFontYScale = 1.f;
1133     OpenGl_TextRender*  textRender =  OpenGl_TextRender::instance();
1134     FTGLLayerFontCurrent = textRender -> FindFont(FTGLLayerFontName, FTGLLayerFontAspect, FTGLLayerFontHeight);
1135
1136     layerFontRed = r;
1137     layerFontGreen = g;
1138     layerFontBlue = b;
1139   }
1140
1141 }
1142