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); }
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 }; }