00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
00033 if ((sh&3) || (sw&3)) return false;
00034
00035
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
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
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
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 };