bool UIAlgorithm::gaussBlur(HWND hWnd, HDC hdcCompatible, HBITMAP hbm, BlurEffectParam* param) { RECT rect; ::GetWindowRect(hWnd, &rect); int w = rect.right - rect.left; int h = rect.bottom - rect.top; int * data = new int[w * h]; BITMAPINFO infoHeader; memset(&infoHeader.bmiHeader, 0, sizeof(BITMAPINFOHEADER)); infoHeader.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); infoHeader.bmiHeader.biWidth = w; infoHeader.bmiHeader.biHeight = -h; infoHeader.bmiHeader.biPlanes = 1; infoHeader.bmiHeader.biBitCount = 32; // 这里建议用32,经过测试在我的机器上比24速度快比较多 infoHeader.bmiHeader.biCompression = BI_RGB; ::GetDIBits(hdcCompatible, hbm, 0, h, data, &infoHeader, DIB_RGB_COLORS); if(!gaussBlur(data, w, h, param->dSigma, param->nRadius)) return false; SetDIBits(hdcCompatible, hbm, 0, abs(infoHeader.bmiHeader.biHeight), data, &infoHeader, DIB_RGB_COLORS); return true; }
IntensityMap GaussianBlur::calculate(IntensityMap &input, double radius, bool tileable) { IntensityMap result = IntensityMap(input.getWidth(), input.getHeight()); gaussBlur(input, result, radius, tileable); return result; }
void CBlurCompositor::render(ISceneManager* smgr, bool lastCompositor) { switch (mBlurAlgorithm) { case SCompositorCreateParam::EBLUR_NEAR_POINTS_4: case SCompositorCreateParam::EBLUR_NEAR_POINTS_8: squareBlur(smgr, lastCompositor); break; case SCompositorCreateParam::EBLUR_GAUSSIAN: gaussBlur(smgr, lastCompositor); break; default: break; } }