// lineX下一行的偏移量
        public virtual void fill(ref Vector2 currentpos, List <Line> lines, float maxWidth, float pixelsPerUnit)
        {
            NextLineX = d_nextLineX * pixelsPerUnit;
            List <Element> TempList;

            UpdateWidthList(out TempList, pixelsPerUnit);
            float height = getHeight();

            AlterX(ref currentpos.x, maxWidth);
            if (TempList.Count == 0)
            {
                return;
            }

            Around around    = owner.around;
            bool   isContain = false; // 当前行是否包含此元素

            for (int i = 0; i < TempList.Count;)
            {
                float totalwidth = TempList[i].totalwidth;
                float newx       = 0f;
                if (((currentpos.x + totalwidth) > maxWidth))
                {
                    currentpos = TempList[i].Next(this, currentpos, lines, maxWidth, NextLineX, height, around, totalwidth, ref isContain);
                    ++i;
                }
                else if (around != null && !around.isContain(currentpos.x, currentpos.y, totalwidth, height, out newx))
                {
                    // 放置不下了
                    currentpos.x = newx;
                }
                else
                {
                    currentpos.x += totalwidth;
                    isContain     = true;
                    ++i;
                }
            }

            Line bl = lines.back();

            bl.x = currentpos.x;
            bl.y = Mathf.Max(height, bl.y);

            if (d_bNewLine)
            {
                lines.Add(new Line(Vector2.zero));
                currentpos.y += height;
                currentpos.x  = NextLineX;
            }
        }
Beispiel #2
0
            void DrawCurrent(bool isnewLine, Around around, float lineX)
            {
                if (sb.Length != 0)
                {
                    var  line      = lines[(int)yline];
                    Rect area_rect = new Rect(pt.x + alignedX, pt.y, x - pt.x + offsetX, node.getHeight());

                    cache.cacheText(line, node, sb.ToString(), area_rect);

                    sb.Remove(0, sb.Length);
                }

                if (isnewLine)
                {
                    // 再换行
                    yline++;
                    x = lineX;

                    pt.x = offsetX;
                    pt.y = offsetY;
                    for (int n = 0; n < yline; ++n)
                    {
                        pt.y += lines[n].y;
                    }

                    if (yline >= lines.Count)
                    {
                        --yline;
                        //Debug.LogError("yline >= vLineSize.Count!yline:" + yline + " vLineSize:" + lines.Count);
                    }

                    alignedX = AlignedFormatting(node.owner, xFormatting, maxWidth, lines[(int)(yline)].x, lineX);

                    float newx;
                    if (!around.isContain(pt.x + alignedX, pt.y, 1, node.getHeight(), out newx))
                    {
                        pt.x = newx - alignedX;
                        x    = pt.x;
                    }
                }
            }
            public Vector2 Next(NodeBase n, Vector2 currentPos, List <Line> lines, float maxWidth, float lineX, float height, Around round, float tw, ref bool currentLineContain)
            {
                if (currentPos.x != 0f)
                {
                    Line bl = lines.back();
                    bl.x = currentPos.x;
                    if (currentLineContain)
                    {
                        bl.y = Mathf.Max(bl.y, height);
                    }

                    // 当前行有数据,在新行里处理
                    currentPos.x       = lineX;
                    currentPos.y      += bl.y;
                    currentLineContain = false;
                    lines.Add(new Line(new Vector2(lineX, 0)));
                }
                else
                {
                    // 当前行没有数据,直接在此行处理
                }

                if (round != null)
                {
                    float newx = 0f;
                    while (!round.isContain(currentPos.x, currentPos.y, tw, height, out newx))
                    {
                        currentPos.x = newx;
                        if (currentPos.x + tw > maxWidth)
                        {
                            currentPos.x = lineX;
                            lines.Add(new Line(new Vector2(lineX, height)));
                            currentPos.y += height;
                        }
                    }
                }

                if (widthList != null)
                {
                    for (int i = 0; i < widthList.Count; ++i)
                    {
                        currentPos = Add(n, currentPos, widthList[i], maxWidth, lineX, lines, height, ref currentLineContain);
                    }
                }
                else
                {
                    currentPos = Add(n, currentPos, totalWidth, maxWidth, lineX, lines, height, ref currentLineContain);
                }

                lines.back().x = currentPos.x;

                return(currentPos);
            }
Beispiel #4
0
            void DrawCurrent(bool isnewLine, Around around)
            {
                if (node.owner.isArabic)
                {
                    if (sb.Length != 0)
                    {
                        float width     = pt.x - x - offsetX;
                        Rect  area_rect = new Rect(x - alignedX, pt.y, width, node.getHeight());

                        cache.cacheText(lines[(int)yline], node, sb.ToString(), area_rect);

                        sb.Remove(0, sb.Length);
                    }

                    if (isnewLine)
                    {
                        // 再换行
                        yline++;
                        x = maxWidth;

                        pt.x = x - offsetX;
                        pt.y = offsetY;
                        for (int n = 0; n < yline; ++n)
                        {
                            pt.y += lines[n].y;
                        }

                        if (yline >= lines.Count)
                        {
                            --yline;
                            //Debug.LogError("yline >= vLineSize.Count!yline:" + yline + " vLineSize:" + lines.Count);
                        }

                        float curentWidth = lines[(int)(yline)].x;
                        alignedX = AlignedFormatting(node.owner, xFormatting, maxWidth, curentWidth);
                        alignedX = maxWidth - (alignedX + curentWidth);

                        float newx;
                        if (!around.isContain(pt.x + alignedX, pt.y, 1, node.getHeight(), out newx, true))
                        {
                            pt.x = newx - alignedX;
                            x    = pt.x;
                        }
                    }
                }
                else
                {
                    if (sb.Length != 0)
                    {
                        Rect area_rect = new Rect(pt.x + alignedX, pt.y, x - pt.x + offsetX, node.getHeight());

                        cache.cacheText(lines[(int)yline], node, sb.ToString(), area_rect);

                        sb.Remove(0, sb.Length);
                    }

                    if (isnewLine)
                    {
                        // 再换行
                        yline++;
                        x = 0.0f;

                        pt.x = offsetX;
                        pt.y = offsetY;
                        for (int n = 0; n < yline; ++n)
                        {
                            pt.y += lines[n].y;
                        }

                        if (yline >= lines.Count)
                        {
                            --yline;
                            //Debug.LogError("yline >= vLineSize.Count!yline:" + yline + " vLineSize:" + lines.Count);
                        }

                        alignedX = AlignedFormatting(node.owner, xFormatting, maxWidth, lines[(int)(yline)].x);

                        float newx;
                        if (!around.isContain(pt.x + alignedX, pt.y, 1, node.getHeight(), out newx))
                        {
                            pt.x = newx - alignedX;
                            x    = pt.x;
                        }
                    }
                }
            }
Beispiel #5
0
            public void Draw(TextNode n)
            {
                node = n;
                if (n.owner.isArabic)
                {
                    pt = new Vector2(x - offsetX, offsetY);
                    for (int i = 0; i < yline; ++i)
                    {
                        pt.y += lines[i].y;
                    }

                    if (maxWidth == 0)
                    {
                        return;
                    }

                    float curentWidth = lines[(int)(yline)].x;
                    alignedX = AlignedFormatting(n.owner, xFormatting, maxWidth, curentWidth);
                    alignedX = maxWidth - (alignedX + curentWidth);
                    fHeight  = node.getHeight();

                    sb.Remove(0, sb.Length);

                    Around around = n.owner.around;

                    int   textindex = node.d_text.Length - 1;
                    float newx      = maxWidth;
                    for (int k = node.d_widthList.Count - 1; k >= 0; --k)
                    {
                        Element e          = node.d_widthList[k];
                        float   totalwidth = e.totalwidth;
                        if ((x - totalwidth) < 0)
                        {
                            if (x != maxWidth)
                            {
                                DrawCurrent(true, around);
                            }

                            if (e.widths == null)
                            {
                                if ((x - e.totalwidth < 0))
                                {
                                    DrawCurrent(true, around);
                                }
                                else
                                {
                                    x -= e.totalwidth;
                                    sb.Insert(0, node.d_text[textindex--]);
                                }
                            }
                            else
                            {
                                for (int m = 0; m < e.widths.Count;)
                                {
                                    if (x != maxWidth && x - e.widths[m] < 0)
                                    {
                                        DrawCurrent(true, around);
                                    }
                                    else
                                    {
                                        x -= e.widths[m];
                                        sb.Insert(0, node.d_text[textindex--]);
                                        ++m;
                                    }
                                }
                            }
                        }
                        else if (!around.isContain(x, pt.y, totalwidth, fHeight, out newx, true))
                        {
                            DrawCurrent(false, around);

                            x    = newx;
                            pt.x = newx;
                            ++k;
                        }
                        else
                        {
                            int ec = e.count;
                            sb.Insert(0, node.d_text.Substring(textindex + 1 - ec, ec));
                            textindex -= ec;
                            x         -= totalwidth;
                        }
                    }

                    if (sb.Length != 0)
                    {
                        DrawCurrent(false, around);
                    }

                    if (node.d_bNewLine == true)
                    {
                        yline++;
                        x = maxWidth;
                    }
                }
                else
                {
                    pt = new Vector2(x + offsetX, offsetY);
                    for (int i = 0; i < yline; ++i)
                    {
                        pt.y += lines[i].y;
                    }

                    if (maxWidth == 0)
                    {
                        return;
                    }

                    alignedX = AlignedFormatting(n.owner, xFormatting, maxWidth, lines[(int)(yline)].x);
                    fHeight  = node.getHeight();

                    sb.Remove(0, sb.Length);

                    Around around = n.owner.around;

                    int   textindex = 0;
                    float newx      = 0f;
                    for (int k = 0; k < node.d_widthList.Count; ++k)
                    {
                        Element e          = node.d_widthList[k];
                        float   totalwidth = e.totalwidth;
                        if ((x + totalwidth) > maxWidth)
                        {
                            if (x != 0f)
                            {
                                DrawCurrent(true, around);
                            }

                            if (e.widths == null)
                            {
                                if ((x + e.totalwidth > maxWidth))
                                {
                                    DrawCurrent(true, around);
                                }
                                else
                                {
                                    x += e.totalwidth;
                                    sb.Append(node.d_text[textindex++]);
                                }
                            }
                            else
                            {
                                for (int m = 0; m < e.widths.Count;)
                                {
                                    if (x != 0 && x + e.widths[m] > maxWidth)
                                    {
                                        DrawCurrent(true, around);
                                    }
                                    else
                                    {
                                        x += e.widths[m];
                                        sb.Append(node.d_text[textindex++]);
                                        ++m;
                                    }
                                }
                            }
                        }
                        else if (!around.isContain(x, pt.y, totalwidth, fHeight, out newx))
                        {
                            DrawCurrent(false, around);

                            x    = newx;
                            pt.x = newx;
                            --k;
                        }
                        else
                        {
                            int ec = e.count;
                            sb.Append(node.d_text.Substring(textindex, ec));
                            textindex += ec;
                            x         += totalwidth;
                        }
                    }

                    if (sb.Length != 0)
                    {
                        DrawCurrent(false, around);
                    }

                    if (node.d_bNewLine == true)
                    {
                        yline++;
                        x = 0;
                    }
                }
            }