00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 #ifndef _BITMAPSHADOW_H_
00099 #define _BITMAPSHADOW_H_
00100
00101 #include "bshadow2.h"
00102
00103 #ifdef BUILDSHADOWS
00104
00105
00106
00107
00108
00109
00110 class ShadowBitmap : public CCObject
00111 {
00112
00113 public:
00114 ShadowBitmap();
00115 ~ShadowBitmap();
00116
00117 BOOL CreateFilled(INT32 Width, INT32 Height, BYTE value, UINT32 Depth = 32);
00118
00119 BOOL Create8BitBitmap(UINT32 * pBits, UINT32 Width, UINT32 Height);
00120
00121 HRESULT Create(INT32 Width, INT32 Height, UINT32 Depth = 32);
00122 LPBYTE GetBytes() { return (LPBYTE)m_Bytes; }
00123
00124 INT32 GetWidth() { return m_Width; }
00125 INT32 GetHeight() { return m_Height; }
00126 UINT32 GetDepth() { return m_Depth; }
00127
00128 private:
00129 INT32 m_Width;
00130 INT32 m_Height;
00131 BYTE * m_Bytes;
00132 UINT32 m_Depth;
00133 } ;
00134
00135 class CBitmapShadow : public ShadowBitmap
00136 {
00137 friend class NodeFeatherEffect;
00138
00139
00140 public:
00141 enum {
00142
00143
00144 } ;
00145
00146 CBitmapShadow();
00147
00148 BOOL CreateShadow(const BOOL bIsWallShadow,
00149 const double dProjection,
00150 const double dTiltAngle,
00151 const double dBlurriness,
00152 const double dDarknessCoeff,
00153 const double dPositionX,
00154 const double dPositionY,
00155 UINT32* pForegroundBits,
00156 const CNativeSize ForegroundSize
00157 );
00158
00159 void GetShadowOffset(INT32* pOffsetX, INT32* pOffsetY)
00160 {
00161 *pOffsetX = m_OffsetX;
00162 *pOffsetY = m_OffsetY;
00163 }
00164
00165 BOOL IsWallShadow(void) const
00166 {
00167 return m_bIsWallShadow;
00168 }
00169
00170 double GetBlurriness(void) const
00171 {
00172 return m_dBlurriness;
00173 }
00174
00175 double GetDarknessCoeff(void) const
00176 {
00177 return m_dDarknessCoeff;
00178 }
00179
00180 private:
00181 BOOL MakeWallShadow (const UINT32* pForegroundBits,
00182 const CNativeSize ForegroundSize,
00183 const INT32 nXPosition,
00184 const INT32 nYPosition,
00185 const double fBlur,
00186 INT32 *pOffsetX,
00187 INT32 *pOffsetY,
00188 const double dDarknessCoeff = 1.0);
00189
00190 BOOL MakeCastShadow (UINT32* pForegroundBits,
00191 const CNativeSize ForegroundSize,
00192 const double fBlur,
00193 const double dTiltAngle,
00194 const double dProjection,
00195 const double dDarknessCoeff = 1.0 );
00196
00197 BOOL m_bIsWallShadow;
00198 double m_dProjection;
00199 double m_dTiltAngle;
00200 double m_dBlurriness;
00201 double m_dDarknessCoeff;
00202 double m_dPositionX;
00203 double m_dPositionY;
00204 INT32 m_OffsetX;
00205 INT32 m_OffsetY;
00206
00207 protected:
00208 ShadowBitmap* Tilt(BYTE* pSourceBits, const INT32 nSourceWidth, const INT32 nSourceHeight, const double dTiltDegrees);
00209 static bool ProjectShadow(BYTE* pSBitmap, BYTE* pDBitmap, UINT32 nWidth, UINT32 nSHeight, UINT32 nDHeight);
00210
00211
00212
00213
00214
00215
00216 public:
00217
00218
00219
00220 static void Blur8BppBitmap( LPBITMAPINFOHEADER pSrcBMIHeader, LPBYTE pSrcBits,
00221 LPBITMAPINFOHEADER pDestBMIHeader, LPBYTE pDestBits,
00222 const UINT32 DWordBitmapWidth, const double fBlur );
00223
00224
00225
00226
00227 static BOOL BlurringWillOffsetBitmap(double fBlurDiameter)
00228 {
00229
00230
00231 return ( ((UINT32)(fBlurDiameter + 0.5) % 2 == 0) &&
00232 !(fBlurDiameter < MIN_BLUR_DIAMETER) );
00233 }
00234
00235 static UINT32 GetWholePixelBlurDiameter(double fBlurDiameter)
00236 {
00237 double fNewBlur = fBlurDiameter / 2.0;
00238 if (fNewBlur > MAX_SHADOW_BLUR)
00239 fNewBlur = MAX_SHADOW_BLUR;
00240
00241 return (UINT32)(2 * fNewBlur + 0.5);
00242 }
00243
00244 static LPBITMAPINFO Feather8BppBitmap(
00245 const double fBlur,
00246 LPBITMAPINFO pSrcInfo,
00247 LPBYTE pSrcBits32,
00248 LPBYTE* pDestBits
00249 ) ;
00250
00251
00252
00253
00254
00255
00256 static bool ContourBitmap(
00257 const LPBITMAPINFO pSrcInfo32,
00258 const LPBYTE pSrcBits32,
00259 const double fContour,
00260 const BYTE uThreshold,
00261 LPBITMAPINFO* ppDestInfo32,
00262 LPBYTE* ppDestBits32,
00263 double* pfOffsetX,
00264 double* pfOffsetY
00265 ) ;
00266
00267
00268
00269
00270
00271 static bool ContourBitmap(
00272 const LPBITMAPINFO pSrcInfo8,
00273 const LPBYTE pSrcBits8,
00274 const double fContour,
00275 const bool bInside,
00276 const BYTE uThreshold,
00277 LPBITMAPINFO* ppDestInfo8,
00278 LPBYTE* ppDestBits8,
00279 double* pfOffsetX,
00280 double* pfOffsetY
00281 ) ;
00282
00283 protected:
00284 } ;
00285
00286 #endif
00287
00288 #endif //_BITMAPSHADOW_H_
00289
00290
00291
00292