public static void RenderBorderAndArea(ICanvas canvas, IShapef shape, IPathf border, Area.AreaStyle style, Area.AreaStyle nextStyle, float alpha) { // We first fill background. { // We create background fill. ITransform mappingTransform; IMapper mapper; IFill fill = BackgroundStyle.Merge(style != null ? style.Background : null, nextStyle != null ? nextStyle.Background : null, alpha, out mappingTransform, out mapper); if (fill != null) { if (mappingTransform != null) { canvas.TextureTransform = mappingTransform; } // We fill shape canvas.FillShape(fill, shape, mapper); // Must reset. if (mappingTransform != null) { canvas.TextureTransform = null; } } } // Now we add border over it. { ITransform transform; IMapper mapper; Pen pen = BorderStyle.Merge(style != null ? style.Border : null, nextStyle != null ? nextStyle.Border : null, alpha, out transform, out mapper); if (pen != null && pen.Fill != null) { if (transform != null) { canvas.TextureTransform = transform; } canvas.DrawShape(pen, border, mapper); if (transform != null) { canvas.TextureTransform = null; } } } }
public override bool Render(ICanvas canvas, IDisplayObject genericDisplayObject) { base.Render(canvas, genericDisplayObject); Label displayObject = genericDisplayObject as Label; // We render text using parameters. Style xstyle = displayObject.Style; // We get state styles. Label.LabelStyle style, otherStyle; float alpha = displayObject.Style.GetStyleState <Label.LabelStyle>( displayObject.StyleAnimation, out style, out otherStyle); // We first merge data. float fontSize, lineSpacing; TextOptions textOptions; Pen pen; IFill fill; Font font = FontStyle.Merge(style != null ? style.TextFont : null, otherStyle != null ? otherStyle.TextFont : null, alpha, out fontSize, out lineSpacing, out textOptions, out pen, out fill); IFill selFill; Pen selPen; PartialFontStyle.Merge(style != null ? style.SelectedTextFont : null, otherStyle != null ? otherStyle.SelectedTextFont : null, alpha, out selFill, out selPen); // We calculate bounding box. Vector2f leftBottom, rightTop; displayObject.GetBoundingBox(out leftBottom, out rightTop); // Render only if we can. if (font != null) { // We prepare. TextRenderInfo info = font.Prepare(canvas, displayObject.Text, fontSize, textOptions, lineSpacing, leftBottom, rightTop - leftBottom); // We set new text information. displayObject.SetTextInfo(info); Vector2i selection = displayObject.TextSelectedRange; // We first draw background. if (selection.Y >= selection.X) { Vector2f minSel, maxSel; info.GetBoundingRect(selection, out minSel, out maxSel); // We enlarge for better look. float enlarge = (maxSel.Y - minSel.Y) * (lineSpacing - 1.0f); minSel.Y -= enlarge / 1.5f; maxSel.Y += enlarge / 1.5f; ITransform btransform; IMapper bmapper; IFill bfill = BackgroundStyle.Merge(style != null ? style.SelectionBackground : null, otherStyle != null ? otherStyle.SelectionBackground : null, alpha, out btransform, out bmapper); if (bfill != null) { if (btransform != null) { canvas.TextureTransform = btransform; } canvas.FillShape(bfill, new Rectf(minSel, maxSel), bmapper); if (btransform != null) { canvas.TextureTransform = null; } } } // We draw other text. if (fill != null) { info.Render(fill, new Vector2i(0, selection.X - 1)); info.Render(fill, new Vector2i(selection.Y + 1, (int)info.GlyphCount - 1)); } else if (pen != null) { info.Render(pen, new Vector2i(0, selection.X - 1)); info.Render(pen, new Vector2i(selection.Y + 1, (int)info.GlyphCount - 1)); } // We draw selected text. if (selFill != null) { info.Render(selFill, selection); } else if (selPen != null) { info.Render(selPen, selection); } displayObject.SetTextInfo(info); } return(true); }