void StackBlurRGBA32(ImageReaderWriterBase img, int radius, int ry) { int width = img.Width; int w4 = img.Width * 4; int height = img.Height; int[] srcBuffer = new int[width * height]; ImageReaderWriterBase.CopySubBufferToInt32Array(img, 0, 0, width, height, srcBuffer); StackBlurARGB.FastBlur32ARGB(srcBuffer, srcBuffer, img.Width, img.Height, radius); int i = 0; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int dest = srcBuffer[i]; img.SetPixel(x, y, Color.FromArgb( (byte)((dest >> 16) & 0xff), (byte)((dest >> 8) & 0xff), (byte)((dest) & 0xff))); i++; } } }
//-------------------------------------------------------------------- public ImgSpanGenRGB_BilinearClip(IImageReaderWriter src, ColorRGBA back_color, ISpanInterpolator inter) : base(inter) { m_bgcolor = back_color; srcRW = (ImageReaderWriterBase)src; }
public void Fill(ImageReaderWriterBase bufferToFillOn, int x, int y) { unchecked // this way we can overflow the uint on negative and get a big number { if ((uint)x > bufferToFillOn.Width || (uint)y > bufferToFillOn.Height) { return; } } destImage = bufferToFillOn; imageStride = destImage.Stride; destBuffer = destImage.GetBuffer(); int imageWidth = destImage.Width; int imageHeight = destImage.Height; pixelsChecked = new bool[destImage.Width * destImage.Height]; int startColorBufferOffset = destImage.GetBufferOffsetXY(x, y); fillRule.SetStartColor(new ColorRGBA(destImage.GetBuffer()[startColorBufferOffset + 2], destImage.GetBuffer()[startColorBufferOffset + 1], destImage.GetBuffer()[startColorBufferOffset])); LinearFill(x, y); while (ranges.Count > 0) { Range range = ranges.Dequeue(); int downY = range.y - 1; int upY = range.y + 1; int downPixelOffset = (imageWidth * (range.y - 1)) + range.startX; int upPixelOffset = (imageWidth * (range.y + 1)) + range.startX; for (int rangeX = range.startX; rangeX <= range.endX; rangeX++) { if (range.y > 0) { if (!pixelsChecked[downPixelOffset]) { int bufferOffset = destImage.GetBufferOffsetXY(rangeX, downY); if (fillRule.CheckPixel(destBuffer, bufferOffset)) { LinearFill(rangeX, downY); } } } if (range.y < (imageHeight - 1)) { if (!pixelsChecked[upPixelOffset]) { int bufferOffset = destImage.GetBufferOffsetXY(rangeX, upY); if (fillRule.CheckPixel(destBuffer, bufferOffset)) { LinearFill(rangeX, upY); } } } upPixelOffset++; downPixelOffset++; } } }
public ImgSpanGenGray_NNStepXby1(IImageReaderWriter src, ISpanInterpolator spanInterpolator) : base(spanInterpolator) { srcRW = (ImageReaderWriterBase)src; if (srcRW.BitDepth != 8) { throw new NotSupportedException("The source is expected to be 32 bit."); } }
public ImgSpanGenRGBA_BilinearClip(IImageReaderWriter src, ColorRGBA back_color, ISpanInterpolator inter) : base(inter) { m_bgcolor = back_color; srcRW = (ImageReaderWriterBase)src; bytesBetweenPixelInclusive = srcRW.BytesBetweenPixelsInclusive; }
public ImgSpanGenGray_NNStepXby1(IImageReaderWriter src, ISpanInterpolator spanInterpolator) : base(spanInterpolator) { srcRW = (ImageReaderWriterBase)src; if (srcRW.BitDepth != 8) { throw new NotSupportedException("The source is expected to be 32 bit."); } }
public static void CopyToWindowsBitmap(ImageReaderWriterBase backingImageBufferByte, Bitmap windowsBitmap, RectInt rect) { int offset = 0; byte[] buffer = backingImageBufferByte.GetBuffer(); BitmapHelper.CopyToWindowsBitmap(buffer, offset, backingImageBufferByte.Stride, backingImageBufferByte.Height, backingImageBufferByte.BitDepth, windowsBitmap, rect); }
public void Blur(ImageReaderWriterBase img, int rx, int ry) { switch (img.BitDepth) { case 24: StackBlurRGB24(img, rx, ry); break; case 32: StackBlurRGBA32(img, rx, ry); break; default: throw new NotImplementedException(); } }
public void Blur(ImageReaderWriterBase img, int rx, int ry) { switch (img.BitDepth) { case 24: StackBlurRGB24(img, rx, ry); break; case 32: StackBlurRGBA32(img, rx, ry); break; default: throw new NotImplementedException(); } }
void StackBlurRGB24(ImageReaderWriterBase img, int rx, int ry) { throw new NotImplementedException(); #if false //typedef typename Img::color_type color_type; //typedef typename Img::order_type order_type; int x, y, xp, yp, i; int stack_ptr; int stack_start; byte * src_pix_ptr; byte * dst_pix_ptr; color_type *stack_pix_ptr; int sum_r; int sum_g; int sum_b; int sum_in_r; int sum_in_g; int sum_in_b; int sum_out_r; int sum_out_g; int sum_out_b; int w = img.width(); int h = img.height(); int wm = w - 1; int hm = h - 1; int div; int mul_sum; int shr_sum; pod_vector <color_type> stack; if (rx > 0) { if (rx > 254) { rx = 254; } div = rx * 2 + 1; mul_sum = stack_blur_tables.g_stack_blur8_mul[rx]; shr_sum = stack_blur_tables.g_stack_blur8_shr[rx]; stack.allocate(div); for (y = 0; y < h; y++) { sum_r = sum_g = sum_b = sum_in_r = sum_in_g = sum_in_b = sum_out_r = sum_out_g = sum_out_b = 0; src_pix_ptr = img.pix_ptr(0, y); for (i = 0; i <= rx; i++) { stack_pix_ptr = &stack[i]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (i + 1); sum_g += src_pix_ptr[G] * (i + 1); sum_b += src_pix_ptr[B] * (i + 1); sum_out_r += src_pix_ptr[R]; sum_out_g += src_pix_ptr[G]; sum_out_b += src_pix_ptr[B]; } for (i = 1; i <= rx; i++) { if (i <= wm) { src_pix_ptr += Img::pix_width; } stack_pix_ptr = &stack[i + rx]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (rx + 1 - i); sum_g += src_pix_ptr[G] * (rx + 1 - i); sum_b += src_pix_ptr[B] * (rx + 1 - i); sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; } stack_ptr = rx; xp = rx; if (xp > wm) { xp = wm; } src_pix_ptr = img.pix_ptr(xp, y); dst_pix_ptr = img.pix_ptr(0, y); for (x = 0; x < w; x++) { dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; dst_pix_ptr += Img::pix_width; sum_r -= sum_out_r; sum_g -= sum_out_g; sum_b -= sum_out_b; stack_start = stack_ptr + div - rx; if (stack_start >= div) { stack_start -= div; } stack_pix_ptr = &stack[stack_start]; sum_out_r -= stack_pix_ptr->r; sum_out_g -= stack_pix_ptr->g; sum_out_b -= stack_pix_ptr->b; if (xp < wm) { src_pix_ptr += Img::pix_width; ++xp; } stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; sum_r += sum_in_r; sum_g += sum_in_g; sum_b += sum_in_b; ++stack_ptr; if (stack_ptr >= div) { stack_ptr = 0; } stack_pix_ptr = &stack[stack_ptr]; sum_out_r += stack_pix_ptr->r; sum_out_g += stack_pix_ptr->g; sum_out_b += stack_pix_ptr->b; sum_in_r -= stack_pix_ptr->r; sum_in_g -= stack_pix_ptr->g; sum_in_b -= stack_pix_ptr->b; } } } if (ry > 0) { if (ry > 254) { ry = 254; } div = ry * 2 + 1; mul_sum = stack_blur_tables.g_stack_blur8_mul[ry]; shr_sum = stack_blur_tables.g_stack_blur8_shr[ry]; stack.allocate(div); int stride = img.stride(); for (x = 0; x < w; x++) { sum_r = sum_g = sum_b = sum_in_r = sum_in_g = sum_in_b = sum_out_r = sum_out_g = sum_out_b = 0; src_pix_ptr = img.pix_ptr(x, 0); for (i = 0; i <= ry; i++) { stack_pix_ptr = &stack[i]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (i + 1); sum_g += src_pix_ptr[G] * (i + 1); sum_b += src_pix_ptr[B] * (i + 1); sum_out_r += src_pix_ptr[R]; sum_out_g += src_pix_ptr[G]; sum_out_b += src_pix_ptr[B]; } for (i = 1; i <= ry; i++) { if (i <= hm) { src_pix_ptr += stride; } stack_pix_ptr = &stack[i + ry]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (ry + 1 - i); sum_g += src_pix_ptr[G] * (ry + 1 - i); sum_b += src_pix_ptr[B] * (ry + 1 - i); sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; } stack_ptr = ry; yp = ry; if (yp > hm) { yp = hm; } src_pix_ptr = img.pix_ptr(x, yp); dst_pix_ptr = img.pix_ptr(x, 0); for (y = 0; y < h; y++) { dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; dst_pix_ptr += stride; sum_r -= sum_out_r; sum_g -= sum_out_g; sum_b -= sum_out_b; stack_start = stack_ptr + div - ry; if (stack_start >= div) { stack_start -= div; } stack_pix_ptr = &stack[stack_start]; sum_out_r -= stack_pix_ptr->r; sum_out_g -= stack_pix_ptr->g; sum_out_b -= stack_pix_ptr->b; if (yp < hm) { src_pix_ptr += stride; ++yp; } stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; sum_r += sum_in_r; sum_g += sum_in_g; sum_b += sum_in_b; ++stack_ptr; if (stack_ptr >= div) { stack_ptr = 0; } stack_pix_ptr = &stack[stack_ptr]; sum_out_r += stack_pix_ptr->r; sum_out_g += stack_pix_ptr->g; sum_out_b += stack_pix_ptr->b; sum_in_r -= stack_pix_ptr->r; sum_in_g -= stack_pix_ptr->g; sum_in_b -= stack_pix_ptr->b; } } } #endif }
//-------------------------------------------------------------------- public ImgSpanGenRGB_BilinearClip(IImageReaderWriter src, Drawing.Color back_color, ISpanInterpolator inter) : base(inter) { m_bgcolor = back_color; srcRW = (ImageReaderWriterBase)src; }
void StackBlurRGB24(ImageReaderWriterBase img, int rx, int ry) { throw new NotImplementedException(); #if false //typedef typename Img::color_type color_type; //typedef typename Img::order_type order_type; int x, y, xp, yp, i; int stack_ptr; int stack_start; byte* src_pix_ptr; byte* dst_pix_ptr; color_type* stack_pix_ptr; int sum_r; int sum_g; int sum_b; int sum_in_r; int sum_in_g; int sum_in_b; int sum_out_r; int sum_out_g; int sum_out_b; int w = img.width(); int h = img.height(); int wm = w - 1; int hm = h - 1; int div; int mul_sum; int shr_sum; pod_vector<color_type> stack; if(rx > 0) { if(rx > 254) rx = 254; div = rx * 2 + 1; mul_sum = stack_blur_tables.g_stack_blur8_mul[rx]; shr_sum = stack_blur_tables.g_stack_blur8_shr[rx]; stack.allocate(div); for(y = 0; y < h; y++) { sum_r = sum_g = sum_b = sum_in_r = sum_in_g = sum_in_b = sum_out_r = sum_out_g = sum_out_b = 0; src_pix_ptr = img.pix_ptr(0, y); for(i = 0; i <= rx; i++) { stack_pix_ptr = &stack[i]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (i + 1); sum_g += src_pix_ptr[G] * (i + 1); sum_b += src_pix_ptr[B] * (i + 1); sum_out_r += src_pix_ptr[R]; sum_out_g += src_pix_ptr[G]; sum_out_b += src_pix_ptr[B]; } for(i = 1; i <= rx; i++) { if(i <= wm) src_pix_ptr += Img::pix_width; stack_pix_ptr = &stack[i + rx]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (rx + 1 - i); sum_g += src_pix_ptr[G] * (rx + 1 - i); sum_b += src_pix_ptr[B] * (rx + 1 - i); sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; } stack_ptr = rx; xp = rx; if(xp > wm) xp = wm; src_pix_ptr = img.pix_ptr(xp, y); dst_pix_ptr = img.pix_ptr(0, y); for(x = 0; x < w; x++) { dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; dst_pix_ptr += Img::pix_width; sum_r -= sum_out_r; sum_g -= sum_out_g; sum_b -= sum_out_b; stack_start = stack_ptr + div - rx; if(stack_start >= div) stack_start -= div; stack_pix_ptr = &stack[stack_start]; sum_out_r -= stack_pix_ptr->r; sum_out_g -= stack_pix_ptr->g; sum_out_b -= stack_pix_ptr->b; if(xp < wm) { src_pix_ptr += Img::pix_width; ++xp; } stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; sum_r += sum_in_r; sum_g += sum_in_g; sum_b += sum_in_b; ++stack_ptr; if(stack_ptr >= div) stack_ptr = 0; stack_pix_ptr = &stack[stack_ptr]; sum_out_r += stack_pix_ptr->r; sum_out_g += stack_pix_ptr->g; sum_out_b += stack_pix_ptr->b; sum_in_r -= stack_pix_ptr->r; sum_in_g -= stack_pix_ptr->g; sum_in_b -= stack_pix_ptr->b; } } } if(ry > 0) { if(ry > 254) ry = 254; div = ry * 2 + 1; mul_sum = stack_blur_tables.g_stack_blur8_mul[ry]; shr_sum = stack_blur_tables.g_stack_blur8_shr[ry]; stack.allocate(div); int stride = img.stride(); for(x = 0; x < w; x++) { sum_r = sum_g = sum_b = sum_in_r = sum_in_g = sum_in_b = sum_out_r = sum_out_g = sum_out_b = 0; src_pix_ptr = img.pix_ptr(x, 0); for(i = 0; i <= ry; i++) { stack_pix_ptr = &stack[i]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (i + 1); sum_g += src_pix_ptr[G] * (i + 1); sum_b += src_pix_ptr[B] * (i + 1); sum_out_r += src_pix_ptr[R]; sum_out_g += src_pix_ptr[G]; sum_out_b += src_pix_ptr[B]; } for(i = 1; i <= ry; i++) { if(i <= hm) src_pix_ptr += stride; stack_pix_ptr = &stack[i + ry]; stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_r += src_pix_ptr[R] * (ry + 1 - i); sum_g += src_pix_ptr[G] * (ry + 1 - i); sum_b += src_pix_ptr[B] * (ry + 1 - i); sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; } stack_ptr = ry; yp = ry; if(yp > hm) yp = hm; src_pix_ptr = img.pix_ptr(x, yp); dst_pix_ptr = img.pix_ptr(x, 0); for(y = 0; y < h; y++) { dst_pix_ptr[R] = (sum_r * mul_sum) >> shr_sum; dst_pix_ptr[G] = (sum_g * mul_sum) >> shr_sum; dst_pix_ptr[B] = (sum_b * mul_sum) >> shr_sum; dst_pix_ptr += stride; sum_r -= sum_out_r; sum_g -= sum_out_g; sum_b -= sum_out_b; stack_start = stack_ptr + div - ry; if(stack_start >= div) stack_start -= div; stack_pix_ptr = &stack[stack_start]; sum_out_r -= stack_pix_ptr->r; sum_out_g -= stack_pix_ptr->g; sum_out_b -= stack_pix_ptr->b; if(yp < hm) { src_pix_ptr += stride; ++yp; } stack_pix_ptr->r = src_pix_ptr[R]; stack_pix_ptr->g = src_pix_ptr[G]; stack_pix_ptr->b = src_pix_ptr[B]; sum_in_r += src_pix_ptr[R]; sum_in_g += src_pix_ptr[G]; sum_in_b += src_pix_ptr[B]; sum_r += sum_in_r; sum_g += sum_in_g; sum_b += sum_in_b; ++stack_ptr; if(stack_ptr >= div) stack_ptr = 0; stack_pix_ptr = &stack[stack_ptr]; sum_out_r += stack_pix_ptr->r; sum_out_g += stack_pix_ptr->g; sum_out_b += stack_pix_ptr->b; sum_in_r -= stack_pix_ptr->r; sum_in_g -= stack_pix_ptr->g; sum_in_b -= stack_pix_ptr->b; } } } #endif }
void StackBlurRGBA32(ImageReaderWriterBase img, int radius, int ry) { int width = img.Width; int w4 = img.Width * 4; int height = img.Height; int[] srcBuffer = new int[width * height]; ImageReaderWriterBase.CopySubBufferToInt32Array(img, 0, 0, width, height, srcBuffer); StackBlurARGB.FastBlur32ARGB(srcBuffer, srcBuffer, img.Width, img.Height, radius); int i = 0; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int dest = srcBuffer[i]; img.SetPixel(x, y, Color.FromArgb( (byte)((dest >> 16) & 0xff), (byte)((dest >> 8) & 0xff), (byte)((dest) & 0xff))); i++; } } }
public ImgSpanGenRGBA_BilinearClip(IImageReaderWriter src, Drawing.Color back_color, ISpanInterpolator inter) : base(inter) { m_bgcolor = back_color; srcRW = (ImageReaderWriterBase)src; bytesBetweenPixelInclusive = srcRW.BytesBetweenPixelsInclusive; }