Пример #1
0
        public TamBloque MedirDeParrafo(int inicio, int cantidad, out Medicion maximaBase)
        {
            Debug.Assert(inicio >= 0 && inicio + cantidad <= Parrafo.Longitud && cantidad >= 0);

            AvanceBloques        av             = new AvanceBloques(this);
            int                  inicioact      = inicio;
            TamBloque            bq             = new TamBloque(Medicion.Cero, Medicion.Cero);
            Medicion             maxbase        = Medicion.Cero;
            IEnumerable <Bloque> bloques        = av.ObtenerBloquesDe(this);
            bool                 primerbloqueOK = false;

            //Medir al menos uno de los bloques
            foreach (Bloque b in bloques)
            {
                if (!primerbloqueOK)
                {
                    primerbloqueOK = true;
                }
                else
                {
                    if (b.Cantidad == 0)
                    {
                        continue;
                    }
                }
                Estilo   e            = new Estilo(b);
                Medicion medicionbase = e.MedirBase();
                if (medicionbase > maxbase)
                {
                    maxbase = medicionbase;
                }
                int       cantidadbloque = Math.Min(b.Cantidad, cantidad);
                TamBloque tm             = e.Medir(Parrafo.ObtenerSubCadena(inicioact, cantidadbloque));
                if (tm.Alto > bq.Alto)
                {
                    bq.Alto = tm.Alto;
                }
                bq.Ancho   = bq.Ancho + tm.Ancho;
                cantidad  -= cantidadbloque;
                inicioact += cantidadbloque;
            }
            maximaBase = maxbase;
            return(bq);
        }
Пример #2
0
        internal static Linea ObtenerSiguienteLinea(Parrafo parrafo, int caracterinicio, Medicion ancho, bool incluirAltoParrafo, bool incluirBaseParrafo)
        {
            int tamparrafo = parrafo.Longitud;

            //Estilo e = new Estilo();
            if (tamparrafo == 0)
            {
                Estilo   estparrafo = new Estilo(new Bloque(0, parrafo.Formato.ObtenerFormatoTexto()));
                Medicion alto       = estparrafo.Medir(string.Empty).Alto;//e.Medir(string.Empty).Alto;
                if (parrafo.Formato.ObtenerEspaciadoInterlineal() != 1)
                {
                    alto = alto * (float)parrafo.Formato.ObtenerEspaciadoInterlineal();
                }
                if (incluirAltoParrafo)
                {
                    alto += parrafo.Formato.ObtenerEspacioAnterior();
                }

                if (incluirBaseParrafo)
                {
                    alto += parrafo.Formato.ObtenerEspacioPosterior();
                }
                ;
                return(new Linea(parrafo, caracterinicio, 0, alto, estparrafo.MedirBase(), ancho));
            }
            Linea     actual      = new Linea(parrafo, caracterinicio, 0, Medicion.Cero, Medicion.Cero, ancho);
            TamBloque tampromedio = new Estilo(new Bloque(4, parrafo.Formato.ObtenerFormatoTexto())).Medir("MMMM");

            Medicion anchocaracter    = tampromedio.Ancho / 4;
            int      numcaracteres    = (int)(ancho / anchocaracter);
            int      limitecaracteres = tamparrafo - caracterinicio;

            if (numcaracteres > limitecaracteres)
            {
                numcaracteres = limitecaracteres;
            }
            actual.Cantidad = numcaracteres;
            Medicion  mbase;
            TamBloque bloque = actual.MedirDeParrafo(actual.Inicio, actual.Cantidad, out mbase);//e.Medir(parrafo.ObtenerSubCadena(caracterinicio, numcaracteres));

            while (numcaracteres < limitecaracteres && bloque.Ancho < ancho)
            {
                actual.Cantidad = numcaracteres;
                bloque          = actual.MedirDeParrafo(caracterinicio, numcaracteres, out mbase);//parrafo.ObtenerSubCadena(caracterinicio, numcaracteres));
                numcaracteres++;
            }
            while (numcaracteres > 0 && bloque.Ancho > ancho)
            {
                actual.Cantidad = numcaracteres;
                //string subcad = parrafo.ObtenerSubCadena(caracterinicio, numcaracteres);
                bloque = actual.MedirDeParrafo(caracterinicio, numcaracteres, out mbase);// e.Medir(subcad);
                if (numcaracteres > 0 && bloque.Ancho > ancho)
                {
                    string subcad = parrafo.ObtenerSubCadena(caracterinicio, numcaracteres);
                    numcaracteres = ObtenerAnteriorDivision(subcad, numcaracteres);
                }
            }
            actual.AltoBase   = mbase;
            actual.Cantidad   = numcaracteres;
            actual.AltoLinea  = bloque.Alto;
            actual.AnchoLinea = ancho;
            if (parrafo.Formato.ObtenerEspaciadoInterlineal() != 1)
            {
                actual.AltoLinea = actual.AltoLinea * (float)parrafo.Formato.ObtenerEspaciadoInterlineal();
            }
            if (incluirAltoParrafo && actual.Inicio == 0)
            {
                actual.AltoLinea += parrafo.Formato.ObtenerEspacioAnterior();
            }
            if (incluirBaseParrafo && actual.Inicio + actual.Cantidad == tamparrafo)
            {
                actual.AltoLinea += parrafo.Formato.ObtenerEspacioPosterior();
            }
            return(actual);
            //return new Linea() { Parrafo = parrafo, Cantidad = numcaracteres, Inicio = caracterinicio,AltoLinea=tampromedio.Alto };
        }