public int GetFirstEmptyRectangle() { for (var i = 0; i < Spring.MaxAllies; ++i) { if (!Rectangles.ContainsKey(i)) { return(i); } } return(-1); }
/// <summary> /// Sets the baseline of the words of the specified box to certain height /// </summary> /// <param name="g">Device info</param> /// <param name="b">box to check words</param> /// <param name="baseline">baseline</param> internal void SetBaseLine(RGraphics g, CssBox b, double baseline) { //TODO: Aqui me quede, checar poniendo "by the" con un font-size de 3em List <CssRect> ws = WordsOf(b); if (!Rectangles.ContainsKey(b)) { return; } RRect r = Rectangles[b]; //Save top of words related to the top of rectangle double gap = 0f; if (ws.Count > 0) { gap = ws[0].Top - r.Top; } else { CssRect firstw = b.FirstWordOccourence(b, this); if (firstw != null) { gap = firstw.Top - r.Top; } } //New top that words will have //float newtop = baseline - (Height - OwnerBox.FontDescent - 3); //OLD double newtop = baseline; // -GetBaseLineHeight(b, g); //OLD if (b.ParentBox != null && b.ParentBox.Rectangles.ContainsKey(this) && r.Height < b.ParentBox.Rectangles[this].Height) { //Do this only if rectangle is shorter than parent's double recttop = newtop - gap; RRect newr = new RRect(r.X, recttop, r.Width, r.Height); Rectangles[b] = newr; b.OffsetRectangle(this, gap); } foreach (var word in ws) { if (!word.IsImage) { word.Top = newtop; } } }
/// <summary> /// Offsets the rectangle of the specified linebox by the specified gap, /// and goes deep for rectangles of children in that linebox. /// </summary> /// <param name="lineBox"></param> /// <param name="gap"></param> internal void OffsetRectangle(CssLineBox lineBox, float gap) { if (Rectangles.ContainsKey(lineBox)) { RectangleF r = Rectangles[lineBox]; Rectangles[lineBox] = new RectangleF(r.X, r.Y + gap, r.Width, r.Height); } //foreach (Box b in Boxes) //{ // b.OffsetRectangle(lineBox, gap); //} }
/// <summary> /// Updates the specified rectangle of the specified box. /// </summary> /// <param name="box"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="r"></param> /// <param name="b"></param> internal void UpdateRectangle(CssBox box, double x, double y, double r, double b) { double leftspacing = box.ActualBorderLeftWidth + box.ActualPaddingLeft; double rightspacing = box.ActualBorderRightWidth + box.ActualPaddingRight; double topspacing = box.ActualBorderTopWidth + box.ActualPaddingTop; double bottomspacing = box.ActualBorderBottomWidth + box.ActualPaddingTop; if ((box.FirstHostingLineBox != null && box.FirstHostingLineBox.Equals(this)) || box.IsImage) { x -= leftspacing; } if ((box.LastHostingLineBox != null && box.LastHostingLineBox.Equals(this)) || box.IsImage) { r += rightspacing; } if (!box.IsImage) { y -= topspacing; b += bottomspacing; } if (!Rectangles.ContainsKey(box)) { Rectangles.Add(box, RRect.FromLTRB(x, y, r, b)); } else { RRect f = Rectangles[box]; Rectangles[box] = RRect.FromLTRB( Math.Min(f.X, x), Math.Min(f.Y, y), Math.Max(f.Right, r), Math.Max(f.Bottom, b)); } //DA NOTE: Need to check prents parent to re-draw inline borders if (box.ParentBox != null && box.ParentBox.IsInline)// || box.ParentBox.ParentBox != null && box.ParentBox.ParentBox.IsInline) { UpdateRectangle(box.ParentBox, x, y, r, b); } }
/// <summary> /// Updates the specified rectangle of the specified box. /// </summary> /// <param name="box"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="r"></param> /// <param name="b"></param> internal void UpdateRectangle(CssBox box, float x, float y, float r, float b) { float leftspacing = box.ActualBorderLeftWidth + box.ActualPaddingLeft; float rightspacing = box.ActualBorderRightWidth + box.ActualPaddingRight; float topspacing = box.ActualBorderTopWidth + box.ActualPaddingTop; float bottomspacing = box.ActualBorderBottomWidth + box.ActualPaddingTop; if ((box.FirstHostingLineBox != null && box.FirstHostingLineBox.Equals(this)) || box.IsImage) { x -= leftspacing; } if ((box.LastHostingLineBox != null && box.LastHostingLineBox.Equals(this)) || box.IsImage) { r += rightspacing; } if (!box.IsImage) { y -= topspacing; b += bottomspacing; } if (!Rectangles.ContainsKey(box)) { Rectangles.Add(box, RectangleF.FromLTRB(x, y, r, b)); } else { RectangleF f = Rectangles[box]; Rectangles[box] = RectangleF.FromLTRB( Math.Min(f.X, x), Math.Min(f.Y, y), Math.Max(f.Right, r), Math.Max(f.Bottom, b)); } if (box.ParentBox != null && box.ParentBox.Display == CssConstants.Inline) { UpdateRectangle(box.ParentBox, x, y, r, b); } }