//---------------------------------------------------------------------

        public static BlockRowBuffer <IDictionary <ushort, int> > GetCodeCountBuffer(ILandscape landscape)
        {
            BlockRowBuffer <IDictionary <ushort, int> > buffer =
                new BlockRowBuffer <IDictionary <ushort, int> >(landscape);

            for (int col = 1; col <= buffer.Columns; col++)
            {
                buffer[col] = new Dictionary <ushort, int>();
            }
            return(buffer);
        }
        //---------------------------------------------------------------------

        /// <summary>
        /// Reads a fine-scale input map using majority rule.
        /// </summary>
        /// <param name="map">
        /// The input map to read.
        /// </param>
        /// <param name="landscape">
        /// The landscape that the input map is associated with.
        /// </param>
        /// <param name="initSiteMethod">
        /// The method that's called to process a map code for a site.
        /// </param>
        public static void ReadWithMajorityRule <TPixel>(IInputRaster <TPixel> map,
                                                         ILandscape landscape,
                                                         Delegates.InitializeSite initSiteMethod)
            where TPixel : SingleBandPixel <ushort>, new()
        {
            BlockRowBuffer <IDictionary <ushort, int> > codeCountBuffer = GetCodeCountBuffer(landscape);
            Location lowerRight = new Location(landscape.BlockSize,
                                               landscape.BlockSize);

            foreach (Site site in landscape.AllSites)
            {
                TPixel pixel = map.ReadPixel();
                if (site.IsActive)
                {
                    ActiveSite activeSite = (ActiveSite)site;
                    ushort     mapCode    = pixel.Band0;
                    if (activeSite.SharesData)
                    {
                        // Increment the count for the current map code.
                        Location blockLocation = activeSite.BroadScaleLocation;
                        IDictionary <ushort, int> codeCounts = codeCountBuffer[blockLocation.Column];
                        int count;
                        codeCounts.TryGetValue(mapCode, out count);
                        codeCounts[mapCode] = count + 1;

                        if (activeSite.LocationInBlock == lowerRight)
                        {
                            // Last site in the block, so select one of
                            // map codes by majority rule.
                            ushort selectedMapCode = MajorityRule.SelectMapCode(codeCounts);
                            initSiteMethod(activeSite, selectedMapCode);
                            codeCounts.Clear();
                        }
                    }
                    else
                    {
                        // Active site has a unique data index
                        initSiteMethod(activeSite, mapCode);
                    }
                }
            }
        }