Exemple #1
0
        private void WriteGradientDefs(List <GradientFill> gradients)
        {
            WriteTag(VexDrawTag.GradientFillList);
            WriteBits(0, 5);             // note: no nBits here, just padding
            WriteBits(gradients.Count, 11);
            for (int index = 0; index < gradients.Count; index++)
            {
                GradientFill gf = gradients[index];
                // first type - all non radial will be solid
                // use 8 bits for future expansion and to keep semi aligned
                int type = (gf.FillType == FillType.Radial) ? 1 : 0;
                WriteBits(type, 3);

                float[] tltr   = DrawObject.GetGradientLine(gf);
                int[]   values = new int[4];
                for (int i = 0; i < tltr.Length; i++)
                {
                    values[i] = (int)(tltr[i] * DrawObject.twips);
                }
                WriteFourNBitValues(values);

                // new argb colors
                List <Color> colors    = new List <Color>(gf.Fills);
                List <float> positions = new List <float>(gf.Stops);
                if (gf.FillType == FillType.Radial)
                {
                    gf.ReverseStops(colors, positions);
                }

                // stops and ratios [[col,rat],[col,rat]...]
                int stopCount = colors.Count;
                if (stopCount > 8)
                {
                    stopCount = 8;
                    Console.WriteLine("*Flash only supports 8 colors max in gradients");
                }

                uint[] wCols = new uint[stopCount];
                for (int i = 0; i < stopCount; i++)
                {
                    wCols[i] = colors[i].AFlipRGB;
                }
                uint colBits = MinBits(wCols);
                WriteNBitsCount(colBits);

                int[] ratios = new int[positions.Count];
                for (int i = 0; i < stopCount; i++)
                {
                    ratios[i] = (int)(positions[i] * 255);
                }
                uint ratioBits = MinBits(ratios);
                WriteNBitsCount(ratioBits);

                WriteBits(stopCount, 11);

                for (int i = 0; i < stopCount; i++)
                {
                    WriteBits(wCols[i], colBits);
                    WriteBits(ratios[i], ratioBits);
                }
            }
            FlushTag();
        }