GetBufferOffsetXY() public method

public GetBufferOffsetXY ( int x, int y ) : int
x int
y int
return int
Ejemplo n.º 1
0
        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(Drawing.Color.FromArgb(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++;
                }
            }
        }
Ejemplo n.º 2
0
        public void SetPixelHighRes(ImageReaderWriterBase sourceImage,
                                    ColorRGBA[] destBuffer,
                                    int destBufferOffset,
                                    int x,
                                    int y)
        {
            int r, g, b, a;

            r = g = b = a = LineAA.SUBPIXEL_SCALE * LineAA.SUBPIXEL_SCALE / 2;

            int weight;
            int x_lr = x >> LineAA.SUBPIXEL_SHIFT;
            int y_lr = y >> LineAA.SUBPIXEL_SHIFT;

            x &= LineAA.SUBPIXEL_MARK;
            y &= LineAA.SUBPIXEL_MARK;
            int sourceOffset;

            byte[] ptr = sourceImage.GetBuffer();
            sourceOffset = sourceImage.GetBufferOffsetXY(x_lr, y_lr);

            weight = (LineAA.SUBPIXEL_SCALE - x) *
                     (LineAA.SUBPIXEL_SCALE - y);
            r += weight * ptr[sourceOffset + CO.R];
            g += weight * ptr[sourceOffset + CO.G];
            b += weight * ptr[sourceOffset + CO.B];
            a += weight * ptr[sourceOffset + CO.A];

            sourceOffset += sourceImage.BytesBetweenPixelsInclusive;

            weight = x * (LineAA.SUBPIXEL_SCALE - y);
            r     += weight * ptr[sourceOffset + CO.R];
            g     += weight * ptr[sourceOffset + CO.G];
            b     += weight * ptr[sourceOffset + CO.B];
            a     += weight * ptr[sourceOffset + CO.A];

            sourceOffset = sourceImage.GetBufferOffsetXY(x_lr, y_lr + 1);

            weight = (LineAA.SUBPIXEL_SCALE - x) * y;
            r     += weight * ptr[sourceOffset + CO.R];
            g     += weight * ptr[sourceOffset + CO.G];
            b     += weight * ptr[sourceOffset + CO.B];
            a     += weight * ptr[sourceOffset + CO.A];

            sourceOffset += sourceImage.BytesBetweenPixelsInclusive;

            weight = x * y;
            r     += weight * ptr[sourceOffset + CO.R];
            g     += weight * ptr[sourceOffset + CO.G];
            b     += weight * ptr[sourceOffset + CO.B];
            a     += weight * ptr[sourceOffset + CO.A];

            destBuffer[destBufferOffset].red   = (byte)(r >> LineAA.SUBPIXEL_SHIFT * 2);
            destBuffer[destBufferOffset].green = (byte)(g >> LineAA.SUBPIXEL_SHIFT * 2);
            destBuffer[destBufferOffset].blue  = (byte)(b >> LineAA.SUBPIXEL_SHIFT * 2);
            destBuffer[destBufferOffset].alpha = (byte)(a >> LineAA.SUBPIXEL_SHIFT * 2);
        }
 public void SetPixelHighRes(ImageReaderWriterBase sourceImage,
     Color[] destBuffer,
     int destBufferOffset,
     int x,
     int y)
 {
     int r, g, b, a;
     r = g = b = a = LineAA.SUBPIXEL_SCALE * LineAA.SUBPIXEL_SCALE / 2;
     int weight;
     int x_lr = x >> LineAA.SUBPIXEL_SHIFT;
     int y_lr = y >> LineAA.SUBPIXEL_SHIFT;
     x &= LineAA.SUBPIXEL_MARK;
     y &= LineAA.SUBPIXEL_MARK;
     int sourceOffset;
     byte[] ptr = sourceImage.GetBuffer();
     sourceOffset = sourceImage.GetBufferOffsetXY(x_lr, y_lr);
     weight = (LineAA.SUBPIXEL_SCALE - x) *
              (LineAA.SUBPIXEL_SCALE - y);
     r += weight * ptr[sourceOffset + CO.R];
     g += weight * ptr[sourceOffset + CO.G];
     b += weight * ptr[sourceOffset + CO.B];
     a += weight * ptr[sourceOffset + CO.A];
     sourceOffset += sourceImage.BytesBetweenPixelsInclusive;
     weight = x * (LineAA.SUBPIXEL_SCALE - y);
     r += weight * ptr[sourceOffset + CO.R];
     g += weight * ptr[sourceOffset + CO.G];
     b += weight * ptr[sourceOffset + CO.B];
     a += weight * ptr[sourceOffset + CO.A];
     sourceOffset = sourceImage.GetBufferOffsetXY(x_lr, y_lr + 1);
     weight = (LineAA.SUBPIXEL_SCALE - x) * y;
     r += weight * ptr[sourceOffset + CO.R];
     g += weight * ptr[sourceOffset + CO.G];
     b += weight * ptr[sourceOffset + CO.B];
     a += weight * ptr[sourceOffset + CO.A];
     sourceOffset += sourceImage.BytesBetweenPixelsInclusive;
     weight = x * y;
     r += weight * ptr[sourceOffset + CO.R];
     g += weight * ptr[sourceOffset + CO.G];
     b += weight * ptr[sourceOffset + CO.B];
     a += weight * ptr[sourceOffset + CO.A];
     destBuffer[destBufferOffset].red = (byte)(r >> LineAA.SUBPIXEL_SHIFT * 2);
     destBuffer[destBufferOffset].green = (byte)(g >> LineAA.SUBPIXEL_SHIFT * 2);
     destBuffer[destBufferOffset].blue = (byte)(b >> LineAA.SUBPIXEL_SHIFT * 2);
     destBuffer[destBufferOffset].alpha = (byte)(a >> LineAA.SUBPIXEL_SHIFT * 2);
 }
Ejemplo n.º 4
0
        void LinearFill(int x, int y)
        {
            int bytesPerPixel = destImage.BytesBetweenPixelsInclusive;
            int imageWidth    = destImage.Width;

            int leftFillX    = x;
            int bufferOffset = destImage.GetBufferOffsetXY(x, y);
            int pixelOffset  = (imageWidth * y) + x;

            while (true)
            {
                fillRule.SetPixel(destBuffer, bufferOffset);
                pixelsChecked[pixelOffset] = true;
                leftFillX--;
                pixelOffset--;
                bufferOffset -= bytesPerPixel;
                if (leftFillX <= 0 || (pixelsChecked[pixelOffset]) || !fillRule.CheckPixel(destBuffer, bufferOffset))
                {
                    break;
                }
            }
            leftFillX++;

            int rightFillX = x;

            bufferOffset = destImage.GetBufferOffsetXY(x, y);
            pixelOffset  = (imageWidth * y) + x;
            while (true)
            {
                fillRule.SetPixel(destBuffer, bufferOffset);
                pixelsChecked[pixelOffset] = true;
                rightFillX++;
                pixelOffset++;
                bufferOffset += bytesPerPixel;
                if (rightFillX >= imageWidth || pixelsChecked[pixelOffset] || !fillRule.CheckPixel(destBuffer, bufferOffset))
                {
                    break;
                }
            }
            rightFillX--;

            ranges.Enqueue(new Range(leftFillX, rightFillX, y));
        }
        public static void CopySubBufferToInt32Array(ImageReaderWriterBase buff, int mx, int my, int w, int h, int[] buffer)
        {
            int i = 0;

            byte[] mBuffer = buff.m_ByteBuffer;
            for (int y = my; y < h; ++y)
            {
                int xbufferOffset = buff.GetBufferOffsetXY(0, y);
                for (int x = mx; x < w; ++x)
                {
                    //rgba
                    byte r = mBuffer[xbufferOffset + 2];
                    byte g = mBuffer[xbufferOffset + 1];
                    byte b = mBuffer[xbufferOffset];
                    xbufferOffset += 4;
                    buffer[i]      = b | (g << 8) | (r << 16);
                    i++;
                }
            }
        }
Ejemplo n.º 6
0
        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(Drawing.Color.FromArgb(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++;
                }
            }
        }
Ejemplo n.º 7
0
 public static void CopySubBufferToInt32Array(ImageReaderWriterBase buff, int mx, int my, int w, int h, int[] buffer)
 {
     int i = 0;
     byte[] mBuffer = buff.m_ByteBuffer;
     for (int y = my; y < h; ++y)
     {
         int xbufferOffset = buff.GetBufferOffsetXY(0, y);
         for (int x = mx; x < w; ++x)
         {
             //rgba 
             byte r = mBuffer[xbufferOffset + 2];
             byte g = mBuffer[xbufferOffset + 1];
             byte b = mBuffer[xbufferOffset];
             xbufferOffset += 4;
             buffer[i] = b | (g << 8) | (r << 16);
             i++;
         }
     }
 }