public NOpenTypeFontFace(Typeface ntypeface, string fontName, string fontPath) { this.ntypeface = ntypeface; this.name = fontName; this.path = fontPath; //---- glyphPathBuilder = new Agg.GlyphPathBuilderVxs(ntypeface); }
public NOpenTypeActualFont(NOpenTypeFontFace ownerFace, float sizeInPoints, FontStyle style) { this.ownerFace = ownerFace; this.sizeInPoints = sizeInPoints; this.style = style; this.typeFace = ownerFace.Typeface; //calculate scale *** scale = typeFace.CalculateScale(sizeInPoints); }
public GlyphPathBuilderVxs(Typeface typeface) : base(typeface) { }
void RenderWithTextPrinterAndMiniAgg(Typeface typeface, string str, float sizeInPoint, int resolution) { //1. TextPrinter printer = new TextPrinter(); printer.EnableKerning = this.chkKern.Checked; int len = str.Length; GlyphPlan[] glyphPlanList = new GlyphPlan[len]; printer.Print(typeface, sizeInPoint, str, glyphPlanList); //-------------------------- //5. use PixelFarm's Agg to render to bitmap... //5.1 clear background p.Clear(PixelFarm.Drawing.Color.White); if (chkFillBackground.Checked) { //5.2 p.FillColor = PixelFarm.Drawing.Color.Black; //5.3 int glyphListLen = glyphPlanList.Length; float ox = p.OriginX; float oy = p.OriginY; float cx = 0; float cy = 10; for (int i = 0; i < glyphListLen; ++i) { GlyphPlan glyphPlan = glyphPlanList[i]; cx = glyphPlan.x; p.SetOrigin(cx, cy); p.Fill(glyphPlan.vxs); } p.SetOrigin(ox, oy); } if (chkBorder.Checked) { //5.4 p.StrokeColor = PixelFarm.Drawing.Color.Green; //user can specific border width here... //p.StrokeWidth = 2; //5.5 int glyphListLen = glyphPlanList.Length; for (int i = 0; i < glyphListLen; ++i) { GlyphPlan glyphPlan = glyphPlanList[i]; p.Draw(glyphPlan.vxs); } } //6. use this util to copy image from Agg actual image to System.Drawing.Bitmap BitmapHelper.CopyToWindowsBitmap(destImg, winBmp, new RectInt(0, 0, 300, 300)); //--------------- //7. just render our bitmap g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); //-------------------------- }
//from http://www.w3schools.com/tags/ref_pxtoemconversion.asp //set default // 16px = 1 em //------------------- //1. conv font design unit to em // em = designUnit / unit_per_Em //2. conv font design unit to pixels // float scale = (float)(size * resolution) / (pointsPerInch * _typeface.UnitsPerEm); void RenderWithMiniAgg(Typeface typeface, char testChar, float sizeInPoint) { //2. glyph-to-vxs builder var builder = new GlyphPathBuilderVxs(typeface); builder.Build(testChar, sizeInPoint); VertexStore vxs = builder.GetVxs(); //5. use PixelFarm's Agg to render to bitmap... //5.1 clear background p.Clear(PixelFarm.Drawing.Color.White); if (chkFillBackground.Checked) { //5.2 p.FillColor = PixelFarm.Drawing.Color.Black; //5.3 p.Fill(vxs); } if (chkBorder.Checked) { //5.4 p.StrokeColor = PixelFarm.Drawing.Color.Green; //user can specific border width here... //p.StrokeWidth = 2; //5.5 p.Draw(vxs); } //6. use this util to copy image from Agg actual image to System.Drawing.Bitmap BitmapHelper.CopyToWindowsBitmap(destImg, winBmp, new RectInt(0, 0, 300, 300)); //--------------- //7. just render our bitmap g.Clear(Color.White); g.DrawImage(winBmp, new Point(10, 0)); }
void RenderWithPlugableGlyphRasterizer(Typeface typeface, char testChar, float sizeInPoint, int resolution) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; g.Clear(Color.White); ////credit: ////http://stackoverflow.com/questions/1485745/flip-coordinates-when-drawing-to-control g.ScaleTransform(1.0F, -1.0F);// Flip the Y-Axis g.TranslateTransform(0.0F, -(float)300);// Translate the drawing area accordingly //2. glyph to gdi path var gdiGlyphRasterizer = new NOpenType.CLI.GDIGlyphRasterizer(); var builder = new GlyphPathBuilder(typeface, gdiGlyphRasterizer); builder.Build(testChar, sizeInPoint); if (chkFillBackground.Checked) { gdiGlyphRasterizer.Fill(g, Brushes.Black); } if (chkBorder.Checked) { gdiGlyphRasterizer.Draw(g, Pens.Green); } //transform back g.ScaleTransform(1.0F, -1.0F);// Flip the Y-Axis g.TranslateTransform(0.0F, -(float)300);// Translate the drawing area accordingly }
public void Print(Typeface typeface, float size, char[] str, GlyphPlan[] glyphPlanBuffer) { //check if we have created a glyph cache GlyphsCache glyphCache; if (!_glyphCaches.TryGetValue(typeface, out glyphCache)) { //create new glyphCache = new GlyphsCache(typeface); _glyphCaches.Add(typeface, glyphCache); } //---------------------------------------------- //1. convert char[] to glyph[] //2. send to shaping engine //3. layout position of each glyph //---------------------------------------------- var glyphPathBuilder = new GlyphPathBuilderVxs(typeface); int j = str.Length; if (j > 1) { //for debug } //TODO:.... //2. //shaping, glyph substitution for (int i = 0; i < j; ++i) { var glyphPlan = new GlyphPlan(); glyphPlan.glyphIndex = (ushort)typeface.LookupIndex(str[i]); glyphPlanBuffer[i] = glyphPlan; } float scale = typeface.CalculateScale(size); float cx = 0; float cy = 0; bool enable_kerning = this.EnableKerning; for (int i = 0; i < j; ++i) { GlyphPlan glyphPlan = glyphPlanBuffer[i]; ushort glyIndex = glyphPlan.glyphIndex; //----------------------------------- //check if we static vxs/bmp for this glyph //if not, create and cache //----------------------------------- glyphPathBuilder.BuildFromGlyphIndex(glyIndex, size); //----------------------------------- var vxs = glyphPathBuilder.GetVxs(); //this advWidth in font design unit float advWidth = typeface.GetAdvanceWidthFromGlyphIndex(glyIndex) * scale; //---------------------------------- glyphPlan.x = cx; glyphPlan.y = 0; glyphPlan.advX = advWidth; glyphPlan.vxs = vxs; // if (enable_kerning && i > 0) { //check kerning advWidth += typeface.GetKernDistance(glyphPlanBuffer[i - 1].glyphIndex, glyphPlanBuffer[i].glyphIndex) * scale; } cx += advWidth; } //TODO:.... //2. //shaping, glyph substitution //3. layout glyph position //---------------------------------------------- //4. actual render }
public void Print(Typeface typeface, float size, string str, GlyphPlan[] glyphPlanBuffer) { Print(typeface, size, str.ToCharArray(), glyphPlanBuffer); }
public GlyphsCache(Typeface typeface) { _typeface = typeface; }
public GlyphPathBuilderBase(Typeface typeface) { _typeface = typeface; }
public GlyphPathBuilder(Typeface typeface, IGlyphRasterizer ras) : base(typeface) { this._rasterizer = ras; }