Write() public method

public Write ( byte data ) : void
data byte
return void
Exemplo n.º 1
0
        void UnkDecode10(PixelNavigator navDst, BinaryReader src, int height)
        {
            int h             = height;
            int numcolors     = src.ReadByte();
            var local_palette = src.ReadBytes(numcolors);

            int x = 8;

            while (true)
            {
                int color = src.ReadByte();
                if (color < numcolors)
                {
                    navDst.Write(RoomPalette[local_palette[color]]);
                    if (!NextRow(ref navDst, ref x, ref h, height))
                    {
                        return;
                    }
                }
                else
                {
                    int run = color - numcolors + 1;
                    color = src.ReadByte();
                    for (var i = 0; i < run; i++)
                    {
                        navDst.Write(RoomPalette[color]);
                        if (!NextRow(ref navDst, ref x, ref h, height))
                        {
                            return;
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        static void DecompressMaskImgOr(PixelNavigator dst, Stream src, int height)
        {
            byte b, c;

            while (height != 0)
            {
                b = (byte)src.ReadByte();

                if ((b & 0x80) != 0)
                {
                    b &= 0x7F;
                    c  = (byte)src.ReadByte();

                    do
                    {
                        dst.Write((byte)(dst.Read() | c));
                        dst.OffsetY(1);
                        --height;
                    } while ((--b != 0) && (height != 0));
                }
                else
                {
                    do
                    {
                        dst.Write((byte)(dst.Read() | src.ReadByte()));
                        dst.OffsetY(1);
                        --height;
                    } while ((--b != 0) && (height != 0));
                }
            }
        }
Exemplo n.º 3
0
        static void DecompressMaskImg(PixelNavigator dst, Stream src, int height)
        {
            while (height != 0)
            {
                var b = (byte)src.ReadByte();

                if ((b & 0x80) != 0)
                {
                    b &= 0x7F;
                    var c = (byte)src.ReadByte();

                    do
                    {
                        dst.Write(c);
                        dst.OffsetY(1);
                        --height;
                    } while (--b != 0 && height != 0);
                }
                else
                {
                    do
                    {
                        dst.Write((byte)src.ReadByte());
                        dst.OffsetY(1);
                        --height;
                    } while (--b != 0 && height != 0);
                }
            }
        }
Exemplo n.º 4
0
        void DrawStripV1Background(PixelNavigator navDst, int stripnr, int height)
        {
            int charIdx;

            height /= 8;
            for (int y = 0; y < height; y++)
            {
                _v1.Colors[3] = (byte)(_v1.ColorMap[y + stripnr * height] & 7);
                // Check for room color change in V1 zak
                if (RoomPalette[0] == 255)
                {
                    _v1.Colors[2] = RoomPalette[2];
                    _v1.Colors[1] = RoomPalette[1];
                }

                charIdx = _v1.PicMap[y + stripnr * height] * 8;
                for (int i = 0; i < 8; i++)
                {
                    byte c     = _v1.CharMap[charIdx + i];
                    var  color = _v1.Colors[(c >> 6) & 3];
                    navDst.Write(0, color);
                    navDst.Write(1, color);
                    color = _v1.Colors[(c >> 4) & 3];
                    navDst.Write(2, color);
                    navDst.Write(3, color);
                    color = _v1.Colors[(c >> 2) & 3];
                    navDst.Write(4, color);
                    navDst.Write(5, color);
                    color = _v1.Colors[(c >> 0) & 3];
                    navDst.Write(6, color);
                    navDst.Write(7, color);
                    navDst.OffsetY(1);
                }
            }
        }
Exemplo n.º 5
0
        void DrawStripV1Object(PixelNavigator navDst, int stripnr, int width, int height)
        {
            int charIdx;

            height /= 8;
            width  /= 8;
            for (var y = 0; y < height; y++)
            {
                _v1.Colors[3] = (byte)(objectMap[(y + height) * width + stripnr] & 7);
                charIdx       = objectMap[y * width + stripnr] * 8;
                for (var i = 0; i < 8; i++)
                {
                    byte c     = _v1.CharMap[charIdx + i];
                    var  color = _v1.Colors[(c >> 6) & 3];
                    navDst.Write(0, color);
                    navDst.Write(1, color);
                    color = _v1.Colors[(c >> 4) & 3];
                    navDst.Write(2, color);
                    navDst.Write(3, color);
                    color = _v1.Colors[(c >> 2) & 3];
                    navDst.Write(4, color);
                    navDst.Write(5, color);
                    color = _v1.Colors[(c >> 0) & 3];
                    navDst.Write(6, color);
                    navDst.Write(7, color);
                    navDst.OffsetY(1);
                }
            }
        }
Exemplo n.º 6
0
        void DrawStripV1Mask(PixelNavigator navDst, int stripnr, int width, int height)
        {
            int maskIdx;

            height /= 8;
            width  /= 8;
            for (var y = 0; y < height; y++)
            {
                if (_objectMode)
                {
                    maskIdx = objectMap[(y + 2 * height) * width + stripnr] * 8;
                }
                else
                {
                    maskIdx = _v1.MaskMap[y + stripnr * height] * 8;
                }
                for (var i = 0; i < 8; i++)
                {
                    byte c = _v1.MaskChar[maskIdx + i];

                    // V1/V0 masks are inverted compared to what ScummVM expects
                    navDst.Write((byte)(c ^ 0xFF));
                    navDst.OffsetY(1);
                }
            }
        }
Exemplo n.º 7
0
        void DrawStripRaw(PixelNavigator navDst, BinaryReader src, int height, bool transpCheck)
        {
            int x;

            if (game.Features.HasFlag(GameFeatures.Old256))
            {
                int h = height;
                x = 8;
                while (true)
                {
                    navDst.Write(RoomPalette[src.ReadByte()]);
                    if (!NextRow(ref navDst, ref x, ref h, height))
                    {
                        return;
                    }
                }
            }
            do
            {
                for (x = 0; x < 8; x++)
                {
                    int color = src.ReadByte();
                    if (!transpCheck || color != TransparentColor)
                    {
                        navDst.OffsetX(x);
                        WriteRoomColor(navDst, color);
                        navDst.OffsetX(-x);
                    }
                }
                navDst.OffsetY(1);
            } while ((--height) != 0);
        }
Exemplo n.º 8
0
        void Line(int c, int p, Codec1 v1, PixelNavigator?mask, PixelNavigator dst, byte color, byte[] palette)
        {
            var pcolor = (color >> c) & 3;

            if (pcolor != 0)
            {
                if (!MaskAt(p, v1, mask))
                {
                    dst.Write(p, palette[pcolor]);
                }
                if (!MaskAt(p + 1, v1, mask))
                {
                    dst.Write(p + 1, palette[pcolor]);
                }
            }
        }
Exemplo n.º 9
0
        protected virtual void DrawBitsN(Surface s, PixelNavigator dst, System.Collections.Generic.IList <byte> src, int srcPos, byte bpp, int drawTop, int width, int height)
        {
            if (bpp != 1 && bpp != 2 && bpp != 4 && bpp != 8)
            {
                throw new ArgumentException("Invalid bpp", "bpp");
            }

            byte bits    = src[srcPos++];
            byte numbits = 8;
            var  cmap    = Vm.CharsetColorMap;

            for (int y = 0; y < height && y + drawTop < s.Height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    int color = (bits >> (8 - bpp)) & 0xFF;

                    if (color != 0 && (y + drawTop >= 0))
                    {
                        dst.Write(cmap[color]);
                    }
                    dst.OffsetX(1);
                    bits   <<= bpp;
                    numbits -= bpp;
                    if (numbits == 0)
                    {
                        bits    = src[srcPos++];
                        numbits = 8;
                    }
                }
                dst.Offset(-width, 1);
            }
        }
Exemplo n.º 10
0
        void LINE(int c, int p, byte color, byte[] palette, PixelNavigator dst, PixelNavigator mask, int destX)
        {
            var pcolor = (color >> c) & 3;

            if (pcolor != 0)
            {
                if (!MASK_AT(p, mask, destX))
                {
                    dst.Write(p, palette[pcolor]);
                }
                if (!MASK_AT(p + 1, mask, destX))
                {
                    dst.Write(p + 1, palette[pcolor]);
                }
            }
        }
Exemplo n.º 11
0
        void UnkDecode9(PixelNavigator navDst, BinaryReader src, int height)
        {
            int  c, color;
            int  i;
            int  buffer = 0;
            int  mask   = 128;
            int  h      = height;
            byte run    = 0;

            int x = 8;

            while (true)
            {
                c = ReadNBits(src, 4, ref mask, ref buffer);

                switch (c >> 2)
                {
                case 0:
                    color = ReadNBits(src, 4, ref mask, ref buffer);
                    for (i = 0; i < ((c & 3) + 2); i++)
                    {
                        navDst.Write(RoomPalette[run * 16 + color]);
                        if (!NextRow(ref navDst, ref x, ref h, height))
                        {
                            return;
                        }
                    }
                    break;

                case 1:
                    for (i = 0; i < ((c & 3) + 1); i++)
                    {
                        color = ReadNBits(src, 4, ref mask, ref buffer);
                        navDst.Write(RoomPalette[run * 16 + color]);
                        if (!NextRow(ref navDst, ref x, ref h, height))
                        {
                            return;
                        }
                    }
                    break;

                case 2:
                    run = (byte)ReadNBits(src, 4, ref mask, ref buffer);
                    break;
                }
            }
        }
Exemplo n.º 12
0
 void WriteRoomColor(PixelNavigator navDst, int color)
 {
     // As described in bug #1294513 "FOA/Amiga: Palette problem (Regression)"
     // the original AMIGA version of Indy4: The Fate of Atlantis allowed
     // overflowing of the palette index. To have the same result in our code,
     // we need to do an logical AND 0xFF here to keep the result in [0, 255].
     navDst.Write(RoomPalette[(color + paletteMod) & 0xFF]);
 }
Exemplo n.º 13
0
        public void DrawChar(PixelNavigator dst, char c, int x, int y, byte color)
        {
            var width    = Math.Min((int)_chars[c].Width, dst.Width - x);
            var height   = Math.Min((int)_chars[c].Height, dst.Height - y);
            var src      = UnpackChar(c);
            var srcPitch = _chars[c].Width;
            var srcPos   = 0;

            var minX = x < 0 ? -x : 0;
            var minY = y < 0 ? -y : 0;

            if (height <= 0 || width <= 0)
            {
                return;
            }

            if (minY != 0)
            {
                srcPos += minY * srcPitch;
                dst.OffsetY(minY);
            }

            for (int ty = minY; ty < height; ty++)
            {
                for (int tx = minX; tx < width; tx++)
                {
                    if (src[srcPos + tx] != _chars[c].Transparency)
                    {
                        if (src[srcPos + tx] == 1)
                        {
                            dst.Write(tx, color);
                        }
                        else
                        {
                            dst.Write(tx, src[srcPos + tx]);
                        }
                    }
                }
                srcPos += srcPitch;
                dst.OffsetY(1);
            }
        }
Exemplo n.º 14
0
        protected virtual void DrawBits1(Surface surface, int x, int y, BinaryReader src, int drawTop, int width, int height)
        {
            var dst = new PixelNavigator(surface);

            dst.GoTo(x, y);

            byte bits = 0;
            byte col  = Color;
            //int pitch = surface.Pitch - width * surface.BytesPerPixel;
            var dst2 = new PixelNavigator(dst);

            dst2.OffsetY(1);

            for (y = 0; y < height && y + drawTop < surface.Height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    if ((x % 8) == 0)
                    {
                        bits = src.ReadByte();
                    }
                    if ((bits & ScummHelper.RevBitMask(x % 8)) != 0 && y + drawTop >= 0)
                    {
                        if (_shadowMode)
                        {
                            dst.OffsetX(1);
                            dst.Write(_shadowColor);
                            dst2.Write(_shadowColor);
                            dst2.OffsetX(1);
                            dst2.Write(_shadowColor);
                        }
                        dst.Write(col);
                    }
                    dst.OffsetX(1);
                    dst2.OffsetX(1);
                }

                dst.OffsetX(surface.Width - width);
                dst2.OffsetX(surface.Width - width);
            }
        }
Exemplo n.º 15
0
 static void Clear8Col(PixelNavigator nav, int height)
 {
     do
     {
         for (int i = 0; i < 8; i++)
         {
             nav.Write(0);
             nav.OffsetX(1);
         }
         nav.Offset(-8, 1);
     } while ((--height) != 0);
 }
Exemplo n.º 16
0
 public static void Fill(PixelNavigator dst, byte color, int width, int height)
 {
     for (int h = 0; h < height; h++)
     {
         for (int w = 0; w < width; w++)
         {
             dst.Write(color);
             dst.OffsetX(1);
         }
         dst.Offset(-width, 1);
     }
 }
Exemplo n.º 17
0
 public static void BompApplyShadow0(byte[] lineBuffer, int linePos, PixelNavigator dst, int size)
 {
     while (size-- > 0)
     {
         byte tmp = lineBuffer[linePos++];
         if (tmp != 255)
         {
             dst.Write(tmp);
         }
         dst.OffsetX(1);
     }
 }
Exemplo n.º 18
0
 public static void Blit(PixelNavigator dst, PixelNavigator src, int width, int height)
 {
     for (var h = 0; h < height; h++)
     {
         for (int w = 0; w < width; w++)
         {
             dst.Write(src.Read());
             src.OffsetX(1);
             dst.OffsetX(1);
         }
         src.Offset(-width, 1);
         dst.Offset(-width, 1);
     }
 }
Exemplo n.º 19
0
 static void Copy8Col(PixelNavigator navDst, PixelNavigator navSource, int height)
 {
     do
     {
         for (int i = 0; i < 8; i++)
         {
             navDst.Write(navSource.Read());
             navDst.OffsetX(1);
             navSource.OffsetX(1);
         }
         navDst.Offset(-8, 1);
         navSource.Offset(-8, 1);
     } while ((--height) != 0);
 }
Exemplo n.º 20
0
 static void BompApplyShadow3(byte[] shadowPalette, byte[] lineBuffer, int linePos, PixelNavigator dst, int size, byte transparency)
 {
     while (size-- > 0)
     {
         byte tmp = lineBuffer[linePos++];
         if (tmp != transparency)
         {
             if (tmp < 8)
             {
                 tmp = shadowPalette[dst.Read() + (tmp << 8)];
             }
             dst.Write(tmp);
         }
         dst.OffsetX(1);
     }
 }
Exemplo n.º 21
0
        void UnkDecode11(PixelNavigator navDst, BinaryReader src, int height)
        {
            int i;
            int buffer = 0, mask = 128;
            int inc   = 1;
            int color = src.ReadByte();

            int x = 8;

            do
            {
                int h = height;
                do
                {
                    navDst.Write(RoomPalette[color]);
                    navDst.OffsetY(1);
                    for (i = 0; i < 3; i++)
                    {
                        if (!ReadBit256(src, ref mask, ref buffer))
                        {
                            break;
                        }
                    }
                    switch (i)
                    {
                    case 1:
                        inc    = -inc;
                        color -= inc;
                        break;

                    case 2:
                        color -= inc;
                        break;

                    case 3:
                        inc   = 1;
                        color = ReadNBits(src, 8, ref mask, ref buffer);
                        break;
                    }
                } while ((--h) != 0);
                navDst.Offset(1, -height);
            } while ((--x) != 0);
        }
Exemplo n.º 22
0
        void UnkDecode8(PixelNavigator navDst, BinaryReader src, int height)
        {
            int h = height;
            int x = 8;

            while (true)
            {
                int run   = src.ReadByte() + 1;
                int color = src.ReadByte();

                for (var i = 0; i < run; i++)
                {
                    navDst.Write(RoomPalette[color]);
                    if (!NextRow(ref navDst, ref x, ref h, height))
                    {
                        return;
                    }
                }
            }
        }
Exemplo n.º 23
0
        void DrawStripV1Mask(PixelNavigator navDst, int stripnr, int width, int height)
        {
            int maskIdx;
            height /= 8;
            width /= 8;
            for (var y = 0; y < height; y++)
            {
                if (_objectMode)
                    maskIdx = objectMap[(y + 2 * height) * width + stripnr] * 8;
                else
                    maskIdx = _v1.MaskMap[y + stripnr * height] * 8;
                for (var i = 0; i < 8; i++)
                {
                    byte c = _v1.MaskChar[maskIdx + i];

                    // V1/V0 masks are inverted compared to what ScummVM expects
                    navDst.Write((byte)(c ^ 0xFF));
                    navDst.OffsetY(1);
                }
            }
        }
Exemplo n.º 24
0
        void UnkDecode8(PixelNavigator navDst, BinaryReader src, int height)
        {
            int h = height;
            int x = 8;
            while (true)
            {
                int run = src.ReadByte() + 1;
                int color = src.ReadByte();
		
                for (var i = 0; i < run; i++)
                {
                    navDst.Write(RoomPalette[color]);
                    if (!NextRow(ref navDst, ref x, ref h, height))
                        return;
                }
            }
        }
Exemplo n.º 25
0
        protected override void PrepareDrawBitmap(ImageData img, VirtScreen vs,
                                                  Point p, int width, int height,
                                                  int stripnr, int numstrip)
        {
            var ptr = img.Data;
            //
            // Since V3, all graphics data was encoded in strips, which is very efficient
            // for redrawing only parts of the screen. However, V2 is different: here
            // the whole graphics are encoded as one big chunk. That makes it rather
            // difficult to draw only parts of a room/object. We handle the V2 graphics
            // differently from all other (newer) graphic formats for this reason.
            //
            var            table = (_objectMode ? null : _roomStrips);
            int            left  = (stripnr * 8);
            int            right = left + (numstrip * 8);
            PixelNavigator navDst;
            var            srcOffset = 0;
            byte           color, data = 0;
            int            run;
            bool           dither = false;

            byte[] dither_table = new byte[128];
            var    ditherOffset = 0;
            int    theX, theY, maxX;

            var surface = vs.HasTwoBuffers ? vs.Surfaces[1] : vs.Surfaces[0];

            navDst = new PixelNavigator(surface);
            navDst.GoTo(p.X * 8, p.Y);

            var mask_ptr = GetMaskBuffer(p.X, p.Y, 1);

            if (table != null)
            {
                run       = table.run[stripnr];
                color     = (byte)table.color[stripnr];
                srcOffset = table.offsets[stripnr];
                theX      = left;
                maxX      = right;
            }
            else
            {
                run       = 1;
                color     = 0;
                srcOffset = 0;
                theX      = 0;
                maxX      = width;
            }

            // Decode and draw the image data.
            Debug.Assert(height <= 128);
            for (; theX < maxX; theX++)
            {
                ditherOffset = 0;
                for (theY = 0; theY < height; theY++)
                {
                    if (--run == 0)
                    {
                        data = ptr[srcOffset++];
                        if ((data & 0x80) != 0)
                        {
                            run    = data & 0x7f;
                            dither = true;
                        }
                        else
                        {
                            run    = data >> 4;
                            dither = false;
                        }
                        color = RoomPalette[data & 0x0f];
                        if (run == 0)
                        {
                            run = ptr[srcOffset++];
                        }
                    }
                    if (!dither)
                    {
                        dither_table[ditherOffset] = color;
                    }
                    if (left <= theX && theX < right)
                    {
                        navDst.Write(dither_table[ditherOffset++]);
                        navDst.OffsetY(1);
                    }
                }
                if (left <= theX && theX < right)
                {
                    navDst.Offset(1, -height);
                }
            }

            // Draw mask (zplane) data
            theY = 0;

            if (table != null)
            {
                srcOffset = table.zoffsets[stripnr];
                run       = table.zrun[stripnr];
                theX      = left;
            }
            else
            {
                run  = ptr[srcOffset++];
                theX = 0;
            }
            while (theX < right)
            {
                byte runFlag = (byte)(run & 0x80);
                if (runFlag != 0)
                {
                    run &= 0x7f;
                    data = ptr[srcOffset++];
                }
                do
                {
                    if (runFlag == 0)
                    {
                        data = ptr[srcOffset++];
                    }

                    if (left <= theX)
                    {
                        mask_ptr.Write(data);
                        mask_ptr.OffsetY(1);
                    }
                    theY++;
                    if (theY >= height)
                    {
                        if (left <= theX)
                        {
                            mask_ptr.Offset(1, -height);
                        }
                        theY  = 0;
                        theX += 8;
                        if (theX >= right)
                        {
                            break;
                        }
                    }
                } while ((--run) != 0);
                run = ptr[srcOffset++];
            }
        }
Exemplo n.º 26
0
        void Proc3Amiga(Codec1 v1)
        {
            byte len;
            int  color;
            bool masked;

            var mask = new PixelNavigator(v1.MaskPtr);

            mask.OffsetX(v1.X / 8);
            var  dst    = new PixelNavigator(v1.DestPtr);
            byte height = (byte)_height;
            byte width  = (byte)_width;

            _loaded.CostumeReader.BaseStream.Seek(_srcptr, System.IO.SeekOrigin.Begin);
            var maskbit        = (byte)ScummHelper.RevBitMask(v1.X & 7);
            var y              = v1.Y;
            var oldXpos        = v1.X;
            var oldScaleIndexX = _scaleIndexX;

            // Indy4 Amiga always uses the room map to match colors to the currently
            // setup palette in the actor code in the original, thus we need to do this
            // mapping over here too.
            var amigaMap =
                (_vm.Game.Platform == Platform.Amiga && _vm.Game.GameId == GameId.Indy4) ? _vm.Gdi.RoomPalette : null;

            do
            {
                len   = _loaded.CostumeReader.ReadByte();
                color = len >> v1.Shr;
                len  &= v1.Mask;
                if (len == 0)
                {
                    len = _loaded.CostumeReader.ReadByte();
                }
                do
                {
                    if (ScaleY == 255 || v1.Scaletable[_scaleIndexY] < ScaleY)
                    {
                        masked = (y < 0 || y >= _h) || (v1.X < 0 || v1.X >= _w) || ((mask.Read() & maskbit) != 0);

                        if (color != 0 && !masked)
                        {
                            byte pcolor;
                            if (amigaMap != null)
                            {
                                pcolor = amigaMap[_palette[color]];
                            }
                            else
                            {
                                pcolor = (byte)_palette[color];
                            }
                            dst.Write(pcolor);
                        }

                        if (ScaleX == 255 || v1.Scaletable[_scaleIndexX] < ScaleX)
                        {
                            v1.X += v1.ScaleXStep;
                            dst.OffsetX(v1.ScaleXStep);
                            maskbit = (byte)ScummHelper.RevBitMask(v1.X & 7);
                        }
                        _scaleIndexX += (byte)v1.ScaleXStep;
                        mask          = new PixelNavigator(v1.MaskPtr);
                        mask.OffsetX(v1.X / 8);
                    }
                    if (--width == 0)
                    {
                        if (--height == 0)
                        {
                            return;
                        }

                        if (y >= _h)
                        {
                            return;
                        }

                        if (v1.X != oldXpos)
                        {
                            dst.Offset(-(v1.X - oldXpos), 1);
                            mask = new PixelNavigator(v1.MaskPtr);
                            mask.OffsetY(1);
                            v1.MaskPtr = mask;
                            mask.OffsetX(oldXpos / 8);
                            maskbit = (byte)ScummHelper.RevBitMask(oldXpos & 7);
                            y++;
                        }
                        width        = (byte)_width;
                        v1.X         = oldXpos;
                        _scaleIndexX = oldScaleIndexX;
                        _scaleIndexY++;
                    }
                } while (--len != 0);
            } while (true);
        }
Exemplo n.º 27
0
 void UnkDecode10(PixelNavigator navDst, BinaryReader src, int height)
 {
     int h = height;
     int numcolors = src.ReadByte();
     var local_palette = src.ReadBytes(numcolors);
 
     int x = 8;
 
     while (true)
     {
         int color = src.ReadByte();
         if (color < numcolors)
         {
             navDst.Write(RoomPalette[local_palette[color]]);
             if (!NextRow(ref navDst, ref x, ref h, height))
                 return;
         }
         else
         {
             int run = color - numcolors + 1;
             color = src.ReadByte();
             for (var i = 0; i < run; i++)
             {
                 navDst.Write(RoomPalette[color]);
                 if (!NextRow(ref navDst, ref x, ref h, height))
                     return;
             }
         }
     }
 }
Exemplo n.º 28
0
        protected override void PrepareDrawBitmap(ImageData img, VirtScreen vs,
                               Point p, int width, int height,
                               int stripnr, int numstrip)
        {
            var ptr = img.Data;
            //
            // Since V3, all graphics data was encoded in strips, which is very efficient
            // for redrawing only parts of the screen. However, V2 is different: here
            // the whole graphics are encoded as one big chunk. That makes it rather
            // difficult to draw only parts of a room/object. We handle the V2 graphics
            // differently from all other (newer) graphic formats for this reason.
            //
            var table = (_objectMode ? null : _roomStrips);
            int left = (stripnr * 8);
            int right = left + (numstrip * 8);
            PixelNavigator navDst;
            var srcOffset = 0;
            byte color, data = 0;
            int run;
            bool dither = false;
            byte[] dither_table = new byte[128];
            var ditherOffset = 0;
            int theX, theY, maxX;

            var surface = vs.HasTwoBuffers ? vs.Surfaces[1] : vs.Surfaces[0];
            navDst = new PixelNavigator(surface);
            navDst.GoTo(p.X * 8, p.Y);

            var mask_ptr = GetMaskBuffer(p.X, p.Y, 1);

            if (table != null)
            {
                run = table.run[stripnr];
                color = (byte)table.color[stripnr];
                srcOffset = table.offsets[stripnr];
                theX = left;
                maxX = right;
            }
            else
            {
                run = 1;
                color = 0;
                srcOffset = 0;
                theX = 0;
                maxX = width;
            }

            // Decode and draw the image data.
            Debug.Assert(height <= 128);
            for (; theX < maxX; theX++)
            {
                ditherOffset = 0;
                for (theY = 0; theY < height; theY++)
                {
                    if (--run == 0)
                    {
                        data = ptr[srcOffset++];
                        if ((data & 0x80) != 0)
                        {
                            run = data & 0x7f;
                            dither = true;
                        }
                        else
                        {
                            run = data >> 4;
                            dither = false;
                        }
                        color = RoomPalette[data & 0x0f];
                        if (run == 0)
                        {
                            run = ptr[srcOffset++];
                        }
                    }
                    if (!dither)
                    {
                        dither_table[ditherOffset] = color;
                    }
                    if (left <= theX && theX < right)
                    {
                        navDst.Write(dither_table[ditherOffset++]);
                        navDst.OffsetY(1);
                    }
                }
                if (left <= theX && theX < right)
                {
                    navDst.Offset(1, -height);
                }
            }

            // Draw mask (zplane) data
            theY = 0;

            if (table != null)
            {
                srcOffset = table.zoffsets[stripnr];
                run = table.zrun[stripnr];
                theX = left;
            }
            else
            {
                run = ptr[srcOffset++];
                theX = 0;
            }
            while (theX < right)
            {
                byte runFlag = (byte)(run & 0x80);
                if (runFlag != 0)
                {
                    run &= 0x7f;
                    data = ptr[srcOffset++];
                }
                do
                {
                    if (runFlag == 0)
                        data = ptr[srcOffset++];

                    if (left <= theX)
                    {
                        mask_ptr.Write(data);
                        mask_ptr.OffsetY(1);
                    }
                    theY++;
                    if (theY >= height)
                    {
                        if (left <= theX)
                        {
                            mask_ptr.Offset(1, -height);
                        }
                        theY = 0;
                        theX += 8;
                        if (theX >= right)
                            break;
                    }
                } while ((--run) != 0);
                run = ptr[srcOffset++];
            }
        }
Exemplo n.º 29
0
        void UnkDecode9(PixelNavigator navDst, BinaryReader src, int height)
        {
            int c, color;
            int i;
            int buffer = 0;
            int mask = 128;
            int h = height;
            byte run = 0;

            int x = 8;
            while (true)
            {
                c = ReadNBits(src, 4, ref mask, ref buffer);
		
                switch (c >> 2)
                {
                    case 0:
                        color = ReadNBits(src, 4, ref mask, ref buffer);
                        for (i = 0; i < ((c & 3) + 2); i++)
                        {
                            navDst.Write(RoomPalette[run * 16 + color]);
                            if (!NextRow(ref navDst, ref x, ref h, height))
                                return;
                        }
                        break;
		
                    case 1:
                        for (i = 0; i < ((c & 3) + 1); i++)
                        {
                            color = ReadNBits(src, 4, ref mask, ref buffer);
                            navDst.Write(RoomPalette[run * 16 + color]);
                            if (!NextRow(ref navDst, ref x, ref h, height))
                                return;
                        }
                        break;
		
                    case 2:
                        run = (byte)ReadNBits(src, 4, ref mask, ref buffer);
                        break;
                }
            }
        }
Exemplo n.º 30
0
        protected override void DrawBits1(Surface dest, int x, int y, BinaryReader src, int drawTop, int width, int height)
        {
            if (_sjisCurChar != 0)
            {
//                Debug.Assert(Vm._cjkFont);
//                Vm._cjkFont.drawChar(dest, _sjisCurChar, x, y, _color, _shadowColor);
                return;
            }
            bool scale2x = ((dest == Vm.TextSurface) && (Vm.TextSurfaceMultiplier == 2) /*&& !(_sjisCurChar >= 256 && Vm.UseCJKMode)*/);

            byte bits = 0;
            var col = Color;
            var bpp = Surface.GetBytesPerPixel(dest.PixelFormat);
            int pitch = dest.Pitch - width * bpp;
            var dst = new PixelNavigator(dest);
            dst.GoTo(x, y);
            var dst2 = new PixelNavigator(dst);
            dst2.OffsetY(1);

            var dst3 = new PixelNavigator(dst2);
            var dst4 = new PixelNavigator(dst2);
            if (scale2x)
            {
                dst3.OffsetY(1);
                dst4.OffsetY(1);
                pitch <<= 1;
            }

            for (y = 0; y < height && y + drawTop < dest.Height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    if ((x % 8) == 0)
                        bits = src.ReadByte();
                    if (((bits & ScummHelper.RevBitMask(x % 8)) != 0) && y + drawTop >= 0)
                    {
                        if (bpp == 2)
                        {
                            if (_enableShadow)
                            {
                                dst.WriteUInt16(2, Vm._16BitPalette[_shadowColor]);
                                dst.WriteUInt16(2 + dest.Pitch, Vm._16BitPalette[_shadowColor]);
                            }
                            dst.WriteUInt16(Vm._16BitPalette[Color]);
                        }
                        else
                        {
                            if (_enableShadow)
                            {
                                if (scale2x)
                                {
                                    dst.Write(2, _shadowColor);
                                    dst.Write(3, _shadowColor);
                                    dst2.Write(2, _shadowColor);
                                    dst2.Write(3, _shadowColor);

                                    dst3.Write(0, _shadowColor);
                                    dst3.Write(1, _shadowColor);
                                    dst4.Write(0, _shadowColor);
                                    dst4.Write(0, _shadowColor);
                                }
                                else
                                {
                                    dst2.Write(_shadowColor);
                                    dst.Write(1, _shadowColor);
                                }
                            }
                            dst.Write(col);

                            if (scale2x)
                            {
                                dst.Write(1, col);
                                dst2.Write(0, col);
                                dst2.Write(1, col);
                            }
                        }
                    }
                    dst.OffsetX(1);
                    dst2.OffsetX(1);
                    if (scale2x)
                    {
                        dst.OffsetX(1);
                        dst2.OffsetX(1);
                        dst3.OffsetX(1);
                        dst4.OffsetX(1);
                    }
                }

                dst.OffsetX(pitch / dst.BytesByPixel);
                dst2.OffsetX(pitch / dst2.BytesByPixel);
                dst3.OffsetX(pitch / dst3.BytesByPixel);
                dst4.OffsetX(pitch / dst4.BytesByPixel);
            }
        }
Exemplo n.º 31
0
 public static void Blit(PixelNavigator dst, PixelNavigator src, int width, int height)
 {
     for (var h = 0; h < height; h++)
     {
         for (int w = 0; w < width; w++)
         {
             dst.Write(src.Read());
             src.OffsetX(1);
             dst.OffsetX(1);
         }
         src.Offset(-width, 1);
         dst.Offset(-width, 1);
     }
 }
Exemplo n.º 32
0
        void DrawStripEGA(PixelNavigator navDst, BinaryReader src, int height)
        {
            byte color;
            int  run;
            int  x = 0, y = 0;
            int  z;

            navDst = new PixelNavigator(navDst);

            while (x < 8)
            {
                color = src.ReadByte();

                if ((color & 0x80) != 0)
                {
                    run = color & 0x3f;

                    if ((color & 0x40) != 0)
                    {
                        color = src.ReadByte();

                        if (run == 0)
                        {
                            run = src.ReadByte();
                        }
                        for (z = 0; z < run; z++)
                        {
                            navDst.GoTo(x, y);
                            navDst.Write((z & 1) != 0 ? RoomPalette[(color & 0xf) + paletteMod] : RoomPalette[(color >> 4) + paletteMod]);

                            y++;
                            if (y >= height)
                            {
                                y = 0;
                                x++;
                            }
                        }
                    }
                    else
                    {
                        if (run == 0)
                        {
                            run = src.ReadByte();
                        }

                        for (z = 0; z < run; z++)
                        {
                            navDst.GoTo(x - 1, y);
                            var col = navDst.Read();
                            navDst.GoTo(x, y);
                            navDst.Write(col);

                            y++;
                            if (y >= height)
                            {
                                y = 0;
                                x++;
                            }
                        }
                    }
                }
                else
                {
                    run = color >> 4;
                    if (run == 0)
                    {
                        run = src.ReadByte();
                    }

                    for (z = 0; z < run; z++)
                    {
                        navDst.GoTo(x, y);
                        navDst.Write(RoomPalette[(color & 0xf) + paletteMod]);

                        y++;
                        if (y >= height)
                        {
                            y = 0;
                            x++;
                        }
                    }
                }
            }
        }
Exemplo n.º 33
0
 static void Clear8Col(PixelNavigator nav, int height)
 {
     do
     {
         for (int i = 0; i < 8; i++)
         {
             nav.Write(0);
             nav.OffsetX(1);
         }
         nav.Offset(-8, 1);
     } while ((--height) != 0);
 }
Exemplo n.º 34
0
 static void Copy8Col(PixelNavigator navDst, PixelNavigator navSource, int height)
 {
     do
     {
         for (int i = 0; i < 8; i++)
         {
             navDst.Write(navSource.Read());
             navDst.OffsetX(1);
             navSource.OffsetX(1);
         }
         navDst.Offset(-8, 1);
         navSource.Offset(-8, 1);
     } while ((--height) != 0);
 }
Exemplo n.º 35
0
        void DrawStripRaw(PixelNavigator navDst, BinaryReader src, int height, bool transpCheck)
        {
            int x;

            if (game.Features.HasFlag(GameFeatures.Old256))
            {
                int h = height;
                x = 8;
                while (true)
                {
                    navDst.Write(RoomPalette[src.ReadByte()]);
                    if (!NextRow(ref navDst, ref x, ref h, height))
                        return;
                }
            }
            do
            {
                for (x = 0; x < 8; x++)
                {
                    int color = src.ReadByte();
                    if (!transpCheck || color != TransparentColor)
                    {
                        navDst.OffsetX(x);
                        WriteRoomColor(navDst, color);
                        navDst.OffsetX(-x);
                    }
                }
                navDst.OffsetY(1);
            } while ((--height) != 0);
        }
Exemplo n.º 36
0
 public static void Fill(PixelNavigator dst, byte color, int width, int height)
 {
     for (int h = 0; h < height; h++)
     {
         for (int w = 0; w < width; w++)
         {
             dst.Write(color);
             dst.OffsetX(1);
         }
         dst.Offset(-width, 1);
     }
 }
Exemplo n.º 37
0
        protected void TownsDrawStripToScreen(VirtScreen vs, int dstX, int dstY, int srcX, int srcY, int width, int height)
        {
            if (width <= 0 || height <= 0)
                return;

            int m = _textSurfaceMultiplier;

            var src1 = new PixelNavigator(vs.Surfaces[0]);
            src1.GoTo(vs.XStart + srcX, srcY);
            var src2 = new PixelNavigator(_textSurface);
            src2.GoTo(srcX * m, (srcY + vs.TopLine - ScreenTop) * m);
            var dst1 = new PixelNavigator(_townsScreen.GetLayerPixels(0, dstX, dstY).Value);
            var dst2 = new PixelNavigator(_townsScreen.GetLayerPixels(1, dstX * m, dstY * m).Value);

            int dp1 = _townsScreen.GetLayerPitch(0) - width * _townsScreen.GetLayerBpp(0);
            int dp2 = _townsScreen.GetLayerPitch(1) - width * m * _townsScreen.GetLayerBpp(1);
            int sp1 = vs.Pitch - (width * Surface.GetBytesPerPixel(vs.PixelFormat));
            int sp2 = _textSurface.Pitch - width * m;

            if (vs == MainVirtScreen || Game.GameId == GameId.Indy3 || Game.GameId == GameId.Zak)
            {
                for (int h = 0; h < height; ++h)
                {
                    if (Surface.GetBytesPerPixel(_gfxManager.PixelFormat) == 2)
                    {
                        for (int w = 0; w < width; ++w)
                        {
                            dst1.WriteUInt16(_16BitPalette[src1.Read()]);
                            src1.OffsetX(1);
                            dst1.OffsetX(1);
                        }

                        src1.OffsetX(sp1 / src1.BytesByPixel);
                        dst1.OffsetX(dp1 / dst1.BytesByPixel);
                    }
                    else
                    {
                        for (int i = 0; i < width; i++)
                        {
                            dst1.Write(src1.Read());
                            dst1.OffsetX(1);
                            src1.OffsetX(1);
                        }
                    }

                    for (int sH = 0; sH < m; ++sH)
                    {
                        for (int i = 0; i < width * m; i++)
                        {
                            dst2.Write(src2.Read());
                            src2.OffsetX(1);
                            dst2.OffsetX(1);
                        }
                        src2.OffsetX(_textSurface.Width - (width * m));
                        dst2.OffsetX(dst2.Width - (width * m));
                    }
                }
            }
            else
            {
                dst1 = new PixelNavigator(dst2);
                for (int h = 0; h < height; ++h)
                {
                    for (int w = 0; w < width; ++w)
                    {
                        var t = (src1.Read()) & 0x0f;
                        src1.OffsetX(1);
                        for (int i = 0; i < m; i++)
                        {
                            dst1.Write((byte)((t << 4) | t));
                            dst1.OffsetX(1);
                        }
                    }

                    dst1 = new PixelNavigator(dst2);
                    var src3 = new PixelNavigator(src2);

                    if (m == 2)
                    {
                        dst2.OffsetY(1);
                        src3.OffsetY(1);
                    }

                    for (int w = 0; w < width * m; ++w)
                    {
                        dst2.Write((byte)(src3.Read() | dst1.Read() & _townsLayer2Mask[src3.Read()]));
                        dst2.OffsetX(1);
                        dst1.Write((byte)(src2.Read() | dst1.Read() & _townsLayer2Mask[src2.Read()]));
                        src2.OffsetX(1);
                        src3.OffsetX(1);
                        dst1.OffsetX(1);
                    }

                    src1.OffsetX(sp1 / src1.BytesByPixel);
                    src2 = new PixelNavigator(src3);
                    src2.OffsetX(sp2 / src2.BytesByPixel);
                    dst1 = new PixelNavigator(dst2);
                    dst1.OffsetX(dp2 / dst1.BytesByPixel);
                    dst2.OffsetX(dp2 / dst2.BytesByPixel);
                }
            }

            _townsScreen.AddDirtyRect(dstX * m, dstY * m, width * m, height * m);
        }
Exemplo n.º 38
0
 void Line(int c, int p, Codec1 v1, PixelNavigator? mask, PixelNavigator dst, byte color, byte[] palette)
 {
     var pcolor = (color >> c) & 3;
     if (pcolor != 0)
     { 
         if (!MaskAt(p, v1, mask))
             dst.Write(p, palette[pcolor]);
         if (!MaskAt(p + 1, v1, mask))
             dst.Write(p + 1, palette[pcolor]);
     }
 }
Exemplo n.º 39
0
        protected override void DrawBits1(Surface dest, int x, int y, BinaryReader src, int drawTop, int width, int height)
        {
            if (_sjisCurChar != 0)
            {
//                Debug.Assert(Vm._cjkFont);
//                Vm._cjkFont.drawChar(dest, _sjisCurChar, x, y, _color, _shadowColor);
                return;
            }
            bool scale2x = ((dest == Vm.TextSurface) && (Vm.TextSurfaceMultiplier == 2) /*&& !(_sjisCurChar >= 256 && Vm.UseCJKMode)*/);

            byte bits  = 0;
            var  col   = Color;
            var  bpp   = Surface.GetBytesPerPixel(dest.PixelFormat);
            int  pitch = dest.Pitch - width * bpp;
            var  dst   = new PixelNavigator(dest);

            dst.GoTo(x, y);
            var dst2 = new PixelNavigator(dst);

            dst2.OffsetY(1);

            var dst3 = new PixelNavigator(dst2);
            var dst4 = new PixelNavigator(dst2);

            if (scale2x)
            {
                dst3.OffsetY(1);
                dst4.OffsetY(1);
                pitch <<= 1;
            }

            for (y = 0; y < height && y + drawTop < dest.Height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    if ((x % 8) == 0)
                    {
                        bits = src.ReadByte();
                    }
                    if (((bits & ScummHelper.RevBitMask(x % 8)) != 0) && y + drawTop >= 0)
                    {
                        if (bpp == 2)
                        {
                            if (_enableShadow)
                            {
                                dst.WriteUInt16(2, Vm._16BitPalette[_shadowColor]);
                                dst.WriteUInt16(2 + dest.Pitch, Vm._16BitPalette[_shadowColor]);
                            }
                            dst.WriteUInt16(Vm._16BitPalette[Color]);
                        }
                        else
                        {
                            if (_enableShadow)
                            {
                                if (scale2x)
                                {
                                    dst.Write(2, _shadowColor);
                                    dst.Write(3, _shadowColor);
                                    dst2.Write(2, _shadowColor);
                                    dst2.Write(3, _shadowColor);

                                    dst3.Write(0, _shadowColor);
                                    dst3.Write(1, _shadowColor);
                                    dst4.Write(0, _shadowColor);
                                    dst4.Write(0, _shadowColor);
                                }
                                else
                                {
                                    dst2.Write(_shadowColor);
                                    dst.Write(1, _shadowColor);
                                }
                            }
                            dst.Write(col);

                            if (scale2x)
                            {
                                dst.Write(1, col);
                                dst2.Write(0, col);
                                dst2.Write(1, col);
                            }
                        }
                    }
                    dst.OffsetX(1);
                    dst2.OffsetX(1);
                    if (scale2x)
                    {
                        dst.OffsetX(1);
                        dst2.OffsetX(1);
                        dst3.OffsetX(1);
                        dst4.OffsetX(1);
                    }
                }

                dst.OffsetX(pitch / dst.BytesByPixel);
                dst2.OffsetX(pitch / dst2.BytesByPixel);
                dst3.OffsetX(pitch / dst3.BytesByPixel);
                dst4.OffsetX(pitch / dst4.BytesByPixel);
            }
        }
Exemplo n.º 40
0
        void Proc3Amiga(Codec1 v1)
        {
            byte len;
            int color;
            bool masked;

            var mask = new PixelNavigator(v1.MaskPtr);
            mask.OffsetX(v1.X / 8);
            var dst = new PixelNavigator(v1.DestPtr);
            byte height = (byte)_height;
            byte width = (byte)_width;
            _loaded.CostumeReader.BaseStream.Seek(_srcptr, System.IO.SeekOrigin.Begin);
            var maskbit = (byte)ScummHelper.RevBitMask(v1.X & 7);
            var y = v1.Y;
            var oldXpos = v1.X;
            var oldScaleIndexX = _scaleIndexX;

            // Indy4 Amiga always uses the room map to match colors to the currently
            // setup palette in the actor code in the original, thus we need to do this
            // mapping over here too.
            var amigaMap = 
                (_vm.Game.Platform == Platform.Amiga && _vm.Game.GameId == GameId.Indy4) ? _vm.Gdi.RoomPalette : null;

            do
            {
                len = _loaded.CostumeReader.ReadByte();
                color = len >> v1.Shr;
                len &= v1.Mask;
                if (len == 0)
                    len = _loaded.CostumeReader.ReadByte();
                do
                {
                    if (ScaleY == 255 || v1.Scaletable[_scaleIndexY] < ScaleY)
                    {
                        masked = (y < 0 || y >= _h) || (v1.X < 0 || v1.X >= _w) || ((mask.Read() & maskbit) != 0);

                        if (color != 0 && !masked)
                        {
                            byte pcolor;
                            if (amigaMap != null)
                                pcolor = amigaMap[_palette[color]];
                            else
                                pcolor = (byte)_palette[color];
                            dst.Write(pcolor);
                        }

                        if (ScaleX == 255 || v1.Scaletable[_scaleIndexX] < ScaleX)
                        {
                            v1.X += v1.ScaleXStep;
                            dst.OffsetX(v1.ScaleXStep);
                            maskbit = (byte)ScummHelper.RevBitMask(v1.X & 7);
                        }
                        _scaleIndexX += (byte)v1.ScaleXStep;
                        mask = new PixelNavigator(v1.MaskPtr);
                        mask.OffsetX(v1.X / 8);
                    }
                    if (--width == 0)
                    {
                        if (--height == 0)
                            return;

                        if (y >= _h)
                            return;

                        if (v1.X != oldXpos)
                        {
                            dst.Offset(-(v1.X - oldXpos), 1);
                            mask = new PixelNavigator(v1.MaskPtr);
                            mask.OffsetY(1);
                            v1.MaskPtr = mask;
                            mask.OffsetX(oldXpos / 8);
                            maskbit = (byte)ScummHelper.RevBitMask(oldXpos & 7);
                            y++;
                        }
                        width = (byte)_width;
                        v1.X = oldXpos;
                        _scaleIndexX = oldScaleIndexX;
                        _scaleIndexY++;
                    }
                } while (--len != 0);
            } while (true);
        }
Exemplo n.º 41
0
        void Proc3(Codec1 v1)
        {
            int y = v1.Y;

            _loaded.CostumeReader.BaseStream.Seek(_srcptr, System.IO.SeekOrigin.Begin);
            var  dst    = new PixelNavigator(v1.DestPtr);
            var  len    = v1.RepLen;
            uint color  = v1.RepColor;
            var  height = (uint)_height;

            var scaleIndexY = _scaleIndexY;
            var maskbit     = (byte)ScummHelper.RevBitMask(v1.X & 7);
            var mask        = new PixelNavigator(v1.MaskPtr);

            mask.OffsetX(v1.X / 8);

            bool ehmerde = (len != 0);

            do
            {
                if (!ehmerde)
                {
                    len   = _loaded.CostumeReader.ReadByte();
                    color = (uint)(len >> v1.Shr);
                    len  &= v1.Mask;
                    if (len == 0)
                    {
                        len = _loaded.CostumeReader.ReadByte();
                    }
                }

                do
                {
                    if (!ehmerde)
                    {
                        if (ScaleY == 255 || v1.Scaletable[scaleIndexY++] < ScaleY)
                        {
                            var masked = (y < 0 || y >= _h) || (v1.X < 0 || v1.X >= _w) || ((mask.Read() & maskbit) != 0);

                            if (color != 0 && !masked)
                            {
                                byte pcolor;
                                if ((ShadowMode & 0x20) != 0)
                                {
                                    pcolor = ShadowTable[dst.Read()];
                                }
                                else
                                {
                                    pcolor = (byte)_palette[color];
                                    if (pcolor == 13 && ShadowTable != null)
                                    {
                                        pcolor = ShadowTable[dst.Read()];
                                    }
                                }
                                dst.Write(pcolor);
                            }
                            dst.OffsetY(1);
                            mask.OffsetY(1);
                            y++;
                        }
                        if ((--height) == 0)
                        {
                            if ((--v1.SkipWidth) == 0)
                            {
                                return;
                            }
                            height = (uint)_height;
                            y      = v1.Y;

                            scaleIndexY = _scaleIndexY;

                            if (ScaleX == 255 || v1.Scaletable[_scaleIndexX] < ScaleX)
                            {
                                v1.X += v1.ScaleXStep;
                                if (v1.X < 0 || v1.X >= _w)
                                {
                                    return;
                                }
                                maskbit = (byte)ScummHelper.RevBitMask(v1.X & 7);
                                v1.DestPtr.OffsetX(v1.ScaleXStep);
                            }
                            _scaleIndexX = (byte)(_scaleIndexX + v1.ScaleXStep);
                            dst          = new PixelNavigator(v1.DestPtr);
                            mask         = new PixelNavigator(v1.MaskPtr);
                            mask.OffsetX(v1.X / 8);
                        }
                    }
                    ehmerde = false;
                } while ((--len) != 0);
            } while (true);
        }
Exemplo n.º 42
0
 static void BompApplyShadow3(byte[] shadowPalette, byte[] lineBuffer, int linePos, PixelNavigator dst, int size, byte transparency)
 {
     while (size-- > 0)
     {
         byte tmp = lineBuffer[linePos++];
         if (tmp != transparency)
         {
             if (tmp < 8)
             {
                 tmp = shadowPalette[dst.Read() + (tmp << 8)];
             }
             dst.Write(tmp);
         }
         dst.OffsetX(1);
     }
 }
Exemplo n.º 43
0
        public void DrawChar(PixelNavigator dst, char c, int x, int y, byte color)
        {
            var width = Math.Min((int)_chars[c].Width, dst.Width - x);
            var height = Math.Min((int)_chars[c].Height, dst.Height - y);
            var src = UnpackChar(c);
            var srcPitch = _chars[c].Width;
            var srcPos = 0;

            var minX = x < 0 ? -x : 0;
            var minY = y < 0 ? -y : 0;

            if (height <= 0 || width <= 0)
            {
                return;
            }

            if (minY != 0)
            {
                srcPos += minY * srcPitch;
                dst.OffsetY(minY);
            }

            for (int ty = minY; ty < height; ty++)
            {
                for (int tx = minX; tx < width; tx++)
                {
                    if (src[srcPos + tx] != _chars[c].Transparency)
                    {
                        if (src[srcPos + tx] == 1)
                        {
                            dst.Write(tx, color);
                        }
                        else
                        {
                            dst.Write(tx, src[srcPos + tx]);
                        }
                    }
                }
                srcPos += srcPitch;
                dst.OffsetY(1);
            }
        }
Exemplo n.º 44
0
        protected virtual void DrawBitsN(Surface s, PixelNavigator dst, System.Collections.Generic.IList<byte> src, int srcPos, byte bpp, int drawTop, int width, int height)
        {
            if (bpp != 1 && bpp != 2 && bpp != 4 && bpp != 8)
                throw new ArgumentException("Invalid bpp", "bpp");

            byte bits = src[srcPos++];
            byte numbits = 8;
            var cmap = Vm.CharsetColorMap;

            for (int y = 0; y < height && y + drawTop < s.Height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    int color = (bits >> (8 - bpp)) & 0xFF;

                    if (color != 0 && (y + drawTop >= 0))
                    {
                        dst.Write(cmap[color]);
                    }
                    dst.OffsetX(1);
                    bits <<= bpp;
                    numbits -= bpp;
                    if (numbits == 0)
                    {
                        bits = src[srcPos++];
                        numbits = 8;
                    }
                }
                dst.Offset(-width, 1);
            }
        }
Exemplo n.º 45
0
        protected override void DrawBitsN(Surface s, PixelNavigator dst, IList <byte> src, int srcPos, byte bpp, int drawTop, int width, int height)
        {
//            if (_sjisCurChar)
//            {
//                assert(Vm._cjkFont);
//                Vm._cjkFont.drawChar(Vm._textSurface, _sjisCurChar, _left * Vm._textSurfaceMultiplier, (_top - Vm._screenTop) * Vm._textSurfaceMultiplier, Vm._townsCharsetColorMap[1], _shadowColor);
//                return;
//            }

            bool scale2x = (Vm.TextSurfaceMultiplier == 2);

            dst = new PixelNavigator(Vm.TextSurface);
            dst.GoTo(Left * Vm.TextSurfaceMultiplier, (Top - Vm.ScreenTop) * Vm.TextSurfaceMultiplier);

            int  y, x;
            int  color;
            byte numbits, bits;

            int pitch = Vm.TextSurface.Pitch - width;

            Debug.Assert(bpp == 1 || bpp == 2 || bpp == 4 || bpp == 8);
            bits    = src[srcPos++];
            numbits = 8;
            var cmap = Vm.CharsetColorMap;
            var dst2 = new PixelNavigator(dst);

            if (Vm.Game.Platform == Platform.FMTowns)
            {
                cmap = Vm.TownsCharsetColorMap;
            }
            if (scale2x)
            {
                dst2.OffsetY(1);
                pitch <<= 1;
            }

            for (y = 0; y < height && y + drawTop < Vm.TextSurface.Height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    color = (bits >> (8 - bpp)) & 0xFF;
                    if (color != 0 && y + drawTop >= 0)
                    {
                        dst.Write(cmap[color]);
                        if (scale2x)
                        {
                            dst.Write(1, dst.Read());
                            dst2.Write(dst.Read());
                            dst2.Write(1, dst.Read());
                        }
                    }
                    dst.OffsetX(1);

                    if (scale2x)
                    {
                        dst.OffsetX(1);
                        dst2.OffsetX(2);
                    }

                    bits   <<= bpp;
                    numbits -= bpp;
                    if (numbits == 0)
                    {
                        bits    = src[srcPos++];
                        numbits = 8;
                    }
                }
                dst.OffsetX(pitch / dst.BytesByPixel);
                dst2.OffsetX(pitch / dst2.BytesByPixel);
            }
        }
Exemplo n.º 46
0
        void DrawFlashlight()
        {
            int i, j, x, y;
            var vs = MainVirtScreen;

            // Remove the flash light first if it was previously drawn
            if (_flashlight.IsDrawn)
            {
                MarkRectAsDirty(MainVirtScreen, _flashlight.X, _flashlight.X + _flashlight.W,
                    _flashlight.Y, _flashlight.Y + _flashlight.H, Gdi.UsageBitDirty);

                if (_flashlight.PixelNavigator.HasValue)
                {
                    Gdi.Fill(_flashlight.PixelNavigator.Value, 0, _flashlight.W, _flashlight.H);
                }
                _flashlight.IsDrawn = false;
            }

            if (_flashlight.XStrips == 0 || _flashlight.YStrips == 0)
                return;

            // Calculate the area of the flashlight
            if (Game.GameId == GameId.Zak || Game.GameId == GameId.Maniac)
            {
                x = _mousePos.X + vs.XStart;
                y = _mousePos.Y - vs.TopLine;
            }
            else
            {
                var a = Actors[Variables[VariableEgo.Value]];
                x = a.Position.X;
                y = a.Position.Y;
            }
            _flashlight.W = _flashlight.XStrips * 8;
            _flashlight.H = _flashlight.YStrips * 8;
            _flashlight.X = x - _flashlight.W / 2 - _screenStartStrip * 8;
            _flashlight.Y = y - _flashlight.H / 2;

            if (Game.GameId == GameId.Loom)
                _flashlight.Y -= 12;

            // Clip the flashlight at the borders
            if (_flashlight.X < 0)
                _flashlight.X = 0;
            else if (_flashlight.X + _flashlight.W > Gdi.NumStrips * 8)
                _flashlight.X = Gdi.NumStrips * 8 - _flashlight.W;
            if (_flashlight.Y < 0)
                _flashlight.Y = 0;
            else if (_flashlight.Y + _flashlight.H > vs.Height)
                _flashlight.Y = vs.Height - _flashlight.H;

            // Redraw any actors "under" the flashlight
            for (i = _flashlight.X / 8; i < (_flashlight.X + _flashlight.W) / 8; i++)
            {
                Debug.Assert(0 <= i && i < Gdi.NumStrips);
                Gdi.SetGfxUsageBit(_screenStartStrip + i, Gdi.UsageBitDirty);
                vs.TDirty[i] = 0;
                vs.BDirty[i] = vs.Height;
            }

            var pn = new PixelNavigator(vs.Surfaces[0]);
            pn.GoTo(_flashlight.X + vs.XStart, _flashlight.Y);
            pn = new PixelNavigator(pn);
            _flashlight.PixelNavigator = pn;
            var bgbak = new PixelNavigator(vs.Surfaces[1]);
            bgbak.GoTo(_flashlight.X + vs.XStart, _flashlight.Y);

            Gdi.Blit(pn, bgbak, _flashlight.W, _flashlight.H);

            // Round the corners. To do so, we simply hard-code a set of nicely
            // rounded corners.
            var corner_data = new [] { 8, 6, 4, 3, 2, 2, 1, 1 };
            int minrow = 0;
            int maxcol = (_flashlight.W - 1);
            int maxrow = (_flashlight.H - 1);

            for (i = 0; i < 8; i++, minrow++, maxrow--)
            {
                int d = corner_data[i];

                for (j = 0; j < d; j++)
                {
                    if (vs.BytesPerPixel == 2)
                    {
                        pn.GoTo(j, minrow);
                        pn.WriteUInt16(0);
                        pn.GoTo(maxcol - j, minrow);
                        pn.WriteUInt16(0);
                        pn.GoTo(j, maxrow);
                        pn.WriteUInt16(0);
                        pn.GoTo(maxcol - j, maxrow);
                        pn.WriteUInt16(0);
                    }
                    else
                    {
                        pn.GoTo(j, minrow);
                        pn.Write(0);
                        pn.GoTo(maxcol - j, minrow);
                        pn.Write(0);
                        pn.GoTo(j, maxrow);
                        pn.Write(0);
                        pn.GoTo(maxcol - j, maxrow);
                        pn.Write(0);
                    }
                }
            }

            _flashlight.IsDrawn = true;
        }
Exemplo n.º 47
0
        void Proc3(Codec1 v1)
        {
            int y = v1.Y;
            _loaded.CostumeReader.BaseStream.Seek(_srcptr, System.IO.SeekOrigin.Begin);
            var dst = new PixelNavigator(v1.DestPtr);
            var len = v1.RepLen;
            uint color = v1.RepColor;
            var height = (uint)_height;

            var scaleIndexY = _scaleIndexY;
            var maskbit = (byte)ScummHelper.RevBitMask(v1.X & 7);
            var mask = new PixelNavigator(v1.MaskPtr);
            mask.OffsetX(v1.X / 8);

            bool ehmerde = (len != 0);

            do
            {
                if (!ehmerde)
                {
                    len = _loaded.CostumeReader.ReadByte();
                    color = (uint)(len >> v1.Shr);
                    len &= v1.Mask;
                    if (len == 0)
                        len = _loaded.CostumeReader.ReadByte();
                }

                do
                {
                    if (!ehmerde)
                    {
                        if (ScaleY == 255 || v1.Scaletable[scaleIndexY++] < ScaleY)
                        {
                            var masked = (y < 0 || y >= _h) || (v1.X < 0 || v1.X >= _w) || ((mask.Read() & maskbit) != 0);

                            if (color != 0 && !masked)
                            {
                                byte pcolor;
                                if ((ShadowMode & 0x20) != 0)
                                {
                                    pcolor = ShadowTable[dst.Read()];
                                }
                                else
                                {
                                    pcolor = (byte)_palette[color];
                                    if (pcolor == 13 && ShadowTable != null)
                                        pcolor = ShadowTable[dst.Read()];
                                }
                                dst.Write(pcolor);
                            }
                            dst.OffsetY(1);
                            mask.OffsetY(1);
                            y++;
                        }
                        if ((--height) == 0)
                        {
                            if ((--v1.SkipWidth) == 0)
                                return;
                            height = (uint)_height;
                            y = v1.Y;

                            scaleIndexY = _scaleIndexY;

                            if (ScaleX == 255 || v1.Scaletable[_scaleIndexX] < ScaleX)
                            {
                                v1.X += v1.ScaleXStep;
                                if (v1.X < 0 || v1.X >= _w)
                                    return;
                                maskbit = (byte)ScummHelper.RevBitMask(v1.X & 7);
                                v1.DestPtr.OffsetX(v1.ScaleXStep);
                            }
                            _scaleIndexX = (byte)(_scaleIndexX + v1.ScaleXStep);
                            dst = new PixelNavigator(v1.DestPtr);
                            mask = new PixelNavigator(v1.MaskPtr);
                            mask.OffsetX(v1.X / 8);
                        }
                    }
                    ehmerde = false;
                } while ((--len) != 0);
            } while (true);
        }
Exemplo n.º 48
0
 void WriteRoomColor(PixelNavigator navDst, int color)
 {
     // As described in bug #1294513 "FOA/Amiga: Palette problem (Regression)"
     // the original AMIGA version of Indy4: The Fate of Atlantis allowed
     // overflowing of the palette index. To have the same result in our code,
     // we need to do an logical AND 0xFF here to keep the result in [0, 255].
     navDst.Write(RoomPalette[(color + paletteMod) & 0xFF]);
 }
Exemplo n.º 49
0
 public static void BompApplyShadow0(byte[] lineBuffer, int linePos, PixelNavigator dst, int size)
 {
     while (size-- > 0)
     {
         byte tmp = lineBuffer[linePos++];
         if (tmp != 255)
         {
             dst.Write(tmp);
         }
         dst.OffsetX(1);
     }
 }
Exemplo n.º 50
0
        void DrawStripEGA(PixelNavigator navDst, BinaryReader src, int height)
        {
            byte color;
            int run;
            int x = 0, y = 0;
            int z;

            navDst = new PixelNavigator(navDst);

            while (x < 8)
            {
                color = src.ReadByte();

                if ((color & 0x80) != 0)
                {
                    run = color & 0x3f;

                    if ((color & 0x40) != 0)
                    {
                        color = src.ReadByte();

                        if (run == 0)
                        {
                            run = src.ReadByte();
                        }
                        for (z = 0; z < run; z++)
                        {
                            navDst.GoTo(x, y);
                            navDst.Write((z & 1) != 0 ? RoomPalette[(color & 0xf) + paletteMod] : RoomPalette[(color >> 4) + paletteMod]);

                            y++;
                            if (y >= height)
                            {
                                y = 0;
                                x++;
                            }
                        }
                    }
                    else
                    {
                        if (run == 0)
                        {
                            run = src.ReadByte();
                        }

                        for (z = 0; z < run; z++)
                        {
                            navDst.GoTo(x - 1, y);
                            var col = navDst.Read();
                            navDst.GoTo(x, y);
                            navDst.Write(col);

                            y++;
                            if (y >= height)
                            {
                                y = 0;
                                x++;
                            }
                        }
                    }
                }
                else
                {
                    run = color >> 4;
                    if (run == 0)
                    {
                        run = src.ReadByte();
                    }

                    for (z = 0; z < run; z++)
                    {
                        navDst.GoTo(x, y);
                        navDst.Write(RoomPalette[(color & 0xf) + paletteMod]);

                        y++;
                        if (y >= height)
                        {
                            y = 0;
                            x++;
                        }
                    }
                }
            }
        }
Exemplo n.º 51
0
        void DrawStripV1Background(PixelNavigator navDst, int stripnr, int height)
        {
            int charIdx;
            height /= 8;
            for (int y = 0; y < height; y++)
            {
                _v1.Colors[3] = (byte)(_v1.ColorMap[y + stripnr * height] & 7);
                // Check for room color change in V1 zak
                if (RoomPalette[0] == 255)
                {
                    _v1.Colors[2] = RoomPalette[2];
                    _v1.Colors[1] = RoomPalette[1];
                }

                charIdx = _v1.PicMap[y + stripnr * height] * 8;
                for (int i = 0; i < 8; i++)
                {
                    byte c = _v1.CharMap[charIdx + i];
                    var color = _v1.Colors[(c >> 6) & 3];
                    navDst.Write(0, color);
                    navDst.Write(1, color);
                    color = _v1.Colors[(c >> 4) & 3];
                    navDst.Write(2, color);
                    navDst.Write(3, color);
                    color = _v1.Colors[(c >> 2) & 3];
                    navDst.Write(4, color);
                    navDst.Write(5, color);
                    color = _v1.Colors[(c >> 0) & 3];
                    navDst.Write(6, color);
                    navDst.Write(7, color);
                    navDst.OffsetY(1);
                }
            }
        }
Exemplo n.º 52
0
        void UnkDecode11(PixelNavigator navDst, BinaryReader src, int height)
        {
            int i;
            int buffer = 0, mask = 128;
            int inc = 1;
            int color = src.ReadByte();
		
            int x = 8;
            do
            {
                int h = height;
                do
                {
                    navDst.Write(RoomPalette[color]);
                    navDst.OffsetY(1);
                    for (i = 0; i < 3; i++)
                    {
                        if (!ReadBit256(src, ref mask, ref buffer))
                            break;
                    }
                    switch (i)
                    {
                        case 1:
                            inc = -inc;
                            color -= inc;
                            break;
                        case 2:
                            color -= inc;
                            break;
                        case 3:
                            inc = 1;
                            color = ReadNBits(src, 8, ref mask, ref buffer);
                            break;
                    }
                } while ((--h) != 0);
                navDst.Offset(1, -height);
            } while ((--x) != 0);
        }
Exemplo n.º 53
0
        protected override void DrawBitsN(Surface s, PixelNavigator dst, IList<byte> src, int srcPos, byte bpp, int drawTop, int width, int height)
        {
//            if (_sjisCurChar)
//            {
//                assert(Vm._cjkFont);
//                Vm._cjkFont.drawChar(Vm._textSurface, _sjisCurChar, _left * Vm._textSurfaceMultiplier, (_top - Vm._screenTop) * Vm._textSurfaceMultiplier, Vm._townsCharsetColorMap[1], _shadowColor);
//                return;
//            }

            bool scale2x = (Vm.TextSurfaceMultiplier == 2);
            dst = new PixelNavigator(Vm.TextSurface);
            dst.GoTo(Left * Vm.TextSurfaceMultiplier, (Top - Vm.ScreenTop) * Vm.TextSurfaceMultiplier);

            int y, x;
            int color;
            byte numbits, bits;

            int pitch = Vm.TextSurface.Pitch - width;

            Debug.Assert(bpp == 1 || bpp == 2 || bpp == 4 || bpp == 8);
            bits = src[srcPos++];
            numbits = 8;
            var cmap = Vm.CharsetColorMap;
            var dst2 = new PixelNavigator(dst);

            if (Vm.Game.Platform == Platform.FMTowns)
                cmap = Vm.TownsCharsetColorMap;
            if (scale2x)
            {
                dst2.OffsetY(1);
                pitch <<= 1;
            }

            for (y = 0; y < height && y + drawTop < Vm.TextSurface.Height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    color = (bits >> (8 - bpp)) & 0xFF;
                    if (color != 0 && y + drawTop >= 0)
                    {
                        dst.Write(cmap[color]);
                        if (scale2x)
                        {
                            dst.Write(1, dst.Read());
                            dst2.Write(dst.Read());
                            dst2.Write(1, dst.Read());
                        }
                    }
                    dst.OffsetX(1);

                    if (scale2x)
                    {
                        dst.OffsetX(1);
                        dst2.OffsetX(2);
                    }

                    bits <<= bpp;
                    numbits -= bpp;
                    if (numbits == 0)
                    {
                        bits = src[srcPos++];
                        numbits = 8;
                    }
                }
                dst.OffsetX(pitch / dst.BytesByPixel);
                dst2.OffsetX(pitch / dst2.BytesByPixel);
            }
        }
Exemplo n.º 54
0
        static void DecompressMaskImg(PixelNavigator dst, Stream src, int height)
        {
            while (height != 0)
            {
                var b = (byte)src.ReadByte();

                if ((b & 0x80) != 0)
                {
                    b &= 0x7F;
                    var c = (byte)src.ReadByte();

                    do
                    {
                        dst.Write(c);
                        dst.OffsetY(1);
                        --height;
                    } while (--b != 0 && height != 0);
                }
                else
                {
                    do
                    {
                        dst.Write((byte)src.ReadByte());
                        dst.OffsetY(1);
                        --height;
                    } while (--b != 0 && height != 0);
                }
            }
        }
Exemplo n.º 55
0
 protected virtual void DrawBits1(Surface surface, int x, int y, BinaryReader src, int drawTop, int width, int height)
 {
     var dst = new PixelNavigator(surface);
     dst.GoTo(x, y);
     
     byte bits = 0;
     byte col = Color;
     //int pitch = surface.Pitch - width * surface.BytesPerPixel;
     var dst2 = new PixelNavigator(dst);
     dst2.OffsetY(1);
     
     for (y = 0; y < height && y + drawTop < surface.Height; y++)
     {
         for (x = 0; x < width; x++)
         {
             if ((x % 8) == 0)
                 bits = src.ReadByte();
             if ((bits & ScummHelper.RevBitMask(x % 8)) != 0 && y + drawTop >= 0)
             {
                 if (_shadowMode)
                 {
                     dst.OffsetX(1);
                     dst.Write(_shadowColor);
                     dst2.Write(_shadowColor);
                     dst2.OffsetX(1);
                     dst2.Write(_shadowColor);
                 }
                 dst.Write(col);
             }
             dst.OffsetX(1);
             dst2.OffsetX(1);
         }
     
         dst.OffsetX(surface.Width - width);
         dst2.OffsetX(surface.Width - width);
     }
 }
Exemplo n.º 56
0
        /// <summary>
        /// Blit the specified rectangle from the given virtual screen to the display.
        /// Note: t and b are in *virtual screen* coordinates, while x is relative to
        /// the *real screen*. This is due to the way tdirty/vdirty work: they are
        /// arrays which map 'strips' (sections of the real screen) to dirty areas as
        /// specified by top/bottom coordinate in the virtual screen.
        /// </summary>
        /// <param name="vs"></param>
        /// <param name="x"></param>
        /// <param name="width"></param>
        /// <param name="top"></param>
        /// <param name="bottom"></param>
        void DrawStripToScreen(VirtScreen vs, int x, int width, int top, int bottom)
        {
            // Short-circuit if nothing has to be drawn
            if (bottom <= top || top >= vs.Height)
                return;

            // Perform some clipping
            if (width > vs.Width - x)
                width = vs.Width - x;
            if (top < ScreenTop)
                top = ScreenTop;
            if (bottom > ScreenTop + ScreenHeight)
                bottom = ScreenTop + ScreenHeight;

            // Convert the vertical coordinates to real screen coords
            int y = vs.TopLine + top - ScreenTop;
            int height = bottom - top;

            if (width <= 0 || height <= 0)
                return;

            byte[] src;
            if (Game.Version < 7)
            {
                if (Game.Platform == Platform.FMTowns)
                {
                    TownsDrawStripToScreen(vs, x, y, x, top, width, height);
                    return;
                }

                var srcNav = new PixelNavigator(vs.Surfaces[0]);
                srcNav.GoTo(vs.XStart + x, top);

                var compNav = new PixelNavigator(_composite);
                var txtNav = new PixelNavigator(_textSurface);
                int m = _textSurfaceMultiplier;
                txtNav.GoTo(x * m, y * m);

                var vsPitch = vs.Pitch - width * vs.BytesPerPixel;
                var textPitch = _textSurface.Pitch - width * m;

                for (int h = height * m; h > 0; --h)
                {
                    for (int w = width * m; w > 0; w--)
                    {
                        var temp = txtNav.Read();
                        int mask = temp ^ CharsetMaskTransparency;
                        mask = (((mask & 0x7f) + 0x7f) | mask) & 0x80;
                        mask = ((mask >> 7) + 0x7f) ^ 0x80;

                        var dst = ((temp ^ srcNav.Read()) & mask) ^ temp;
                        compNav.Write((byte)dst);

                        srcNav.OffsetX(1);
                        txtNav.OffsetX(1);
                        compNav.OffsetX(1);
                    }

                    srcNav.OffsetX(vsPitch);
                    txtNav.OffsetX(textPitch);
                }

                src = _composite.Pixels;
            }
            else
            {
                src = new byte[width * height * vs.BytesPerPixel];
                var srcNav = new PixelNavigator(vs.Surfaces[0]);
                srcNav.GoTo(vs.XStart + x, top);
                for (int h = 0; h < height; h++)
                {
                    for (int w = 0; w < width; w++)
                    {
                        src[h * width + w] = srcNav.Read();
                        srcNav.OffsetX(1);
                    }
                    srcNav.Offset(-width, 1);
                }
            }

            // Finally blit the whole thing to the screen
            _gfxManager.CopyRectToScreen(src, width * vs.BytesPerPixel, x, y, width, height);
        }
Exemplo n.º 57
0
        void CheckV2MouseOver(Point pos)
        {
            var vs = VerbVirtScreen;
            Rect rect;
            int i, x, y, new_box = -1;

            // Don't do anything unless the inventory is active
            if (!_userState.HasFlag(UserStates.IFaceInventory))
            {
                _mouseOverBoxV2 = -1;
                return;
            }

            if (_cursor.State > 0)
            {
                for (i = 0; i < _mouseOverBoxesV2.Length; i++)
                {
                    if (_mouseOverBoxesV2[i].rect.Contains(pos.X, pos.Y - vs.TopLine))
                    {
                        new_box = i;
                        break;
                    }
                }
            }

            if ((new_box != _mouseOverBoxV2) || (Game.Version == 0))
            {
                if (_mouseOverBoxV2 != -1)
                {
                    rect = _mouseOverBoxesV2[_mouseOverBoxV2].rect;

                    var dst = new PixelNavigator(vs.Surfaces[0]);
                    dst.GoTo(rect.Left, rect.Top);

                    // Remove highlight.
                    for (y = rect.Height - 1; y >= 0; y--)
                    {
                        for (x = rect.Width - 1; x >= 0; x--)
                        {
                            if (dst.Read() == _mouseOverBoxesV2[_mouseOverBoxV2].hicolor)
                                dst.Write(_mouseOverBoxesV2[_mouseOverBoxV2].color);
                            dst.OffsetX(1);
                        }
                        dst.Offset(-rect.Width, 1);
                    }

                    MarkRectAsDirty(VerbVirtScreen, rect);
                }

                if (new_box != -1)
                {
                    rect = _mouseOverBoxesV2[new_box].rect;

                    var dst = new PixelNavigator(vs.Surfaces[0]);
                    dst.GoTo(rect.Left, rect.Top);

                    // Apply highlight
                    for (y = rect.Height - 1; y >= 0; y--)
                    {
                        for (x = rect.Width - 1; x >= 0; x--)
                        {
                            if (dst.Read() == _mouseOverBoxesV2[new_box].color)
                                dst.Write(_mouseOverBoxesV2[new_box].hicolor);
                            dst.OffsetX(1);
                        }
                        dst.Offset(-rect.Width, 1);
                    }

                    MarkRectAsDirty(VerbVirtScreen, rect);
                }

                _mouseOverBoxV2 = (sbyte)new_box;
            }
        }
Exemplo n.º 58
0
        static void DecompressMaskImgOr(PixelNavigator dst, Stream src, int height)
        {
            byte b, c;

            while (height != 0)
            {
                b = (byte)src.ReadByte();

                if ((b & 0x80) != 0)
                {
                    b &= 0x7F;
                    c = (byte)src.ReadByte();

                    do
                    {
                        dst.Write((byte)(dst.Read() | c));
                        dst.OffsetY(1);
                        --height;
                    } while ((--b != 0) && (height != 0));
                }
                else
                {
                    do
                    {
                        dst.Write((byte)(dst.Read() | src.ReadByte()));
                        dst.OffsetY(1);
                        --height;
                    } while ((--b != 0) && (height != 0));
                }
            }
        }