Ejemplo n.º 1
0
        public static ImageResource CreateImageResource(PsdBinaryReader reader)
        {
            Util.DebugMessage(reader.BaseStream, "Load, Begin, ImageResource");

            var signature     = reader.ReadAsciiChars(4);
            var resourceIdInt = reader.ReadUInt16();
            var name          = reader.ReadPascalString(2);
            var dataLength    = (int)reader.ReadUInt32();

            var dataPaddedLength = Util.RoundUp(dataLength, 2);
            var endPosition      = reader.BaseStream.Position + dataPaddedLength;

            ImageResource resource   = null;
            var           resourceId = (ResourceID)resourceIdInt;

            switch (resourceId)
            {
            case ResourceID.ThumbnailRgb:
            case ResourceID.ThumbnailBgr:
                resource = new Thumbnail(reader, resourceId, name, dataLength);
                break;

            case ResourceID.AlphaChannelNames:
                resource = new AlphaChannelNames(reader, name, dataLength);
                break;

            case ResourceID.UnicodeAlphaNames:
                resource = new UnicodeAlphaNames(reader, name, dataLength);
                break;

            case ResourceID.VersionInfo:
                resource = new VersionInfo(reader, name);
                break;

            default:
                resource = new RawImageResource(reader, signature, resourceId, name, dataLength);
                break;
            }

            Util.DebugMessage(reader.BaseStream,
                              $"Load, End, ImageResource, {resourceId}");

            // Reposition the reader if we do not consume the full resource block.
            // This takes care of the even-padding, and also preserves forward-
            // compatibility in case a resource block is later extended with
            // additional properties.
            if (reader.BaseStream.Position < endPosition)
            {
                reader.BaseStream.Position = endPosition;
            }

            // However, overruns are definitely an error.
            if (reader.BaseStream.Position > endPosition)
            {
                throw new PsdInvalidException("Corruption detected in resource.");
            }

            return(resource);
        }
Ejemplo n.º 2
0
        public static void SlicesToTextureRegionInfo(this PsdFile psd, ref Texture texture)
        {
            RawImageResource slices_resource = (RawImageResource)psd.ImageResources.Find(resource => resource.ID == ResourceID.Slices);

//			Console.Write("Slices image resource:"); // Newline handled by ternary
//			for(int i = 0; i < slices_resource.Data.Length; i++)
//			{
//				char c = MathUtil.Clamp((char)slices_resource.Data[i], '~', ' ');
//				if(c == slices_resource.Data[i])
//					Console.Write(c);
//				else
//					Console.Write("[{0}]", slices_resource.Data[i]);
//			}

            PsdSlicesHeader psd_slices_header = new PsdSlicesHeader();

            PsdSlice[] psd_slices;
            // FixedEndianness and ReadPascalString are defined in Utility.Structure
            using (MemoryStream mem_stream = new MemoryStream(slices_resource.Data))
            {
                using (BinaryReader reader = new BinaryReader(mem_stream, Encoding.BigEndianUnicode))
                {
                    psd_slices_header.Version    = reader.ReadInt32().FixEndianness();
                    psd_slices_header.Top        = reader.ReadInt32().FixEndianness();
                    psd_slices_header.Left       = reader.ReadInt32().FixEndianness();
                    psd_slices_header.Bottom     = reader.ReadInt32().FixEndianness();
                    psd_slices_header.Right      = reader.ReadInt32().FixEndianness();
                    psd_slices_header.GroupName  = reader.ReadPascalString();
                    psd_slices_header.SliceCount = reader.ReadInt32().FixEndianness();

                    int len = psd_slices_header.SliceCount;
                    psd_slices = new PsdSlice[len];

                    // This is terrifying
                    for (int i = 0; i < len; i++)
                    {
                        psd_slices [i]         = new PsdSlice();
                        psd_slices [i].Id      = reader.ReadInt32().FixEndianness();
                        psd_slices [i].GroupId = reader.ReadInt32().FixEndianness();
                        psd_slices [i].Origin  = reader.ReadInt32().FixEndianness();
                        if (psd_slices [i].Origin == 1)
                        {
                            psd_slices [i].AssociatedLayerId = reader.ReadInt32().FixEndianness();
                        }
                        psd_slices [i].Name                = reader.ReadPascalString();
                        psd_slices [i].Type                = reader.ReadInt32().FixEndianness();
                        psd_slices [i].Left                = reader.ReadInt32().FixEndianness();
                        psd_slices [i].Top                 = reader.ReadInt32().FixEndianness();
                        psd_slices [i].Right               = reader.ReadInt32().FixEndianness();
                        psd_slices [i].Bottom              = reader.ReadInt32().FixEndianness();
                        psd_slices [i].URL                 = reader.ReadPascalString();
                        psd_slices [i].Target              = reader.ReadPascalString();
                        psd_slices [i].Message             = reader.ReadPascalString();
                        psd_slices [i].AltTag              = reader.ReadPascalString();
                        psd_slices [i].CellIsHTML          = reader.ReadBoolean();
                        psd_slices [i].CellText            = reader.ReadPascalString();
                        psd_slices [i].HorizontalAlignment = reader.ReadInt32().FixEndianness();
                        psd_slices [i].VerticalAlignment   = reader.ReadInt32().FixEndianness();
                        psd_slices [i].A = reader.ReadByte();
                        psd_slices [i].R = reader.ReadByte();
                        psd_slices [i].G = reader.ReadByte();
                        psd_slices [i].B = reader.ReadByte();
                    }
                    reader.Dispose();
                }
                mem_stream.Dispose();
            }
            var tr         = new List <TextureRegion> ();
            var set_corner = new List <TextureRegion> ();

            for (int i = 0; i < psd_slices.Length; i++)
            {
                PsdSlice slice = psd_slices [i];
                if (slice.Name != "")
                {
                    TextureRegion region =
                        new TextureRegion(slice.Name,
                                          new Vector2d(slice.Left, psd.RowCount - slice.Bottom),
                                          new Vector2d(slice.Right, psd.RowCount - slice.Top));                          // Vertical axis (Y) is flipped

                    if (slice.Target.ToLower() == "default")
                    {
                        texture.DefaultRegionIndex = tr.Count;
                    }
                    if (slice.Target.ToLower() == "corner")
                    {
                        set_corner.Add(region);
                    }
                    tr.Add(region);
                }
            }

            texture.Regions = tr.ToArray();

            // Set the origin of these regions to a position that aligns its
            // lower left corner with the default region
            for (int i = 0; i < set_corner.Count; i++)
            {
                Vector2d origin_offset = 0.5 * (set_corner[i].Size - texture.DefaultRegion.Size);
                //Console.WriteLine("Expected: {0}", origin);
                set_corner[i].OriginOffset = origin_offset;
                //Console.WriteLine("Result: {0}", set_corner[i].OriginOffset);
            }
        }