}\r
}\r
\r
- internal SizeF MeasureDraw (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format, bool fDraw) { \r
- SizeF retVal = new SizeF(0,0);\r
- awt.Graphics2D g = NativeObject;\r
- \r
- java.awt.Font fnt = font.NativeObject;\r
- if(s != null && s.Length != 0 && fnt != null) {\r
- float size = fnt.getSize();\r
- float wid = layoutRectangle.Width;\r
- float hei = layoutRectangle.Height;\r
- float x = layoutRectangle.X;\r
- float y = layoutRectangle.Y;\r
- java.text.AttributedString astr = new java.text.AttributedString(s);\r
- astr.addAttribute(java.awt.font.TextAttribute.FONT, fnt);\r
- java.text.AttributedCharacterIterator prg = astr.getIterator();\r
- java.awt.font.TextLayout textlayout = new java.awt.font.TextLayout(prg, g.getFontRenderContext());\r
- int prgStart = prg.getBeginIndex();\r
- int prgEnd = prg.getEndIndex();\r
- java.awt.font.LineBreakMeasurer lineMeasurer = new java.awt.font.LineBreakMeasurer(\r
- prg, new java.awt.font.FontRenderContext(null, false, false));\r
- lineMeasurer.setPosition(prgStart);\r
- float formatWidth = wid;\r
- \r
- //some vertical layout magic - should be reviewed\r
- // if(format != null)\r
- // {\r
- // StringFormatFlags formatflag = format.FormatFlags;\r
- // if(formatflag != StringFormatFlags.DirectionVertical)\r
- // {\r
- // if(size > (float)8 && wid > (float)13)\r
- // formatWidth = wid - (float)12;\r
- // if(formatflag == StringFormatFlags.DirectionRightToLeft && size == (float)6)\r
- // formatWidth = wid - (float)10;\r
- // }\r
- // }\r
-\r
- //now calculate number of lines and full layout height\r
- //this is required for LineAlignment calculations....\r
- int lines=0;\r
- float layHeight=0;\r
- float layPrevHeight=0;\r
- float layWidth=0;\r
- float drawPosY = y;\r
- //bool fSkipLastLine = false;\r
- java.awt.font.TextLayout layout;\r
- java.awt.geom.Rectangle2D bnds = new java.awt.geom.Rectangle2D.Float();\r
- while(lineMeasurer.getPosition() < prgEnd) {\r
- layout = lineMeasurer.nextLayout(formatWidth);\r
- lines++;\r
- bnds = bnds.createUnion(layout.getBounds());\r
- layPrevHeight = layHeight;\r
- layHeight += layout.getDescent() + layout.getLeading() + layout.getAscent();\r
- float advance;\r
- if((format != null) && \r
- ((format.FormatFlags & StringFormatFlags.MeasureTrailingSpaces) != 0))\r
- advance = layout.getAdvance();\r
- else\r
- advance = layout.getVisibleAdvance();\r
- if(layWidth < advance)\r
- layWidth = advance;\r
- if((format != null) && ((format.FormatFlags & StringFormatFlags.NoWrap) != 0))\r
- break;\r
- }\r
- //Overhanging parts of glyphs, and unwrapped text reaching outside \r
- //the formatting rectangle are allowed to show. By default all text \r
- //and glyph parts reaching outside the formatting rectangle are clipped.\r
- if((lines == 1) && \r
- (format != null) && \r
- ((format.FormatFlags & StringFormatFlags.NoClip) != 0)) {\r
- formatWidth = layWidth; \r
- }\r
-\r
- //Only entire lines are laid out in the formatting rectangle. By default layout \r
- //continues until the end of the text, or until no more lines are visible as a \r
- //result of clipping, whichever comes first. Note that the default settings allow \r
- //the last line to be partially obscured by a formatting rectangle that is not a \r
- //whole multiple of the line height. To ensure that only whole lines are seen, specify\r
- //this value and be careful to provide a formatting rectangle at least as tall as the \r
- //height of one line.\r
- if(format != null && ((format.FormatFlags & StringFormatFlags.LineLimit) != 0) && \r
- layHeight > hei && layPrevHeight < hei) {\r
- layHeight = layPrevHeight;\r
- lines--;\r
- }\r
-\r
- retVal.Height = layHeight;\r
- retVal.Width = layWidth+size/2.5f;\r
- if(!fDraw)\r
- return retVal;\r
-\r
- NativeObject.setPaint(brush);\r
- g.setRenderingHint(awt.RenderingHints.KEY_TEXT_ANTIALIASING, awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);\r
-\r
- //end measurment\r
-\r
- //for draw we should probably update origins\r
-\r
- //Vertical...\r
- if(format != null) {\r
- StringAlignment align = format.LineAlignment;\r
- if(align == StringAlignment.Center) {\r
- drawPosY = y + (float)hei/2 - layHeight/2;\r
- }\r
- else if(align == StringAlignment.Far) {\r
- drawPosY = (float)y + (float)hei - layHeight;\r
- }\r
- //in both cases if string is not fit - switch to near\r
- if(drawPosY < y)\r
- drawPosY = y;\r
- }\r
-\r
- //Horisontal... on the fly\r
- lineMeasurer.setPosition(prgStart);\r
- float drawPosX = x; \r
- for(int line = 0;line < lines /*lineMeasurer.getPosition() < prgEnd*/;line++, drawPosY += layout.getDescent() + layout.getLeading()) {\r
- layout = lineMeasurer.nextLayout(formatWidth);\r
- drawPosX = x + size / (float)5;//???\r
- drawPosY += layout.getAscent();\r
- if(format != null) {\r
- float advance;\r
- if((format.FormatFlags & StringFormatFlags.MeasureTrailingSpaces) != 0)\r
- advance = layout.getAdvance();\r
- else\r
- advance = layout.getVisibleAdvance();\r
- \r
- if(format.Alignment == StringAlignment.Center) {\r
- drawPosX = (float)((double)x + ((double)formatWidth)/2 - advance/2);\r
- }\r
- else if(format.Alignment == StringAlignment.Far) {\r
- drawPosX = (float)(drawPosX + formatWidth) - advance;\r
- }\r
- if((format.FormatFlags & StringFormatFlags.DirectionVertical ) != 0) {\r
- java.awt.geom.AffineTransform at1 = java.awt.geom.AffineTransform.getTranslateInstance(\r
- drawPosX + size / (float)5, (drawPosY - layout.getAscent()) + size / (float)5);\r
-\r
- at1.rotate(Math.PI/2);\r
- awt.Shape sha = textlayout.getOutline(at1);\r
- geom.AffineTransform t = GetFinalTransform();\r
- if (!t.isIdentity())\r
- sha = t.createTransformedShape(sha);\r
- //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
- g.fill(sha);\r
- continue;\r
- }\r
- if((format.FormatFlags & StringFormatFlags.DirectionRightToLeft) != 0) {\r
- drawPosX = ((drawPosX + formatWidth) - advance) + (float)9;\r
- layout.draw(g, drawPosX, drawPosY);\r
- } \r
- } \r
-\r
- geom.AffineTransform oldT = null;\r
- geom.AffineTransform ft = GetFinalTransform();\r
-\r
- //Draw current line\r
- try {\r
- if (!ft.isIdentity()) {\r
- oldT = NativeObject.getTransform();\r
- NativeObject.transform(ft);\r
- }\r
- layout.draw(g, drawPosX, drawPosY); \r
- }\r
- finally {\r
- if (oldT != null)\r
- NativeObject.setTransform(oldT);\r
- }\r
- }\r
- } //not nulls\r
-\r
- return retVal;\r
- }\r
#endregion\r
\r
#region Dispose\r