Beispiel #1
0
        public override float Draw(XGraphics gfx, PointF pt, bool dorender)
        {
            float acty = 0;

            foreach (string line in GetLines(gfx))
            {
                float tpos = m_x0, apos = m_x0;
                SongLineParser par = new SongLineParser(line);
                while (par.Current != SongLineParser.Token.End)
                {
                    if (par.Current == SongLineParser.Token.Word)
                    {
                        float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width;
                        if (dorender) gfx.DrawString(par.Data, Options.TextFont, Options.TextColor, new PointF(pt.X + tpos, acty + pt.Y + Options.ChordHeight), XStringFormat.TopLeft);
                        tpos += wordwi;
                    }
                    if (par.Current == SongLineParser.Token.Space)
                    {
                        tpos += Options.HTextSpace;
                    }
                    if (par.Current == SongLineParser.Token.Chord)
                    {
                        if (tpos < apos) tpos = apos; // aby nebyly 2 akordy pres sebe
                        apos = tpos;
                        float chordwi = (float)gfx.MeasureString(par.Data, Options.ChordFont).Width;
                        if (dorender) gfx.DrawString(par.Data, Options.ChordFont, Options.ChordColor, new PointF(pt.X + apos, acty + pt.Y), XStringFormat.TopLeft);
                        apos += chordwi + Options.HChordSpace;
                    }
                    par.Read();
                }
                acty += Options.ChordHeight + Options.TextHeight;
            }
            DrawLabel(gfx, pt, Options.ChordHeight + Options.TextHeight);

            return acty;
        }
Beispiel #2
0
        // resi odradkovani, muze se odradkovat jen pri Space
        private IEnumerable<string> GetLines(XGraphics gfx)
        {
            List<string> lines = new List<string>();
            float tpos = m_x0, apos = m_x0;
            SongLineParser par = new SongLineParser(m_text);

            SongLineParser.ParserState lastflushed = par.InitState;
            SongLineParser.ParserState lastspace = par.InitState;

            while (true)
            {
                if (par.Current == SongLineParser.Token.Word)
                {
                    float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width;
                    tpos += wordwi;
                    par.Read();
                }
                else if (par.Current == SongLineParser.Token.Space || par.Current == SongLineParser.Token.End)
                {
                    if ((apos > Options.PageWidth || tpos > Options.PageWidth) && (lastspace.Position > lastflushed.Position))
                    {
                        yield return par.Original.Substring(lastflushed.Position, lastspace.Position - lastflushed.Position);
                        lastflushed = lastspace;
                        par.State = lastspace;
                        apos = tpos = m_x0;
                    }
                    else
                    {
                        if (par.Current == SongLineParser.Token.End) break;
                        tpos += Options.HTextSpace;
                        lastspace = par.State;
                        par.Read();
                    }
                    if (par.Current == SongLineParser.Token.End) break;
                }
                else if (par.Current == SongLineParser.Token.Chord)
                {
                    if (tpos < apos) tpos = apos; // aby nebyly 2 akordy pres sebe
                    apos = tpos;
                    float chordwi = (float)gfx.MeasureString(par.Data, Options.ChordFont).Width;
                    apos += chordwi + Options.HChordSpace;
                    par.Read();
                }
            }
            yield return par.Original.Substring(lastflushed.Position);
        }
 private void MakeInChordLine(string line, TextWriter fw)
 {
     BeginLine(GetLabel(), fw, LineType.MIXED);
     SongLineParser par = new SongLineParser(line);
     while (par.Current != SongLineParser.Token.End)
     {
         switch (par.Current)
         {
             case SongLineParser.Token.Word:
                 DumpText(par.Data, fw);
                 break;
             case SongLineParser.Token.Chord:
                 int reallen = par.Data.Length;
                 DumpChord(par.Data, fw, ref reallen);
                 break;
             case SongLineParser.Token.Space:
                 DumpText(" ", fw);
                 break;
         }
         par.Read();
     }
     EndLine(fw, LineType.MIXED);
 }
Beispiel #4
0
        public override float Draw(XGraphics gfx, PointF pt, bool dorender)
        {
            float actx = m_x0;
            float acty = 0;
            SongLineParser par = new SongLineParser(m_text);
            bool wasword = false;
            while (par.Current != SongLineParser.Token.End)
            {
                if (par.Current == SongLineParser.Token.Word)
                {
                    if (wasword) actx += Options.HTextSpace;
                    float wordwi = (float)gfx.MeasureString(par.Data, Options.TextFont).Width;
                    if (actx + wordwi > Options.PageWidth && actx > m_x0) // slovo se nevejde na radku
                    { // odradkujeme
                        actx = m_x0;
                        acty += Options.TextHeight;
                    }
                    if (dorender) gfx.DrawString(par.Data, Options.TextFont, Options.TextColor, new PointF(pt.X + actx, pt.Y + acty), XStringFormat.TopLeft);
                    actx += wordwi;
                    wasword = true;
                }
                par.Read();
            }

            if (actx > 0) acty += Options.TextHeight;
            if (dorender) DrawLabel(gfx, pt, Options.TextHeight);
            return acty;
        }
        private void MakeNormalChordLine(string line, TextWriter fw)
        {
            StringBuilder tline = new StringBuilder(), chline = new StringBuilder(), chordsp = new StringBuilder();
            int tpos = 0, apos = 0;//pozice, kam se pise text,akord

            BeginLine(m_labelsp, fw, LineType.CHORD);
            SongLineParser par = new SongLineParser(line);
            while (par.Current != SongLineParser.Token.End)
            {
                switch (par.Current)
                {
                    case SongLineParser.Token.Word:
                        tline.Append(par.Data);
                        tpos += par.Data.Length;
                        break;
                    case SongLineParser.Token.Chord:
                        while (apos < tpos)
                        {
                            chordsp.Append(' ');
                            apos++;
                        }
                        DumpChordSpace(chordsp.ToString(), fw);
                        chordsp = new StringBuilder();

                        int reallen = par.Data.Length;
                        DumpChord(par.Data, fw, ref reallen);
                        apos += reallen;
                        chordsp.Append(' ');
                        apos++;
                        break;
                    case SongLineParser.Token.Space:
                        tline.Append(" ");
                        tpos += 1;
                        break;
                }
                par.Read();
            }
            EndLine(fw, LineType.CHORD);

            BeginLine(GetLabel(), fw, LineType.TEXT);
            DumpText(tline.ToString(), fw);
            EndLine(fw, LineType.TEXT);
        }