Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/FreeImageToolkit/ClassicRotate.cpp view on Meta::CPAN
// ==========================================================
// Bitmap rotation by means of 3 shears.
//
// Design and implementation by
// - Hervé Drolon (drolon@infonie.fr)
// - Thorsten Radde (support@IdealSoftware.com)
// - Mihail Naydenov (mnaydenov@users.sourceforge.net)
//
// 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!
// ==========================================================
/*
============================================================
References :
[1] Paeth A., A Fast Algorithm for General Raster Rotation.
Graphics Gems, p. 179, Andrew Glassner editor, Academic Press, 1990.
[2] Yariv E., High quality image rotation (rotate by shear).
[Online] http://www.codeproject.com/bitmap/rotatebyshear.asp
[3] Treskunov A., Fast and high quality true-color bitmap rotation function.
[Online] http://anton.treskunov.net/Software/doc/fast_and_high_quality_true_color_bitmap_rotation_function.html
============================================================
*/
#include "FreeImage.h"
#include "Utilities.h"
#define RBLOCK 64 // image blocks of RBLOCK*RBLOCK pixels
// --------------------------------------------------------------------------
/**
Skews a row horizontally (with filtered weights).
Limited to 45 degree skewing only. Filters two adjacent pixels.
Parameter T can be BYTE, WORD of float.
@param src Pointer to source image to rotate
@param dst Pointer to destination image
@param row Row index
@param iOffset Skew offset
@param dWeight Relative weight of right pixel
@param bkcolor Background color
*/
template <class T> void
HorizontalSkewT(FIBITMAP *src, FIBITMAP *dst, int row, int iOffset, double weight, const void *bkcolor = NULL) {
int iXPos;
const unsigned src_width = FreeImage_GetWidth(src);
const unsigned dst_width = FreeImage_GetWidth(dst);
T pxlSrc[4], pxlLeft[4], pxlOldLeft[4]; // 4 = 4*sizeof(T) max
// background
const T pxlBlack[4] = {0, 0, 0, 0 };
const T *pxlBkg = static_cast<const T*>(bkcolor); // assume at least bytespp and 4*sizeof(T) max
if(!pxlBkg) {
// default background color is black
pxlBkg = pxlBlack;
}
// calculate the number of bytes per pixel
const unsigned bytespp = FreeImage_GetLine(src) / FreeImage_GetWidth(src);
// calculate the number of samples per pixel
const unsigned samples = bytespp / sizeof(T);
BYTE *src_bits = FreeImage_GetScanLine(src, row);
BYTE *dst_bits = FreeImage_GetScanLine(dst, row);
// fill gap left of skew with background
if(bkcolor) {
for(int k = 0; k < iOffset; k++) {
memcpy(&dst_bits[k * bytespp], bkcolor, bytespp);
}
AssignPixel((BYTE*)&pxlOldLeft[0], (BYTE*)bkcolor, bytespp);
} else {
if(iOffset > 0) {
memset(dst_bits, 0, iOffset * bytespp);
}
( run in 0.454 second using v1.01-cache-2.11-cpan-5511b514fd6 )