Ejemplo n.º 1
0
        internal override void saveCompact(aBinaryWriter writer)
        {
            base.saveCompact(writer);

            writer.Write16((ushort)mContentRect.left);
            writer.Write16((ushort)mContentRect.top);
            writer.Write16((ushort)mContentRect.width);
            writer.Write16((ushort)mContentRect.height);

            for (int i = 0; i < 4; ++i)
            {
                bloResource.save(mTextures[i].texture, writer);
            }
            bloResource.save(mPalette, writer);

            byte bits = 0;

            for (int i = 0; i < 4; ++i)
            {
                bits <<= 2;
                bits  |= (byte)mTextures[i].mirror;
            }
            writer.Write8(bits);

            for (int i = 0; i < 4; ++i)
            {
                writer.Write32(mTextures[i].color.rgba);
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 2
0
        internal override void saveCompact(aBinaryWriter writer)
        {
            base.saveCompact(writer);

            if (mTextureCount > 0)
            {
                bloResource.save(mTextures[0], writer);
            }
            else
            {
                bloResource.save(null, writer);
            }
            bloResource.save(mPalette, writer);

            writer.Write8((byte)mBinding);

            byte bits = 0;

            bits  |= (byte)mWrapS;
            bits <<= 1;
            bits  |= (byte)(mRotate90 ? 1 : 0);
            bits <<= 2;
            bits  |= (byte)mMirror;
            writer.Write8(bits);

            writer.WritePadding(4, 0);

            for (int i = 0; i < 4; ++i)
            {
                writer.Write32(mColors[i].rgba);
            }
        }
Ejemplo n.º 3
0
        void WriteWaveBank()
        {
            var winfSize   = CalculateControlSize(mWaveBank.Count);
            var wbctSize   = CalculateControlGroupSize(mWaveBank.Count);
            var baseOffset = (32 + winfSize + wbctSize);

            mWriter.PushAnchor();

            mWriter.Write32(WSYS);
            mWriter.WriteS32(0);             // TODO: size
            mWriter.WriteS32(0);             // unused
            mWriter.WriteS32(0);             // unused
            mWriter.WriteS32(32);
            mWriter.WriteS32(32 + winfSize);
            mWriter.WritePadding(32, 0);

            mWriter.Write32(WINF);
            mWriter.WriteS32(mWaveBank.Count);

            var winfOffset = baseOffset;

            foreach (var waveGroup in mWaveBank)
            {
                mWriter.WriteS32(winfOffset);
                winfOffset += CalculateWaveGroupSize(waveGroup);
            }

            mWriter.WritePadding(32, 0);

            mWriter.Write32(WBCT);
            mWriter.WriteS32(0);             // unused
            mWriter.WriteS32(mWaveBank.Count);

            var wbctOffset = baseOffset;

            foreach (var waveGroup in mWaveBank)
            {
                mWriter.WriteS32(wbctOffset + CalculateArchiveInfoSize(waveGroup.Count) + CalculateWaveSize(waveGroup.Count) + CalculateControlSize(waveGroup.Count) + 64);
                wbctOffset += CalculateWaveGroupSize(waveGroup);
            }

            mWriter.WritePadding(32, 0);

            foreach (var waveGroup in mWaveBank)
            {
                WriteWaveGroup(waveGroup);
            }

            mWriter.PopAnchor();
        }
Ejemplo n.º 4
0
        internal override void saveCompact(aBinaryWriter writer)
        {
            base.saveCompact(writer);

            bloResource.save(mFont, writer);
            writer.Write32(mTopColor.rgba);
            writer.Write32(mBottomColor.rgba);

            byte binding = 0;

            if (mFont != null)
            {
                binding  |= 1;
                binding <<= 2;
            }
            binding  |= (byte)mHBinding;
            binding <<= 2;
            binding  |= (byte)mVBinding;
            writer.Write8(binding);

            if (mFont != null)
            {
                writer.WriteS16((short)mFontSpacing);
                writer.WriteS16((short)mFontLeading);
                writer.Write16((ushort)mFontWidth);
                writer.Write16((ushort)mFontHeight);
            }

            if (mFont != null)
            {
                var strbuffer = mFont.decodeToBytes(mText);
                writer.Write16((ushort)strbuffer.Length);
                writer.Write8s(strbuffer);
            }
            else
            {
                writer.Write16(0);
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 5
0
        internal virtual void saveCompact(aBinaryWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            writer.Write8((byte)(mVisible ? 1 : 0));
            writer.Write8(0);             // padding
            writer.Write32(mName);
            writer.WriteS16((short)mRect.left);
            writer.WriteS16((short)mRect.top);
            writer.WriteS16((short)mRect.width);
            writer.WriteS16((short)mRect.height);
        }
Ejemplo n.º 6
0
        static void saveBlo1(bloPane pane, aBinaryWriter writer, ref uint blockcount)
        {
            var typeID = cPAN1;

            if (pane is bloTextbox)
            {
                typeID = cTBX1;
            }
            else if (pane is bloWindow)
            {
                typeID = cWIN1;
            }
            else if (pane is bloPicture)
            {
                typeID = cPIC1;
            }

            var blockstart = writer.Position;

            writer.Write32(typeID);
            writer.Write32(0u);             // dummy size

            pane.saveBlo1(writer);

            writer.WritePadding(4, 0);

            var blockend = writer.Position;

            writer.Goto(blockstart + 4);
            writer.Write32((uint)(blockend - blockstart));
            writer.Goto(blockend);
            ++blockcount;

            if (pane.getChildPane() > 0)
            {
                writer.Write32(cBGN1);
                writer.Write32(0x8u);
                ++blockcount;

                foreach (var childpane in pane)
                {
                    saveBlo1(childpane, writer, ref blockcount);
                }

                writer.Write32(cEND1);
                writer.Write32(0x8u);
                ++blockcount;
            }
        }
Ejemplo n.º 7
0
        internal override void saveBlo1(aBinaryWriter writer)
        {
            base.saveBlo1(writer);

            byte numparams;

            if (mToColor.rgba != bloColor.cOne)
            {
                numparams = 17;
            }
            else if (mFromColor.rgba != bloColor.cZero)
            {
                numparams = 16;
            }
            else if (mContentTexture != null)
            {
                numparams = 15;
            }
            else
            {
                numparams = 14;
            }

            writer.Write8(numparams);
            writer.Write16((ushort)mContentRect.left);
            writer.Write16((ushort)mContentRect.top);
            writer.Write16((ushort)mContentRect.width);
            writer.Write16((ushort)mContentRect.height);

            for (int i = 0; i < 4; ++i)
            {
                bloResource.save(mTextures[i].texture, writer);
            }
            bloResource.save(mPalette, writer);

            byte bits = 0;

            for (int i = 0; i < 4; ++i)
            {
                bits <<= 2;
                bits  |= (byte)mTextures[i].mirror;
            }
            writer.Write8(bits);

            for (int i = 0; i < 4; ++i)
            {
                writer.Write32(mTextures[i].color.rgba);
            }

            numparams -= 14;

            if (numparams > 0)
            {
                bloResource.save(mContentTexture, writer);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mFromColor.rgba);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mToColor.rgba);
                --numparams;
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 8
0
        internal override void saveBlo1(aBinaryWriter writer)
        {
            base.saveBlo1(writer);

            byte numparams;

            if (mToColor.rgba != bloColor.cOne)
            {
                numparams = 13;
            }
            else if (mFromColor.rgba != bloColor.cZero)
            {
                numparams = 12;
            }
            else if (mConnectParent)
            {
                numparams = 11;
            }
            else
            {
                numparams = 10;
            }

            writer.Write8(numparams);

            bloResource.save(mFont, writer);
            writer.Write32(mTopColor.rgba);
            writer.Write32(mBottomColor.rgba);

            byte binding = 0;

            binding  |= (byte)mHBinding;
            binding <<= 2;
            binding  |= (byte)mVBinding;
            writer.Write8(binding);

            writer.WriteS16((short)mFontSpacing);
            writer.WriteS16((short)mFontLeading);
            writer.Write16((ushort)mFontWidth);
            writer.Write16((ushort)mFontHeight);

            if (mFont != null)
            {
                var strbuffer = mFont.decodeToBytes(mText);
                writer.Write16((ushort)strbuffer.Length);
                writer.Write8s(strbuffer);
            }
            else
            {
                writer.Write16(0);
            }

            numparams -= 10;

            if (numparams > 0)
            {
                writer.Write8((byte)(mConnectParent ? 1 : 0));
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mFromColor.rgba);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mToColor.rgba);
                --numparams;
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 9
0
        public void saveBlo1(Stream stream)
        {
            aBinaryWriter writer = new aBinaryWriter(stream, Endianness.Big, Encoding.GetEncoding(1252));

            var blockstart = writer.Position;
            var blockcount = 0u;

            writer.Write32(cSCRN);
            writer.Write32(cBLO1);
            writer.Write32(0u);             // dummy size
            writer.Write32(0u);             // dummy block count
            writer.WritePadding(32, 0);

            writer.Write32(cINF1);
            writer.Write32(0x10u);
            writer.WriteS16((short)mRect.width);
            writer.WriteS16((short)mRect.height);
            writer.Write32(mTintColor.rgba);
            ++blockcount;

            foreach (var childpane in this)
            {
                saveBlo1(childpane, writer, ref blockcount);
            }

            writer.Write32(cEXT1);
            writer.Write32(0x8u);
            ++blockcount;

            writer.WritePadding(32, 0);

            var blockend = writer.Position;

            writer.Goto(blockstart + 8);
            writer.Write32((uint)(blockend - blockstart));
            writer.Write32(blockcount);
            writer.Goto(blockend);
        }
Ejemplo n.º 10
0
        internal override void saveBlo1(aBinaryWriter writer)
        {
            base.saveBlo1(writer);

            byte numparams;

            if (mColors[(int)bloTextureBase.BottomRight].rgba != bloColor.cWhite)
            {
                numparams = 11;
            }
            else if (mColors[(int)bloTextureBase.BottomLeft].rgba != bloColor.cWhite)
            {
                numparams = 10;
            }
            else if (mColors[(int)bloTextureBase.TopRight].rgba != bloColor.cWhite)
            {
                numparams = 9;
            }
            else if (mColors[(int)bloTextureBase.TopLeft].rgba != bloColor.cWhite)
            {
                numparams = 8;
            }
            else if (mToColor.rgba != bloColor.cOne)
            {
                numparams = 7;
            }
            else if (mFromColor.rgba != bloColor.cZero)
            {
                numparams = 6;
            }
            else if (mWrapS != bloWrapMode.None || mWrapT != bloWrapMode.None)
            {
                numparams = 5;
            }
            else if (mMirror != 0 || mRotate90)
            {
                numparams = 4;
            }
            else
            {
                numparams = 3;
            }

            writer.Write8(numparams);
            if (mTextureCount > 0)
            {
                bloResource.save(mTextures[0], writer);
            }
            else
            {
                bloResource.save(null, writer);
            }
            bloResource.save(mPalette, writer);
            writer.Write8((byte)mBinding);

            numparams -= 3;

            if (numparams > 0)
            {
                byte bits = (byte)mMirror;
                if (mRotate90)
                {
                    bits |= 4;
                }
                writer.Write8(bits);
                --numparams;
            }

            if (numparams > 0)
            {
                byte bits = 0;
                bits  |= (byte)mWrapS;
                bits <<= 2;
                bits  |= (byte)mWrapT;
                writer.Write8(bits);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mFromColor.rgba);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write32(mToColor.rgba);
                --numparams;
            }

            for (int i = 0; i < 4; ++i)
            {
                if (numparams > 0)
                {
                    writer.Write32(mColors[i].rgba);
                    --numparams;
                }
            }

            writer.WritePadding(4, 0);
        }
Ejemplo n.º 11
0
        public void save(aBinaryWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }
            // calculate entry shit
            var entryOffset = calculateEntryOffset(FieldCount);
            var entrySize   = calculateEntrySize(mFields);

            // write header
            writer.WriteS32(EntryCount);
            writer.WriteS32(FieldCount);
            writer.Write32(entryOffset);
            writer.WriteS32(entrySize);
            // write field LUT
            foreach (var field in mFields)
            {
                writer.Write32(field.hash);
                writer.Write32(field.bitmask);
                writer.Write16(field.start);
                writer.Write8(field.shift);
                writer.Write8((byte)field.type);
            }
            // since the stream is write-only, we must write packed integer fields to an intermediate, R/W buffer
            var buffer = new Dictionary <ushort, uint>(FieldCount);

            for (var entry = 0; entry < EntryCount; ++entry)
            {
                buffer.Clear();
                for (var field = 0; field < FieldCount; ++field)
                {
                    writer.Goto(entryOffset + (entrySize * entry) + mFields[field].start);
                    switch (mFields[field].type)
                    {
                    case jmpValueType.INTEGER: {
                        if (mFields[field].bitmask == 0xFFFFFFFFu)
                        {
                            // field is unpacked; write directly to stream
                            writer.WriteS32(mEntries[entry, field]);
                        }
                        else
                        {
                            // field is packed; write to intermediate buffer
                            if (!buffer.ContainsKey(mFields[field].start))
                            {
                                buffer[mFields[field].start] = 0u;                                         // if there's no key yet, create one
                            }
                            buffer[mFields[field].start] |= ((uint)mEntries[entry, field] << mFields[field].shift) & mFields[field].bitmask;
                        }
                        break;
                    }

                    case jmpValueType.FLOAT: {
                        writer.WriteF32(mEntries[entry, field]);
                        break;
                    }

                    case jmpValueType.STRING: {
                        writer.WriteString <aCSTR>(mEntries[entry, field], 0x20);
                        break;
                    }
                    }
                }
                // flush intermediate buffer
                foreach (var point in buffer)
                {
                    writer.Goto(entryOffset + (entrySize * entry) + point.Key);
                    writer.Write32(point.Value);
                }
            }
        }
Ejemplo n.º 12
0
        internal virtual void saveBlo1(aBinaryWriter writer)
        {
            if (writer == null)
            {
                throw new ArgumentNullException("writer");
            }

            byte numparams;

            if (!mInheritAlpha)
            {
                numparams = 10;
            }
            else if (mAlpha < 255)
            {
                numparams = 9;
            }
            else if (mAnchor != bloAnchor.TopLeft)
            {
                numparams = 8;
            }
            else if (mAngle != 0.0d)
            {
                numparams = 7;
            }
            else
            {
                numparams = 6;
            }

            writer.Write8(numparams);
            writer.Write8((byte)(mVisible ? 1 : 0));
            writer.Step(2);
            writer.Write32(mName);
            writer.WriteS16((short)mRect.left);
            writer.WriteS16((short)mRect.top);
            writer.WriteS16((short)mRect.width);
            writer.WriteS16((short)mRect.height);

            numparams -= 6;

            if (numparams > 0)
            {
                writer.Write16((ushort)mAngle);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write8((byte)mAnchor);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write8(mAlpha);
                --numparams;
            }

            if (numparams > 0)
            {
                writer.Write8((byte)(mInheritAlpha ? 1 : 0));
                --numparams;
            }

            writer.WritePadding(4, 0);
        }