flt_steff.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:17k
源码类别:

图形图象

开发平台:

Visual C++

  1. // flt_steff.cpp : Defines the initialization routines for the DLL.
  2. //
  3. #include "stdafx.h"
  4. #include "flt_steff.h"
  5. #include "previewdlg.h" // added by lzg
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. //
  12. // Note!
  13. //
  14. // If this DLL is dynamically linked against the MFC
  15. // DLLs, any functions exported from this DLL which
  16. // call into MFC must have the AFX_MANAGE_STATE macro
  17. // added at the very beginning of the function.
  18. //
  19. // For example:
  20. //
  21. // extern "C" BOOL PASCAL EXPORT ExportedFunction()
  22. // {
  23. // AFX_MANAGE_STATE(AfxGetStaticModuleState());
  24. // // normal function body here
  25. // }
  26. //
  27. // It is very important that this macro appear in each
  28. // function, prior to any calls into MFC.  This means that
  29. // it must appear as the first statement within the 
  30. // function, even before any object variable declarations
  31. // as their constructors may generate calls into the MFC
  32. // DLL.
  33. //
  34. // Please see MFC Technical Notes 33 and 58 for additional
  35. // details.
  36. //
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CFlt_steffApp
  39. BEGIN_MESSAGE_MAP(CFlt_steffApp, CWinApp)
  40. //{{AFX_MSG_MAP(CFlt_steffApp)
  41. // NOTE - the ClassWizard will add and remove mapping macros here.
  42. //    DO NOT EDIT what you see in these blocks of generated code!
  43. //}}AFX_MSG_MAP
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CFlt_steffApp construction
  47. CFlt_steffApp::CFlt_steffApp()
  48. {
  49. // TODO: add construction code here,
  50. // Place all significant initialization in InitInstance
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // The one and only CFlt_steffApp object
  54. CFlt_steffApp theApp;
  55. BOOL WINAPI AccessStEffFilter(LPIMAGEPROCSTR lpInfo)
  56. {
  57. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  58. // 这个函数可以不作修改的使用,除非你的返回值多于两种。
  59. switch(lpInfo->comm)
  60. {
  61. case PCM_EMBOSS: // 浮雕效果
  62. _fnCMD_EMBOSS(lpInfo);
  63. break;
  64. case PCM_VARIATIONS:     // 色调处理
  65. _fnCMD_VARIATIONS(lpInfo);
  66. break;
  67. case PCM_BLUR:           // 模糊
  68. _fnCMD_BLUR(lpInfo);
  69. break;
  70. case PCM_BUTTON:         // 按钮化处理
  71. _fnCMD_BUTTON(lpInfo);
  72. break;
  73. case PCM_TWIRL:          // 扭曲
  74. _fnCMD_TWIRL(lpInfo);
  75. break;
  76. case PCM_INTERLACE:      // 抽丝
  77. _fnCMD_INTERLACE(lpInfo);
  78. break;
  79. case PCM_MOSAIC:         // 马赛克
  80. _fnCMD_MOSAIC(lpInfo);
  81. break;
  82. default:
  83. lpInfo->result = PR_ILLCOMM; // 非法指令(客户程序给出的命令码不正确)
  84. ASSERT(FALSE); // 调用者的程序设计有问题 :-)
  85. break;
  86. }
  87. // 执行命令成功返回TRUE, 失败返回FALSE
  88. return (lpInfo->result==PR_SUCCESS)? TRUE:FALSE;
  89. }
  90. int WINAPI Dll_Function(int i)
  91. {
  92. CString str;
  93. str.Format("%d",i);
  94. //sprintf(str,"%d",i);
  95. AfxMessageBox(str);
  96. return 20+i;
  97. }
  98. // 命令解释函数 — 第二层解释函数
  99. void _fnCMD_EMBOSS(LPIMAGEPROCSTR lpInfo) // 浮雕效果
  100. {
  101. // Initialize the destine image infomation
  102. lpInfo->dImageInfo.height=lpInfo->sImageInfo.height;
  103. lpInfo->dImageInfo.width=lpInfo->sImageInfo.width;
  104. lpInfo->dImageInfo.bitperpix=lpInfo->sImageInfo.bitperpix;
  105. lpInfo->dImageInfo.byteperline=lpInfo->sImageInfo.byteperline;
  106. lpInfo->dImageInfo.bAlpha=lpInfo->sImageInfo.bAlpha;
  107. // Set Modify flag
  108. lpInfo->modify=1;
  109. // 分配用于存放标准图像位数据的内存块
  110. unsigned char * _pbdata = (unsigned char * )::GlobalAlloc(GPTR, lpInfo->dImageInfo.width * 4 * lpInfo->dImageInfo.height);
  111. if (!_pbdata)
  112. {
  113. lpInfo->result=PR_MEMORYERR;
  114. return ;
  115. }
  116. lpInfo->_pdbdata=_pbdata;
  117. // 分配用于存放每一扫描行地址的指针数组并初始化
  118. unsigned long** pLineAddr = (unsigned long**)::GlobalAlloc(GPTR, lpInfo->dImageInfo.height*sizeof(DWORD*));
  119. if (!pLineAddr)
  120. {
  121. ::GlobalFree(_pbdata);
  122. lpInfo->result=PR_MEMORYERR;
  123. return ;
  124. }
  125. // 初始化行首数组
  126. for (int y=0;y<lpInfo->dImageInfo.height;y++)
  127. pLineAddr[y] = (DWORD*)(_pbdata+((lpInfo->dImageInfo.height-y-1)*(lpInfo->dImageInfo.width *4)));
  128. lpInfo->pdLineAddr=pLineAddr;
  129. // Test emboss effect
  130. lpInfo->_pdbdata=lpInfo->_psbdata;
  131. lpInfo->pdLineAddr=lpInfo->psLineAddr;
  132. int i;
  133. DWORD TempPixel;
  134. BYTE* pByte;
  135. for(i=30;i<=60;i++)
  136. {
  137. _fnCOM_GetPixel(lpInfo,i,30,&TempPixel);
  138. pByte = (BYTE*)&TempPixel;
  139. *pByte++ =(BYTE)(*pByte*0.9);
  140. *pByte++ =(BYTE)(*pByte*0.9);
  141. *pByte =(BYTE)(*pByte*0.9);
  142. _fnCOM_SetPixel(lpInfo,i,30,&TempPixel);
  143. _fnCOM_GetPixel(lpInfo,i,60,&TempPixel);
  144. pByte = (BYTE*)&TempPixel;
  145. *pByte++ =(BYTE)(*pByte*0.9);
  146. *pByte++ =(BYTE)(*pByte*0.9);
  147. *pByte =(BYTE)(*pByte*0.9);
  148. _fnCOM_SetPixel(lpInfo,i,60,&TempPixel);
  149. _fnCOM_GetPixel(lpInfo,30,i,&TempPixel);
  150. pByte = (BYTE*)&TempPixel;
  151. *pByte++ =(BYTE)(*pByte*0.9);
  152. *pByte++ =(BYTE)(*pByte*0.9);
  153. *pByte =(BYTE)(*pByte*0.9);
  154. _fnCOM_SetPixel(lpInfo,30,i,&TempPixel);
  155. _fnCOM_GetPixel(lpInfo,60,i,&TempPixel);
  156. pByte = (BYTE*)&TempPixel;
  157. *pByte++ =(BYTE)(*pByte*0.9);
  158. *pByte++ =(BYTE)(*pByte*0.9);
  159. *pByte =(BYTE)(*pByte*0.9);
  160. _fnCOM_SetPixel(lpInfo,60,i,&TempPixel);
  161. }
  162. for(i=32;i<=58;i++)
  163. {
  164. _fnCOM_GetPixel(lpInfo,i,32,&TempPixel);
  165. pByte = (BYTE*)&TempPixel;
  166. *pByte++ =(BYTE)(*pByte*1.1);
  167. *pByte++ =(BYTE)(*pByte*1.1);
  168. *pByte =(BYTE)(*pByte*1.1);
  169. _fnCOM_SetPixel(lpInfo,i,32,&TempPixel);
  170. _fnCOM_GetPixel(lpInfo,i,58,&TempPixel);
  171. pByte = (BYTE*)&TempPixel;
  172. *pByte++ =(BYTE)(*pByte*1.1);
  173. *pByte++ =(BYTE)(*pByte*1.1);
  174. *pByte =(BYTE)(*pByte*1.1);
  175. _fnCOM_SetPixel(lpInfo,i,58,&TempPixel);
  176. _fnCOM_GetPixel(lpInfo,32,i,&TempPixel);
  177. pByte = (BYTE*)&TempPixel;
  178. *pByte++ =(BYTE)(*pByte*1.1);
  179. *pByte++ =(BYTE)(*pByte*1.1);
  180. *pByte =(BYTE)(*pByte*1.1);
  181. _fnCOM_SetPixel(lpInfo,32,i,&TempPixel);
  182. _fnCOM_GetPixel(lpInfo,58,i,&TempPixel);
  183. pByte = (BYTE*)&TempPixel;
  184. *pByte++ =(BYTE)(*pByte*1.1);
  185. *pByte++ =(BYTE)(*pByte*1.1);
  186. *pByte =(BYTE)(*pByte*1.1);
  187. _fnCOM_SetPixel(lpInfo,58,i,&TempPixel);
  188. }
  189. lpInfo->result=PR_SUCCESS;
  190. }
  191. void _fnCMD_VARIATIONS(LPIMAGEPROCSTR lpInfo) // 色调处理
  192. {
  193. lpInfo->result=PR_SUCCESS;
  194. }
  195. void _fnCMD_BLUR(LPIMAGEPROCSTR lpInfo) // 模糊
  196. {
  197. lpInfo->result=PR_SUCCESS;
  198. }
  199. void _fnCMD_BUTTON(LPIMAGEPROCSTR lpInfo) // 按钮化处理
  200. {
  201. lpInfo->result=PR_SUCCESS;
  202. }
  203. void _fnCMD_TWIRL(LPIMAGEPROCSTR lpInfo) // 扭曲
  204. {
  205. lpInfo->result=PR_SUCCESS;
  206. }
  207. void _fnCMD_INTERLACE(LPIMAGEPROCSTR lpInfo) // 抽丝
  208. {
  209. lpInfo->result=PR_SUCCESS;
  210. }
  211. void _fnCMD_MOSAIC(LPIMAGEPROCSTR lpInfo) // 马赛克
  212. {
  213. // 检验入口参数是否符合接口定义
  214. ASSERT(lpInfo->_psbdata != NULL);
  215. ASSERT(lpInfo->sImageInfo.bitperpix == 32);
  216. ASSERT(lpInfo->sImageInfo.height > 0);
  217. ASSERT(lpInfo->sImageInfo.width > 0);
  218. ASSERT(lpInfo->annexdata.siAnnData[0]<2); // full image or region
  219. // Initialize the destine image infomation
  220. lpInfo->dImageInfo.height=lpInfo->sImageInfo.height;
  221. lpInfo->dImageInfo.width=lpInfo->sImageInfo.width;
  222. lpInfo->dImageInfo.bitperpix=lpInfo->sImageInfo.bitperpix;
  223. lpInfo->dImageInfo.byteperline=lpInfo->sImageInfo.byteperline;
  224. lpInfo->dImageInfo.bAlpha=lpInfo->sImageInfo.bAlpha;
  225. // Set Modify flag
  226. lpInfo->modify=1;
  227. // 分配用于存放标准图像位数据的内存块
  228. unsigned char * _pbdata = (unsigned char * )::GlobalAlloc(GPTR, lpInfo->dImageInfo.width * 4 * lpInfo->dImageInfo.height);
  229. if (!_pbdata)
  230. {
  231. lpInfo->result=PR_MEMORYERR;
  232. return ;
  233. }
  234. lpInfo->_pdbdata=_pbdata;
  235. // 分配用于存放每一扫描行地址的指针数组并初始化
  236. unsigned long** pLineAddr = (unsigned long**)::GlobalAlloc(GPTR, lpInfo->dImageInfo.height*sizeof(DWORD*));
  237. if (!pLineAddr)
  238. {
  239. ::GlobalFree(_pbdata);
  240. lpInfo->result=PR_MEMORYERR;
  241. return ;
  242. }
  243. // 初始化行首数组
  244. for (int y=0;y<lpInfo->dImageInfo.height;y++)
  245. pLineAddr[y] = (DWORD*)(_pbdata+((lpInfo->dImageInfo.height-y-1)*(lpInfo->dImageInfo.width *4)));
  246. lpInfo->pdLineAddr=pLineAddr;
  247. // Initialize destine image use source image
  248. // memcpy(lpInfo->_pdbdata, lpInfo->_psbdata, lpInfo->dImageInfo.width * 4 * lpInfo->dImageInfo.height);
  249. // To show the preview windows
  250. CPreviewDlg preViewDlg;    // 显示马赛克对话框
  251. preViewDlg.SendPreviewImage(lpInfo);
  252. if(preViewDlg.DoModal()!=IDOK)
  253. {
  254. ::GlobalFree(lpInfo->_pdbdata); 
  255. lpInfo->_pdbdata=NULL;
  256. ::GlobalFree(lpInfo->pdLineAddr);
  257. lpInfo->pdLineAddr=NULL;
  258. lpInfo->result=PR_NULL;
  259. return ;
  260. }
  261. lpInfo->result=PR_SUCCESS;
  262. return ;
  263. }
  264. // Get pixel value in inside standard format
  265. BOOL _fnCOM_GetPixel(LPIMAGEPROCSTR lpInfo, int x, int y, DWORD* pPixel)
  266. {
  267. // Make sure the point inside the image
  268. ASSERT(x>= 0 );
  269. ASSERT(x< lpInfo->sImageInfo.width);
  270. ASSERT(y>= 0 );
  271. ASSERT(y< lpInfo->sImageInfo.height);
  272. // Get pixel value, for speed use DWORD
  273. *pPixel = *(lpInfo->psLineAddr[y] + x );
  274. return TRUE;
  275. }
  276. // Set pixel value in inside standard format
  277. BOOL _fnCOM_SetPixel(LPIMAGEPROCSTR lpInfo, int x, int y, DWORD* pPixel)
  278. {
  279. // Make sure the point inside the image
  280. ASSERT(x>= 0 );
  281. ASSERT(x< lpInfo->dImageInfo.width);
  282. ASSERT(y>= 0 );
  283. ASSERT(y< lpInfo->dImageInfo.height);
  284. // Set pixel value ,for speed use DWORD
  285. *(lpInfo->pdLineAddr[y] + x ) = *pPixel;
  286. return TRUE;
  287. }
  288. // Fill rect region if coordinate is equal, line is drawed
  289. BOOL _fnCOM_FillRect(LPIMAGEPROCSTR lpInfo, RECT rect, DWORD* pPixel)
  290. {
  291. // Make sure the rect inside the image
  292. if (rect.left<0 ||rect.left>rect.right||rect.right > lpInfo->dImageInfo.width-1)
  293. return FALSE;
  294. if (rect.top<0 ||rect.top>rect.bottom||rect.bottom > lpInfo->dImageInfo.height-1)
  295. return FALSE;
  296. // Fill rect use given pixel
  297. for (int i=rect.left; i<=rect.right; i++)
  298. for(int j=rect.top; j<=rect.bottom; j++)
  299. _fnCOM_SetPixel(lpInfo, i, j, pPixel);
  300. return TRUE;
  301. }
  302. // Get zoom image 
  303. BOOL _fnCOM_GetZoomImage(LPIMAGEPROCSTR lpInfo, float fXzoom, float fYzoom, LPBITMAPINFOHEADER lpBi, LPVOID lpBits)
  304. {
  305. int zoom_width, zoom_height;
  306. zoom_width= (int)(lpInfo->sImageInfo.width * fXzoom);
  307. zoom_height= (int)(lpInfo->sImageInfo.height * fYzoom);
  308. lpBi = new BITMAPINFOHEADER;
  309. lpBits= malloc(zoom_width* zoom_height *4);
  310. // Set bi value
  311. HWND hWnd = ::GetDesktopWindow();
  312. HDC hDC = ::GetDC(hWnd);
  313. lpBi->biSize = sizeof(BITMAPINFOHEADER);
  314. lpBi->biPlanes = 1;
  315. lpBi->biBitCount = 32;
  316. lpBi->biCompression = BI_RGB;
  317. lpBi->biSizeImage = 0;
  318. lpBi->biWidth = zoom_width;
  319. lpBi->biHeight =  zoom_height;
  320. lpBi->biClrImportant = 0;
  321. lpBi->biClrUsed = 0;
  322. lpBi->biXPelsPerMeter = (int)(::GetDeviceCaps(hDC,LOGPIXELSX)*(float)39.373);
  323. lpBi->biYPelsPerMeter = (int)(::GetDeviceCaps(hDC,LOGPIXELSY)*(float)39.373);
  324. // x0= gx(x,y)= ax+by+cxy+d
  325. // y0= gy(x,y)= ex+fy+gxy+h
  326. // (0,0)--(0,0), (zoom_with-1,0)--(width-1, 0),
  327. // (0,zoom_height-1)--(0,height-1),(zoom_width-1,zoom_height-1)--(width-1, height-1)
  328. // b=0; c=0; d=0; e=0;g=0;h=0
  329. float a,f, x0,y0;
  330. a=((float)(lpInfo->sImageInfo.width-1))/(zoom_width-1);
  331. f=((float)(lpInfo->sImageInfo.height-1))/(zoom_height-1);
  332. for(int i=0; i<=zoom_width-1; i++)
  333. for(int j=0; j<=zoom_height; j++)
  334. {
  335. x0= a* i;
  336. y0= f*j;
  337. // Get pixel
  338. DWORD temp =_fnSPE_BilinearInterValue(lpInfo, x0, y0);
  339. // Set pixel
  340. }
  341. return TRUE;
  342. }
  343. ///////////////////////////////////////////////////////////////
  344. //  Special function is added here
  345. // Mosaic a special region
  346. BOOL _fnSPE_MOSAIC(LPIMAGEPROCSTR lpInfo, int Size, RECT* pRect) // 马赛克
  347. {
  348. // The mosaic unit size should not be too large
  349. ASSERT(Size<= 32);
  350. ASSERT(Size>= 2 );
  351. // Temp pixel value
  352. DWORD dwPixel;
  353. // Make sure the rect is large than mosaic unit size
  354. if (pRect!=NULL)
  355. {
  356. // Copy the unchanged part in source image into destine image
  357. int i, j;
  358. for(i=0; i< pRect->top; i++)
  359. for(j=0; j<lpInfo->dImageInfo.width; j++)
  360. {
  361. _fnCOM_GetPixel(lpInfo, j, i, &dwPixel);
  362. _fnCOM_SetPixel(lpInfo, j, i, &dwPixel);
  363. }
  364. for(i=pRect->top; i<= pRect->bottom; i++)
  365. {
  366. for(j=0; j<pRect->left; j++)
  367. {
  368. _fnCOM_GetPixel(lpInfo, j, i, &dwPixel);
  369. _fnCOM_SetPixel(lpInfo, j, i, &dwPixel);
  370. }
  371. for(j=pRect->right+1; j< lpInfo->dImageInfo.width; j++)
  372. {
  373. _fnCOM_GetPixel(lpInfo, j, i, &dwPixel);
  374. _fnCOM_SetPixel(lpInfo, j, i, &dwPixel);
  375. }
  376. }
  377. for(i=pRect->bottom+1; i< lpInfo->dImageInfo.height; i++)
  378. for(j=0; j<lpInfo->dImageInfo.width; j++)
  379. {
  380. _fnCOM_GetPixel(lpInfo, j, i, &dwPixel);
  381. _fnCOM_SetPixel(lpInfo, j, i, &dwPixel);
  382. }
  383. }
  384. // Mosaic a certain image
  385. RECT UnitRect, WholeRect;
  386. if (pRect==NULL)
  387. {
  388. WholeRect.left=0;
  389. WholeRect.right=lpInfo->dImageInfo.width-1;
  390. WholeRect.top=0;
  391. WholeRect.bottom=lpInfo->dImageInfo.height-1;
  392. }
  393. else
  394. {
  395. WholeRect.left=pRect->left;
  396. WholeRect.right=pRect->right;
  397. WholeRect.top=pRect->top;
  398. WholeRect.bottom=pRect->bottom;
  399. }
  400. // initialize mosaic unit 
  401. UnitRect.left=WholeRect.left;
  402. UnitRect.right=UnitRect.left+Size;
  403. UnitRect.top=WholeRect.top;
  404. UnitRect.bottom=UnitRect.top+Size;
  405. while(UnitRect.bottom<=WholeRect.bottom)
  406. {
  407. while(UnitRect.right<=WholeRect.right)
  408. {
  409. _fnCOM_GetPixel(lpInfo, UnitRect.left+Size/2,UnitRect.top+Size/2, &dwPixel);
  410. _fnCOM_FillRect(lpInfo, UnitRect, &dwPixel);
  411. UnitRect.left=UnitRect.right+1;
  412. UnitRect.right=UnitRect.left+Size;
  413. }
  414. if (UnitRect.left<=WholeRect.right)
  415. {
  416. UnitRect.right=WholeRect.right;
  417. _fnCOM_GetPixel(lpInfo, (UnitRect.left+UnitRect.right)/2,(UnitRect.top+UnitRect.bottom)/2, &dwPixel);
  418. _fnCOM_FillRect(lpInfo, UnitRect, &dwPixel);
  419. }
  420. UnitRect.left=WholeRect.left;
  421. UnitRect.right=UnitRect.left+Size;
  422. UnitRect.top=UnitRect.bottom+1;
  423. UnitRect.bottom=UnitRect.top+Size;
  424. }
  425. if (UnitRect.top<=WholeRect.bottom)
  426. {
  427. UnitRect.bottom=WholeRect.bottom;
  428. UnitRect.left=WholeRect.left;
  429. UnitRect.right=UnitRect.left+Size;
  430. while(UnitRect.right<=WholeRect.right)
  431. {
  432. _fnCOM_GetPixel(lpInfo, UnitRect.left,UnitRect.top, &dwPixel);
  433. _fnCOM_FillRect(lpInfo, UnitRect, &dwPixel);
  434. UnitRect.left=UnitRect.right+1;
  435. UnitRect.right=UnitRect.left+Size;
  436. }
  437. if (UnitRect.left<=WholeRect.right)
  438. {
  439. WholeRect.right=WholeRect.right;
  440. _fnCOM_GetPixel(lpInfo, UnitRect.left,UnitRect.top, &dwPixel);
  441. _fnCOM_FillRect(lpInfo, UnitRect, &dwPixel);
  442. }
  443. }
  444. return TRUE;
  445. }
  446. // Get pixel value for image, use bilinear method
  447. DWORD _fnSPE_BilinearInterValue(LPIMAGEPROCSTR lpInfo, float x, float y)
  448. {
  449. DWORD pixel, point1, point2, point3, point4;
  450. pStdPix pPixel;
  451. //pPixel=(pStdPix)pixel;
  452. pPixel=(pStdPix)&pixel; // YZ Modify at 2000-11-22
  453. int ix, iy;
  454. float ddx, ddy, f_ddx_y, f_ddx_y1, f_ddx_ddy;
  455. ix= (int)x;
  456. iy= (int)y;
  457. // get the difference
  458. ddx=x-ix;
  459. ddy=y-iy;
  460. // If the point is on the right_bottom point
  461. if (x==lpInfo->sImageInfo.width-1 && y==lpInfo->sImageInfo.height-1)
  462. {
  463. _fnCOM_GetPixel(lpInfo,ix,iy,&point1);
  464. return point1;
  465. }
  466. // If point is on the right edge of image
  467. if(ix==lpInfo->sImageInfo.width-1)
  468. {
  469. _fnCOM_GetPixel(lpInfo,ix,iy,&point1);
  470. _fnCOM_GetPixel(lpInfo,ix,iy+1,&point2);
  471. pPixel->blue= (BYTE)(((pStdPix)&point1)->blue +
  472. ddx * (((pStdPix)&point2)->blue - ((pStdPix)&point1)->blue));
  473. pPixel->green= (BYTE)(((pStdPix)&point1)->green +
  474. ddx * (((pStdPix)&point2)->green - ((pStdPix)&point1)->green));
  475. pPixel->red= (BYTE)(((pStdPix)&point1)->red +
  476. ddx * (((pStdPix)&point2)->red- ((pStdPix)&point1)->red));
  477. pPixel->alpha=(BYTE)0;
  478. return pixel;
  479. }
  480. // If point is on the bottom edge of image
  481. if(iy==lpInfo->sImageInfo.height-1)
  482. {
  483. _fnCOM_GetPixel(lpInfo,ix,iy,&point1);
  484. _fnCOM_GetPixel(lpInfo,ix+1,iy,&point2);
  485. pPixel->blue= (BYTE)(((pStdPix)&point1)->blue +
  486. ddx * (((pStdPix)&point2)->blue - ((pStdPix)&point1)->blue));
  487. pPixel->green= (BYTE)(((pStdPix)&point1)->green +
  488. ddx * (((pStdPix)&point2)->green - ((pStdPix)&point1)->green));
  489. pPixel->red= (BYTE)(((pStdPix)&point1)->red +
  490. ddx * (((pStdPix)&point2)->red- ((pStdPix)&point1)->red));
  491. pPixel->alpha=(BYTE)0;
  492. return pixel;
  493. }
  494. // The point is in image
  495. _fnCOM_GetPixel(lpInfo,ix,iy,&point1);
  496. _fnCOM_GetPixel(lpInfo,ix,iy+1,&point2);
  497. _fnCOM_GetPixel(lpInfo,ix+1,iy+1,&point3);
  498. _fnCOM_GetPixel(lpInfo,ix+1,iy,&point4);
  499. // red color
  500. f_ddx_y= ((pStdPix)&point1)->red+ ddx*(((pStdPix)&point4)->red -((pStdPix)&point1)->red);
  501. f_ddx_y1= ((pStdPix)&point2)->red+ ddx*(((pStdPix)&point3)->red-((pStdPix)&point2)->red);
  502. f_ddx_ddy=f_ddx_y + ddy*(f_ddx_y1 - f_ddx_y);
  503. pPixel->red=(BYTE)f_ddx_ddy;
  504. // green color
  505. f_ddx_y= ((pStdPix)&point1)->green+ ddx*(((pStdPix)&point4)->green-((pStdPix)&point1)->green);
  506. f_ddx_y1= ((pStdPix)&point2)->green+ ddx*(((pStdPix)&point3)->green-((pStdPix)&point2)->green);
  507. f_ddx_ddy=f_ddx_y + ddy*(f_ddx_y1 - f_ddx_y);
  508. pPixel->green=(int)f_ddx_ddy;
  509. // blue color
  510. f_ddx_y= ((pStdPix)&point1)->blue+ ddx*(((pStdPix)&point4)->blue-((pStdPix)&point1)->blue);
  511. f_ddx_y1= ((pStdPix)&point2)->blue+ ddx*(((pStdPix)&point3)->blue-((pStdPix)&point2)->blue);
  512. f_ddx_ddy=f_ddx_y + ddy*(f_ddx_y1 - f_ddx_y);
  513. pPixel->blue=(int)f_ddx_ddy;
  514. return pixel;
  515. }
  516. BOOL CALLBACK WINAPI MosaicProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
  517. {
  518. return FALSE;
  519. }