public void pixel_high_res(ImageBuffer sourceImage, RGBA_Bytes[] destBuffer, int destBufferOffset, int x, int y) { int r, g, b, a; r = g = b = a = LineAABasics.line_subpixel_scale * LineAABasics.line_subpixel_scale / 2; int weight; int x_lr = x >> LineAABasics.line_subpixel_shift; int y_lr = y >> LineAABasics.line_subpixel_shift; x &= LineAABasics.line_subpixel_mask; y &= LineAABasics.line_subpixel_mask; int sourceOffset; byte[] ptr = sourceImage.GetPixelPointerXY(x_lr, y_lr, out sourceOffset); weight = (LineAABasics.line_subpixel_scale - x) * (LineAABasics.line_subpixel_scale - y); r += weight * ptr[sourceOffset + ImageBuffer.OrderR]; g += weight * ptr[sourceOffset + ImageBuffer.OrderG]; b += weight * ptr[sourceOffset + ImageBuffer.OrderB]; a += weight * ptr[sourceOffset + ImageBuffer.OrderA]; sourceOffset += sourceImage.GetBytesBetweenPixelsInclusive(); weight = x * (LineAABasics.line_subpixel_scale - y); r += weight * ptr[sourceOffset + ImageBuffer.OrderR]; g += weight * ptr[sourceOffset + ImageBuffer.OrderG]; b += weight * ptr[sourceOffset + ImageBuffer.OrderB]; a += weight * ptr[sourceOffset + ImageBuffer.OrderA]; ptr = sourceImage.GetPixelPointerXY(x_lr, y_lr + 1, out sourceOffset); weight = (LineAABasics.line_subpixel_scale - x) * y; r += weight * ptr[sourceOffset + ImageBuffer.OrderR]; g += weight * ptr[sourceOffset + ImageBuffer.OrderG]; b += weight * ptr[sourceOffset + ImageBuffer.OrderB]; a += weight * ptr[sourceOffset + ImageBuffer.OrderA]; sourceOffset += sourceImage.GetBytesBetweenPixelsInclusive(); weight = x * y; r += weight * ptr[sourceOffset + ImageBuffer.OrderR]; g += weight * ptr[sourceOffset + ImageBuffer.OrderG]; b += weight * ptr[sourceOffset + ImageBuffer.OrderB]; a += weight * ptr[sourceOffset + ImageBuffer.OrderA]; destBuffer[destBufferOffset].red = (byte)(r >> LineAABasics.line_subpixel_shift * 2); destBuffer[destBufferOffset].green = (byte)(g >> LineAABasics.line_subpixel_shift * 2); destBuffer[destBufferOffset].blue = (byte)(b >> LineAABasics.line_subpixel_shift * 2); destBuffer[destBufferOffset].alpha = (byte)(a >> LineAABasics.line_subpixel_shift * 2); }
private void BlendInFilterPixel(int[] accumulatedColor, ref int sourceAlpha, int back_r, int back_g, int back_b, int back_a, ImageBuffer SourceRenderingBuffer, int maxx, int maxy, int x_lr, int y_lr, int weight) { byte[] fg_ptr; unchecked { if ((uint)x_lr <= (uint)maxx && (uint)y_lr <= (uint)maxy) { int bufferIndex; fg_ptr = SourceRenderingBuffer.GetPixelPointerXY(x_lr, y_lr, out bufferIndex); accumulatedColor[0] += weight * fg_ptr[bufferIndex + ImageBuffer.OrderR]; accumulatedColor[1] += weight * fg_ptr[bufferIndex + ImageBuffer.OrderG]; accumulatedColor[2] += weight * fg_ptr[bufferIndex + ImageBuffer.OrderB]; sourceAlpha += weight * base_mask; } else { accumulatedColor[0] += back_r * weight; accumulatedColor[1] += back_g * weight; accumulatedColor[2] += back_b * weight; sourceAlpha += back_a * weight; } } }