//apply filter

        private void applyFilter(Filter filter)
        {
            BitmapSource source = (BitmapSource)this.originalImage.Source;

            if (filter is ConvolutionFilter)
            {
                Bitmap            originalBitmap    = source.ConvertToBitmap();
                ConvolutionFilter convolutionFilter = (ConvolutionFilter)filter;

                bool parsed = false;
                if (this.offsetTextField.Text.Replace(" ", "").Length != 0)
                {
                    float offset = 0;
                    parsed = (float.TryParse(this.offsetTextField.Text.Replace(" ", ""), out offset));
                    if (parsed == false)
                    {
                        MessageBox.Show("Enter valid offset / offset value", "Invalid parameters", MessageBoxButton.OK, MessageBoxImage.Information);
                        return;
                    }
                    convolutionFilter.Offset = offset;
                }

                if (this.factorTextField.Text.Replace(" ", "").Length != 0)
                {
                    float factor = 0;
                    parsed = parsed && (float.TryParse(this.factorTextField.Text.Replace(" ", ""), out factor));
                    if (parsed == false)
                    {
                        MessageBox.Show("Enter valid offset / offset value", "Invalid parameters", MessageBoxButton.OK, MessageBoxImage.Information);
                        return;
                    }
                    convolutionFilter.Factor = factor;
                }

                Bitmap      filteredBitmap = originalBitmap.ConvolutionFilter(convolutionFilter);
                BitmapImage bitmapImage    = filteredBitmap.BitmapToImageSource();
                this.filteredImage.Source = bitmapImage;
            }
            else     //function filter
            {
                FunctionFilter functionFilter = (FunctionFilter)filter;
                if (functionFilter is IFunctionFilterOffset)
                {
                    IFunctionFilterOffset factorFunctionFilter = (IFunctionFilterOffset)functionFilter;
                    float coeff  = 0;
                    bool  parsed = (float.TryParse(this.coeffTextField.Text.Replace(" ", ""), out coeff));

                    if (parsed == false)
                    {
                        MessageBox.Show("Enter valid coefficient value", "Invalid parameters", MessageBoxButton.OK, MessageBoxImage.Information);
                        return;
                    }

                    factorFunctionFilter.Offset = coeff;
                }

                WriteableBitmap writeableBitmap = functionFilter.ApplyFunctionFilter((BitmapImage)this.originalImage.Source);
                this.filteredImage.Source = writeableBitmap;
            }
        }