0024157: Parallelization of assembly part of BO
[occt.git] / src / Image / Image_Color.hxx
1 // Created on: 2012-07-18
2 // Created by: Kirill GAVRILOV
3 // Copyright (c) 2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 #ifndef _Image_Color_H__
21 #define _Image_Color_H__
22
23 #include <Standard.hxx>
24
25 //! POD structure for packed RGB color value (3 bytes)
26 struct Image_ColorRGB
27 {
28
29   //! Component type.
30   typedef Standard_Byte ComponentType_t;
31
32   //! Returns the number of components.
33   static Standard_Integer Length()
34   {
35     return 3;
36   }
37
38 public: // access methods
39
40   //! Alias to 1st component (red intensity).
41   Standard_Byte r() const { return v[0]; }
42
43   //! Alias to 2nd component (green intensity).
44   Standard_Byte g() const { return v[1]; }
45
46   //! Alias to 3rd component (blue intensity).
47   Standard_Byte b() const { return v[2]; }
48
49   //! Alias to 1st component (red intensity).
50   Standard_Byte& r() { return v[0]; }
51
52   //! Alias to 2nd component (green intensity).
53   Standard_Byte& g() { return v[1]; }
54
55   //! Alias to 3rd component (blue intensity).
56   Standard_Byte& b() { return v[2]; }
57
58 public:
59
60   Standard_Byte v[3];
61
62 };
63
64 //! POD structure for packed RGB color value (4 bytes with extra byte for alignment)
65 struct Image_ColorRGB32
66 {
67
68   //! Component type.
69   typedef Standard_Byte ComponentType_t;
70
71   //! Returns the number of components.
72   static Standard_Integer Length()
73   {
74     return 3;
75   }
76
77   //! Alias to 1st component (red intensity).
78   Standard_Byte r() const { return v[0]; }
79
80   //! Alias to 2nd component (green intensity).
81   Standard_Byte g() const { return v[1]; }
82
83   //! Alias to 3rd component (blue intensity).
84   Standard_Byte b() const { return v[2]; }
85
86   //! Alias to 4th component (dummy).
87   Standard_Byte a_() const { return v[3]; }
88
89   //! Alias to 1st component (red intensity).
90   Standard_Byte& r() { return v[0]; }
91
92   //! Alias to 2nd component (green intensity).
93   Standard_Byte& g() { return v[1]; }
94
95   //! Alias to 3rd component (blue intensity).
96   Standard_Byte& b() { return v[2]; }
97
98   //! Alias to 4th component (dummy).
99   Standard_Byte& a_() { return v[3]; }
100
101 public:
102
103   Standard_Byte v[4];
104
105 };
106
107 //! POD structure for packed RGBA color value (4 bytes)
108 struct Image_ColorRGBA
109 {
110
111   //! Component type.
112   typedef Standard_Byte ComponentType_t;
113
114   //! Returns the number of components.
115   static Standard_Integer Length()
116   {
117     return 4;
118   }
119
120   //! Alias to 1st component (red intensity).
121   Standard_Byte r() const { return v[0]; }
122
123   //! Alias to 2nd component (green intensity).
124   Standard_Byte g() const { return v[1]; }
125
126   //! Alias to 3rd component (blue intensity).
127   Standard_Byte b() const { return v[2]; }
128
129   //! Alias to 4th component (alpha value).
130   Standard_Byte a() const { return v[3]; }
131
132   //! Alias to 1st component (red intensity).
133   Standard_Byte& r() { return v[0]; }
134
135   //! Alias to 2nd component (green intensity).
136   Standard_Byte& g() { return v[1]; }
137
138   //! Alias to 3rd component (blue intensity).
139   Standard_Byte& b() { return v[2]; }
140
141   //! Alias to 4th component (alpha value).
142   Standard_Byte& a() { return v[3]; }
143
144 public:
145
146   Standard_Byte v[4];
147
148 };
149
150 //! POD structure for packed BGR color value (3 bytes)
151 struct Image_ColorBGR
152 {
153
154   //! Component type.
155   typedef Standard_Byte ComponentType_t;
156
157   //! Returns the number of components.
158   static Standard_Integer Length()
159   {
160     return 3;
161   }
162
163   //! Alias to 3rd component (red intensity).
164   Standard_Byte r() const { return v[2]; }
165
166   //! Alias to 2nd component (green intensity).
167   Standard_Byte g() const { return v[1]; }
168
169   //! Alias to 1st component (blue intensity).
170   Standard_Byte b() const { return v[0]; }
171
172   //! Alias to 3rd component (red intensity).
173   Standard_Byte& r() { return v[2]; }
174
175   //! Alias to 2nd component (green intensity).
176   Standard_Byte& g() { return v[1]; }
177
178   //! Alias to 1st component (blue intensity).
179   Standard_Byte& b() { return v[0]; }
180
181 public:
182
183   Standard_Byte v[3];
184
185 };
186
187 //! POD structure for packed BGR color value (4 bytes with extra byte for alignment)
188 struct Image_ColorBGR32
189 {
190
191   //! Component type.
192   typedef Standard_Byte ComponentType_t;
193
194   //! Returns the number of components.
195   static Standard_Integer Length()
196   {
197     return 3;
198   }
199
200   //! Alias to 3rd component (red intensity).
201   Standard_Byte r() const { return v[2]; }
202
203   //! Alias to 2nd component (green intensity).
204   Standard_Byte g() const { return v[1]; }
205
206   //! Alias to 1st component (blue intensity).
207   Standard_Byte b() const { return v[0]; }
208
209   //! Alias to 4th component (dummy).
210   Standard_Byte a_() const { return v[3]; }
211
212   //! Alias to 3rd component (red intensity).
213   Standard_Byte& r() { return v[2]; }
214
215   //! Alias to 2nd component (green intensity).
216   Standard_Byte& g() { return v[1]; }
217
218   //! Alias to 1st component (blue intensity).
219   Standard_Byte& b() { return v[0]; }
220
221   //! Alias to 4th component (dummy).
222   Standard_Byte& a_() { return v[3]; }
223
224 public:
225
226   Standard_Byte v[4];
227
228 };
229
230 //! POD structure for packed BGRA color value (4 bytes)
231 struct Image_ColorBGRA
232 {
233
234   //! Component type.
235   typedef Standard_Byte ComponentType_t;
236
237   //! Returns the number of components.
238   static Standard_Integer Length()
239   {
240     return 4;
241   }
242
243   //! Alias to 3rd component (red intensity).
244   Standard_Byte r() const { return v[2]; }
245
246   //! Alias to 2nd component (green intensity).
247   Standard_Byte g() const { return v[1]; }
248
249   //! Alias to 1st component (blue intensity).
250   Standard_Byte b() const { return v[0]; }
251
252   //! Alias to 4th component (alpha value).
253   Standard_Byte a() const { return v[3]; }
254
255   //! Alias to 3rd component (red intensity).
256   Standard_Byte& r() { return v[2]; }
257
258   //! Alias to 2nd component (green intensity).
259   Standard_Byte& g() { return v[1]; }
260
261   //! Alias to 1st component (blue intensity).
262   Standard_Byte& b() { return v[0]; }
263
264   //! Alias to 4th component (alpha value).
265   Standard_Byte& a() { return v[3]; }
266
267 public:
268
269   Standard_Byte v[4];
270
271 };
272
273 //! POD structure for packed float RGB color value (3 floats)
274 struct Image_ColorRGBF
275 {
276
277   //! Component type.
278   typedef Standard_ShortReal ComponentType_t;
279
280   //! Returns the number of components.
281   static Standard_Integer Length()
282   {
283     return 3;
284   }
285
286   //! Alias to 1st component (red intensity).
287   Standard_ShortReal r() const { return v[0]; }
288
289   //! Alias to 2nd component (green intensity).
290   Standard_ShortReal g() const { return v[1]; }
291
292   //! Alias to 3rd component (blue intensity).
293   Standard_ShortReal b() const { return v[2]; }
294
295   //! Alias to 1st component (red intensity).
296   Standard_ShortReal& r() { return v[0]; }
297
298   //! Alias to 2nd component (green intensity).
299   Standard_ShortReal& g() { return v[1]; }
300
301   //! Alias to 3rd component (blue intensity).
302   Standard_ShortReal& b() { return v[2]; }
303
304 public:
305
306   Standard_ShortReal v[3];
307
308 };
309
310 //! POD structure for packed BGR float color value (3 floats)
311 struct Image_ColorBGRF
312 {
313
314   //! Component type.
315   typedef Standard_ShortReal ComponentType_t;
316
317   //! Returns the number of components.
318   static Standard_Integer Length()
319   {
320     return 3;
321   }
322
323   //! Alias to 3rd component (red intensity).
324   Standard_ShortReal r() const { return v[2]; }
325
326   //! Alias to 2nd component (green intensity).
327   Standard_ShortReal g() const { return v[1]; }
328
329   //! Alias to 1st component (blue intensity).
330   Standard_ShortReal b() const { return v[0]; }
331
332   //! Alias to 3rd component (red intensity).
333   Standard_ShortReal& r() { return v[2]; }
334
335   //! Alias to 2nd component (green intensity).
336   Standard_ShortReal& g() { return v[1]; }
337
338   //! Alias to 1st component (blue intensity).
339   Standard_ShortReal& b() { return v[0]; }
340
341 public:
342
343   Standard_ShortReal v[3];
344
345 };
346
347 //! POD structure for packed RGBA color value (4 floats)
348 struct Image_ColorRGBAF
349 {
350
351   //! Component type.
352   typedef Standard_ShortReal ComponentType_t;
353
354   //! Returns the number of components.
355   static Standard_Integer Length()
356   {
357     return 4;
358   }
359
360   //! Alias to 1st component (red intensity).
361   Standard_ShortReal r() const { return v[0]; }
362
363   //! Alias to 2nd component (green intensity).
364   Standard_ShortReal g() const { return v[1]; }
365
366   //! Alias to 3rd component (blue intensity).
367   Standard_ShortReal b() const { return v[2]; }
368
369   //! Alias to 4th component (alpha value).
370   Standard_ShortReal a() const { return v[3]; }
371
372   //! Alias to 1st component (red intensity).
373   Standard_ShortReal& r() { return v[0]; }
374
375   //! Alias to 2nd component (green intensity).
376   Standard_ShortReal& g() { return v[1]; }
377
378   //! Alias to 3rd component (blue intensity).
379   Standard_ShortReal& b() { return v[2]; }
380
381   //! Alias to 4th component (alpha value).
382   Standard_ShortReal& a() { return v[3]; }
383
384 public:
385
386   Standard_ShortReal v[4];
387
388 };
389
390 //! POD structure for packed float BGRA color value (4 floats)
391 struct Image_ColorBGRAF
392 {
393
394   //! Component type.
395   typedef Standard_ShortReal ComponentType_t;
396
397   //! Returns the number of components.
398   static Standard_Integer Length()
399   {
400     return 4;
401   }
402
403   //! Alias to 3rd component (red intensity).
404   Standard_ShortReal r() const { return v[2]; }
405
406   //! Alias to 2nd component (green intensity).
407   Standard_ShortReal g() const { return v[1]; }
408
409   //! Alias to 1st component (blue intensity).
410   Standard_ShortReal b() const { return v[0]; }
411
412   //! Alias to 4th component (alpha value).
413   Standard_ShortReal a() const { return v[3]; }
414
415   //! Alias to 3rd component (red intensity).
416   Standard_ShortReal& r() { return v[2]; }
417
418   //! Alias to 2nd component (green intensity).
419   Standard_ShortReal& g() { return v[1]; }
420
421   //! Alias to 1st component (blue intensity).
422   Standard_ShortReal& b() { return v[0]; }
423
424   //! Alias to 4th component (alpha value).
425   Standard_ShortReal& a() { return v[3]; }
426
427 public:
428
429   Standard_ShortReal v[4];
430
431 };
432
433 //! Addition operator
434 template<typename ColorType_t>
435 inline ColorType_t Image_ColorSumm3 (const ColorType_t& theA, const ColorType_t& theB)
436 {
437   ColorType_t aRes = {{typename ColorType_t::ComponentType_t (theA.v[0] + theB.v[0]),
438                        typename ColorType_t::ComponentType_t (theA.v[1] + theB.v[1]),
439                        typename ColorType_t::ComponentType_t (theA.v[2] + theB.v[2])}};
440   return aRes;
441 }
442
443 inline Image_ColorRGB operator+ (const Image_ColorRGB& theA, const Image_ColorRGB& theB)
444 {
445   return Image_ColorSumm3 (theA, theB);
446 }
447
448 inline Image_ColorBGR operator+ (const Image_ColorBGR& theA, const Image_ColorBGR& theB)
449 {
450   return Image_ColorSumm3 (theA, theB);
451 }
452
453 inline Image_ColorRGBF operator+ (const Image_ColorRGBF& theA, const Image_ColorRGBF& theB)
454 {
455   return Image_ColorSumm3 (theA, theB);
456 }
457
458 inline Image_ColorBGRF operator+ (const Image_ColorBGRF& theA, const Image_ColorBGRF& theB)
459 {
460   return Image_ColorSumm3 (theA, theB);
461 }
462
463 template<typename ColorType_t>
464 inline ColorType_t Image_ColorSumm4 (const ColorType_t& theA, const ColorType_t& theB)
465 {
466   ColorType_t aRes = {{typename ColorType_t::ComponentType_t (theA.v[0] + theB.v[0]),
467                        typename ColorType_t::ComponentType_t (theA.v[1] + theB.v[1]),
468                        typename ColorType_t::ComponentType_t (theA.v[2] + theB.v[2]),
469                        typename ColorType_t::ComponentType_t (theA.v[3] + theB.v[3])}};
470   return aRes;
471 }
472
473 inline Image_ColorRGBA operator+ (const Image_ColorRGBA& theA, const Image_ColorRGBA& theB)
474 {
475   return Image_ColorSumm4 (theA, theB);
476 }
477
478 inline Image_ColorBGRA operator+ (const Image_ColorBGRA& theA, const Image_ColorBGRA& theB)
479 {
480   return Image_ColorSumm4 (theA, theB);
481 }
482
483 inline Image_ColorRGB32 operator+ (const Image_ColorRGB32& theA, const Image_ColorRGB32& theB)
484 {
485   return Image_ColorSumm4 (theA, theB);
486 }
487
488 inline Image_ColorBGR32 operator+ (const Image_ColorBGR32& theA, const Image_ColorBGR32& theB)
489 {
490   return Image_ColorSumm4 (theA, theB);
491 }
492
493 inline Image_ColorRGBAF operator+ (const Image_ColorRGBAF& theA, const Image_ColorRGBAF& theB)
494 {
495   return Image_ColorSumm4 (theA, theB);
496 }
497
498 inline Image_ColorBGRAF operator+ (const Image_ColorBGRAF& theA, const Image_ColorBGRAF& theB)
499 {
500   return Image_ColorSumm4 (theA, theB);
501 }
502
503 //! Subtraction operator
504 template<typename ColorType_t>
505 inline ColorType_t Image_ColorSub3 (const ColorType_t& theA, const ColorType_t& theB)
506 {
507   ColorType_t aRes = {{typename ColorType_t::ComponentType_t (theA.v[0] - theB.v[0]),
508                        typename ColorType_t::ComponentType_t (theA.v[1] - theB.v[1]),
509                        typename ColorType_t::ComponentType_t (theA.v[2] - theB.v[2])}};
510   return aRes;
511 }
512
513 inline Image_ColorRGB operator- (const Image_ColorRGB& theA, const Image_ColorRGB& theB)
514 {
515   return Image_ColorSub3 (theA, theB);
516 }
517
518 inline Image_ColorBGR operator- (const Image_ColorBGR& theA, const Image_ColorBGR& theB)
519 {
520   return Image_ColorSub3 (theA, theB);
521 }
522
523 inline Image_ColorRGBF operator- (const Image_ColorRGBF& theA, const Image_ColorRGBF& theB)
524 {
525   return Image_ColorSub3 (theA, theB);
526 }
527
528 inline Image_ColorBGRF operator- (const Image_ColorBGRF& theA, const Image_ColorBGRF& theB)
529 {
530   return Image_ColorSub3 (theA, theB);
531 }
532
533 template<typename ColorType_t>
534 inline ColorType_t Image_ColorSub4 (const ColorType_t& theA, const ColorType_t& theB)
535 {
536   ColorType_t aRes = {{typename ColorType_t::ComponentType_t (theA.v[0] - theB.v[0]),
537                        typename ColorType_t::ComponentType_t (theA.v[1] - theB.v[1]),
538                        typename ColorType_t::ComponentType_t (theA.v[2] - theB.v[2]),
539                        typename ColorType_t::ComponentType_t (theA.v[3] - theB.v[3])}};
540   return aRes;
541 }
542
543 inline Image_ColorRGBA operator- (const Image_ColorRGBA& theA, const Image_ColorRGBA& theB)
544 {
545   return Image_ColorSub4 (theA, theB);
546 }
547
548 inline Image_ColorBGRA operator- (const Image_ColorBGRA& theA, const Image_ColorBGRA& theB)
549 {
550   return Image_ColorSub4 (theA, theB);
551 }
552
553 inline Image_ColorRGB32 operator- (const Image_ColorRGB32& theA, const Image_ColorRGB32& theB)
554 {
555   return Image_ColorSub4 (theA, theB);
556 }
557
558 inline Image_ColorBGR32 operator- (const Image_ColorBGR32& theA, const Image_ColorBGR32& theB)
559 {
560   return Image_ColorSub4 (theA, theB);
561 }
562
563 inline Image_ColorRGBAF operator- (const Image_ColorRGBAF& theA, const Image_ColorRGBAF& theB)
564 {
565   return Image_ColorSub4 (theA, theB);
566 }
567
568 inline Image_ColorBGRAF operator- (const Image_ColorBGRAF& theA, const Image_ColorBGRAF& theB)
569 {
570   return Image_ColorSub4 (theA, theB);
571 }
572
573 #endif // _Image_Color_H__