예제 #1
0
        void Akos16Decompress(PixelNavigator dest, int srcPos, int t_width, int t_height, int dir,
                              int numskip_before, int numskip_after, byte transparency, int maskLeft, int maskTop, int zBuf)
        {
            var tmp_buf = _akos16.Buffer;
            var tmp_pos = 0;
            var maskbit = (byte)ScummHelper.RevBitMask(maskLeft & 7);

            if (dir < 0)
            {
                dest.OffsetX(-(t_width - 1));
                tmp_pos += (t_width - 1);
            }

            Akos16SetupBitReader(srcPos);

            if (numskip_before != 0)
            {
                Akos16SkipData(numskip_before);
            }

            var maskptr = _vm.GetMaskBuffer(maskLeft, maskTop, zBuf);

            Debug.Assert(t_height > 0);
            Debug.Assert(t_width > 0);
            while ((t_height--) != 0)
            {
                Akos16DecodeLine(tmp_buf, tmp_pos, t_width, dir);
                BompDrawData.BompApplyMask(_akos16.Buffer, 0, maskptr, maskbit, t_width, transparency);
                BompDrawData.BompApplyShadow(ShadowMode, ShadowTable, _akos16.Buffer, 0, dest, t_width, transparency);

                if (numskip_after != 0)
                {
                    Akos16SkipData(numskip_after);
                }
                dest.OffsetY(1);
                maskptr.OffsetY(1);
            }
        }
예제 #2
0
        byte Codec5(int xmoveCur, int ymoveCur)
        {
            Rect clip;
            int  maxw, maxh;

            if (ActorHitMode)
            {
                throw new NotImplementedException("codec5: _actorHitMode not yet implemented");
            }

            if (!_mirror)
            {
                clip.Left = (ActorX - xmoveCur - _width) + 1;
            }
            else
            {
                clip.Left = ActorX + xmoveCur - 1;
            }

            clip.Top    = ActorY + ymoveCur;
            clip.Right  = clip.Left + _width;
            clip.Bottom = clip.Top + _height;
            maxw        = _vm.MainVirtScreen.Width;
            maxh        = _vm.MainVirtScreen.Height;

            MarkRectAsDirty(clip);

            clip.Clip(maxw, maxh);

            if ((clip.Left >= clip.Right) || (clip.Top >= clip.Bottom))
            {
                return(0);
            }

            if (DrawTop > clip.Top)
            {
                DrawTop = clip.Top;
            }
            if (DrawBottom < clip.Bottom)
            {
                DrawBottom = clip.Bottom;
            }

            var bdd = new BompDrawData();

            bdd.Dst = startNav;
            if (!_mirror)
            {
                bdd.X = (ActorX - xmoveCur - _width) + 1;
            }
            else
            {
                bdd.X = ActorX + xmoveCur;
            }
            bdd.Y = ActorY + ymoveCur;

            var src = new byte[akcd.Length - _srcptr];

            Array.Copy(akcd, _srcptr, src, 0, src.Length);
            bdd.Src    = src;
            bdd.Width  = _width;
            bdd.Height = _height;

            bdd.ScaleX = 255;
            bdd.ScaleY = 255;

            bdd.MaskPtr   = _vm.GetMaskBuffer(0, 0, ZBuffer);
            bdd.NumStrips = _vm.Gdi.NumStrips;

            bdd.ShadowMode    = ShadowMode;
            bdd.ShadowPalette = _vm.ShadowPalette;

            bdd.ActorPalette = _useBompPalette ? _palette : null;

            bdd.Mirror = !_mirror;

            bdd.DrawBomp();

            _useBompPalette = false;

            return(0);
        }
예제 #3
0
        byte Codec5(int xmoveCur, int ymoveCur)
        {
            Rect clip;
            int maxw, maxh;

            if (ActorHitMode)
            {
                throw new NotImplementedException("codec5: _actorHitMode not yet implemented");
            }

            if (!_mirror)
            {
                clip.Left = (ActorX - xmoveCur - _width) + 1;
            }
            else
            {
                clip.Left = ActorX + xmoveCur - 1;
            }

            clip.Top = ActorY + ymoveCur;
            clip.Right = clip.Left + _width;
            clip.Bottom = clip.Top + _height;
            maxw = _vm.MainVirtScreen.Width;
            maxh = _vm.MainVirtScreen.Height;

            MarkRectAsDirty(clip);

            clip.Clip(maxw, maxh);

            if ((clip.Left >= clip.Right) || (clip.Top >= clip.Bottom))
                return 0;

            if (DrawTop > clip.Top)
                DrawTop = clip.Top;
            if (DrawBottom < clip.Bottom)
                DrawBottom = clip.Bottom;

            var bdd = new BompDrawData();

            bdd.Dst = startNav;
            if (!_mirror)
            {
                bdd.X = (ActorX - xmoveCur - _width) + 1;
            }
            else
            {
                bdd.X = ActorX + xmoveCur;
            }
            bdd.Y = ActorY + ymoveCur;

            var src = new byte[akcd.Length - _srcptr];
            Array.Copy(akcd, _srcptr, src, 0, src.Length);
            bdd.Src = src;
            bdd.Width = _width;
            bdd.Height = _height;

            bdd.ScaleX = 255;
            bdd.ScaleY = 255;

            bdd.MaskPtr = _vm.GetMaskBuffer(0, 0, ZBuffer);
            bdd.NumStrips = _vm.Gdi.NumStrips;

            bdd.ShadowMode = ShadowMode;
            bdd.ShadowPalette = _vm.ShadowPalette;

            bdd.ActorPalette = _useBompPalette ? _palette : null;

            bdd.Mirror = !_mirror;

            bdd.DrawBomp();

            _useBompPalette = false;

            return 0;
        }
예제 #4
0
        void DumpRoomObjectImages(Room room, ObjectData obj, Gdi gdi)
        {
            var text = new ScummText(obj.Name);
            var sb = new StringBuilder();
            sb.Append("Object #" + obj.Number).Append(" ");

            var decoder = new TextDecoder(sb);
            text.Decode(decoder);

            sb.AppendFormat(" size: {0}x{1}", obj.Width, obj.Height);
            Console.WriteLine(sb);

            var j = 0;
            foreach (var img in obj.Images)
            {
//                try
//                {
                var screen = new VirtScreen(0, obj.Width, obj.Height, PixelFormat.Indexed8, 2);
                if (img.IsBomp)
                {
                    var bdd = new BompDrawData();
                    bdd.Src = img.Data;
                    bdd.Dst = new PixelNavigator(screen.Surfaces[0]);
                    bdd.X = 0;
                    bdd.Y = 0;

                    bdd.Width = obj.Width;
                    bdd.Height = obj.Height;

                    bdd.ScaleX = 255;
                    bdd.ScaleY = 255;
                    bdd.DrawBomp();
                }
                else
                {
                    gdi.DrawBitmap(img, screen, new Point(0, 0), obj.Width, obj.Height & 0xFFF8, 0, obj.Width / 8, room.Header.Width, DrawBitmaps.None, true);
                }

                using (var bmp = ToBitmap(room, screen))
                {
                    bmp.Save("obj_" + obj.Number + "_" + (++j) + ".png");
                }
//                }
//                catch (Exception e)
//                {
//                    Console.ForegroundColor = ConsoleColor.Red;
//                    Console.WriteLine(e);
//                    Console.ResetColor();
//                    Console.ReadLine();
//                }
            }
        }
예제 #5
0
        void DrawBlastObject(BlastObject eo)
        {
            var objnum = GetObjectIndex(eo.Number);
            if (objnum == -1)
                throw new NotSupportedException(string.Format("DrawBlastObject: GetObjectIndex on BlastObject {0} failed", eo.Number));

            if (_objs[objnum].Images.Count == 0)
                return;

            var index = eo.Image >= _objs[objnum].Images.Count ? 0 : eo.Image < 0 ? 0 : eo.Image;
            var img = _objs[objnum].Images[index];

            if (!img.IsBomp)
                throw new NotSupportedException(string.Format("object {0} is not a blast object", eo.Number));

            var bdd = new BompDrawData();
            bdd.Src = img.Data;
            bdd.Dst = new PixelNavigator(MainVirtScreen.Surfaces[0]);
            bdd.Dst.GoTo(MainVirtScreen.XStart, 0);
            bdd.X = eo.Rect.Left;
            bdd.Y = eo.Rect.Top;

            bdd.Width = _objs[objnum].Width;
            bdd.Height = _objs[objnum].Height;

            bdd.ScaleX = eo.ScaleX;
            bdd.ScaleY = eo.ScaleY;

            if ((bdd.ScaleX != 255) || (bdd.ScaleY != 255))
            {
                bdd.ShadowMode = 0;
            }
            else
            {
                bdd.ShadowMode = eo.Mode;
            }
            bdd.ShadowPalette = _shadowPalette;

            bdd.DrawBomp();

            MarkRectAsDirty(MainVirtScreen, new Rect(bdd.X, bdd.X + bdd.Width, bdd.Y, bdd.Y + bdd.Height));
        }