/*
 * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved.
 *
 * This file is part of BoofCV (http://boofcv.org).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package boofcv.alg.filter.misc;

import boofcv.struct.image.*;

/**
 * 

Implementation of {@link AverageDownSampleOps} specialized for square regions of width 2.

* *

* DO NOT MODIFY: This class was automatically generated by {@link boofcv.alg.filter.misc.GenerateImplAverageDownSample2}. *

* * @author Peter Abeles */ public class ImplAverageDownSample2 { public static void down(GrayU8 input , GrayI8 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]& 0xFF; total += input.data[ indexIn0++ ]& 0xFF; total += input.data[ indexIn1++ ]& 0xFF; total += input.data[ indexIn1++ ]& 0xFF; output.data[ indexOut++ ] = (byte)((total+2)/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; int total = input.data[ indexIn0 ]& 0xFF; total += input.data[ indexIn1 ]& 0xFF; output.data[ indexOut ] = (byte)((total+1)/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]& 0xFF; total += input.data[ indexIn0++ ]& 0xFF; output.data[ indexOut++ ] = (byte)((total+1)/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } public static void down(GrayS8 input , GrayI8 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; total += input.data[ indexIn1++ ]; total += input.data[ indexIn1++ ]; output.data[ indexOut++ ] = (byte)((total+2)/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; int total = input.data[ indexIn0 ]; total += input.data[ indexIn1 ]; output.data[ indexOut ] = (byte)((total+1)/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; output.data[ indexOut++ ] = (byte)((total+1)/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } public static void down(GrayU16 input , GrayI16 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]& 0xFFFF; total += input.data[ indexIn0++ ]& 0xFFFF; total += input.data[ indexIn1++ ]& 0xFFFF; total += input.data[ indexIn1++ ]& 0xFFFF; output.data[ indexOut++ ] = (short)((total+2)/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; int total = input.data[ indexIn0 ]& 0xFFFF; total += input.data[ indexIn1 ]& 0xFFFF; output.data[ indexOut ] = (short)((total+1)/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]& 0xFFFF; total += input.data[ indexIn0++ ]& 0xFFFF; output.data[ indexOut++ ] = (short)((total+1)/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } public static void down(GrayS16 input , GrayI16 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; total += input.data[ indexIn1++ ]; total += input.data[ indexIn1++ ]; output.data[ indexOut++ ] = (short)((total+2)/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; int total = input.data[ indexIn0 ]; total += input.data[ indexIn1 ]; output.data[ indexOut ] = (short)((total+1)/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; output.data[ indexOut++ ] = (short)((total+1)/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } public static void down(GrayS32 input , GrayS32 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; total += input.data[ indexIn1++ ]; total += input.data[ indexIn1++ ]; output.data[ indexOut++ ] = ((total+2)/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; int total = input.data[ indexIn0 ]; total += input.data[ indexIn1 ]; output.data[ indexOut ] = ((total+1)/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { int total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; output.data[ indexOut++ ] = ((total+1)/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } public static void down(GrayF32 input , GrayF32 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { float total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; total += input.data[ indexIn1++ ]; total += input.data[ indexIn1++ ]; output.data[ indexOut++ ] = (total/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; float total = input.data[ indexIn0 ]; total += input.data[ indexIn1 ]; output.data[ indexOut ] = (total/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { float total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; output.data[ indexOut++ ] = (total/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } public static void down(GrayF64 input , GrayF64 output ) { int maxY = input.height - input.height%2; int maxX = input.width - input.width%2; for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride; int indexIn0 = input.startIndex + y*input.stride; int indexIn1 = indexIn0 + input.stride; for( int x = 0; x < maxX; x += 2 ) { double total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; total += input.data[ indexIn1++ ]; total += input.data[ indexIn1++ ]; output.data[ indexOut++ ] = (total/4); } } if( maxX != input.width ) { for( int y = 0; y < maxY; y += 2 ) { int indexOut = output.startIndex + (y/2)*output.stride + output.width-1; int indexIn0 = input.startIndex + y*input.stride + maxX; int indexIn1 = indexIn0 + input.stride; double total = input.data[ indexIn0 ]; total += input.data[ indexIn1 ]; output.data[ indexOut ] = (total/2); } } if( maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride; int indexIn0 = input.startIndex + (input.height-1)*input.stride; for( int x = 0; x < maxX; x += 2 ) { double total = input.data[ indexIn0++ ]; total += input.data[ indexIn0++ ]; output.data[ indexOut++ ] = (total/2); } } if( maxX != input.width && maxY != input.height ) { int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int indexIn = input.startIndex + (input.height-1)*input.stride + input.width-1; output.data[indexOut] = input.data[ indexIn ]; } } }

Ads help maintain this website.