Beispiel #1
0
 private void EndLine(LineData currentLine, StringBuilder currentLineText)
 {
     currentLine.Text = currentLineText.ToString().Trim();
     if (!string.IsNullOrWhiteSpace(currentLine.Text))
     {
         currentLine.TextSize = PInvoked.MeasureString(graphics, currentLine.Text, font,
                                                       settings.LetterSpacing);
         Lines.Add(currentLine);
     }
 }
        public Bitmap Draw(IEnumerable <LineData> lines)
        {
            foreach (var line in lines)
            {
                //create bitmap for line
                using (var lineImage = new Bitmap(line.TextSize.Width, line.TextSize.Height))
                {
                    var lineGraphics = Graphics.FromImage(lineImage);

                    if (settings.TextAlign != Constants.TextAlignmentOptions.Justify)
                    {
                        PInvoked.TextOut(lineGraphics, line.Text, 0, 0, font, settings.LetterSpacing);
                    }
                    else
                    {
                        Justify(line, lineGraphics);
                    }

                    //draw line bitmap to image
                    graphics.DrawImage(lineImage,
                                       new Rectangle(
                                           line.LineBounds.Location,
                                           lineImage.Size
                                           ), /* destination rect */
                                       0, 0,  /* source coordinates */
                                       lineImage.Width,
                                       lineImage.Height,
                                       GraphicsUnit.Pixel,
                                       imageAttributes
                                       );

#if DEBUG
                    //draw rectangles
                    graphics.DrawRectangle(Pens.White, line.LineBounds);
                    graphics.DrawLine(Pens.Gray,
                                      line.LineBounds.X,
                                      line.LineBounds.Y + line.TextSize.Height / 2,
                                      line.LineBounds.X + line.TextSize.Width,
                                      line.LineBounds.Y + line.TextSize.Height / 2
                                      );
#endif
                    lineGraphics.Dispose();
                }
            }

            //create selection-sized bitmap
            var resultImage    = new Bitmap(selectionBounds.Width, selectionBounds.Height);
            var resultGraphics = Graphics.FromImage(resultImage);
            resultGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            resultGraphics.DrawImage(image, 0, 0, selectionBounds.Width, selectionBounds.Height);

            return(resultImage);
        }
Beispiel #3
0
        public void SetText()
        {
            IEnumerable <string> words           = settings.Text.Replace(Environment.NewLine, Constants.Space + Environment.NewLine + Constants.Space).Split(' ');
            StringBuilder        currentLineText = new StringBuilder();
            int      y           = 0;
            LineData currentLine = StartNewLine(ref y);

            //until all words are placed or y is outside scaledBounds
            foreach (string word in words)
            {
                if (y > scaledBounds.Bottom + lineIncrement)
                {
                    break;
                }

                if (word.Equals(Environment.NewLine))
                {
                    EndLine(currentLine, currentLineText);

                    //start new line
                    currentLineText.Clear();
                    currentLine = StartNewLine(ref y);

                    continue;
                }

                Size textSize = PInvoked.MeasureString(graphics, (currentLineText + word).Trim(), font,
                                                       settings.LetterSpacing);
                if (textSize.Width > currentLine.LineBounds.Width)
                {
                    EndLine(currentLine, currentLineText);

                    //start new line
                    currentLineText.Clear();
                    currentLine = StartNewLine(ref y);
                    currentLineText.Append(word + Constants.Space);
                }
                else
                {
                    currentLineText.Append(word + Constants.Space);
                }
            }
            if (currentLine != null && currentLineText.Length > 0)
            {
                EndLine(currentLine, currentLineText);
            }
        }
        private void Justify(LineData line, Graphics lineGraphics)
        {
            var lineTextWithoutSpaces = line.Text.Replace(Constants.Space, string.Empty);
            var lineSizeWithoutSpaces = PInvoked.MeasureString(lineGraphics, lineTextWithoutSpaces, font,
                                                               settings.LetterSpacing);
            var spaceWidth = (line.TextSize.Width - lineSizeWithoutSpaces.Width) /
                             Math.Max((line.Text.Length - lineTextWithoutSpaces.Length), 1);

            if (spaceWidth > font.Size * 3)
            {
                PInvoked.TextOut(lineGraphics, line.Text, 0, 0, font, settings.LetterSpacing);
            }
            else
            {
                var x = 0;

                foreach (string word in line.Text.Split(Constants.SpaceChar))
                {
                    var wordSize = PInvoked.MeasureString(lineGraphics, word, font, settings.LetterSpacing);
                    PInvoked.TextOut(lineGraphics, word, x, 0, font, settings.LetterSpacing);
                    x += wordSize.Width + spaceWidth;
                }
            }
        }