Esempio n. 1
0
 public FontGlyphData(FontPage page, FontGlyph glyph, Rectangle rectangle)
 {
     this.Page             = page;
     this.glyph            = glyph;
     this.Rectangle        = rectangle;
     this.PaddingRectangle = page.GeneratePaddingRectangle(rectangle);
     this.SpacingRectangle = page.GenerateSpacingRectangle(rectangle);
 }
Esempio n. 2
0
        private IReservator ReserveRegion(FontGlyph glyph, Point point)
        {
            var padding     = this.settings.Padding;
            var metrics     = glyph.Metrics;
            var width       = metrics.Width;
            var height      = metrics.Height;
            var rect        = new Rectangle(point.X + padding.Left, point.Y + padding.Top, width, height);
            var paddingRect = this.Page.GeneratePaddingRectangle(rect);

            if (paddingRect.Right > this.Rectangle.Right || paddingRect.Bottom > this.Rectangle.Bottom)
            {
                return(null);
            }

            var spacingRect = this.Page.GenerateSpacingRectangle(rect);
            var nodeList    = new List <FontNode>(this.count);

            this.CollectNode(spacingRect, nodeList);
            if (nodeList.Any() == false)
            {
                return(null);
            }

            var query1 = from item in nodeList
                         where item.IsLeaf
                         select item;
            var query2 = from item in query1
                         where this.IntersectsWithGlyph(spacingRect) == false
                         select item;

            if (query1.Count() != query2.Count())
            {
                return(null);
            }

            return(new Reservator(() => this.Reserve(glyph, nodeList.ToArray(), rect)));
        }
Esempio n. 3
0
        private void Reserve(FontGlyph glyph, FontNode[] nodes, Rectangle region)
        {
            var glyphData = new FontGlyphData(this.Page, glyph, region);

            foreach (var item in nodes)
            {
                item.AddGlyphData(glyphData);
            }
            var spacingRect = glyphData.SpacingRectangle;
            var lt          = new Point(spacingRect.Left, spacingRect.Top);
            var rt          = new Point(spacingRect.Right, spacingRect.Top);
            var lb          = new Point(spacingRect.Left, spacingRect.Bottom);
            var rb          = new Point(spacingRect.Right, spacingRect.Bottom);

            this.pointList.Remove(lt);
            this.pointList.Remove(lb);
            this.pointList.Insert(0, rt);
            if (this.rightBottomList.Contains(lb) == false)
            {
                this.pointList.Add(lb);
            }

            this.rightBottomList.Add(rb);
        }
Esempio n. 4
0
        public IReservator ReserveRegion(FontGlyph glyph)
        {
            if (glyph == null)
            {
                throw new ArgumentNullException(nameof(glyph));
            }
            if (glyph.Bitmap == null)
            {
                return(null);
            }
            if (this.Parent != null)
            {
                throw new InvalidOperationException(Resources.Exception_RootOnlyCanBeUsed);
            }

            foreach (var item in this.pointList)
            {
                if (this.ReserveRegion(glyph, item) is IReservator reservator)
                {
                    return(reservator);
                }
            }
            return(null);
        }
Esempio n. 5
0
 public IReservator ReserveRegion(FontGlyph glyph)
 {
     return(this.node.ReserveRegion(glyph));
 }