// ==========================================================
// Upsampling / downsampling classes
//
// Design and implementation by
// - Hervé Drolon (drolon@infonie.fr)
// - Detlev Vendt (detlev.vendt@brillit.de)
//
// This file is part of FreeImage 3
//
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
// THIS DISCLAIMER.
//
// Use at your own risk!
// ==========================================================
#ifndef _RESIZE_H_
#define _RESIZE_H_
#include "FreeImage.h"
#include "Utilities.h"
#include "Filters.h"
/**
Filter weights table.
This class stores contribution information for an entire line (row or column).
*/
class CWeightsTable
{
/**
Sampled filter weight table.
Contribution information for a single pixel
*/
typedef struct {
/// Normalized weights of neighboring pixels
double *Weights;
/// Bounds of source pixels window
unsigned Left, Right;
} Contribution;
private:
/// Row (or column) of contribution weights
Contribution *m_WeightTable;
/// Filter window size (of affecting source pixels)
unsigned m_WindowSize;
/// Length of line (no. of rows / cols)
unsigned m_LineLength;
public:
/**
Constructor
Allocate and compute the weights table
@param pFilter Filter used for upsampling or downsampling
@param uDstSize Length (in pixels) of the destination line buffer
@param uSrcSize Length (in pixels) of the source line buffer
*/
CWeightsTable(CGenericFilter *pFilter, unsigned uDstSize, unsigned uSrcSize);
/**
Destructor
Destroy the weights table
*/
~CWeightsTable();
/** Retrieve a filter weight, given source and destination positions
@param dst_pos Pixel position in destination line buffer
@param src_pos Pixel position in source line buffer
@return Returns the filter weight
*/
double getWeight(unsigned dst_pos, unsigned src_pos) {
return m_WeightTable[dst_pos].Weights[src_pos];
}
/** Retrieve left boundary of source line buffer
@param dst_pos Pixel position in destination line buffer
@return Returns the left boundary of source line buffer
*/
unsigned getLeftBoundary(unsigned dst_pos) {
return m_WeightTable[dst_pos].Left;
}
/** Retrieve right boundary of source line buffer
@param dst_pos Pixel position in destination line buffer
@return Returns the right boundary of source line buffer
*/
unsigned getRightBoundary(unsigned dst_pos) {
return m_WeightTable[dst_pos].Right;
}
};
// ---------------------------------------------
/**
CResizeEngine
This class performs filtered zoom. It scales an image to the desired dimensions with
any of the CGenericFilter derived filter class.
It works with 8-, 24- and 32-bit buffers.
References :
[1] Paul Heckbert, C code to zoom raster images up or down, with nice filtering.
UC Berkeley, August 1989. [online] http://www-2.cs.cmu.edu/afs/cs.cmu.edu/Web/People/ph/heckbert.html
[2] Eran Yariv, Two Pass Scaling using Filters. The Code Project, December 1999.
[online] http://www.codeproject.com/bitmap/2_pass_scaling.asp
*/
class CResizeEngine
{
private:
/// Pointer to the FIR / IIR filter
CGenericFilter* m_pFilter;
public:
/// Constructor
CResizeEngine(CGenericFilter* filter):m_pFilter(filter) {}
/// Destructor
virtual ~CResizeEngine() {}
/** Scale an image to the desired dimensions
@param src Pointer to the source image
@param dst_width Destination image width
@param dst_height Destination image height
@return Returns the scaled image if successful, returns NULL otherwise
*/
FIBITMAP* scale(FIBITMAP *src, unsigned dst_width, unsigned dst_height);
private:
/// Performs horizontal image filtering
void horizontalFilter(FIBITMAP *src, unsigned src_width, unsigned src_height, FIBITMAP *dst, unsigned dst_width, unsigned dst_height);
/// Performs vertical image filtering
void verticalFilter(FIBITMAP *src, unsigned src_width, unsigned src_height, FIBITMAP *dst, unsigned dst_width, unsigned dst_height);
};
#endif // _RESIZE_H_