BilinearScaler.cpp

Go to the documentation of this file.
00001 /*
00002 Copyright (C) 2005 The Pentagram Team
00003 
00004 This program is free software; you can redistribute it and/or
00005 modify it under the terms of the GNU General Public License
00006 as published by the Free Software Foundation; either version 2
00007 of the License, or (at your option) any later version.
00008 
00009 This program is distributed in the hope that it will be useful,
00010 but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 GNU General Public License for more details.
00013 
00014 You should have received a copy of the GNU General Public License
00015 along with this program; if not, write to the Free Software
00016 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00017 */
00018 
00019 #include "pent_include.h"
00020 #include "BilinearScaler.h"
00021 #include "BilinearScalerInternal.h"
00022 #include "Manips.h"
00023 
00024 
00025 namespace Pentagram {
00026 
00027 template<class uintX, class Manip, class uintS> class BilinearScalerInternal {
00028 public:
00029 static bool ScaleBilinear( Texture *tex, sint32 sx, sint32 sy, sint32 sw, sint32 sh, 
00030                                 uint8* pixel, sint32 dw, sint32 dh, sint32 pitch, bool clamp_src)
00031 {
00032         // Must be multiples of 4!!!
00033         if ((sh&3) || (sw&3)) return false;
00034 
00035         // 2x Scaling
00036         if ((sw*2 == dw) && (sh*2 == dh))
00037                 return BilinearScalerInternal_2x<uintX,Manip,uintS>(tex,sx,sy,sw,sh,pixel,dw,dh,pitch,clamp_src);
00038         // 2 X 2.4 Y
00039         else if ((sw*2 == dw) && (dh*5 == sh*12))
00040                 return BilinearScalerInternal_X2Y24<uintX,Manip,uintS>(tex,sx,sy,sw,sh,pixel,dw,dh,pitch,clamp_src);
00041         // 1 X 1.2 Y 
00042         else if ((sw == dw) && (dh*5 == sh*6))
00043                 return BilinearScalerInternal_X1Y12<uintX,Manip,uintS>(tex,sx,sy,sw,sh,pixel,dw,dh,pitch,clamp_src);
00044         // Arbitrary 
00045         else 
00046                 return BilinearScalerInternal_Arb<uintX,Manip,uintS>(tex,sx,sy,sw,sh,pixel,dw,dh,pitch,clamp_src);
00047 }
00048 };
00049 
00050 
00051 BilinearScaler::BilinearScaler() : Scaler()
00052 {
00053 #ifdef COMPILE_ALL_BILINEAR_SCALERS
00054         Scale16Nat = BilinearScalerInternal<uint16, Manip_Nat2Nat_16, uint16>::ScaleBilinear;
00055         Scale16Sta = BilinearScalerInternal<uint16, Manip_Sta2Nat_16, uint32>::ScaleBilinear;
00056 
00057         Scale32Nat = BilinearScalerInternal<uint32, Manip_Nat2Nat_32, uint32>::ScaleBilinear;
00058         Scale32Sta = BilinearScalerInternal<uint32, Manip_Sta2Nat_32, uint32>::ScaleBilinear;
00059         Scale32_A888 = BilinearScalerInternal<uint32, Manip_32_A888, uint32>::ScaleBilinear;
00060         Scale32_888A = BilinearScalerInternal<uint32, Manip_32_888A, uint32>::ScaleBilinear;
00061 #else
00062         Scale16Nat = 0;
00063         Scale16Sta = 0;
00064 
00065         Scale32Nat = BilinearScalerInternal<uint32, Manip_Nat2Nat_32, uint32>::ScaleBilinear;
00066         Scale32Sta = BilinearScalerInternal<uint32, Manip_Sta2Nat_32, uint32>::ScaleBilinear;
00067         Scale32_A888 = Scale32Nat;
00068         Scale32_888A = Scale32Nat;
00069 #endif
00070 }
00071 
00072 const uint32 BilinearScaler::ScaleBits() const { return 0xFFFFFFFF; }
00073 const bool BilinearScaler::ScaleArbitrary() const { return true; }
00074 
00075 const char *BilinearScaler::ScalerName() const { return "bilinear"; }
00076 const char *BilinearScaler::ScalerDesc() const { return "Bilinear Filtering Scaler"; }
00077 const char *BilinearScaler::ScalerCopyright() const { return "Copyright (C) 2005 The Pentagram Team"; }
00078 
00079 const BilinearScaler bilinear_scaler;
00080 
00081 #ifdef COMPILE_GAMMA_CORRECT_SCALERS
00082 GC_BilinearScaler::GC_BilinearScaler() : Scaler()
00083 {
00084 #ifdef COMPILE_ALL_BILINEAR_SCALERS
00085         Scale16Nat = BilinearScalerInternal<uint16, Manip_Nat2Nat_16_GC, uint16>::ScaleBilinear;
00086         Scale16Sta = BilinearScalerInternal<uint16, Manip_Sta2Nat_16_GC, uint32>::ScaleBilinear;
00087 
00088         Scale32Nat = BilinearScalerInternal<uint32, Manip_Nat2Nat_32_GC, uint32>::ScaleBilinear;
00089         Scale32Sta = BilinearScalerInternal<uint32, Manip_Sta2Nat_32_GC, uint32>::ScaleBilinear;
00090         Scale32_A888 = BilinearScalerInternal<uint32, Manip_32_A888_GC, uint32>::ScaleBilinear;
00091         Scale32_888A = BilinearScalerInternal<uint32, Manip_32_888A_GC, uint32>::ScaleBilinear;
00092 #else
00093         Scale16Nat = 0;
00094         Scale16Sta = 0;
00095 
00096         Scale32Nat = BilinearScalerInternal<uint32, Manip_Nat2Nat_32_GC, uint32>::ScaleBilinear;
00097         Scale32Sta = BilinearScalerInternal<uint32, Manip_Sta2Nat_32_GC, uint32>::ScaleBilinear;
00098         Scale32_A888 = Scale32Nat;
00099         Scale32_888A = Scale32Nat;
00100 #endif
00101 }
00102 
00103 const uint32 GC_BilinearScaler::ScaleBits() const { return 0xFFFFFFFF; }
00104 const bool GC_BilinearScaler::ScaleArbitrary() const { return true; }
00105 
00106 const char *GC_BilinearScaler::ScalerName() const { return "gc-bilinear"; }
00107 const char *GC_BilinearScaler::ScalerDesc() const { return "Gamma 2.2 Correct Bilinear Filtering Scaler"; }
00108 const char *GC_BilinearScaler::ScalerCopyright() const { return "Copyright (C) 2005 The Pentagram Team"; }
00109 
00110 const GC_BilinearScaler GC_bilinear_scaler;
00111 #endif
00112 };

Generated on Fri Jul 27 22:27:10 2007 for pentagram by  doxygen 1.4.7