예제 #1
0
        public override void LoadTextures(IEnumerable <TextureItem> items)
        {
            var list     = items.ToList();
            var packages = list.Select(x => x.Package).Distinct().ToList();
            var packs    = packages.Select(x =>
            {
                if (!_roots.ContainsKey(x))
                {
                    var wp = new WadStream(new WadPackage(new FileInfo(x.PackageRoot)));
                    _roots.Add(x, wp);
                }
                return(_roots[x]);
            }).ToList();
            var streams = packs.Select(x => x.StreamSource).ToList();

            // Process the bitmaps in parallel
            var bitmaps = list.AsParallel().Select(ti =>
            {
                var stream = streams.FirstOrDefault(x => x.HasFile(ti.Name.ToLowerInvariant()));
                if (stream == null)
                {
                    return(null);
                }

                var open = stream.OpenFile(ti.Name.ToLowerInvariant());
                if (open == null)
                {
                    return(null);
                }

                var bmp = new Bitmap(open);
                bool hasTransparency;
                bmp = PostProcessBitmap(ti.Package.PackageRelativePath, ti.Name.ToLowerInvariant(), bmp, out hasTransparency);
                open.Dispose();

                return(new
                {
                    Bitmap = bmp,
                    Name = ti.Name.ToLowerInvariant(),
                    ti.Width,
                    ti.Height,
                    ti.Flags
                });
            }).Where(x => x != null);

            // TextureHelper.Create must run on the UI thread
            foreach (var bmp in bitmaps)
            {
                TextureHelper.Create(bmp.Name, bmp.Bitmap, bmp.Width, bmp.Height, bmp.Flags);
                bmp.Bitmap.Dispose();
            }
        }
예제 #2
0
        public override ITextureStreamSource GetStreamSource(int maxWidth, int maxHeight, IEnumerable <TexturePackage> packages)
        {
            var packs = packages.Select(x =>
            {
                if (!_roots.ContainsKey(x))
                {
                    var wp = new WadStream(new WadPackage(new FileInfo(x.PackageRoot)));
                    _roots.Add(x, wp);
                }
                return(_roots[x]);
            }).ToList();
            var streams = packs.Select(x => x.StreamSource).ToList();

            return(new WadStreamSource(streams));
        }
예제 #3
0
파일: WadProvider.cs 프로젝트: silky/sledge
        public override ITextureStreamSource GetStreamSource(int maxWidth, int maxHeight, IEnumerable<TexturePackage> packages)
        {
            var packs = packages.Select(x =>
            {
                if (!_roots.ContainsKey(x))
                {
                    var wp = new WadStream(new WadPackage(new FileInfo(x.PackageRoot)));
                    _roots.Add(x, wp);
                }
                return _roots[x];

            }).ToList();
            var streams = packs.Select(x => x.StreamSource).ToList();
            return new WadStreamSource(streams);
        }
예제 #4
0
파일: WadProvider.cs 프로젝트: silky/sledge
        public override void LoadTextures(IEnumerable<TextureItem> items)
        {
            var list = items.ToList();
            var packages = list.Select(x => x.Package).Distinct().ToList();
            var packs = packages.Select(x =>
            {
                if (!_roots.ContainsKey(x))
                {
                    var wp = new WadStream(new WadPackage(new FileInfo(x.PackageRoot)));
                    _roots.Add(x, wp);
                }
                return _roots[x];

            }).ToList();
            var streams = packs.Select(x => x.StreamSource).ToList();

            // Process the bitmaps in parallel
            var bitmaps = list.AsParallel().Select(ti =>
            {
                var stream = streams.FirstOrDefault(x => x.HasFile(ti.Name.ToLowerInvariant()));
                if (stream == null) return null;

                var open = stream.OpenFile(ti.Name.ToLowerInvariant());
                if (open == null) return null;

                var bmp = new Bitmap(open);
                bool hasTransparency;
                bmp = PostProcessBitmap(ti.Package.PackageRelativePath, ti.Name.ToLowerInvariant(), bmp, out hasTransparency);
                open.Dispose();

                return new
                {
                    Bitmap = bmp,
                    Name = ti.Name.ToLowerInvariant(),
                    ti.Width,
                    ti.Height,
                    ti.Flags
                };
            }).Where(x => x != null);

            // TextureHelper.Create must run on the UI thread
            foreach (var bmp in bitmaps)
            {
                TextureHelper.Create(bmp.Name, bmp.Bitmap, bmp.Width, bmp.Height, bmp.Flags);
                bmp.Bitmap.Dispose();
            }
        }
예제 #5
0
        private TexturePackage CreatePackage(string package)
        {
            try
            {
                var fi = new FileInfo(package);
                if (!fi.Exists)
                {
                    return(null);
                }

                var tp = new TexturePackage(package, Path.GetFileNameWithoutExtension(package), this);
                if (LoadFromCache(tp))
                {
                    return(tp);
                }

                var list = new List <TextureItem>();

                var pack = _roots.Values.FirstOrDefault(x => x.Package.PackageFile.FullName == fi.FullName);
                if (pack == null)
                {
                    _roots.Add(tp, pack = new WadStream(new WadPackage(fi)));
                }

                list.AddRange(pack.Package.GetEntries().OfType <WadEntry>().Select(x => new TextureItem(tp, x.Name, GetFlags(x.Name), (int)x.Width, (int)x.Height)));
                foreach (var ti in list)
                {
                    tp.AddTexture(ti);
                }
                SaveToCache(tp);
                return(tp);
            }
            catch
            {
                return(null);
            }
        }
예제 #6
0
파일: WadProvider.cs 프로젝트: silky/sledge
        private TexturePackage CreatePackage(string package)
        {
            try
            {
                var fi = new FileInfo(package);
                if (!fi.Exists) return null;

                var tp = new TexturePackage(package, Path.GetFileNameWithoutExtension(package), this);
                if (LoadFromCache(tp)) return tp;

                var list = new List<TextureItem>();

                var pack = _roots.Values.FirstOrDefault(x => x.Package.PackageFile.FullName == fi.FullName);
                if (pack == null) _roots.Add(tp, pack = new WadStream(new WadPackage(fi)));

                list.AddRange(pack.Package.GetEntries().OfType<WadEntry>().Select(x => new TextureItem(tp, x.Name, GetFlags(x.Name), (int) x.Width, (int) x.Height)));
                foreach (var ti in list)
                {
                    tp.AddTexture(ti);
                }
                SaveToCache(tp);
                return tp;
            }
            catch
            {
                return null;
            }
        }