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); } }
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); }
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; }
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(); // } } }
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)); }