static void drawHinshiText(SKCanvas canvas, SKPaint paint, WaterTrans.TypeLoader.TypefaceInfo tfi, HKWaxBase ch, bool bRightLeft)
        {
            if (string.IsNullOrEmpty(ch.Hinshi))
            {
                return;
            }
            //Debug.WriteLine($"drawhinshi hinsi={ch.Hinshi}");

            float hinshiFontSize = ch.FontSize * 0.5f; //ルビの文字サイズは本文の半分

            paint.TextSize = hinshiFontSize;
            var   glyphs = stringToVerticalGlyphs(ch.Hinshi, paint, tfi);
            float curX   = ch.DevX;

            if (bRightLeft != true) //左右交互
            {
                curX += paint.TextSize;
            }
            //if (ch.Hinshi.Length >= 2)
            //  curX -= paint.TextSize;   //左から2文字
            float curY = ch.DevY;

            foreach (var glyph in glyphs)
            {
                drawChar(canvas, glyph, curX - ch.FontSize /*本文の左側*/,
                         curY, paint);
                curY += paint.TextSize; /*下に進む*/
            }
        }
        static void drawHonbunChar(SKCanvas canvas, SKPaint paint, WaterTrans.TypeLoader.TypefaceInfo tfi, HKWaxBase ch)
        {
            //文字をGlyphIdに変換
            var glyphs = stringToVerticalGlyphs(ch.Char, paint, tfi);

            //描画の文字サイズを設定
            paint.TextSize = ch.FontSize;
            //本文を描画
            drawText(canvas, glyphs, ch.DevX, ch.DevY, paint);
        }
 //ページを描画
 static void drawPage(SKCanvas canvas, SKPaint paint, WaterTrans.TypeLoader.TypefaceInfo tfi, IHKWaxPage page, bool isVisibleHinshi)
 {
     foreach (var item in page.Lines.Select((v, i) => new { v, i }))
     {
         foreach (var ch in item.v.Chars)
         {
             paint.Color = new SKColor(0, 0, 0);
             //本文を描画
             drawHonbunChar(canvas, paint, tfi, ch);
             //右ルビを描画
             drawRubyText(canvas, paint, tfi, ch);
         }
     }
 }
        //文字列からGlyphIdを取得
        static ushort[] stringToVerticalGlyphs(string text, SKPaint paint, WaterTrans.TypeLoader.TypefaceInfo typefaceInfo)
        {
            ushort[] glyphs;
            paint.Typeface.CharsToGlyphs(text, out glyphs);
            var conv = typefaceInfo.GetVerticalGlyphConverter();

            for (int i = 0; i < glyphs.Length; i++)
            {
                if (conv.CanConvert(glyphs[i]))
                {
                    glyphs[i] = conv.Convert(glyphs[i]);
                }
            }
            return(glyphs);
        }
示例#5
0
        public static void DrawHonbunPage(SKCanvas canvas, IHKWaxPage page, bool isVisibleHinshi)
        {
            WaterTrans.TypeLoader.TypefaceInfo tfi;
            using (var fs = OpenFontStream())
                tfi = new WaterTrans.TypeLoader.TypefaceInfo(fs);

            using (var paint = new SKPaint())
                using (var tf = SKTypeface.FromStream(new SKManagedStream(OpenFontStream(), true) /*,0*/))
                {
                    canvas.DrawColor(SKColors.White); //背景を白に
                    paint.IsAntialias = true;
                    paint.Typeface    = tf;
                    //paint.IsVerticalText = true;

                    //ページを描画
                    drawPage(canvas, paint, tfi, page, isVisibleHinshi);
                }
        }
        static void drawRubyText(SKCanvas canvas, SKPaint paint, WaterTrans.TypeLoader.TypefaceInfo tfi, HKWaxBase ch)
        {
            if (string.IsNullOrEmpty(ch.Ruby))
            {
                return;
            }
            float rubyFontSize = ch.FontSize * 0.6f;  //ルビの文字サイズは本文の半分

            paint.TextSize = rubyFontSize;
            var   glyphs = stringToVerticalGlyphs(ch.Ruby, paint, tfi);
            float curY   = ch.DevY;

            foreach (var glyph in glyphs)
            {
                drawChar(canvas, glyph, ch.DevX + ch.FontSize /*本文の右*/,
                         curY, paint);
                curY += paint.TextSize;/*下に進む*/
            }
        }