From 0ea5fc66924303d1bf73ba283a383e2aadee02f2 Mon Sep 17 00:00:00 2001 From: neodarz Date: Sat, 11 Aug 2018 20:21:34 +0200 Subject: Initial commit --- docs/doxygen/nel/rgba_8cpp-source.html | 805 +++++++++++++++++++++++++++++++++ 1 file changed, 805 insertions(+) create mode 100644 docs/doxygen/nel/rgba_8cpp-source.html (limited to 'docs/doxygen/nel/rgba_8cpp-source.html') diff --git a/docs/doxygen/nel/rgba_8cpp-source.html b/docs/doxygen/nel/rgba_8cpp-source.html new file mode 100644 index 00000000..7befbbaf --- /dev/null +++ b/docs/doxygen/nel/rgba_8cpp-source.html @@ -0,0 +1,805 @@ + + + + nevrax.org : docs + + + + + + + + + + + + + + +
# Home   # nevrax.com   
+ + + + +
Nevrax
+ + + + + + + + + + +
+ + +
+ Nevrax.org
+ + + + + + + +
#News
#Mailing-list
#Documentation
#CVS
#Bugs
#License
+
+ + +
+ + +
+Docs + +
+  + + + + + +
Documentation 
+ +
+Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages   Search  
+

rgba.cpp

Go to the documentation of this file.
00001 
+00007 /* Copyright, 2000 Nevrax Ltd.
+00008  *
+00009  * This file is part of NEVRAX NEL.
+00010  * NEVRAX NEL is free software; you can redistribute it and/or modify
+00011  * it under the terms of the GNU General Public License as published by
+00012  * the Free Software Foundation; either version 2, or (at your option)
+00013  * any later version.
+00014 
+00015  * NEVRAX NEL is distributed in the hope that it will be useful, but
+00016  * WITHOUT ANY WARRANTY; without even the implied warranty of
+00017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+00018  * General Public License for more details.
+00019 
+00020  * You should have received a copy of the GNU General Public License
+00021  * along with NEVRAX NEL; see the file COPYING. If not, write to the
+00022  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+00023  * MA 02111-1307, USA.
+00024  */
+00025 
+00026 #include "stdmisc.h"
+00027 
+00028 #include "nel/misc/rgba.h"
+00029 #include "nel/misc/stream.h"
+00030 #include "nel/misc/system_info.h"
+00031 #include "nel/misc/common.h"
+00032 
+00033 
+00034 namespace NLMISC {
+00035 
+00036 
+00037 //#define DISABLE_MMX_OPTIM
+00038 
+00039 // ***************************************************************************
+00040 // ***************************************************************************
+00041 // CRGBA
+00042 // ***************************************************************************
+00043 // ***************************************************************************
+00044 
+00045 // predifined colors
+00046 
+00048     const CRGBA CRGBA::Black(0, 0, 0) ;
+00049         const CRGBA CRGBA::Red(255, 0, 0) ;
+00050         const CRGBA CRGBA::Green(0, 255, 0) ;
+00051         const CRGBA CRGBA::Yellow(255, 255, 0) ;
+00052         const CRGBA CRGBA::Blue(0, 0, 255) ;
+00053         const CRGBA CRGBA::Magenta(255, 0, 255) ;
+00054         const CRGBA CRGBA::Cyan(0, 255, 255) ;
+00055         const CRGBA CRGBA::White(255, 255, 255) ;
+00056 
+00057 // ***************************************************************************
+00058 void CRGBA::serial(class NLMISC::IStream &f)
+00059 {
+00060         f.serial (R);
+00061         f.serial (G);
+00062         f.serial (B);
+00063         f.serial (A);
+00064 }
+00065 // ***************************************************************************
+00066 void CRGBA::set(uint8 r, uint8 g, uint8 b, uint8 a)
+00067 {
+00068         R = r;
+00069         G = g;
+00070         B = b;
+00071         A = a;
+00072 }
+00073 
+00074 #ifdef  NL_OS_WINDOWS
+00075         #pragma warning(disable : 4731) /* frame pointer register 'ebp' modified by inline assembly code */
+00076 #endif
+00077 
+00078 // ***************************************************************************
+00079 void CRGBA::addColors(CRGBA *dest, const CRGBA *src1, const CRGBA *src2, uint numColors, uint srcStride, uint destStride, uint dup)
+00080 {
+00081         if (numColors == 0) return;
+00082         #if     defined(NL_OS_WINDOWS) && !defined(DISABLE_MMX_OPTIM)
+00083         if (!CSystemInfo::hasMMX())
+00084         #endif
+00085         {   // unoptimized version
+00086                 if (dup == 1)
+00087                 {
+00088                         while (numColors--)
+00089                         {
+00090                                 dest->add(*src1, *src2);
+00091                                 dest = (CRGBA *) ((uint8 *) dest + destStride);
+00092                                 src1 = (CRGBA *) ((uint8 *) src1 + srcStride);
+00093                                 src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00094                         }
+00095                 }
+00096                 else
+00097                 {
+00098                         if (dup == 4) // optimisation for the 4 case
+00099                         {
+00100                                 while (numColors--)
+00101                                 {
+00102                                         dest->add(*src1, *src2);
+00103                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00104                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00105                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00106                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00107                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00108                                         dest = (CRGBA *) ((uint8 *) dest + (destStride << 1));
+00109 
+00110                                         src1 = (CRGBA *) ((uint8 *) src1 + srcStride);                                                                                                  
+00111                                         src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00112                                 }
+00113                         }
+00114                         else
+00115                         {
+00116                                 while (numColors--)
+00117                                 {
+00118                                         dest->add(*src1, *src2);
+00119 
+00120                                         uint k = dup - 1;
+00121                                         do
+00122                                         {
+00123                                                 * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00124                                                 dest = (CRGBA *) ((uint8 *) dest + destStride);
+00125                                         }
+00126                                         while (--k);
+00127                                         
+00128                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00129                                         src1 = (CRGBA *) ((uint8 *) src1 + srcStride);                                                                                                  
+00130                                         src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00131                                 }
+00132                         }
+00133                 }
+00134         }
+00135         #if     defined(NL_OS_WINDOWS) && !defined(DISABLE_MMX_OPTIM)
+00136         else // optimized mmx version
+00137         {       
+00139                 if (dup == 1)
+00140                 {
+00141                         __asm
+00142                         {
+00143                                                 push        ebp                                         
+00144                                                 mov                     edi, dest
+00145                                                 mov                     esi, src1
+00146                                                 mov                     ebx, src2
+00147                                                 sub                     ebx, esi  ; offset to source 2
+00148                                                 mov                     ecx, numColors
+00149                                                 mov         edx, destStride
+00150                                                 mov         ebp, srcStride
+00151                                                 sub         edi, edx
+00152                                 myLoop:                                                                                         
+00153                                                 movd        mm0, [esi]
+00154                                                 add         edi, edx
+00155                                                 movd        mm1, [esi + ebx]
+00156                                                 paddusb     mm0, mm1
+00157                                                 movd        [edi], mm0
+00158                                                 add         esi, ebp                                            
+00159                                                 dec                     ecx
+00160                                                 jne         myLoop                      
+00161                                                 pop                     ebp
+00162                                                 emms
+00163                         }
+00164                 }
+00165                 else
+00166                 {
+00167                         if (dup == 4)
+00168                         {
+00169                                 __asm
+00170                                 {
+00171                                                         push        ebp
+00172                                                         mov                     edi, dest
+00173                                                         mov                     esi, src1
+00174                                                         mov                     ebx, src2
+00175                                                         sub                     ebx, esi  ; offset to source 2
+00176                                                         mov                     ecx, numColors
+00177                                                         mov         edx, destStride
+00178                                                         mov         ebp, srcStride
+00179                                         myLoop4:                                                        
+00180                                                         movd        mm0, [esi]                                                  
+00181                                                         movd        mm1, [esi + ebx]
+00182                                                         paddusb     mm0, mm1
+00183                                                         movd        eax, mm0
+00184                                                         
+00185                                                         mov         [edi], eax                  
+00186                                                         mov         [edi + edx], eax
+00187                                                         mov         [edi + 2 * edx], eax
+00188                                                         lea         edi, [edi + edx * 2]
+00189                                                         mov         [edi + edx], eax
+00190                                                         lea         edi, [edi + edx * 2]                                                
+00191                                                         add         esi, ebp
+00192 
+00193                                                         dec         ecx
+00194                                                         jne         myLoop4                                     
+00195                                                         pop                     ebp
+00196                                                         emms
+00197                                 }
+00198                         }
+00199                         else
+00200                         {
+00201                                 __asm
+00202                                 {
+00203                                                         push        ebp
+00204                                                         mov                     edi, dest
+00205                                                         mov                     esi, src1
+00206                                                         mov                     ebx, src2
+00207                                                         sub                     ebx, esi  ; offset to source 2
+00208                                                         mov                     ecx, numColors
+00209                                                         mov         edx, destStride
+00210                                                         mov         eax, dup
+00211                                                         mov         ebp, srcStride
+00212                                                         push        eax
+00213                                         myLoopN:                                                                                                
+00214                                                         movd        mm0, [esi]                                                  
+00215                                                         movd        mm1, [esi + ebx]
+00216                                                         push        ecx
+00217                                                         paddusb     mm0, mm1
+00218                                                         mov         ecx, 4[esp]
+00219                                                         movd        eax, mm0
+00220                                         dupLoopN:
+00221                                                         mov         [edi], eax
+00222                                                         dec         ecx
+00223                                                         lea         edi, [edi + edx]
+00224                                                         jne                 dupLoopN
+00225                                                         pop         ecx                 ; get back the loop counter                                                     
+00226                                                         add         esi, ebp 
+00227                                                         dec         ecx
+00228                                                         jne         myLoopN                                     
+00229                                                         pop eax
+00230                                                         pop     ebp
+00231                                                         emms
+00232                                 }
+00233                         }
+00234                 }
+00235         }
+00236         #endif
+00237 }
+00238 // ***************************************************************************
+00239 void CRGBA::modulateColors(CRGBA *dest, const CRGBA *src1, const CRGBA *src2, uint numColors, uint srcStride, uint destStride, uint dup)
+00240 {
+00241         #if     defined(NL_OS_WINDOWS) && !defined(DISABLE_MMX_OPTIM)
+00242         if (!CSystemInfo::hasMMX())
+00243         #endif
+00244         {   // unoptimized version
+00245                 if (dup == 1)
+00246                 {
+00247                         while (numColors--)
+00248                         {
+00249                                 dest->modulateFromColor(*src1, *src2);
+00250                                 dest = (CRGBA *) ((uint8 *) dest + destStride);
+00251                                 src1 = (CRGBA *) ((uint8 *) src1 + srcStride);
+00252                                 src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00253                         }
+00254                 }
+00255                 else
+00256                 {
+00257                         if (dup == 4) // optimisation for the 4 case
+00258                         {
+00259                                 while (numColors--)
+00260                                 {
+00261                                         dest->modulateFromColor(*src1, *src2);
+00262                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00263                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00264                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00265                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00266                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00267                                         dest = (CRGBA *) ((uint8 *) dest + (destStride << 1));
+00268 
+00269                                         src1 = (CRGBA *) ((uint8 *) src1 + srcStride);                                                                                                  
+00270                                         src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00271                                 }
+00272                         }
+00273                         else
+00274                         {
+00275                                 while (numColors--)
+00276                                 {
+00277                                         dest->modulateFromColor(*src1, *src2);
+00278 
+00279                                         uint k = dup - 1;
+00280                                         do
+00281                                         {
+00282                                                 * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00283                                                 dest = (CRGBA *) ((uint8 *) dest + destStride);
+00284                                         }
+00285                                         while (--k);
+00286                                         
+00287                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00288                                         src1 = (CRGBA *) ((uint8 *) src1 + srcStride);                                                                                                  
+00289                                         src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00290                                 }
+00291                         }
+00292                 }
+00293         }
+00294         #if     defined(NL_OS_WINDOWS) && !defined(DISABLE_MMX_OPTIM)
+00295         else // optimized mmx version
+00296         {       
+00297                 uint64 blank = 0;
+00299                 if (dup == 1)
+00300                 {                       __asm
+00301                         {
+00302                                                 push        ebp
+00303                                                 movq         mm2, blank
+00304                                                 mov                     edi, dest
+00305                                                 mov                     esi, src1
+00306                                                 mov                     ebx, src2
+00307                                                 sub                     ebx, esi  ; offset to source 2
+00308                                                 mov                     ecx, numColors
+00309                                                 mov         edx, destStride
+00310                                                 mov         ebp, srcStride
+00311                                 myLoop:                                                                                         
+00312                                                 movd                    mm0, [esi]                                                                                              
+00313                                                 movd                    mm1, [esi + ebx]
+00314                                                 punpcklbw       mm0, mm2
+00315                                                 punpcklbw       mm1, mm2                                                
+00316                                                 pmullw          mm0, mm1
+00317                                                 psrlw       mm0, 8
+00318                                                 packuswb    mm0, mm0
+00319                                                 movd        [edi], mm0                                          
+00320                                                 add         edi, edx
+00321                                                 add         esi, ebp 
+00322 
+00323                                                 dec         ecx
+00324                                                 jne         myLoop                              
+00325                                                 pop                     ebp
+00326                                                 emms
+00327                         }
+00328                 }
+00329                 else
+00330                 {
+00331                         if (dup == 4)                   
+00332                         {
+00333                                 
+00334                                 __asm
+00335                                 {
+00336                                                         push        ebp
+00337                                                         movq        mm2, blank
+00338                                                         mov                     edi, dest
+00339                                                         mov                     esi, src1
+00340                                                         mov                     ebx, src2
+00341                                                         sub                     ebx, esi  ; offset to source 2
+00342                                                         mov                     ecx, numColors
+00343                                                         mov         edx, destStride
+00344                                                         mov         ebp, srcStride
+00345                                         myLoop4:
+00346                                                         movd            mm0, [esi]                                                                                              
+00347                                                         movd            mm1, [esi + ebx]
+00348                                                         punpcklbw       mm0, mm2
+00349                                                         punpcklbw       mm1, mm2                                                
+00350                                                         pmullw          mm0, mm1
+00351                                                         psrlw       mm0, 8
+00352                                                         packuswb    mm0, mm0
+00353                                                         movd        eax, mm0
+00354                                                         ; duplicate the result 4 times
+00355                                                         mov         [edi], eax                  
+00356                                                         mov         [edi + edx], eax
+00357                                                         mov         [edi + 2 * edx], eax
+00358                                                         lea         edi, [edi +  2 * edx]
+00359                                                         mov         [edi + edx], eax
+00360                                                         lea         edi, [edi + 2 * edx]
+00361                                                         add         esi, ebp 
+00362                                                         dec         ecx
+00363                                                         jne         myLoop4                             
+00364                                                         pop                     ebp
+00365                                                         emms
+00366                                 }
+00367                         }
+00368                         else
+00369                         {
+00370                                 __asm
+00371                                 {
+00372                                                         push        ebp
+00373                                                         mov                     edi, dest
+00374                                                         mov                     esi, src1
+00375                                                         mov                     ebx, src2
+00376                                                         sub                     ebx, esi  ; offset to source 2
+00377                                                         mov                     ecx, numColors
+00378                                                         mov         edx, destStride
+00379                                                         mov         eax, dup
+00380                                                         mov         ebp, srcStride
+00381                                                         push        eax
+00382                                         myLoopN:
+00383                                                         movd            mm0, [esi]                                                                                              
+00384                                                         movd            mm1, [esi + ebx]
+00385                                                         punpcklbw       mm0, mm2
+00386                                                         punpcklbw       mm1, mm2                                                
+00387                                                         pmullw          mm0, mm1
+00388                                                         push        ecx
+00389                                                         psrlw       mm0, 8
+00390                                                         mov         ecx, 4[esp] 
+00391                                                         packuswb    mm0, mm0
+00392                                                         movd        eax, mm0
+00393                                         dupLoopN:
+00394                                                         mov         [edi], eax
+00395                                                         dec         ecx
+00396                                                         lea         edi, [edi + edx]
+00397                                                         jne                 dupLoopN
+00398                                                         pop         ecx                 ; get back the loop counter
+00399                                                         add         esi, ebp
+00400                                                         dec         ecx
+00401                                                         jne         myLoopN                                     
+00402                                                         pop eax
+00403                                                         pop                     ebp
+00404                                                         emms
+00405                                 }
+00406                         }
+00407                 }
+00408         }
+00409         #endif
+00410 }
+00411 // ***************************************************************************
+00412 void CRGBA::subtractColors(CRGBA *dest, const CRGBA *src1, const CRGBA *src2, uint numColors, uint srcStride, uint destStride, uint dup)
+00413 {
+00414         if (numColors == 0) return;
+00415         #if     defined(NL_OS_WINDOWS) && !defined(DISABLE_MMX_OPTIM)
+00416         if (!CSystemInfo::hasMMX())
+00417         #endif
+00418         {   // unoptimized version
+00419                 if (dup == 1)
+00420                 {
+00421                         while (numColors--)
+00422                         {
+00423                                 dest->sub(*src1, *src2);
+00424                                 dest = (CRGBA *) ((uint8 *) dest + destStride);
+00425                                 src1 = (CRGBA *) ((uint8 *) src1 + srcStride);
+00426                                 src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00427                         }
+00428                 }
+00429                 else
+00430                 {
+00431                         if (dup == 4) // optimisation for the 4 case
+00432                         {
+00433                                 while (numColors--)
+00434                                 {
+00435                                         dest->sub(*src1, *src2);
+00436                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00437                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00438                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00439                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00440                                         * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00441                                         dest = (CRGBA *) ((uint8 *) dest + (destStride << 1));
+00442 
+00443                                         src1 = (CRGBA *) ((uint8 *) src1 + srcStride);                                                                                                  
+00444                                         src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00445                                 }
+00446                         }
+00447                         else
+00448                         {
+00449                                 while (numColors--)
+00450                                 {
+00451                                         dest->sub(*src1, *src2);
+00452 
+00453                                         uint k = dup - 1;
+00454                                         do
+00455                                         {
+00456                                                 * (CRGBA *) ((uint8 *) dest + destStride) = *dest;
+00457                                                 dest = (CRGBA *) ((uint8 *) dest + destStride);
+00458                                         }
+00459                                         while (--k);
+00460                                         
+00461                                         dest = (CRGBA *) ((uint8 *) dest + destStride);
+00462                                         src1 = (CRGBA *) ((uint8 *) src1 + srcStride);                                                                                                  
+00463                                         src2 = (CRGBA *) ((uint8 *) src2 + srcStride);
+00464                                 }
+00465                         }
+00466                 }
+00467         }
+00468         #if     defined(NL_OS_WINDOWS) && !defined(DISABLE_MMX_OPTIM)
+00469         else // optimized mmx version
+00470         {       
+00472                 if (dup == 1)
+00473                 {
+00474                         __asm
+00475                         {
+00476                                                 push        ebp                                         
+00477                                                 mov                     edi, dest
+00478                                                 mov                     esi, src1
+00479                                                 mov                     ebx, src2
+00480                                                 sub                     ebx, esi  ; offset to source 2
+00481                                                 mov                     ecx, numColors
+00482                                                 mov         edx, destStride
+00483                                                 mov         ebp, srcStride
+00484                                                 sub         edi, edx
+00485                                 myLoop:                                                                                         
+00486                                                 movd        mm0, [esi]
+00487                                                 add         edi, edx
+00488                                                 movd        mm1, [esi + ebx]
+00489                                                 psubusb     mm0, mm1
+00490                                                 movd        [edi], mm0
+00491                                                 add         esi, ebp                                            
+00492                                                 dec                     ecx
+00493                                                 jne         myLoop                      
+00494                                                 pop                     ebp
+00495                                                 emms
+00496                         }
+00497                 }
+00498                 else
+00499                 {
+00500                         if (dup == 4)
+00501                         {
+00502                                 __asm
+00503                                 {
+00504                                                         push        ebp
+00505                                                         mov                     edi, dest
+00506                                                         mov                     esi, src1
+00507                                                         mov                     ebx, src2
+00508                                                         sub                     ebx, esi  ; offset to source 2
+00509                                                         mov                     ecx, numColors
+00510                                                         mov         edx, destStride
+00511                                                         mov         ebp, srcStride
+00512                                         myLoop4:                                                        
+00513                                                         movd        mm0, [esi]                                                  
+00514                                                         movd        mm1, [esi + ebx]
+00515                                                         psubusb     mm0, mm1
+00516                                                         movd        eax, mm0
+00517                                                         
+00518                                                         mov         [edi], eax                  
+00519                                                         mov         [edi + edx], eax
+00520                                                         mov         [edi + 2 * edx], eax
+00521                                                         lea         edi, [edi + edx * 2]
+00522                                                         mov         [edi + edx], eax
+00523                                                         lea         edi, [edi + edx * 2]                                                
+00524                                                         add         esi, ebp
+00525 
+00526                                                         dec         ecx
+00527                                                         jne         myLoop4
+00528                                                         pop                     ebp
+00529                                                         emms
+00530                                 }
+00531                         }
+00532                         else
+00533                         {
+00534                                 __asm
+00535                                 {
+00536                                                         push        ebp
+00537                                                         mov                     edi, dest
+00538                                                         mov                     esi, src1
+00539                                                         mov                     ebx, src2
+00540                                                         sub                     ebx, esi  ; offset to source 2
+00541                                                         mov                     ecx, numColors
+00542                                                         mov         edx, destStride
+00543                                                         mov         eax, dup
+00544                                                         mov         ebp, srcStride
+00545                                                         push        eax
+00546                                         myLoopN:                                                                                                
+00547                                                         movd        mm0, [esi]                                                  
+00548                                                         movd        mm1, [esi + ebx]
+00549                                                         push        ecx
+00550                                                         psubusb     mm0, mm1
+00551                                                         mov         ecx, 4[esp]
+00552                                                         movd        eax, mm0
+00553                                         dupLoopN:
+00554                                                         mov         [edi], eax
+00555                                                         dec         ecx
+00556                                                         lea         edi, [edi + edx]
+00557                                                         jne                 dupLoopN
+00558                                                         pop         ecx                 ; get back the loop counter                                                     
+00559                                                         add         esi, ebp 
+00560                                                         dec         ecx
+00561                                                         jne         myLoopN                                     
+00562                                                         pop eax
+00563                                                         pop     ebp
+00564                                                         emms
+00565                                 }
+00566                         }
+00567                 }
+00568         }
+00569         #endif
+00570 }
+00571 
+00572 // ***************************************************************************
+00573 // ***************************************************************************
+00574 // CBGRA
+00575 // ***************************************************************************
+00576 // ***************************************************************************
+00577 
+00578 
+00579 // ***************************************************************************
+00580 void CBGRA::serial(class NLMISC::IStream &f)
+00581 {
+00582         f.serial (B);
+00583         f.serial (G);
+00584         f.serial (R);
+00585         f.serial (A);
+00586 }
+00587 // ***************************************************************************
+00588 void CBGRA::set(uint8 r, uint8 g, uint8 b, uint8 a)
+00589 {
+00590         R = r;
+00591         G = g;
+00592         B = b;
+00593         A = a;
+00594 }
+00595 // ***************************************************************************
+00596 void CBGRA::blendFromui(CBGRA &c0, CBGRA &c1, uint coef) // coef must be in [0,256]
+00597 {
+00598         int     a1 = coef;
+00599         int     a2 = 256-a1;
+00600         R = (c0.R*a2 + c1.R*a1) >>8;
+00601         G = (c0.G*a2 + c1.G*a1) >>8;
+00602         B = (c0.B*a2 + c1.B*a1) >>8;
+00603         A = (c0.A*a2 + c1.A*a1) >>8;
+00604 }
+00605 
+00606 
+00607 // ***************************************************************************
+00608 bool CRGBA::convertToHLS(float &h, float &l, float &s) const
+00609 {
+00610         float r = R / 255.f;
+00611         float g = G / 255.f;
+00612         float b = B / 255.f;
+00613 
+00614         float maxV = NLMISC::maxof(r, g, b);
+00615         float minV = NLMISC::minof(r, g, b);
+00616 
+00618         l = 0.5f * (maxV + minV);
+00619 
+00621         if (minV == maxV)  // all composants are equals -> achromatique
+00622         {
+00623                 s = 0;          
+00624                 return true;
+00625         }
+00626         float diff = maxV - minV;
+00628         s  = l > 0.5f                                   ?   /*are we in the top of the double-hexcone ? */
+00629                 diff / (2.f - maxV - minV)  :
+00630                 diff / (maxV + minV);
+00631 
+00632         // Get hue
+00633 
+00634         if (maxV == r)
+00635         {
+00636                 h = (g - b) / diff;
+00637         }
+00638         else if (maxV == g)
+00639         {
+00640                 h = 2.f + (b - r) / diff;
+00641         }
+00642         else
+00643         {
+00644                 h = 4.f + (r - g) / diff;
+00645         }
+00646                  
+00647         h *= 60.f; // scale to [0..360]
+00648 
+00649         if (h < 0.f) h += 360.f;
+00650         
+00651         return false;
+00652 }
+00653 
+00654 
+00655 // ***************************************************************************
+00657 static float HLSValue(float h, float v1, float v2)
+00658 {
+00659         /* get hue in the [0, 360] interval */
+00660         // h -= 360.f * ::floorf(h / 360.f);
+00661 
+00662         if (h > 360.f) h -= 360.f;
+00663         else if (h < 0) h += 360.f;
+00664 
+00665         if (h < 60.f)
+00666         {
+00667                 return v1 + (v2 - v1) * h / 60.f;
+00668         }
+00669         else if (h < 180.f)
+00670         {
+00671                 return v2;
+00672         }
+00673         else if (h < 240.f)
+00674         {
+00675                 return v1 + (v2 - v1) * (240.f - h) / 60.f;
+00676         }
+00677         else
+00678         {
+00679                 return v1;
+00680         }                
+00681 }
+00682 
+00683 
+00684 // ***************************************************************************
+00685 void CRGBA::buildFromHLS(float h, float l, float s)
+00686 {
+00687         clamp(l, 0, 1);
+00688         clamp(s, 0, 1);
+00689 
+00690         float v2 = (l <= 0.5f) ? (l * (1 + s)) : (l + s - l * s);
+00691         float v1 = 2.f * l - v2;
+00692 
+00693         if (s == 0) // achromatic ?
+00694         {
+00695                 R = G = B = (uint8) (255.f * l);
+00696         }
+00697         else // chromatic case
+00698         {
+00699                 float v;
+00700                 //
+00701                 v = HLSValue(h + 120.f, v1, v2);
+00702                 clamp(v, 0.f, 1.f);
+00703                 R = (uint8) (255.f * v);
+00704                 //
+00705                 v = HLSValue(h, v1, v2);
+00706                 clamp(v, 0.f, 1.f);
+00707                 G = (uint8) (255.f * v);
+00708                 //
+00709                 v = HLSValue(h - 120.f, v1, v2);
+00710                 clamp(v, 0.f, 1.f);
+00711                 B = (uint8) (255.f * v);        
+00712         }
+00713 }
+00714 
+00715 
+00716 // ***************************************************************************
+00717 // ***************************************************************************
+00718 // CRGBAF
+00719 // ***************************************************************************
+00720 // ***************************************************************************
+00721 
+00722 
+00723 // ***************************************************************************
+00724 void CRGBAF::serial(class NLMISC::IStream &f)
+00725 {
+00726         f.serial (R);
+00727         f.serial (G);
+00728         f.serial (B);
+00729         f.serial (A);
+00730 }
+00731 // ***************************************************************************
+00732 void CRGBAF::set(float r, float g, float b, float a)
+00733 {
+00734         R = r;
+00735         G = g;
+00736         B = b;
+00737         A = a;
+00738 }
+00739 
+00740 
+00741 
+00742 
+00743 
+00744 } // NLMISC
+
+ + +
                                                                                                                                                                    +
+ + -- cgit v1.2.1