public EditTextBuilder(FontBuilder builder, float height, bool useOutlines, bool readOnly, bool noSelect)
        {
            tag = new DefineEditText();
            //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
            tag.height = (int)System.Math.Round((double)(height * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL));

            if (builder != null)
            {
                fontBuilder = builder;
                tag.hasFont = true;
            }

            tag.useOutlines = useOutlines;
            tag.readOnly    = readOnly;
            tag.noSelect    = noSelect;
        }
		public EditTextBuilder(FontBuilder builder, float height, bool useOutlines, bool readOnly, bool noSelect)
		{
			tag = new DefineEditText();
			//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
			tag.height = (int) System.Math.Round((double) (height * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL));
			
			if (builder != null)
			{
				fontBuilder = builder;
				tag.hasFont = true;
			}
			
			tag.useOutlines = useOutlines;
			tag.readOnly = readOnly;
			tag.noSelect = noSelect;
		}
		/// <summary> </summary>
		/// <param name="fontBuilder">FontBuilder
		/// </param>
		/// <param name="height">double
		/// </param>
		/// <param name="text">String
		/// </param>
		/// <param name="color">Color
		/// </param>
		/// <param name="xOffset">int
		/// </param>
		/// <param name="yOffset">int
		/// </param>
		/// <throws>  IOException </throws>
		/// <summary> add text</summary>
		//UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
		public virtual void  add(FontBuilder fontBuilder, double height, System.String text, ref System.Drawing.Color color, int xOffset, int yOffset)
		{
			fontBuilders.Add(fontBuilder);
			
			//UPGRADE_ISSUE: Constructor 'java.io.BufferedReader.BufferedReader' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioBufferedReaderBufferedReader_javaioReader'"
			System.IO.StreamReader reader = new BufferedReader(new System.IO.StringReader(text));
			System.String line;
			char[] chars;
			int yCount = 0;
			double t_width = 0.0f;
			double t_height = 0.0f;
			while (true)
			{
				line = reader.ReadLine();
				// Make sure we don't create empty TextRecords
				// A empty textRecord will crash Flash Player. Player Bug#57644
				if ((line == null) || (line.Length == 0))
					break;
				
				//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
				//UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
				TextRecord tr = getStyleRecord(fontBuilder, height, ref color, xOffset, (int) (yOffset + yCount * height * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL));
				
				chars = line.ToCharArray();
				tr.entries = new GlyphEntry[chars.Length];
				double w = 0;
				for (int i = 0; i < chars.Length; i++)
				{
					char c = chars[i];
					// preilly: According to Sherman Gong, we need to clone the font GlyphEntry, so
					// that the advance value can be mapped from the font's logical scale to the
					// text's physical scale.
					GlyphEntry ge = (GlyphEntry) fontBuilder.getGlyph(c).Clone();
					//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
					ge.advance = (int) ((ge.advance / 1024f) * tr.height);
					tr.entries[i] = ge;
					w += ge.advance;
				}
				if (w > t_width)
					t_width = w;
				tag.records.Add(tr);
				yCount++;
			}
			t_height = yCount * height;
			
			double x1 = 0;
			double y1 = 0;
			double x2 = x1 + t_width;
			double y2 = y1 + t_height;
			x1 = x1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			x2 = x2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			y1 = y1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			y2 = y2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			/**
			*  If the values are greater than Max_value, then
			*  the results are not to be trusted.
			*/
			if (x1 > System.Int32.MaxValue)
				x1 = 0;
			if (x2 > System.Int32.MaxValue)
				x2 = 0;
			if (y1 > System.Int32.MaxValue)
				y1 = 0;
			if (y2 > System.Int32.MaxValue)
				y2 = 0;
			
			//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
			tag.bounds = new Rect((int) x1, (int) x2, (int) y1, (int) y2);
		}
		//UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
		private TextRecord getStyleRecord(FontBuilder fontBuilder, double height, ref System.Drawing.Color color, int xOffset, int yOffset)
		{
			TextRecord tr = new TextRecord();
			if (fontBuilder != null)
			{
				tr.Font = fontBuilder.tag;
				tr.Height = SwfUtils.toTwips(height);
			}
			
			if (!color.IsEmpty)
			{
				//UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
				int c = SwfUtils.colorToInt(ref color);
				tr.Color = c;
			}
			
			if (xOffset > 0)
			{
				tr.X = xOffset;
			}
			
			if (yOffset > 0)
			{
				tr.Y = yOffset;
			}
			return tr;
		}
		/// <summary> Description:  This version is the same as the straight add function
		/// The difference is that we use java layout class to
		/// calculate the bounding box.
		/// 
		/// </summary>
		/// <param name="fontBuilder">FontBuilder
		/// </param>
		/// <param name="height">     double
		/// </param>
		/// <param name="text">       String
		/// </param>
		/// <param name="color">      Color
		/// </param>
		/// <param name="xOffset">    int
		/// </param>
		/// <param name="yOffset">    int
		/// </param>
		/// <param name="bounds">     Rectangle2D
		/// </param>
		/// <throws>  IOException </throws>
		//UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
		public virtual void  addWithLayout(FontBuilder fontBuilder, double height, System.String text, ref System.Drawing.Color color, int xOffset, int yOffset, ref System.Drawing.RectangleF bounds)
		{
			fontBuilders.Add(fontBuilder);
			
			//UPGRADE_ISSUE: Constructor 'java.io.BufferedReader.BufferedReader' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioBufferedReaderBufferedReader_javaioReader'"
			System.IO.StreamReader reader = new BufferedReader(new System.IO.StringReader(text));
			System.String line;
			char[] chars;
			int yCount = 0;
			while (true)
			{
				line = reader.ReadLine();
				// Make sure we don't create empty TextRecords
				// A empty textRecord will crash Flash Player. Player Bug #102948
				if ((line == null) || (line.Length == 0))
					break;
				//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
				//UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
				TextRecord tr = getStyleRecord(fontBuilder, height, ref color, xOffset, (int) (yOffset + yCount * height * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL));
				
				chars = line.ToCharArray();
				tr.entries = new GlyphEntry[chars.Length];
				for (int i = 0; i < chars.Length; i++)
				{
					char c = chars[i];
					GlyphEntry ge = (GlyphEntry) fontBuilder.getGlyph(c).Clone();
					//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
					ge.advance = (int) ((ge.advance / 1024f) * tr.height);
					tr.entries[i] = ge;
				}
				tag.records.Add(tr);
				yCount++;
			}
			/**
			*  on JDK1.4.x the bounds.getMinX() can returns values > bounds.getMaxX()
			*  and also return values > Interger.MAX_VALUE which can cause many
			*  problems when we encode the the position valures in the tagEncoder.
			*
			*  So we stay away from the getMinx, getMinxY methods, and also
			*  double check everything here.
			*
			*/
			
			double x1 = (double) bounds.X;
			double y1 = (double) bounds.Y;
			double rect_width = (double) bounds.Width;
			double rect_height = (double) bounds.Height;
			double x2 = x1 + rect_width;
			double y2 = y1 + rect_height;
			x1 = x1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			x2 = x2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			y1 = y1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			y2 = y2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
			/**
			*  If the values are greater than Max_value, then
			*  the results are not to be trusted.
			*/
			if (x1 > System.Int32.MaxValue)
				x1 = 0;
			if (x2 > System.Int32.MaxValue)
				x2 = 0;
			if (y1 > System.Int32.MaxValue)
				y1 = 0;
			if (y2 > System.Int32.MaxValue)
				y2 = 0;
			
			//UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
			tag.bounds = new Rect((int) x1, (int) x2, (int) y1, (int) y2);
		}
        /// <summary> </summary>
        /// <param name="fontBuilder">FontBuilder
        /// </param>
        /// <param name="height">double
        /// </param>
        /// <param name="text">String
        /// </param>
        /// <param name="color">Color
        /// </param>
        /// <param name="xOffset">int
        /// </param>
        /// <param name="yOffset">int
        /// </param>
        /// <throws>  IOException </throws>
        /// <summary> add text</summary>
        //UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
        public virtual void  add(FontBuilder fontBuilder, double height, System.String text, ref System.Drawing.Color color, int xOffset, int yOffset)
        {
            fontBuilders.Add(fontBuilder);

            //UPGRADE_ISSUE: Constructor 'java.io.BufferedReader.BufferedReader' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioBufferedReaderBufferedReader_javaioReader'"
            System.IO.StreamReader reader = new BufferedReader(new System.IO.StringReader(text));
            System.String          line;
            char[] chars;
            int    yCount   = 0;
            double t_width  = 0.0f;
            double t_height = 0.0f;

            while (true)
            {
                line = reader.ReadLine();
                // Make sure we don't create empty TextRecords
                // A empty textRecord will crash Flash Player. Player Bug#57644
                if ((line == null) || (line.Length == 0))
                {
                    break;
                }

                //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                //UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
                TextRecord tr = getStyleRecord(fontBuilder, height, ref color, xOffset, (int)(yOffset + yCount * height * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL));

                chars      = line.ToCharArray();
                tr.entries = new GlyphEntry[chars.Length];
                double w = 0;
                for (int i = 0; i < chars.Length; i++)
                {
                    char c = chars[i];
                    // preilly: According to Sherman Gong, we need to clone the font GlyphEntry, so
                    // that the advance value can be mapped from the font's logical scale to the
                    // text's physical scale.
                    GlyphEntry ge = (GlyphEntry)fontBuilder.getGlyph(c).Clone();
                    //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                    ge.advance    = (int)((ge.advance / 1024f) * tr.height);
                    tr.entries[i] = ge;
                    w            += ge.advance;
                }
                if (w > t_width)
                {
                    t_width = w;
                }
                tag.records.Add(tr);
                yCount++;
            }
            t_height = yCount * height;

            double x1 = 0;
            double y1 = 0;
            double x2 = x1 + t_width;
            double y2 = y1 + t_height;

            x1 = x1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
            x2 = x2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
            y1 = y1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
            y2 = y2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;

            /**
             *  If the values are greater than Max_value, then
             *  the results are not to be trusted.
             */
            if (x1 > System.Int32.MaxValue)
            {
                x1 = 0;
            }
            if (x2 > System.Int32.MaxValue)
            {
                x2 = 0;
            }
            if (y1 > System.Int32.MaxValue)
            {
                y1 = 0;
            }
            if (y2 > System.Int32.MaxValue)
            {
                y2 = 0;
            }

            //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
            tag.bounds = new Rect((int)x1, (int)x2, (int)y1, (int)y2);
        }
        /// <summary> Description:  This version is the same as the straight add function
        /// The difference is that we use java layout class to
        /// calculate the bounding box.
        ///
        /// </summary>
        /// <param name="fontBuilder">FontBuilder
        /// </param>
        /// <param name="height">     double
        /// </param>
        /// <param name="text">       String
        /// </param>
        /// <param name="color">      Color
        /// </param>
        /// <param name="xOffset">    int
        /// </param>
        /// <param name="yOffset">    int
        /// </param>
        /// <param name="bounds">     Rectangle2D
        /// </param>
        /// <throws>  IOException </throws>
        //UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
        public virtual void  addWithLayout(FontBuilder fontBuilder, double height, System.String text, ref System.Drawing.Color color, int xOffset, int yOffset, ref System.Drawing.RectangleF bounds)
        {
            fontBuilders.Add(fontBuilder);

            //UPGRADE_ISSUE: Constructor 'java.io.BufferedReader.BufferedReader' was not converted. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1000_javaioBufferedReaderBufferedReader_javaioReader'"
            System.IO.StreamReader reader = new BufferedReader(new System.IO.StringReader(text));
            System.String          line;
            char[] chars;
            int    yCount = 0;

            while (true)
            {
                line = reader.ReadLine();
                // Make sure we don't create empty TextRecords
                // A empty textRecord will crash Flash Player. Player Bug #102948
                if ((line == null) || (line.Length == 0))
                {
                    break;
                }
                //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                //UPGRADE_NOTE: ref keyword was added to struct-type parameters. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1303'"
                TextRecord tr = getStyleRecord(fontBuilder, height, ref color, xOffset, (int)(yOffset + yCount * height * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL));

                chars      = line.ToCharArray();
                tr.entries = new GlyphEntry[chars.Length];
                for (int i = 0; i < chars.Length; i++)
                {
                    char       c  = chars[i];
                    GlyphEntry ge = (GlyphEntry)fontBuilder.getGlyph(c).Clone();
                    //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
                    ge.advance    = (int)((ge.advance / 1024f) * tr.height);
                    tr.entries[i] = ge;
                }
                tag.records.Add(tr);
                yCount++;
            }

            /**
             *  on JDK1.4.x the bounds.getMinX() can returns values > bounds.getMaxX()
             *  and also return values > Interger.MAX_VALUE which can cause many
             *  problems when we encode the the position valures in the tagEncoder.
             *
             *  So we stay away from the getMinx, getMinxY methods, and also
             *  double check everything here.
             *
             */

            double x1          = (double)bounds.X;
            double y1          = (double)bounds.Y;
            double rect_width  = (double)bounds.Width;
            double rect_height = (double)bounds.Height;
            double x2          = x1 + rect_width;
            double y2          = y1 + rect_height;

            x1 = x1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
            x2 = x2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
            y1 = y1 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;
            y2 = y2 * flash.swf.SwfConstants_Fields.TWIPS_PER_PIXEL;

            /**
             *  If the values are greater than Max_value, then
             *  the results are not to be trusted.
             */
            if (x1 > System.Int32.MaxValue)
            {
                x1 = 0;
            }
            if (x2 > System.Int32.MaxValue)
            {
                x2 = 0;
            }
            if (y1 > System.Int32.MaxValue)
            {
                y1 = 0;
            }
            if (y2 > System.Int32.MaxValue)
            {
                y2 = 0;
            }

            //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
            tag.bounds = new Rect((int)x1, (int)x2, (int)y1, (int)y2);
        }