void GaussianBlur::boxBlur(IntensityMap &input, IntensityMap &result, double radius, bool tileable) { for(size_t i = 0; i < input.getWidth() * input.getHeight(); i++) { result.setValue(i, input.at(i)); } boxBlurH(result, input, radius, tileable); boxBlurT(input, result, radius, tileable); }
/** * Draws gaussian blur filter. * Uses code from Mozilla (nsSVGFilters.cpp) */ void gaussianBlur(cairo_surface_t* surface, int dx, int dy) { unsigned char* buffer = cairo_image_surface_get_data(surface); int stride = cairo_image_surface_get_stride(surface); int width = cairo_image_surface_get_width(surface); int height = cairo_image_surface_get_height(surface); wxRect rect(0, 0, width, height); // Create temporary buffer unsigned char* tempBuffer = (unsigned char*) calloc((size_t)(stride * height), 1); if (tempBuffer == NULL) return; if (dx & 1) { // odd unsigned char* prediv = setupPredivide(2 * (dx / 2) + 1); boxBlurH(buffer, tempBuffer, stride, rect, dx / 2, dx / 2, prediv); boxBlurH(tempBuffer, buffer, stride, rect, dx / 2, dx / 2, prediv); boxBlurH(buffer, tempBuffer, stride, rect, dx / 2, dx / 2, prediv); delete[] prediv; } else { // even if (dx == 0) { memcpy(tempBuffer, buffer, (size_t)(stride * height)); } else { unsigned char* prediv = setupPredivide(2 * (dx / 2) + 1); unsigned char* prediv2 = setupPredivide(2 * (dx / 2)); boxBlurH(buffer, tempBuffer, stride, rect, dx / 2, dx / 2 - 1, prediv2); boxBlurH(tempBuffer, buffer, stride, rect, dx / 2 - 1, dx / 2, prediv2); boxBlurH(buffer, tempBuffer, stride, rect, dx / 2, dx / 2, prediv); delete[] prediv; delete[] prediv2; } } if (dy & 1) { // odd unsigned char* prediv = setupPredivide(2 * (dy / 2) + 1); boxBlurV(tempBuffer, buffer, stride, rect, dy / 2, dy / 2, prediv); boxBlurV(buffer, tempBuffer, stride, rect, dy / 2, dy / 2, prediv); boxBlurV(tempBuffer, buffer, stride, rect, dy / 2, dy / 2, prediv); delete[] prediv; } else { // even if (dy == 0) { memcpy(buffer, tempBuffer, (size_t)(stride * height)); } else { unsigned char* prediv = setupPredivide(2 * (dy / 2) + 1); unsigned char* prediv2 = setupPredivide(2 * (dy / 2)); boxBlurV(tempBuffer, buffer, stride, rect, dy / 2, dy / 2 - 1, prediv2); boxBlurV(buffer, tempBuffer, stride, rect, dy / 2 - 1, dy / 2, prediv2); boxBlurV(tempBuffer, buffer, stride, rect, dy / 2, dy / 2, prediv); delete[] prediv; delete[] prediv2; } } free(tempBuffer); }