@@ -51,43 +51,44 @@ protected override void OnFrameApply(ImageFrame<TPixel> source, Rectangle source
5151            Span < TPixel >  pixels  =  source . GetPixelSpan ( ) ; 
5252
5353            var  parallelOptions  =  new  ParallelOptions ( )  {  MaxDegreeOfParallelism  =  configuration . MaxDegreeOfParallelism  } ; 
54-             int  tileWidth  =  source . Width  /  this . Tiles ; 
55-             int  pixeInTile  =  tileWidth  *  tileWidth ; 
56-             int  halfTileWith  =  tileWidth  /  2 ; 
54+             int  tileHeight  =  source . Height  /  this . Tiles ; 
55+             int  pixeInTile  =  tileHeight  *  tileHeight ; 
56+             int  halfTileHeight  =  tileHeight  /  2 ; 
57+             int  halfTileWidth  =  halfTileHeight ; 
5758            using  ( Buffer2D < TPixel >  targetPixels  =  configuration . MemoryAllocator . Allocate2D < TPixel > ( source . Width ,  source . Height ) ) 
5859            { 
5960                Parallel . For ( 
6061                    0 , 
61-                     source . Width , 
62+                     source . Height , 
6263                    parallelOptions , 
63-                     x  => 
64+                     y  => 
6465                    { 
6566                        using  ( IMemoryOwner < int >  histogramBuffer  =  memoryAllocator . Allocate < int > ( this . LuminanceLevels ,  AllocationOptions . Clean ) ) 
6667                        using  ( IMemoryOwner < int >  histogramBufferCopy  =  memoryAllocator . Allocate < int > ( this . LuminanceLevels ,  AllocationOptions . Clean ) ) 
6768                        using  ( IMemoryOwner < int >  cdfBuffer  =  memoryAllocator . Allocate < int > ( this . LuminanceLevels ,  AllocationOptions . Clean ) ) 
68-                         using  ( IMemoryOwner < TPixel >  pixelRowBuffer  =  memoryAllocator . Allocate < TPixel > ( tileWidth ,  AllocationOptions . Clean ) ) 
69+                         using  ( IMemoryOwner < TPixel >  pixelColumnBuffer  =  memoryAllocator . Allocate < TPixel > ( tileHeight ,  AllocationOptions . Clean ) ) 
6970                        { 
7071                            Span < int >  histogram  =  histogramBuffer . GetSpan ( ) ; 
7172                            ref  int  histogramBase  =  ref  MemoryMarshal . GetReference ( histogram ) ; 
7273                            Span < int >  histogramCopy  =  histogramBufferCopy . GetSpan ( ) ; 
7374                            ref  int  histogramCopyBase  =  ref  MemoryMarshal . GetReference ( histogramCopy ) ; 
7475                            ref  int  cdfBase  =  ref  MemoryMarshal . GetReference ( cdfBuffer . GetSpan ( ) ) ; 
7576
76-                             Span < TPixel >  pixelRow  =  pixelRowBuffer . GetSpan ( ) ; 
77+                             Span < TPixel >  pixelColumn  =  pixelColumnBuffer . GetSpan ( ) ; 
7778                            int  maxHistIdx  =  0 ; 
7879
7980                            // Build the histogram of grayscale values for the current tile. 
80-                             for  ( int  dy  =  - halfTileWith ;   dy  <  halfTileWith ;   dy ++ ) 
81+                             for  ( int  dx  =  - halfTileWidth ;   dx  <  halfTileWidth ;   dx ++ ) 
8182                            { 
82-                                 Span < TPixel >  rowSpan  =  this . GetPixelRow ( source ,  pixelRow ,   x   -   halfTileWith ,   dy ,   tileWidth ) ; 
83-                                 int  maxIdx  =  this . AddPixelsToHistogram ( rowSpan ,  histogram ,  this . LuminanceLevels ) ; 
83+                                 Span < TPixel >  columnSpan  =  this . GetPixelColumn ( source ,  pixelColumn ,   dx ,   y   -   halfTileHeight ,   tileHeight ) ; 
84+                                 int  maxIdx  =  this . AddPixelsToHistogram ( columnSpan ,  histogram ,  this . LuminanceLevels ) ; 
8485                                if  ( maxIdx  >  maxHistIdx ) 
8586                                { 
8687                                    maxHistIdx  =  maxIdx ; 
8788                                } 
8889                            } 
8990
90-                             for  ( int  y  =  0 ;  y  <  source . Height ;   y ++ ) 
91+                             for  ( int  x  =  0 ;  x  <  source . Width ;   x ++ ) 
9192                            { 
9293                                if  ( this . ClipHistogramEnabled ) 
9394                                { 
@@ -103,18 +104,18 @@ protected override void OnFrameApply(ImageFrame<TPixel> source, Rectangle source
103104
104105                                float  numberOfPixelsMinusCdfMin  =  pixeInTile  -  cdfMin ; 
105106
106-                                 // Map the current pixel to the new equalized value 
107+                                 // Map the current pixel to the new equalized value.  
107108                                int  luminance  =  GetLuminance ( source [ x ,  y ] ,  this . LuminanceLevels ) ; 
108109                                float  luminanceEqualized  =  Unsafe . Add ( ref  cdfBase ,  luminance )  /  numberOfPixelsMinusCdfMin ; 
109110                                targetPixels [ x ,  y ] . FromVector4 ( new  Vector4 ( luminanceEqualized ,  luminanceEqualized ,  luminanceEqualized ,  source [ x ,  y ] . ToVector4 ( ) . W ) ) ; 
110111
111-                                 // Remove top  most row  from the histogram, mirroring rows  which exceeds the borders. 
112-                                 Span < TPixel >  rowSpan  =  this . GetPixelRow ( source ,  pixelRow ,  x  -  halfTileWith ,  y  -  halfTileWith ,   tileWidth ) ; 
113-                                 maxHistIdx  =  this . RemovePixelsFromHistogram ( rowSpan ,  histogram ,  this . LuminanceLevels ,  maxHistIdx ) ; 
112+                                 // Remove left  most column  from the histogram, mirroring columns  which exceeds the borders of the image . 
113+                                 Span < TPixel >  columnSpan  =  this . GetPixelColumn ( source ,  pixelColumn ,  x  -  halfTileWidth ,  y  -  halfTileHeight ,   tileHeight ) ; 
114+                                 maxHistIdx  =  this . RemovePixelsFromHistogram ( columnSpan ,  histogram ,  this . LuminanceLevels ,  maxHistIdx ) ; 
114115
115-                                 // Add new bottom row  to the histogram, mirroring rows  which exceeds the borders. 
116-                                 rowSpan  =  this . GetPixelRow ( source ,  pixelRow ,  x  -   halfTileWith ,  y  +   halfTileWith ,   tileWidth ) ; 
117-                                 int  maxIdx  =  this . AddPixelsToHistogram ( rowSpan ,  histogram ,  this . LuminanceLevels ) ; 
116+                                 // Add new right column  to the histogram, mirroring columns  which exceeds the borders of the image . 
117+                                 columnSpan  =  this . GetPixelColumn ( source ,  pixelColumn ,  x  +   halfTileWidth ,  y  -   halfTileHeight ,   tileHeight ) ; 
118+                                 int  maxIdx  =  this . AddPixelsToHistogram ( columnSpan ,  histogram ,  this . LuminanceLevels ) ; 
118119                                if  ( maxIdx  >  maxHistIdx ) 
119120                                { 
120121                                    maxHistIdx  =  maxIdx ; 
@@ -128,62 +129,64 @@ protected override void OnFrameApply(ImageFrame<TPixel> source, Rectangle source
128129        } 
129130
130131        /// <summary> 
131-         /// Get the a pixel row  at a given position with a length  of the tile width . Mirrors pixels which exceeds the edges. 
132+         /// Get the a pixel column  at a given position with the size  of the tile height . Mirrors pixels which exceeds the edges of the image . 
132133        /// </summary> 
133134        /// <param name="source">The source image.</param> 
134-         /// <param name="rowPixels ">Pre-allocated pixel row span of the size of a tile width .</param> 
135+         /// <param name="columnPixels ">Pre-allocated pixel row span of the size of a tile height .</param> 
135136        /// <param name="x">The x position.</param> 
136137        /// <param name="y">The y position.</param> 
137-         /// <param name="tileWidth ">The width  in pixels of a tile.</param> 
138+         /// <param name="tileHeight ">The height  in pixels of a tile.</param> 
138139        /// <returns>A pixel row of the length of the tile width.</returns> 
139-         private  Span < TPixel >  GetPixelRow ( ImageFrame < TPixel >  source ,  Span < TPixel >  rowPixels ,  int  x ,  int  y ,  int  tileWidth ) 
140+         private  Span < TPixel >  GetPixelColumn ( ImageFrame < TPixel >  source ,  Span < TPixel >  columnPixels ,  int  x ,  int  y ,  int  tileHeight ) 
140141        { 
141-             if  ( y  <  0 ) 
142+             if  ( x  <  0 ) 
142143            { 
143-                 y  =  Math . Abs ( y ) ; 
144+                 x  =  Math . Abs ( x ) ; 
144145            } 
145-             else  if  ( y  >=  source . Height ) 
146+             else  if  ( x  >=  source . Width ) 
146147            { 
147-                 int  diff  =  y  -  source . Height ; 
148-                 y  =  source . Height  -  diff  -  1 ; 
148+                 int  diff  =  x  -  source . Width ; 
149+                 x  =  source . Width  -  diff  -  1 ; 
149150            } 
150151
151-             // Special cases for the left and the right border where GetPixelRowSpan can not be used 
152-             if  ( x  <  0 ) 
152+             int  idx  =  0 ; 
153+             columnPixels . Clear ( ) ; 
154+             if  ( y  <  0 ) 
153155            { 
154-                 rowPixels . Clear ( ) ; 
155-                 int  idx  =  0 ; 
156-                 for  ( int  dx  =  x ;  dx  <  x  +  tileWidth ;  dx ++ ) 
156+                 columnPixels . Clear ( ) ; 
157+                 for  ( int  dy  =  y ;  dy  <  y  +  tileHeight ;  dy ++ ) 
157158                { 
158-                     rowPixels [ idx ]  =  source [ Math . Abs ( dx ) ,   y ] ; 
159+                     columnPixels [ idx ]  =  source [ x ,   Math . Abs ( dy ) ] ; 
159160                    idx ++ ; 
160161                } 
161- 
162-                 return  rowPixels ; 
163162            } 
164-             else  if  ( x  +  tileWidth  >  source . Width ) 
163+             else  if  ( y  +  tileHeight  >  source . Height ) 
165164            { 
166-                 rowPixels . Clear ( ) ; 
167-                 int  idx  =  0 ; 
168-                 for  ( int  dx  =  x ;  dx  <  x  +  tileWidth ;  dx ++ ) 
165+                 for  ( int  dy  =  y ;  dy  <  y  +  tileHeight ;  dy ++ ) 
169166                { 
170-                     if  ( dx  >=  source . Width ) 
167+                     if  ( dy  >=  source . Height ) 
171168                    { 
172-                         int  diff  =  dx  -  source . Width ; 
173-                         rowPixels [ idx ]  =  source [ dx   -  diff  -  1 ,   y ] ; 
169+                         int  diff  =  dy  -  source . Height ; 
170+                         columnPixels [ idx ]  =  source [ x ,   dy   -  diff  -  1 ] ; 
174171                    } 
175172                    else 
176173                    { 
177-                         rowPixels [ idx ]  =  source [ dx ,   y ] ; 
174+                         columnPixels [ idx ]  =  source [ x ,   dy ] ; 
178175                    } 
179176
180177                    idx ++ ; 
181178                } 
182- 
183-                 return  rowPixels ; 
179+             } 
180+             else 
181+             { 
182+                 for  ( int  dy  =  y ;  dy  <  y  +  tileHeight ;  dy ++ ) 
183+                 { 
184+                     columnPixels [ idx ]  =  source [ x ,  dy ] ; 
185+                     idx ++ ; 
186+                 } 
184187            } 
185188
186-             return  source . GetPixelRowSpan ( y ) . Slice ( start :   x ,   length :   tileWidth ) ; 
189+             return  columnPixels ; 
187190        } 
188191
189192        /// <summary> 
0 commit comments