1 // Created on: 2011-07-14
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #include <OpenGl_AspectMarker.hxx>
17 #include <OpenGl_Context.hxx>
18 #include <OpenGl_GraphicDriver.hxx>
19 #include <OpenGl_PointSprite.hxx>
20 #include <OpenGl_ShaderManager.hxx>
21 #include <OpenGl_ShaderProgram.hxx>
22 #include <OpenGl_Workspace.hxx>
24 #include <Image_PixMap.hxx>
25 #include <Graphic3d_MarkerImage.hxx>
26 #include <Graphic3d_ShaderProgram.hxx>
27 #include <NCollection_Vec4.hxx>
28 #include <TColStd_HArray1OfByte.hxx>
32 static const TCollection_AsciiString THE_EMPTY_KEY;
34 //! Draw inner point as filled rectangle
35 static Handle(TColStd_HArray1OfByte) fillPointBitmap (const Standard_Integer theSize)
37 // draw inner point as filled rectangle
38 const Standard_Integer aNumOfBytes = (theSize / 8 + (theSize % 8 ? 1 : 0)) * theSize;
39 Handle(TColStd_HArray1OfByte) aBitMap = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
40 for (Standard_Integer anIter = 0; anIter < aBitMap->Length(); ++anIter)
42 aBitMap->SetValue (anIter, 255);
48 // Following Section relates to default markers
50 #define TEL_NO_OF_SIZES 13
51 #define TEL_PM_START_SIZE 1.0
52 #define TEL_PM_END_SIZE 7.0
59 typedef PM_FONT_INFO* pm_font_info;
61 #define PM_PLUS_10_NUM 9*2
62 #define PM_PLUS_15_NUM 11*2
63 #define PM_PLUS_20_NUM 13*2
64 #define PM_PLUS_25_NUM 15*2
65 #define PM_PLUS_30_NUM 17*3
66 #define PM_PLUS_35_NUM 19*3
67 #define PM_PLUS_40_NUM 21*3
68 #define PM_PLUS_45_NUM 23*3
69 #define PM_PLUS_50_NUM 25*4
70 #define PM_PLUS_55_NUM 27*4
71 #define PM_PLUS_60_NUM 29*4
72 #define PM_PLUS_65_NUM 31*4
73 #define PM_PLUS_70_NUM 32*4
75 #define PM_STAR_10_NUM 9
76 #define PM_STAR_15_NUM 11*2
77 #define PM_STAR_20_NUM 13*2
78 #define PM_STAR_25_NUM 15*2
79 #define PM_STAR_30_NUM 17*2
80 #define PM_STAR_35_NUM 19*2
81 #define PM_STAR_40_NUM 21*3
82 #define PM_STAR_45_NUM 23*3
83 #define PM_STAR_50_NUM 25*3
84 #define PM_STAR_55_NUM 27*3
85 #define PM_STAR_60_NUM 29*4
86 #define PM_STAR_65_NUM 32*4
87 #define PM_STAR_70_NUM 32*4
89 #define PM_CIRC_10_NUM 7
90 #define PM_CIRC_15_NUM 9*2
91 #define PM_CIRC_20_NUM 9*2
92 #define PM_CIRC_25_NUM 11*2
93 #define PM_CIRC_30_NUM 13*2
94 #define PM_CIRC_35_NUM 15*2
95 #define PM_CIRC_40_NUM 17*3
96 #define PM_CIRC_45_NUM 19*3
97 #define PM_CIRC_50_NUM 21*3
98 #define PM_CIRC_55_NUM 23*3
99 #define PM_CIRC_60_NUM 25*4
100 #define PM_CIRC_65_NUM 27*4
101 #define PM_CIRC_70_NUM 29*4
103 #define PM_CROSS_10_NUM 7
104 #define PM_CROSS_15_NUM 9*2
105 #define PM_CROSS_20_NUM 11*2
106 #define PM_CROSS_25_NUM 13*2
107 #define PM_CROSS_30_NUM 15*2
108 #define PM_CROSS_35_NUM 17*3
109 #define PM_CROSS_40_NUM 19*3
110 #define PM_CROSS_45_NUM 21*3
111 #define PM_CROSS_50_NUM 23*3
112 #define PM_CROSS_55_NUM 25*4
113 #define PM_CROSS_60_NUM 27*4
114 #define PM_CROSS_65_NUM 32*4
115 #define PM_CROSS_70_NUM 32*4
117 #define PM_PLUS_10_OFT 0
118 #define PM_PLUS_15_OFT PM_PLUS_10_OFT + PM_PLUS_10_NUM
119 #define PM_PLUS_20_OFT PM_PLUS_15_OFT + PM_PLUS_15_NUM
120 #define PM_PLUS_25_OFT PM_PLUS_20_OFT + PM_PLUS_20_NUM
121 #define PM_PLUS_30_OFT PM_PLUS_25_OFT + PM_PLUS_25_NUM
122 #define PM_PLUS_35_OFT PM_PLUS_30_OFT + PM_PLUS_30_NUM
123 #define PM_PLUS_40_OFT PM_PLUS_35_OFT + PM_PLUS_35_NUM
124 #define PM_PLUS_45_OFT PM_PLUS_40_OFT + PM_PLUS_40_NUM
125 #define PM_PLUS_50_OFT PM_PLUS_45_OFT + PM_PLUS_45_NUM
126 #define PM_PLUS_55_OFT PM_PLUS_50_OFT + PM_PLUS_50_NUM
127 #define PM_PLUS_60_OFT PM_PLUS_55_OFT + PM_PLUS_55_NUM
128 #define PM_PLUS_65_OFT PM_PLUS_60_OFT + PM_PLUS_60_NUM
129 #define PM_PLUS_70_OFT PM_PLUS_65_OFT + PM_PLUS_65_NUM
131 #define PM_STAR_10_OFT PM_PLUS_70_OFT + PM_PLUS_70_NUM
132 #define PM_STAR_15_OFT PM_STAR_10_OFT + PM_STAR_10_NUM
133 #define PM_STAR_20_OFT PM_STAR_15_OFT + PM_STAR_15_NUM
134 #define PM_STAR_25_OFT PM_STAR_20_OFT + PM_STAR_20_NUM
135 #define PM_STAR_30_OFT PM_STAR_25_OFT + PM_STAR_25_NUM
136 #define PM_STAR_35_OFT PM_STAR_30_OFT + PM_STAR_30_NUM
137 #define PM_STAR_40_OFT PM_STAR_35_OFT + PM_STAR_35_NUM
138 #define PM_STAR_45_OFT PM_STAR_40_OFT + PM_STAR_40_NUM
139 #define PM_STAR_50_OFT PM_STAR_45_OFT + PM_STAR_45_NUM
140 #define PM_STAR_55_OFT PM_STAR_50_OFT + PM_STAR_50_NUM
141 #define PM_STAR_60_OFT PM_STAR_55_OFT + PM_STAR_55_NUM
142 #define PM_STAR_65_OFT PM_STAR_60_OFT + PM_STAR_60_NUM
143 #define PM_STAR_70_OFT PM_STAR_65_OFT + PM_STAR_65_NUM
145 #define PM_CIRC_10_OFT PM_STAR_70_OFT + PM_STAR_70_NUM
146 #define PM_CIRC_15_OFT PM_CIRC_10_OFT + PM_CIRC_10_NUM
147 #define PM_CIRC_20_OFT PM_CIRC_15_OFT + PM_CIRC_15_NUM
148 #define PM_CIRC_25_OFT PM_CIRC_20_OFT + PM_CIRC_20_NUM
149 #define PM_CIRC_30_OFT PM_CIRC_25_OFT + PM_CIRC_25_NUM
150 #define PM_CIRC_35_OFT PM_CIRC_30_OFT + PM_CIRC_30_NUM
151 #define PM_CIRC_40_OFT PM_CIRC_35_OFT + PM_CIRC_35_NUM
152 #define PM_CIRC_45_OFT PM_CIRC_40_OFT + PM_CIRC_40_NUM
153 #define PM_CIRC_50_OFT PM_CIRC_45_OFT + PM_CIRC_45_NUM
154 #define PM_CIRC_55_OFT PM_CIRC_50_OFT + PM_CIRC_50_NUM
155 #define PM_CIRC_60_OFT PM_CIRC_55_OFT + PM_CIRC_55_NUM
156 #define PM_CIRC_65_OFT PM_CIRC_60_OFT + PM_CIRC_60_NUM
157 #define PM_CIRC_70_OFT PM_CIRC_65_OFT + PM_CIRC_65_NUM
159 #define PM_CROSS_10_OFT PM_CIRC_70_OFT + PM_CIRC_70_NUM
160 #define PM_CROSS_15_OFT PM_CROSS_10_OFT + PM_CROSS_10_NUM
161 #define PM_CROSS_20_OFT PM_CROSS_15_OFT + PM_CROSS_15_NUM
162 #define PM_CROSS_25_OFT PM_CROSS_20_OFT + PM_CROSS_20_NUM
163 #define PM_CROSS_30_OFT PM_CROSS_25_OFT + PM_CROSS_25_NUM
164 #define PM_CROSS_35_OFT PM_CROSS_30_OFT + PM_CROSS_30_NUM
165 #define PM_CROSS_40_OFT PM_CROSS_35_OFT + PM_CROSS_35_NUM
166 #define PM_CROSS_45_OFT PM_CROSS_40_OFT + PM_CROSS_40_NUM
167 #define PM_CROSS_50_OFT PM_CROSS_45_OFT + PM_CROSS_45_NUM
168 #define PM_CROSS_55_OFT PM_CROSS_50_OFT + PM_CROSS_50_NUM
169 #define PM_CROSS_60_OFT PM_CROSS_55_OFT + PM_CROSS_55_NUM
170 #define PM_CROSS_65_OFT PM_CROSS_60_OFT + PM_CROSS_60_NUM
171 #define PM_CROSS_70_OFT PM_CROSS_65_OFT + PM_CROSS_65_NUM
173 static const PM_FONT_INFO arrPMFontInfo[][TEL_NO_OF_SIZES] =
175 // TOM_POINT - not used
191 {{ 9.f, 9.f, PM_PLUS_10_OFT},
192 {11.f, 11.f, PM_PLUS_15_OFT},
193 {13.f, 13.f, PM_PLUS_20_OFT},
194 {15.f, 15.f, PM_PLUS_25_OFT},
195 {17.f, 17.f, PM_PLUS_30_OFT},
196 {19.f, 19.f, PM_PLUS_35_OFT},
197 {21.f, 21.f, PM_PLUS_40_OFT},
198 {23.f, 23.f, PM_PLUS_45_OFT},
199 {25.f, 25.f, PM_PLUS_50_OFT},
200 {27.f, 27.f, PM_PLUS_55_OFT},
201 {29.f, 29.f, PM_PLUS_60_OFT},
202 {31.f, 31.f, PM_PLUS_65_OFT},
203 {32.f, 32.f, PM_PLUS_70_OFT}},
206 {{ 7.f, 9.f, PM_STAR_10_OFT},
207 {9.f, 11.f, PM_STAR_15_OFT},
208 {11.f, 13.f, PM_STAR_20_OFT},
209 {13.f, 15.f, PM_STAR_25_OFT},
210 {13.f, 17.f, PM_STAR_30_OFT},
211 {15.f, 19.f, PM_STAR_35_OFT},
212 {17.f, 21.f, PM_STAR_40_OFT},
213 {19.f, 23.f, PM_STAR_45_OFT},
214 {21.f, 25.f, PM_STAR_50_OFT},
215 {23.f, 27.f, PM_STAR_55_OFT},
216 {25.f, 29.f, PM_STAR_60_OFT},
217 {32.f, 32.f, PM_STAR_65_OFT},
218 {32.f, 32.f, PM_STAR_70_OFT}},
221 {{ 7.f, 7.f, PM_CROSS_10_OFT},
222 { 9.f, 9.f, PM_CROSS_15_OFT},
223 {11.f, 11.f, PM_CROSS_20_OFT},
224 {13.f, 13.f, PM_CROSS_25_OFT},
225 {15.f, 15.f, PM_CROSS_30_OFT},
226 {17.f, 17.f, PM_CROSS_35_OFT},
227 {19.f, 19.f, PM_CROSS_40_OFT},
228 {21.f, 21.f, PM_CROSS_45_OFT},
229 {23.f, 23.f, PM_CROSS_50_OFT},
230 {25.f, 25.f, PM_CROSS_55_OFT},
231 {27.f, 27.f, PM_CROSS_60_OFT},
232 {32.f, 32.f, PM_CROSS_65_OFT},
233 {32.f, 32.f, PM_CROSS_70_OFT}},
236 {{ 7.f, 7.f, PM_CIRC_10_OFT},
237 { 9.f, 9.f, PM_CIRC_15_OFT},
238 { 9.f, 9.f, PM_CIRC_20_OFT},
239 {11.f, 11.f, PM_CIRC_25_OFT},
240 {13.f, 13.f, PM_CIRC_30_OFT},
241 {15.f, 15.f, PM_CIRC_35_OFT},
242 {17.f, 17.f, PM_CIRC_40_OFT},
243 {19.f, 19.f, PM_CIRC_45_OFT},
244 {21.f, 21.f, PM_CIRC_50_OFT},
245 {23.f, 23.f, PM_CIRC_55_OFT},
246 {25.f, 25.f, PM_CIRC_60_OFT},
247 {27.f, 27.f, PM_CIRC_65_OFT},
248 {29.f, 29.f, PM_CIRC_70_OFT}}
251 static const Standard_Byte OpenGl_AspectMarker_myMarkerRaster[] =
263 0x08,0x00, // PLUS 9x9 = 1.0
275 0x04,0x00, // PLUS 11x11 = 1.5
289 0x02,0x00, // PLUS 13x13 = 2.0
305 0x01,0x00, // PLUS 15x15 = 2.5
323 0x00,0x80, 0x00, // PLUS 17x17 = 3.0
343 0x00,0x40, 0x00, // PLUS 19x19 = 3.5
365 0x00,0x20, 0x00, // PLUS 21x21 = 4.0
389 0x00,0x10, 0x00, // PLUS 23x23 = 4.5
391 0x00,0x08, 0x00,0x00,
392 0x00,0x08, 0x00,0x00,
393 0x00,0x08, 0x00,0x00,
394 0x00,0x08, 0x00,0x00,
395 0x00,0x08, 0x00,0x00,
396 0x00,0x08, 0x00,0x00,
397 0x00,0x08, 0x00,0x00,
398 0x00,0x08, 0x00,0x00,
399 0x00,0x08, 0x00,0x00,
400 0x00,0x08, 0x00,0x00,
401 0x00,0x08, 0x00,0x00,
402 0x00,0x08, 0x00,0x00,
403 0xff,0xff, 0xff,0x80,
404 0x00,0x08, 0x00,0x00,
405 0x00,0x08, 0x00,0x00,
406 0x00,0x08, 0x00,0x00,
407 0x00,0x08, 0x00,0x00,
408 0x00,0x08, 0x00,0x00,
409 0x00,0x08, 0x00,0x00,
410 0x00,0x08, 0x00,0x00,
411 0x00,0x08, 0x00,0x00,
412 0x00,0x08, 0x00,0x00,
413 0x00,0x08, 0x00,0x00,
414 0x00,0x08, 0x00,0x00,
415 0x00,0x08, 0x00,0x00, // PLUS 25x25 = 5.0
417 0x00,0x04, 0x00,0x00,
418 0x00,0x04, 0x00,0x00,
419 0x00,0x04, 0x00,0x00,
420 0x00,0x04, 0x00,0x00,
421 0x00,0x04, 0x00,0x00,
422 0x00,0x04, 0x00,0x00,
423 0x00,0x04, 0x00,0x00,
424 0x00,0x04, 0x00,0x00,
425 0x00,0x04, 0x00,0x00,
426 0x00,0x04, 0x00,0x00,
427 0x00,0x04, 0x00,0x00,
428 0x00,0x04, 0x00,0x00,
429 0x00,0x04, 0x00,0x00,
430 0xff,0xff, 0xff,0xe0,
431 0x00,0x04, 0x00,0x00,
432 0x00,0x04, 0x00,0x00,
433 0x00,0x04, 0x00,0x00,
434 0x00,0x04, 0x00,0x00,
435 0x00,0x04, 0x00,0x00,
436 0x00,0x04, 0x00,0x00,
437 0x00,0x04, 0x00,0x00,
438 0x00,0x04, 0x00,0x00,
439 0x00,0x04, 0x00,0x00,
440 0x00,0x04, 0x00,0x00,
441 0x00,0x04, 0x00,0x00,
442 0x00,0x04, 0x00,0x00,
443 0x00,0x04, 0x00,0x00, // PLUS 27x27 = 5.5
445 0x00,0x02, 0x00,0x00,
446 0x00,0x02, 0x00,0x00,
447 0x00,0x02, 0x00,0x00,
448 0x00,0x02, 0x00,0x00,
449 0x00,0x02, 0x00,0x00,
450 0x00,0x02, 0x00,0x00,
451 0x00,0x02, 0x00,0x00,
452 0x00,0x02, 0x00,0x00,
453 0x00,0x02, 0x00,0x00,
454 0x00,0x02, 0x00,0x00,
455 0x00,0x02, 0x00,0x00,
456 0x00,0x02, 0x00,0x00,
457 0x00,0x02, 0x00,0x00,
458 0x00,0x02, 0x00,0x00,
459 0xff,0xff, 0xff,0xf8,
460 0x00,0x02, 0x00,0x00,
461 0x00,0x02, 0x00,0x00,
462 0x00,0x02, 0x00,0x00,
463 0x00,0x02, 0x00,0x00,
464 0x00,0x02, 0x00,0x00,
465 0x00,0x02, 0x00,0x00,
466 0x00,0x02, 0x00,0x00,
467 0x00,0x02, 0x00,0x00,
468 0x00,0x02, 0x00,0x00,
469 0x00,0x02, 0x00,0x00,
470 0x00,0x02, 0x00,0x00,
471 0x00,0x02, 0x00,0x00,
472 0x00,0x02, 0x00,0x00,
473 0x00,0x02, 0x00,0x00, // PLUS 29x29 = 6.0
475 0x00,0x01, 0x00,0x00,
476 0x00,0x01, 0x00,0x00,
477 0x00,0x01, 0x00,0x00,
478 0x00,0x01, 0x00,0x00,
479 0x00,0x01, 0x00,0x00,
480 0x00,0x01, 0x00,0x00,
481 0x00,0x01, 0x00,0x00,
482 0x00,0x01, 0x00,0x00,
483 0x00,0x01, 0x00,0x00,
484 0x00,0x01, 0x00,0x00,
485 0x00,0x01, 0x00,0x00,
486 0x00,0x01, 0x00,0x00,
487 0x00,0x01, 0x00,0x00,
488 0x00,0x01, 0x00,0x00,
489 0x00,0x01, 0x00,0x00,
490 0xff,0xff, 0xff,0xfd,
491 0x00,0x01, 0x00,0x00,
492 0x00,0x01, 0x00,0x00,
493 0x00,0x01, 0x00,0x00,
494 0x00,0x01, 0x00,0x00,
495 0x00,0x01, 0x00,0x00,
496 0x00,0x01, 0x00,0x00,
497 0x00,0x01, 0x00,0x00,
498 0x00,0x01, 0x00,0x00,
499 0x00,0x01, 0x00,0x00,
500 0x00,0x01, 0x00,0x00,
501 0x00,0x01, 0x00,0x00,
502 0x00,0x01, 0x00,0x00,
503 0x00,0x01, 0x00,0x00,
504 0x00,0x01, 0x00,0x00,
505 0x00,0x01, 0x00,0x00, // PLUS 31x31 = 6.5
507 0x00,0x00, 0x80,0x00,
508 0x00,0x00, 0x80,0x00,
509 0x00,0x00, 0x80,0x00,
510 0x00,0x00, 0x80,0x00,
511 0x00,0x00, 0x80,0x00,
512 0x00,0x00, 0x80,0x00,
513 0x00,0x00, 0x80,0x00,
514 0x00,0x00, 0x80,0x00,
515 0x00,0x00, 0x80,0x00,
516 0x00,0x00, 0x80,0x00,
517 0x00,0x00, 0x80,0x00,
518 0x00,0x00, 0x80,0x00,
519 0x00,0x00, 0x80,0x00,
520 0x00,0x00, 0x80,0x00,
521 0x00,0x00, 0x80,0x00,
522 0x00,0x00, 0x80,0x00,
523 0xff,0xff, 0xff,0xff,
524 0x00,0x00, 0x80,0x00,
525 0x00,0x00, 0x80,0x00,
526 0x00,0x00, 0x80,0x00,
527 0x00,0x00, 0x80,0x00,
528 0x00,0x00, 0x80,0x00,
529 0x00,0x00, 0x80,0x00,
530 0x00,0x00, 0x80,0x00,
531 0x00,0x00, 0x80,0x00,
532 0x00,0x00, 0x80,0x00,
533 0x00,0x00, 0x80,0x00,
534 0x00,0x00, 0x80,0x00,
535 0x00,0x00, 0x80,0x00,
536 0x00,0x00, 0x80,0x00,
537 0x00,0x00, 0x80,0x00,
538 0x00,0x00, 0x80,0x00, // PLUS 32x32 = 7.0
550 0x10, // STAR 7x9 = 1.0
562 0x08,0x00, // STAR 9x11 = 1.5
576 0x04,0x00, // STAR 11x13 = 2.0
592 0x02,0x00, // STAR 13x15 = 2.5
610 0x02,0x00, // STAR 13x17 = 3.0
630 0x01,0x00, // STAR 15x19 = 3.5
652 0x00,0x80, 0x00, // STAR 17x21 = 4.0
676 0x00,0x40, 0x00, // STAR 19x23 = 4.5
702 0x00,0x20, 0x00, // STAR 21x25 = 5.0
730 0x00,0x10, 0x00, // STAR 23x27 = 5.5
732 0x00,0x08, 0x00,0x00,
733 0x00,0x08, 0x00,0x00,
734 0x00,0x08, 0x00,0x00,
735 0x00,0x08, 0x00,0x00,
736 0x00,0x08, 0x00,0x00,
737 0x00,0x08, 0x00,0x00,
738 0x00,0x08, 0x00,0x00,
739 0x80,0x08, 0x00,0x80,
740 0x60,0x08, 0x03,0x00,
741 0x18,0x08, 0x0c,0x00,
742 0x04,0x08, 0x30,0x00,
743 0x03,0x08, 0x40,0x00,
744 0x00,0xc9, 0x80,0x00,
745 0x00,0x3e, 0x00,0x00,
746 0x00,0x08, 0x00,0x00,
747 0x00,0x3e, 0x00,0x00,
748 0x00,0xc9, 0x80,0x00,
749 0x03,0x08, 0x40,0x00,
750 0x04,0x08, 0x30,0x00,
751 0x18,0x08, 0x0c,0x00,
752 0x60,0x08, 0x03,0x00,
753 0x80,0x08, 0x00,0x80,
754 0x00,0x08, 0x00,0x00,
755 0x00,0x08, 0x00,0x00,
756 0x00,0x08, 0x00,0x00,
757 0x00,0x08, 0x00,0x00,
758 0x00,0x08, 0x00,0x00,
759 0x00,0x08, 0x00,0x00,
760 0x00,0x08, 0x00,0x00, // STAR 25x29 = 6.0
762 0x00,0x00, 0x80,0x00,
763 0x00,0x00, 0x80,0x00,
764 0x00,0x00, 0x80,0x00,
765 0x00,0x00, 0x80,0x00,
766 0x00,0x00, 0x80,0x00,
767 0x00,0x00, 0x80,0x00,
768 0x00,0x00, 0x80,0x00,
769 0x00,0x00, 0x80,0x00,
770 0x00,0x00, 0x80,0x00,
771 0x30,0x00, 0x80,0x06,
772 0x0c,0x00, 0x80,0x18,
773 0x03,0x00, 0x80,0x60,
774 0x00,0xc0, 0x81,0x80,
775 0x00,0x30, 0x86,0x00,
776 0x00,0x0c, 0x98,0x00,
777 0x00,0x03, 0xe0,0x00,
778 0x00,0x03, 0xe0,0x00,
779 0x00,0x0c, 0x98,0x00,
780 0x00,0x30, 0x86,0x00,
781 0x00,0xc0, 0x81,0x80,
782 0x03,0x00, 0x80,0x60,
783 0x0c,0x00, 0x80,0x18,
784 0x30,0x00, 0x80,0x06,
785 0x00,0x00, 0x80,0x00,
786 0x00,0x00, 0x80,0x00,
787 0x00,0x00, 0x80,0x00,
788 0x00,0x00, 0x80,0x00,
789 0x00,0x00, 0x80,0x00,
790 0x00,0x00, 0x80,0x00,
791 0x00,0x00, 0x80,0x00,
792 0x00,0x00, 0x00,0x00,
793 0x00,0x00, 0x00,0x00, // STAR 32x32 = 6.5
795 0x00, 0x00, 0x80, 0x00,
796 0x00, 0x00, 0x80, 0x00,
797 0x00, 0x00, 0x80, 0x00,
798 0x00, 0x00, 0x80, 0x00,
799 0x00, 0x00, 0x80, 0x00,
800 0x00, 0x00, 0x80, 0x00,
801 0x00, 0x00, 0x80, 0x00,
802 0x00, 0x00, 0x80, 0x00,
803 0x10, 0x00, 0x80, 0x04,
804 0x0c, 0x00, 0x80, 0x18,
805 0x02, 0x00, 0x80, 0x20,
806 0x01, 0x80, 0x80, 0xc0,
807 0x00, 0x40, 0x81, 0x00,
808 0x00, 0x30, 0x86, 0x00,
809 0x00, 0x08, 0x88, 0x00,
810 0x00, 0x06, 0xb0, 0x00,
811 0x00, 0x01, 0xc0, 0x00,
812 0x00, 0x06, 0xb0, 0x00,
813 0x00, 0x08, 0x88, 0x00,
814 0x00, 0x30, 0x86, 0x00,
815 0x00, 0x40, 0x81, 0x00,
816 0x01, 0x80, 0x80, 0xc0,
817 0x02, 0x00, 0x80, 0x20,
818 0x0c, 0x00, 0x80, 0x18,
819 0x10, 0x00, 0x80, 0x04,
820 0x00, 0x00, 0x80, 0x00,
821 0x00, 0x00, 0x80, 0x00,
822 0x00, 0x00, 0x80, 0x00,
823 0x00, 0x00, 0x80, 0x00,
824 0x00, 0x00, 0x80, 0x00,
825 0x00, 0x00, 0x80, 0x00,
826 0x00, 0x00, 0x80, 0x00, // STAR 32x32 = 7.0
836 0x38, // CIRC 7x7 = 1.0
846 0x00,0x00, //CIRC 9x9 = 1.5
856 0x3e,0x00, // CIRC 9x9 = 2.0
868 0x1f,0x00, // CIRC 11x11 = 2.5
882 0x0f,0x80, // CIRC 13x13 = 3.0
898 0x07,0xc0, // CIRC 15x15 = 3.5
916 0x03,0xe0, 0x00, // CIRC 17x17 = 4.0
936 0x03,0xf8, 0x00, // CIRC 19x19 = 4.5
958 0x01,0xfc, 0x00, // CIRC 21x21 = 5.0
982 0x00,0xfe, 0x00, // CIRC 23x23 = 5.5
984 0x00,0x7f, 0x00,0x00,
985 0x01,0x80, 0xc0,0x00,
986 0x06,0x00, 0x30,0x00,
987 0x08,0x00, 0x08,0x00,
988 0x10,0x00, 0x04,0x00,
989 0x20,0x00, 0x02,0x00,
990 0x20,0x00, 0x02,0x00,
991 0x40,0x00, 0x01,0x00,
992 0x40,0x00, 0x01,0x00,
993 0x80,0x00, 0x00,0x80,
994 0x80,0x00, 0x00,0x80,
995 0x80,0x00, 0x00,0x80,
996 0x80,0x00, 0x00,0x80,
997 0x80,0x00, 0x00,0x80,
998 0x80,0x00, 0x00,0x80,
999 0x80,0x00, 0x00,0x80,
1000 0x40,0x00, 0x01,0x00,
1001 0x40,0x00, 0x01,0x00,
1002 0x20,0x00, 0x02,0x00,
1003 0x20,0x00, 0x02,0x00,
1004 0x10,0x00, 0x04,0x00,
1005 0x08,0x00, 0x08,0x00,
1006 0x06,0x00, 0x30,0x00,
1007 0x01,0x80, 0xc0,0x00,
1008 0x00,0x7f, 0x00,0x00, // CIRC 25x25 = 6.0
1010 0x00,0x3f, 0x80,0x00,
1011 0x01,0xc0, 0x70,0x00,
1012 0x03,0x00, 0x18,0x00,
1013 0x0c,0x00, 0x06,0x00,
1014 0x18,0x00, 0x03,0x00,
1015 0x10,0x00, 0x01,0x00,
1016 0x20,0x00, 0x00,0x80,
1017 0x60,0x00, 0x00,0xc0,
1018 0x40,0x00, 0x00,0x40,
1019 0x40,0x00, 0x00,0x40,
1020 0x80,0x00, 0x00,0x20,
1021 0x80,0x00, 0x00,0x20,
1022 0x80,0x00, 0x00,0x20,
1023 0x80,0x00, 0x00,0x20,
1024 0x80,0x00, 0x00,0x20,
1025 0x80,0x00, 0x00,0x20,
1026 0x80,0x00, 0x00,0x20,
1027 0x40,0x00, 0x00,0x40,
1028 0x40,0x00, 0x00,0x40,
1029 0x60,0x00, 0x00,0xc0,
1030 0x20,0x00, 0x00,0x80,
1031 0x10,0x00, 0x01,0x00,
1032 0x18,0x00, 0x03,0x00,
1033 0x0c,0x00, 0x06,0x00,
1034 0x03,0x00, 0x18,0x00,
1035 0x01,0xc0, 0x70,0x00,
1036 0x00,0x3f, 0x80,0x00, // CIRC 27x27 = 6.5
1038 0x00,0x1f, 0xc0,0x00,
1039 0x00,0xe0, 0x38,0x00,
1040 0x01,0x00, 0x04,0x00,
1041 0x06,0x00, 0x03,0x00,
1042 0x08,0x00, 0x00,0x80,
1043 0x10,0x00, 0x00,0x40,
1044 0x10,0x00, 0x00,0x40,
1045 0x20,0x00, 0x00,0x20,
1046 0x40,0x00, 0x00,0x10,
1047 0x40,0x00, 0x00,0x10,
1048 0x40,0x00, 0x00,0x10,
1049 0x80,0x00, 0x00,0x08,
1050 0x80,0x00, 0x00,0x08,
1051 0x80,0x00, 0x00,0x08,
1052 0x80,0x00, 0x00,0x08,
1053 0x80,0x00, 0x00,0x08,
1054 0x80,0x00, 0x00,0x08,
1055 0x80,0x00, 0x00,0x08,
1056 0x40,0x00, 0x00,0x10,
1057 0x40,0x00, 0x00,0x10,
1058 0x40,0x00, 0x00,0x10,
1059 0x20,0x00, 0x00,0x20,
1060 0x10,0x00, 0x00,0x40,
1061 0x10,0x00, 0x00,0x40,
1062 0x08,0x00, 0x00,0x80,
1063 0x06,0x00, 0x03,0x00,
1064 0x01,0x00, 0x04,0x00,
1065 0x00,0xe0, 0x38,0x00,
1066 0x00,0x1f, 0xc0,0x00, // CIRC 29x29 = 7.0
1076 0x82, // CROSS 7x7 = 1.0
1086 0x80,0x80, // CROSS 9x9 = 1.5
1098 0x80,0x20, // CROSS 11x11 = 2.0
1112 0x80,0x08, // CROSS 13x13 = 2.5
1128 0x80,0x02, // CROSS 15x15 = 3.0
1146 0x80,0x00, 0x80, // CROSS 17x17 = 3.5
1166 0x80,0x00, 0x20, // CROSS 19x19 = 4.0
1188 0x80,0x00, 0x08,/* CROSS 21x21 = 4.5 */
1212 0x80,0x00, 0x02, // CROSS 23x23 = 5.0
1214 0x80,0x00, 0x00,0x80,
1215 0x40,0x00, 0x01,0x00,
1216 0x20,0x00, 0x02,0x00,
1217 0x10,0x00, 0x04,0x00,
1218 0x08,0x00, 0x08,0x00,
1219 0x04,0x00, 0x10,0x00,
1220 0x02,0x00, 0x20,0x00,
1221 0x01,0x00, 0x40,0x00,
1222 0x00,0x80, 0x80,0x00,
1223 0x00,0x41, 0x00,0x00,
1224 0x00,0x22, 0x00,0x00,
1225 0x00,0x14, 0x00,0x00,
1226 0x00,0x08, 0x00,0x00,
1227 0x00,0x14, 0x00,0x00,
1228 0x00,0x22, 0x00,0x00,
1229 0x00,0x41, 0x00,0x00,
1230 0x00,0x80, 0x80,0x00,
1231 0x01,0x00, 0x40,0x00,
1232 0x02,0x00, 0x20,0x00,
1233 0x04,0x00, 0x10,0x00,
1234 0x08,0x00, 0x08,0x00,
1235 0x10,0x00, 0x04,0x00,
1236 0x20,0x00, 0x02,0x00,
1237 0x40,0x00, 0x01,0x00,
1238 0x80,0x00, 0x00,0x80, // CROSS 25x25 = 5.5
1240 0x80,0x00, 0x00,0x20,
1241 0x40,0x00, 0x00,0x40,
1242 0x20,0x00, 0x00,0x80,
1243 0x10,0x00, 0x01,0x00,
1244 0x08,0x00, 0x02,0x00,
1245 0x04,0x00, 0x04,0x00,
1246 0x02,0x00, 0x08,0x00,
1247 0x01,0x00, 0x10,0x00,
1248 0x00,0x80, 0x20,0x00,
1249 0x00,0x40, 0x40,0x00,
1250 0x00,0x20, 0x80,0x00,
1251 0x00,0x11, 0x00,0x00,
1252 0x00,0x0a, 0x00,0x00,
1253 0x00,0x04, 0x00,0x00,
1254 0x00,0x0a, 0x00,0x00,
1255 0x00,0x11, 0x00,0x00,
1256 0x00,0x20, 0x80,0x00,
1257 0x00,0x40, 0x40,0x00,
1258 0x00,0x80, 0x20,0x00,
1259 0x01,0x00, 0x10,0x00,
1260 0x02,0x00, 0x08,0x00,
1261 0x04,0x00, 0x04,0x00,
1262 0x08,0x00, 0x02,0x00,
1263 0x10,0x00, 0x01,0x00,
1264 0x20,0x00, 0x00,0x80,
1265 0x40,0x00, 0x00,0x40,
1266 0x80,0x00, 0x00,0x20, // CROSS 27x27 = 6.0
1268 0x00,0x00, 0x00,0x00,
1269 0x00,0x00, 0x00,0x00,
1270 0x20,0x00, 0x00,0x04,
1271 0x10,0x00, 0x00,0x08,
1272 0x08,0x00, 0x00,0x10,
1273 0x04,0x00, 0x00,0x20,
1274 0x02,0x00, 0x00,0x40,
1275 0x01,0x00, 0x00,0x80,
1276 0x00,0x80, 0x01,0x00,
1277 0x00,0x40, 0x02,0x00,
1278 0x00,0x20, 0x04,0x00,
1279 0x00,0x10, 0x08,0x00,
1280 0x00,0x08, 0x10,0x00,
1281 0x00,0x04, 0x20,0x00,
1282 0x00,0x02, 0x40,0x00,
1283 0x00,0x01, 0x80,0x00,
1284 0x00,0x01, 0x80,0x00,
1285 0x00,0x02, 0x40,0x00,
1286 0x00,0x04, 0x20,0x00,
1287 0x00,0x08, 0x10,0x00,
1288 0x00,0x10, 0x08,0x00,
1289 0x00,0x20, 0x04,0x00,
1290 0x00,0x40, 0x02,0x00,
1291 0x00,0x80, 0x01,0x00,
1292 0x01,0x00, 0x00,0x80,
1293 0x02,0x00, 0x00,0x40,
1294 0x04,0x00, 0x00,0x20,
1295 0x08,0x00, 0x00,0x10,
1296 0x10,0x00, 0x00,0x08,
1297 0x20,0x00, 0x00,0x04,
1298 0x00,0x00, 0x00,0x00,
1299 0x00,0x00, 0x00,0x00, // CROSS 32x32 = 6.5
1301 0x00,0x00, 0x00,0x00,
1302 0x40,0x00, 0x00,0x02,
1303 0x20,0x00, 0x00,0x04,
1304 0x10,0x00, 0x00,0x08,
1305 0x08,0x00, 0x00,0x10,
1306 0x04,0x00, 0x00,0x20,
1307 0x02,0x00, 0x00,0x40,
1308 0x01,0x00, 0x00,0x80,
1309 0x00,0x80, 0x01,0x00,
1310 0x00,0x40, 0x02,0x00,
1311 0x00,0x20, 0x04,0x00,
1312 0x00,0x10, 0x08,0x00,
1313 0x00,0x08, 0x10,0x00,
1314 0x00,0x04, 0x20,0x00,
1315 0x00,0x02, 0x40,0x00,
1316 0x00,0x01, 0x80,0x00,
1317 0x00,0x01, 0x80,0x00,
1318 0x00,0x02, 0x40,0x00,
1319 0x00,0x04, 0x20,0x00,
1320 0x00,0x08, 0x10,0x00,
1321 0x00,0x10, 0x08,0x00,
1322 0x00,0x20, 0x04,0x00,
1323 0x00,0x40, 0x02,0x00,
1324 0x00,0x80, 0x01,0x00,
1325 0x01,0x00, 0x00,0x80,
1326 0x02,0x00, 0x00,0x40,
1327 0x04,0x00, 0x00,0x20,
1328 0x08,0x00, 0x00,0x10,
1329 0x10,0x00, 0x00,0x08,
1330 0x20,0x00, 0x00,0x04,
1331 0x40,0x00, 0x00,0x02,
1332 0x00,0x00, 0x00,0x00 // CROSS 32x32 = 7.0
1335 // =======================================================================
1336 // function : GetMarkerBitMapArray
1337 // purpose : Returns a parameters for the marker of the specified
1339 // =======================================================================
1340 void GetMarkerBitMapParam (const Aspect_TypeOfMarker theMarkerType,
1341 const Standard_ShortReal& theScale,
1342 Standard_Integer& theWidth,
1343 Standard_Integer& theHeight,
1344 Standard_Integer& theOffset,
1345 Standard_Integer& theNumOfBytes)
1347 const Standard_Integer aType = (Standard_Integer )((theMarkerType > Aspect_TOM_O) ? Aspect_TOM_O : theMarkerType);
1348 const Standard_Real anIndex = (Standard_Real )(TEL_NO_OF_SIZES - 1) * (theScale - (Standard_Real )TEL_PM_START_SIZE)
1349 / (Standard_Real )(TEL_PM_END_SIZE - TEL_PM_START_SIZE);
1350 Standard_Integer anId = (Standard_Integer )(anIndex + 0.5);
1355 else if (anId >= TEL_NO_OF_SIZES)
1357 anId = TEL_NO_OF_SIZES - 1;
1360 theWidth = (Standard_Integer )arrPMFontInfo[aType][anId].width;
1361 theHeight = (Standard_Integer )arrPMFontInfo[aType][anId].height;
1362 theOffset = arrPMFontInfo[aType][anId].offset;
1363 const Standard_Integer aNumOfBytesInRow = theWidth / 8 + (theWidth % 8 ? 1 : 0);
1364 theNumOfBytes = theHeight * aNumOfBytesInRow;
1367 // =======================================================================
1368 // function : GetTextureImage
1369 // purpose : Returns a marker image for the marker of the specified
1371 // =======================================================================
1372 Handle(Graphic3d_MarkerImage) GetTextureImage (const Aspect_TypeOfMarker theMarkerType,
1373 const Standard_ShortReal& theScale)
1375 Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
1376 GetMarkerBitMapParam (theMarkerType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1378 Handle(TColStd_HArray1OfByte) aBitMap = new TColStd_HArray1OfByte (0, aNumOfBytes - 1);
1379 for (Standard_Integer anIter = 0; anIter < aNumOfBytes; anIter++)
1381 aBitMap->ChangeValue (anIter) = OpenGl_AspectMarker_myMarkerRaster[anOffset + anIter];
1384 Handle(Graphic3d_MarkerImage) aTexture = new Graphic3d_MarkerImage (aBitMap, aWidth, aHeight);
1388 // =======================================================================
1389 // function : MergeImages
1390 // purpose : Merge two image pixmap into one. Used for creating image for
1391 // following markers: Aspect_TOM_O_POINT, Aspect_TOM_O_PLUS,
1392 // Aspect_TOM_O_STAR, Aspect_TOM_O_X, Aspect_TOM_RING1,
1393 // Aspect_TOM_RING2, Aspect_TOM_RING3
1394 // =======================================================================
1395 Handle(Image_PixMap) MergeImages (const Handle(Image_PixMap)& theImage1,
1396 const Handle(Image_PixMap)& theImage2)
1398 if (theImage1.IsNull() && theImage2.IsNull())
1400 return Handle(Image_PixMap)();
1403 Handle(Image_PixMap) aResultImage = new Image_PixMap();
1405 Standard_Integer aWidth1 (0), aHeight1 (0);
1406 if (!theImage1.IsNull())
1408 aWidth1 = (Standard_Integer )theImage1->Width();
1409 aHeight1 = (Standard_Integer )theImage1->Height();
1412 Standard_Integer aWidth2 (0), aHeight2 (0);
1413 if (!theImage2.IsNull())
1415 aWidth2 = (Standard_Integer )theImage2->Width();
1416 aHeight2 = (Standard_Integer )theImage2->Height();
1419 const Standard_Integer aMaxWidth = Max (aWidth1, aWidth2);
1420 const Standard_Integer aMaxHeight = Max (aHeight1, aHeight2);
1421 const Standard_Integer aSize = Max (aMaxWidth, aMaxHeight);
1423 aResultImage->InitZero (Image_Format_Alpha, aSize, aSize);
1425 if (!theImage1.IsNull())
1427 const Standard_Integer aXOffset1 = Abs (aWidth1 - aMaxWidth) / 2;
1428 const Standard_Integer anYOffset1 = Abs (aHeight1 - aMaxHeight) / 2;
1429 for (Standard_Integer anY = 0; anY < aHeight1; anY++)
1431 Standard_Byte* anImageLine = theImage1->ChangeRow (anY);
1432 Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset1 + anY);
1433 for (Standard_Integer aX = 0; aX < aWidth1; aX++)
1435 aResultImageLine[aXOffset1 + aX] |= anImageLine[aX];
1440 if (!theImage2.IsNull())
1442 const Standard_Integer aXOffset2 = Abs (aWidth2 - aMaxWidth) / 2;
1443 const Standard_Integer anYOffset2 = Abs (aHeight2 - aMaxHeight) / 2;
1444 for (Standard_Integer anY = 0; anY < aHeight2; anY++)
1446 Standard_Byte* anImageLine = theImage2->ChangeRow (anY);
1447 Standard_Byte* aResultImageLine = aResultImage->ChangeRow (anYOffset2 + anY);
1448 for (Standard_Integer aX = 0; aX < aWidth2; aX++)
1450 aResultImageLine[aXOffset2 + aX] |= anImageLine[aX];
1455 return aResultImage;
1458 // =======================================================================
1459 // function : OpenGl_AspectMarker
1461 // =======================================================================
1462 OpenGl_AspectMarker::OpenGl_AspectMarker()
1463 : myAspect (new Graphic3d_AspectMarker3d (Aspect_TOM_PLUS, Quantity_Color (Quantity_NOC_WHITE), 1.0f)),
1469 // =======================================================================
1470 // function : OpenGl_AspectMarker
1472 // =======================================================================
1473 OpenGl_AspectMarker::OpenGl_AspectMarker (const Handle(Graphic3d_AspectMarker3d)& theAspect)
1474 : myMarkerSize (1.0f)
1476 SetAspect (theAspect);
1479 // =======================================================================
1480 // function : SetAspect
1482 // =======================================================================
1483 void OpenGl_AspectMarker::SetAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect)
1485 myAspect = theAspect;
1487 // update resource bindings
1488 myResources.UpdateTexturesRediness (theAspect, myMarkerSize);
1489 myResources.UpdateShaderRediness (theAspect);
1492 // =======================================================================
1493 // function : Render
1495 // =======================================================================
1496 void OpenGl_AspectMarker::Render (const Handle(OpenGl_Workspace)& theWorkspace) const
1498 theWorkspace->SetAspectMarker (this);
1501 // =======================================================================
1502 // function : Release
1504 // =======================================================================
1505 void OpenGl_AspectMarker::Release (OpenGl_Context* theCtx)
1507 myResources.ReleaseTextures(theCtx);
1508 myResources.ReleaseShaders (theCtx);
1511 // =======================================================================
1512 // function : ReleaseTextures
1514 // =======================================================================
1515 void OpenGl_AspectMarker::Resources::ReleaseTextures (OpenGl_Context* theCtx)
1517 myIsSpriteReady = Standard_False;
1518 if (mySprite.IsNull())
1525 if (mySprite->First()->ResourceId().IsEmpty())
1527 theCtx->DelayedRelease (mySprite->ChangeFirst());
1528 theCtx->DelayedRelease (mySpriteA->ChangeFirst());
1533 const TCollection_AsciiString aSpriteKey = mySprite->First()->ResourceId();
1534 mySprite.Nullify(); // we need nullify all handles before ReleaseResource() call
1535 theCtx->ReleaseResource (aSpriteKey, Standard_True);
1537 if (!mySpriteA.IsNull())
1539 const TCollection_AsciiString aSpriteKeyA = mySpriteA->First()->ResourceId();
1540 mySpriteA.Nullify();
1541 theCtx->ReleaseResource (aSpriteKeyA, Standard_True);
1546 mySpriteA.Nullify();
1549 // =======================================================================
1550 // function : ReleaseShaders
1552 // =======================================================================
1553 void OpenGl_AspectMarker::Resources::ReleaseShaders (OpenGl_Context* theCtx)
1555 if (!myShaderProgram.IsNull() && theCtx != NULL)
1557 theCtx->ShaderManager()->Unregister (myShaderProgramId,
1560 myShaderProgramId.Clear();
1561 myIsShaderReady = Standard_False;
1564 // =======================================================================
1565 // function : UpdateTexturesRediness
1567 // =======================================================================
1568 void OpenGl_AspectMarker::Resources::UpdateTexturesRediness (const Handle(Graphic3d_AspectMarker3d)& theAspect,
1569 Standard_ShortReal& theMarkerSize)
1571 // update sprite resource bindings
1572 TCollection_AsciiString aSpriteKeyNew, aSpriteAKeyNew;
1573 spriteKeys (theAspect->GetMarkerImage(), theAspect->Type(), theAspect->Scale(), theAspect->ColorRGBA(), aSpriteKeyNew, aSpriteAKeyNew);
1574 const TCollection_AsciiString& aSpriteKeyOld = !mySprite.IsNull() ? mySprite ->First()->ResourceId() : THE_EMPTY_KEY;
1575 const TCollection_AsciiString& aSpriteAKeyOld = !mySpriteA.IsNull() ? mySpriteA->First()->ResourceId() : THE_EMPTY_KEY;
1576 if (aSpriteKeyNew.IsEmpty() || aSpriteKeyOld != aSpriteKeyNew
1577 || aSpriteAKeyNew.IsEmpty() || aSpriteAKeyOld != aSpriteAKeyNew)
1579 myIsSpriteReady = Standard_False;
1580 theMarkerSize = theAspect->Scale();
1584 // =======================================================================
1585 // function : UpdateShaderRediness
1587 // =======================================================================
1588 void OpenGl_AspectMarker::Resources::UpdateShaderRediness (const Handle(Graphic3d_AspectMarker3d)& theAspect)
1590 // update shader program resource bindings
1591 const TCollection_AsciiString& aShaderKey = theAspect->ShaderProgram().IsNull() ? THE_EMPTY_KEY : theAspect->ShaderProgram()->GetId();
1592 if (aShaderKey.IsEmpty() || myShaderProgramId != aShaderKey)
1594 myIsShaderReady = Standard_False;
1598 // =======================================================================
1599 // function : BuildSprites
1601 // =======================================================================
1602 void OpenGl_AspectMarker::Resources::BuildSprites (const Handle(OpenGl_Context)& theCtx,
1603 const Handle(Graphic3d_MarkerImage)& theMarkerImage,
1604 const Aspect_TypeOfMarker theType,
1605 const Standard_ShortReal theScale,
1606 const Graphic3d_Vec4& theColor,
1607 Standard_ShortReal& theMarkerSize)
1609 // generate key for shared resource
1610 TCollection_AsciiString aNewKey, aNewKeyA;
1611 spriteKeys (theMarkerImage, theType, theScale, theColor, aNewKey, aNewKeyA);
1613 const TCollection_AsciiString& aSpriteKeyOld = !mySprite.IsNull() ? mySprite ->First()->ResourceId() : THE_EMPTY_KEY;
1614 const TCollection_AsciiString& aSpriteAKeyOld = !mySpriteA.IsNull() ? mySpriteA->First()->ResourceId() : THE_EMPTY_KEY;
1616 // release old shared resources
1617 const Standard_Boolean aNewResource = aNewKey.IsEmpty()
1618 || aSpriteKeyOld != aNewKey;
1621 if (!mySprite.IsNull())
1623 if (mySprite->First()->ResourceId().IsEmpty())
1625 theCtx->DelayedRelease (mySprite->ChangeFirst());
1630 const TCollection_AsciiString anOldKey = mySprite->First()->ResourceId();
1631 mySprite.Nullify(); // we need nullify all handles before ReleaseResource() call
1632 theCtx->ReleaseResource (anOldKey, Standard_True);
1636 if (aNewKeyA.IsEmpty() || aSpriteAKeyOld != aNewKeyA)
1638 if (!mySpriteA.IsNull())
1640 if (mySpriteA->First()->ResourceId().IsEmpty())
1642 theCtx->DelayedRelease (mySpriteA->ChangeFirst());
1643 mySpriteA.Nullify();
1647 const TCollection_AsciiString anOldKey = mySpriteA->First()->ResourceId();
1648 mySpriteA.Nullify(); // we need nullify all handles before ReleaseResource() call
1649 theCtx->ReleaseResource (anOldKey, Standard_True);
1656 const OpenGl_PointSprite* aSprite = dynamic_cast<OpenGl_PointSprite*> (mySprite->First().get());
1657 if (!aSprite->IsDisplayList())
1659 theMarkerSize = Standard_ShortReal (Max (aSprite->SizeX(), aSprite->SizeY()));
1663 if (theType == Aspect_TOM_POINT
1664 || theType == Aspect_TOM_EMPTY
1665 || (theType == Aspect_TOM_USERDEFINED && theMarkerImage.IsNull()))
1667 // nothing to do - just simple point
1671 if (mySprite.IsNull())
1673 mySprite = new OpenGl_TextureSet (1);
1674 mySpriteA = new OpenGl_TextureSet (1);
1677 Handle(OpenGl_PointSprite) aSprite, aSpriteA;
1678 if (!aNewKey.IsEmpty()
1679 && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKeyA, aSpriteA) // alpha sprite could be shared
1680 && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKey, aSprite))
1682 // reuse shared resource
1683 if (!aSprite->IsDisplayList())
1685 theMarkerSize = Standard_ShortReal (Max (aSprite->SizeX(), aSprite->SizeY()));
1687 mySprite ->ChangeFirst() = aSprite;
1688 mySpriteA->ChangeFirst() = aSpriteA;
1692 const bool hadAlreadyAlpha = !aSpriteA.IsNull();
1693 if (!hadAlreadyAlpha)
1695 aSpriteA = new OpenGl_PointSprite (aNewKeyA);
1697 aSprite = new OpenGl_PointSprite (aNewKey);
1698 mySprite ->ChangeFirst() = aSprite;
1699 mySpriteA->ChangeFirst() = aSpriteA;
1700 if (!aNewKey.IsEmpty())
1702 theCtx->ShareResource (aNewKey, aSprite);
1703 if (!hadAlreadyAlpha)
1705 theCtx->ShareResource (aNewKeyA, aSpriteA);
1709 if (!theCtx.IsNull()
1710 && theCtx->core20fwd != NULL
1711 && !theCtx->caps->pntSpritesDisable)
1713 // Creating texture resource for using it with point sprites
1714 Handle(Graphic3d_MarkerImage) aNewMarkerImage;
1715 Handle(Image_PixMap) anImage, anImageA;
1717 if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
1719 aNewMarkerImage = theMarkerImage;
1720 anImage = aNewMarkerImage->GetImage();
1724 // Creating image from default bitmap
1725 Handle(Graphic3d_MarkerImage) aMarkerImage1, aMarkerImage2;
1727 const Standard_ShortReal aDelta = 0.1F;
1728 Standard_ShortReal aScale = theScale;
1729 Standard_ShortReal aLimit = 0.0F;
1733 case Aspect_TOM_O_POINT:
1735 // draw inner point as filled rectangle
1736 const Standard_Integer aSize = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
1737 Handle(TColStd_HArray1OfByte) aBitMap = fillPointBitmap (aSize);
1738 aMarkerImage2 = new Graphic3d_MarkerImage (aBitMap, aSize, aSize);
1740 Standard_FALLTHROUGH
1741 case Aspect_TOM_O_PLUS:
1742 case Aspect_TOM_O_STAR:
1743 case Aspect_TOM_O_X:
1745 // For this type of markers we merge two base bitmaps into one
1746 // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
1747 aMarkerImage1 = GetTextureImage (Aspect_TOM_O, theScale);
1748 if (theType != Aspect_TOM_O_POINT)
1750 aMarkerImage2 = GetTextureImage (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale);
1752 anImage = MergeImages (aMarkerImage1->GetImage(), aMarkerImage2->GetImage());
1753 aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
1756 case Aspect_TOM_RING1:
1757 if (aLimit == 0.0f) aLimit = aScale * 0.2f;
1758 Standard_FALLTHROUGH
1759 case Aspect_TOM_RING2:
1760 if (aLimit == 0.0f) aLimit = aScale * 0.5f;
1761 Standard_FALLTHROUGH
1762 case Aspect_TOM_RING3:
1764 if (aLimit == 0.0f) aLimit = aScale * 0.8f;
1765 for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
1767 anImage = MergeImages (anImage, GetTextureImage (Aspect_TOM_O, aScale)->GetImage());
1769 aNewMarkerImage = new Graphic3d_MarkerImage (anImage);
1772 case Aspect_TOM_BALL:
1774 Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
1775 GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
1777 NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.r()),
1778 Standard_Real (theColor.g()),
1779 Standard_Real (theColor.b()),
1780 Standard_Real (theColor.a()));
1782 const Standard_Integer aSize = Max (aWidth + 2, aHeight + 2); // includes extra margin
1783 anImage = new Image_PixMap();
1784 anImageA = new Image_PixMap();
1785 anImage ->InitZero (Image_Format_BGRA, aSize, aSize);
1786 anImageA->InitZero (Image_Format_Alpha, aSize, aSize);
1788 // we draw a set of circles
1789 Image_ColorBGRA aColor32;
1791 Standard_Real aHLS[3];
1792 while (aScale >= 1.0f)
1794 Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
1795 aHLS[2] *= 0.95; // 5% saturation change
1796 Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
1797 aColor32.r() = Standard_Byte(255.0 * aColor.r());
1798 aColor32.g() = Standard_Byte(255.0 * aColor.g());
1799 aColor32.b() = Standard_Byte(255.0 * aColor.b());
1801 const Handle(Graphic3d_MarkerImage) aMarker = GetTextureImage (Aspect_TOM_O, aScale);
1802 const Handle(Image_PixMap)& aCircle = aMarker->GetImage();
1804 const Standard_Size aDiffX = (anImage->SizeX() - aCircle->SizeX()) / 2;
1805 const Standard_Size aDiffY = (anImage->SizeY() - aCircle->SizeY()) / 2;
1806 for (Standard_Size aRow = 0; aRow < aCircle->SizeY(); ++aRow)
1808 const Standard_Byte* aRowData = aCircle->Row (aRow);
1809 for (Standard_Size aCol = 0; aCol < aCircle->SizeX(); ++aCol)
1811 if (aRowData[aCol] != 0)
1813 anImage ->ChangeValue<Image_ColorBGRA> (aDiffX + aRow, aDiffY + aCol) = aColor32;
1814 anImageA->ChangeValue<Standard_Byte> (aDiffX + aRow, aDiffY + aCol) = 255;
1824 aNewMarkerImage = GetTextureImage (theType, theScale);
1825 anImage = aNewMarkerImage->GetImage();
1831 theMarkerSize = Max ((Standard_ShortReal )anImage->Width(),(Standard_ShortReal )anImage->Height());
1833 aSprite->Init (theCtx, *anImage.operator->(), Graphic3d_TOT_2D);
1834 if (!hadAlreadyAlpha)
1836 if (anImageA.IsNull()
1837 && aSprite->GetFormat() != GL_ALPHA
1838 && !aNewMarkerImage.IsNull())
1840 anImageA = aNewMarkerImage->GetImageAlpha();
1842 if (!anImageA.IsNull())
1844 aSpriteA->Init (theCtx, *anImageA.operator->(), Graphic3d_TOT_2D);
1850 #if !defined(GL_ES_VERSION_2_0)
1851 // Creating list with bitmap for using it in compatibility mode
1852 GLuint aBitmapList = glGenLists (1);
1853 aSprite->SetDisplayList (theCtx, aBitmapList);
1855 Standard_Integer aWidth, aHeight, anOffset, aNumOfBytes;
1856 if (theType == Aspect_TOM_USERDEFINED && !theMarkerImage.IsNull())
1858 // Reading user defined marker
1859 Handle(TColStd_HArray1OfByte) aBitMap = theMarkerImage->GetBitMapArray();
1860 Standard_Byte* aBitMapArray = new Standard_Byte[aBitMap->Length()];
1861 theMarkerImage->GetTextureSize (aWidth, aHeight);
1863 // We should pass bitmap to glBitmap with reversed line order as it draws it from
1865 const Standard_Integer aNumOfBytesInRow = aWidth / 8 + (aWidth % 8 ? 1 : 0);
1866 const Standard_Integer anUpperIndex = aBitMap->Upper();
1867 for (Standard_Integer aRow = 0; aRow < aHeight; aRow++)
1869 for (Standard_Integer aByteIter = 0; aByteIter < aNumOfBytesInRow; aByteIter++)
1871 aBitMapArray[aRow * aNumOfBytesInRow + aByteIter] =
1872 aBitMap->Value (anUpperIndex + 1 - (aRow + 1) * aNumOfBytesInRow + aByteIter);
1876 if (aBitMapArray != NULL)
1878 glNewList (aBitmapList, GL_COMPILE);
1879 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
1880 0.f, 0.f, (const GLubyte* )aBitMapArray);
1886 // Creating list for default marker
1887 const Standard_ShortReal aDelta = 0.1f;
1888 Standard_ShortReal aScale = theScale;
1889 Standard_ShortReal aLimit = 0.0f;
1891 glNewList (aBitmapList, GL_COMPILE);
1894 case Aspect_TOM_O_POINT:
1896 // draw inner point as filled rectangle
1897 const Standard_Integer aSize = theScale > 7 ? 7 : (Standard_Integer )(theScale + 0.5F);
1898 Handle(TColStd_HArray1OfByte) aBitMap = fillPointBitmap (aSize);
1899 glBitmap (aSize, aSize, (GLfloat )(0.5f * aSize), (GLfloat )(0.5f * aSize),
1900 0.0f, 0.0f, &aBitMap->Array1().Value (aBitMap->Lower()));
1902 Standard_FALLTHROUGH
1903 case Aspect_TOM_O_PLUS:
1904 case Aspect_TOM_O_STAR:
1905 case Aspect_TOM_O_X:
1907 // For this type of markers we merge two base bitmaps into one
1908 // For example Aspect_TOM_O_PLUS = Aspect_TOM_O + Aspect_TOM_PLUS
1909 GetMarkerBitMapParam (Aspect_TOM_O, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1910 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
1911 0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1912 if (theType != Aspect_TOM_O_POINT)
1914 GetMarkerBitMapParam (Aspect_TypeOfMarker (theType - Aspect_TOM_O_POINT), theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1915 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, (GLfloat )(0.5f * aWidth), (GLfloat )(0.5f * aHeight),
1916 0.f, 0.f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1920 case Aspect_TOM_BALL:
1922 NCollection_Vec4<Standard_Real> aColor (Standard_Real (theColor.r()),
1923 Standard_Real (theColor.g()),
1924 Standard_Real (theColor.b()),
1925 Standard_Real (theColor.a()));
1927 // we draw a set of circles
1928 while (aScale >= 1.0f)
1930 Standard_Real aHLS[3];
1931 Quantity_Color::RgbHls (aColor.r(), aColor.g(), aColor.b(), aHLS[0], aHLS[1], aHLS[2]);
1932 // 5% saturation change
1934 Quantity_Color::HlsRgb (aHLS[0], aHLS[1], aHLS[2], aColor.r(), aColor.g(), aColor.b());
1936 glColor4dv (aColor);
1937 GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
1938 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
1939 0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1945 case Aspect_TOM_RING1:
1946 if (aLimit == 0.0f) aLimit = aScale * 0.2f;
1947 Standard_FALLTHROUGH
1948 case Aspect_TOM_RING2:
1949 if (aLimit == 0.0f) aLimit = aScale * 0.5f;
1950 Standard_FALLTHROUGH
1951 case Aspect_TOM_RING3:
1953 if (aLimit == 0.0f) aLimit = aScale * 0.8f;
1954 for (; aScale > aLimit && aScale >= 1.0f; aScale -= aDelta)
1956 GetMarkerBitMapParam (Aspect_TOM_O, aScale, aWidth, aHeight, anOffset, aNumOfBytes);
1957 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
1958 0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1964 GetMarkerBitMapParam (theType, theScale, aWidth, aHeight, anOffset, aNumOfBytes);
1965 glBitmap ((GLsizei )aWidth, (GLsizei )aHeight, 0.5f * GLfloat(aWidth), 0.5f * GLfloat(aHeight),
1966 0.0f, 0.0f, (const GLubyte* )&OpenGl_AspectMarker_myMarkerRaster[anOffset]);
1976 // =======================================================================
1977 // function : BuildShader
1979 // =======================================================================
1980 void OpenGl_AspectMarker::Resources::BuildShader (const Handle(OpenGl_Context)& theCtx,
1981 const Handle(Graphic3d_ShaderProgram)& theShader)
1983 if (theCtx->core20fwd == NULL)
1988 // release old shader program resources
1989 if (!myShaderProgram.IsNull())
1991 theCtx->ShaderManager()->Unregister (myShaderProgramId, myShaderProgram);
1992 myShaderProgramId.Clear();
1993 myShaderProgram.Nullify();
1995 if (theShader.IsNull())
2000 theCtx->ShaderManager()->Create (theShader, myShaderProgramId, myShaderProgram);
2003 // =======================================================================
2004 // function : spriteKeys
2006 // =======================================================================
2007 void OpenGl_AspectMarker::Resources::spriteKeys (const Handle(Graphic3d_MarkerImage)& theMarkerImage,
2008 const Aspect_TypeOfMarker theType,
2009 const Standard_ShortReal theScale,
2010 const Graphic3d_Vec4& theColor,
2011 TCollection_AsciiString& theKey,
2012 TCollection_AsciiString& theKeyA)
2014 // generate key for shared resource
2015 if (theType == Aspect_TOM_USERDEFINED)
2017 if (!theMarkerImage.IsNull())
2019 theKey = theMarkerImage->GetImageId();
2020 theKeyA = theMarkerImage->GetImageAlphaId();
2023 else if (theType != Aspect_TOM_POINT
2024 && theType != Aspect_TOM_EMPTY)
2026 // predefined markers are defined with 0.5 step
2027 const Standard_Integer aScale = Standard_Integer(theScale * 10.0f + 0.5f);
2028 theKey = TCollection_AsciiString ("OpenGl_AspectMarker") + theType + "_" + aScale;
2029 theKeyA = theKey + "A";
2030 if (theType == Aspect_TOM_BALL)
2032 unsigned int aColor[3] =
2034 (unsigned int )(255.0f * theColor.r()),
2035 (unsigned int )(255.0f * theColor.g()),
2036 (unsigned int )(255.0f * theColor.b())
2039 sprintf (aBytes, "%02X%02X%02X", aColor[0], aColor[1], aColor[2]);