Author Topic: How can I get real pixels the font rendering on the screen(use screen coordinat)  (Read 2366 times)

WinMain

  • Newbie
  • *
  • Thank You
  • -Given: 1
  • -Receive: 0
  • Posts: 6
    • View Profile
Hi,guys,unfortune,my project using NGUI 2.0.3,now we want to make UILabel support hyperlike.so I modify my UIFont code to implement it like NGUI 3.X.I use mouse position(screen coordinate system) to judge if touch the link.The code like below:
UILabel:
public int GetCharacterIndexAtPosition(Vector3 sceenPos)
{
        return mFont.GetExactCharacterIndex(sceenPos);
}
UIFont:
if UNITY_3_5_4
   public void Print (string text, Color color, BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color> cols,
      bool encoding, SymbolStyle symbolStyle, Alignment alignment, int lineWidth)
#else
   public void Print (string text, Color32 color, BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color> cols,
      bool encoding, SymbolStyle symbolStyle, Alignment alignment, int lineWidth)
#endif
   {
      if (mReplacement != null)
      {
         mReplacement.Print(text, color, verts, uvs, cols, encoding, symbolStyle, alignment, lineWidth);
      }
      else if (mFont != null && text != null)
      {
         if (!mFont.isValid && !UseDynamicFont)
         {
            UIDebug.LogError("Attempting to print using an invalid font!");
            return;
         }
           
            mTempIndices.Clear();
            mTempVerts.Clear();
            linkTextIdx.Clear();
         mColors.Clear();
         mColors.Add(color);

         Vector2 scale = charSize > 0 ? new Vector2(1f / charSize, 1f / charSize) : Vector2.one;

         int indexOffset = verts.size;
         int maxX = 0;
         int x = 0;
         int y = 0;
         int prev = 0;
         int lineHeight = (charSize + mSpacingY);
         Vector3 v0 = Vector3.zero, v1 = Vector3.zero;
         Vector2 u0 = Vector2.zero, u1 = Vector2.zero;
         float invX = uvRect.width / mFont.texWidth;
         float invY = mUVRect.height / mFont.texHeight;
         int textLength = text.Length;
         
         //int vertsIndex = 0;
         float yMax_row = 0;
         
          //JUDIVA, include symbols in font
            RegisterFont(this);
            if (UseDynamicFont)
         {
            CharacterInfo charInfo;
            dynamicFont.RequestCharactersInTexture("|",dynamicFontSize,dynamicFontStyle);
            if (dynamicFont.GetCharacterInfo('|', out charInfo, dynamicFontSize, dynamicFontStyle))
               {                                  
               yMax_row = Mathf.Abs( Mathf.RoundToInt(charInfo.vert.yMax) );
               lineHeight =  Mathf.Abs(Mathf.RoundToInt(charInfo.vert.height)) + mSpacingY;
               }
            dynamicFont.RequestCharactersInTexture(text, dynamicFontSize, dynamicFontStyle);
         }

            int nLinkStart = -1;
            string link = "";
         for (int i = 0; i < textLength; ++i)
         {
            char c = text;

            if (c == '\n')
            {
               if (x > maxX) maxX = x;

               if (alignment != Alignment.Left)
               {
                  Align(verts, indexOffset, alignment, x, lineWidth);
                  indexOffset = verts.size;
               }

               x = 0;
               y += lineHeight;
               prev = 0;
               
               /*
               for(int j = vertsIndex;j < verts.size; ++j)
               {
                  Vector2 temp = verts.buffer[j];
                  temp.y += (yMax_row/2 - charSize/2)*scale.y;
                  verts.buffer[j] = temp;
               }
               yMax_row = 0;
               vertsIndex = verts.size;*/
               continue;
            }

            if (c < ' ')
            {
               prev = 0;
               continue;
            }

            if (encoding && c == '[')
            {
               int retVal = NGUITools.ParseSymbol(text, i, mColors);

               if (retVal > 0)
               {
                  color = mColors[mColors.Count - 1];
                  i += retVal - 1;
                  continue;
               }
            }

                // ext code
                // HyperLink
                if (encoding && c == '#')
                {
                    int retVal = 0;
                    NGUITools.HyperLinkFlag flag = NGUITools.ParseHyperLink(text, i, ref retVal, ref link);

                    if (retVal > 0)
                    {
                        if (flag == NGUITools.HyperLinkFlag.EHead)
                        {
                            i += retVal - 1;
                            nLinkStart = i;
                        }
                        else if(flag == NGUITools.HyperLinkFlag.EEnd && nLinkStart != -1)
                        {
                            for (int j = nLinkStart; j < i-1; ++j)
                            {
                                linkTextIdx.Add(j, link);
                            }

                            i += retVal - 1;
                        }

                        continue;
                    }
                }

                if (!UseDynamicFont)
                {
                    // See if there is a symbol matching this text
                   
                    {
                        BMGlyph glyph = mFont.GetGlyph(c);
                        if (glyph == null) continue;

                        if (prev != 0) x += glyph.GetKerning(prev);

                        if (c == ' ')
                        {
                            x += mSpacingX + glyph.advance;
                            prev = c;
                            continue;
                        }

                        v0.x = scale.x * (x + glyph.offsetX);
                        v0.y = -scale.y * (y + glyph.offsetY);

                        v1.x = v0.x + scale.x * glyph.width;
                        v1.y = v0.y - scale.y * glyph.height;

                        u0.x = mUVRect.xMin + invX * glyph.x;
                        u0.y = mUVRect.yMax - invY * glyph.y;

                        u1.x = u0.x + invX * glyph.width;
                        u1.y = u0.y - invY * glyph.height;


                        // ext code
                        mTempIndices.Add(i);
                        mTempVerts.Add(new Vector3(x, y, 0));


                        x += mSpacingX + glyph.advance;
                        prev = c;

                        if (true)
                        {
                            for (int b = 0; b < 4; ++b) cols.Add(color);
                        }
                       
                    }
               
                    uvs.Add(new Vector2(u1.x, u0.y));
                    uvs.Add(new Vector2(u1.x, u1.y));
                    uvs.Add(new Vector2(u0.x, u1.y));
                    uvs.Add(new Vector2(u0.x, u0.y));

                    verts.Add(new Vector3(v1.x, v0.y));
                    verts.Add(new Vector3(v1.x, v1.y));
                    verts.Add(new Vector3(v0.x, v1.y));
                    verts.Add(new Vector3(v0.x, v0.y));

                    // ext code
                    mTempVerts.Add(new Vector3(x, y + lineHeight, 0));

                }

                else
                {
                    //v0 v1 are the two corners
                    CharacterInfo charInfo;
                    if (!dynamicFont.GetCharacterInfo(c, out charInfo, dynamicFontSize, dynamicFontStyle))
                    {
                        UIDebug.LogError("character not found in font");
                        continue;
                    }
               
                    v0.x = scale.x * (x + charInfo.vert.xMin);
                    v0.y = scale.y * (-y + charInfo.vert.yMax);
                    v1.x = scale.x * (x + charInfo.vert.xMax);
                    v1.y = scale.y * (-y + charInfo.vert.yMin);
               

                   
                    u0.x = charInfo.uv.xMin;
                    u0.y = charInfo.uv.yMin;
                    u1.x = charInfo.uv.xMax;
                    u1.y = charInfo.uv.yMax;

                    // ext code
                    mTempIndices.Add(i);
                    mTempVerts.Add(new Vector3(x, y, 0));


                    x += mSpacingX+(int)charInfo.width;

                    for (int b = 0; b < 4; ++b) cols.Add(color);

                    if (charInfo.flipped)
                    {
                        //swap entries
                        uvs.Add(new Vector2(u0.x, u1.y));
                        uvs.Add(new Vector2(u0.x, u0.y));
                        uvs.Add(new Vector2(u1.x, u0.y));
                        uvs.Add(new Vector2(u1.x, u1.y));
                    }
                    else
                    {
                        uvs.Add(new Vector2(u1.x, u0.y));
                        uvs.Add(new Vector2(u0.x, u0.y));
                        uvs.Add(new Vector2(u0.x, u1.y));
                        uvs.Add(new Vector2(u1.x, u1.y));
                    }

                    verts.Add(new Vector3(v1.x, v0.y));
                    verts.Add(new Vector3(v0.x, v0.y));
                    verts.Add(new Vector3(v0.x, v1.y));
                    verts.Add(new Vector3(v1.x, v1.y));

                    // ext code
                    mTempVerts.Add(new Vector3(x, y + lineHeight, 0));

                }
         }
         
         if(UseDynamicFont)
         {            
            for(int j = 0;j < verts.size; ++j)
            {
               Vector2 temp = verts.buffer[j];
               temp.y += (yMax_row/2 - charSize/2)*scale.y;
               verts.buffer[j] = temp;
            }
         }
         
         if (alignment != Alignment.Left && indexOffset < verts.size)
         {
                if (!UseDynamicFont)
                    Align(verts, indexOffset, alignment, x, lineWidth);
                else
            {
               Align(verts, indexOffset, alignment, x, lineWidth);
            }
                   
            indexOffset = verts.size;
         }
      }
   }

The code where comment "ext code" is my code.That I want to put the real pixels the font rendering size into mTempVerts,and use GetCharacterIndexAtPosition() to judge the mouse position whether click on hyperlink.But now the value in mTempVerts is wrong,it's not the right value on the screen,example the value in mTempVerts is 32,but on the screen it's more than 10.I think maybe I need do same scale in my value.So how I can to correct my code.