unsafe internal static void CopyGlyphBitmap(NativeFontGlyph fontGlyph) { FT_Bitmap *ftBmp = (FT_Bitmap *)fontGlyph.nativeBmpPtr; //image is 8 bits grayscale int h = ftBmp->rows; int w = ftBmp->width; int stride = ftBmp->pitch; int size = stride * h; //copy it to array //bmp glyph is bottom up //so .. invert it... byte[] buff = new byte[size]; //------------------------------------------------ byte *currentSrc = ftBmp->buffer; int srcpos = size; int targetpos = 0; for (int r = 1; r <= h; ++r) { srcpos -= stride; currentSrc = ftBmp->buffer + srcpos; for (int c = 0; c < stride; ++c) { buff[targetpos] = *(currentSrc + c); targetpos++; } } ////------------------------------------------------ //IntPtr bmpPtr = (IntPtr)ftBmp->buffer; //Marshal.Copy((IntPtr)ftBmp->buffer, buff, 0, size); ////------------------------------------------------ //------------------------------------------------ fontGlyph.glyImgBuffer8 = buff; //convert to 32bpp //make gray value as alpha channel color value ActualImage actualImage = new ActualImage(w, h, Agg.PixelFormat.ARGB32); byte[] newBmp32Buffer = ActualImage.GetBuffer(actualImage); int src_p = 0; int target_p = 0; for (int r = 0; r < h; ++r) { for (int c = 0; c < w; ++c) { byte srcColor = buff[src_p + c]; //expand to 4 channel newBmp32Buffer[target_p] = 0; newBmp32Buffer[target_p + 1] = 0; newBmp32Buffer[target_p + 2] = 0; newBmp32Buffer[target_p + 3] = srcColor; //A target_p += 4; } src_p += stride; } fontGlyph.glyphImage32 = actualImage; }
unsafe internal static void CopyGlyphBitmap(FontGlyph fontGlyph, ExportGlyph *exportTypeFace) { FT_Bitmap *ftBmp = (FT_Bitmap *)exportTypeFace->bitmap; //image is 8 bits grayscale int h = ftBmp->rows; int w = ftBmp->width; int stride = ftBmp->pitch; int size = stride * h; //copy it to array //bmp glyph is bottom up //so .. invert it... byte[] buff = new byte[size]; //------------------------------------------------ byte *currentSrc = ftBmp->buffer; int srcpos = size; int targetpos = 0; for (int r = 1; r <= h; ++r) { srcpos -= stride; currentSrc = ftBmp->buffer + srcpos; for (int c = 0; c < stride; ++c) { buff[targetpos] = *(currentSrc + c); targetpos++; } } ////------------------------------------------------ //IntPtr bmpPtr = (IntPtr)ftBmp->buffer; //Marshal.Copy((IntPtr)ftBmp->buffer, buff, 0, size); ////------------------------------------------------ //------------------------------------------------ fontGlyph.glyImgBuffer8 = buff; //convert to 32bpp //make gray value as alpha channel color value ActualImage actualImage = new ActualImage(w, h, Agg.Image.PixelFormat.Rgba32); int newstride = stride * 4; byte[] newBmp32Buffer = actualImage.GetBuffer(); int src_p = 0; int target_p = 0; for (int r = 0; r < h; ++r) { for (int c = 0; c < w; ++c) { byte srcColor = buff[src_p + c]; //expand to 4 channel newBmp32Buffer[target_p] = 0; //R newBmp32Buffer[target_p + 1] = 0; //G newBmp32Buffer[target_p + 2] = 0; //B newBmp32Buffer[target_p + 3] = srcColor; //A target_p += 4; } src_p += stride; } fontGlyph.glyphImage32 = actualImage; ////------------------------------------------------ //{ // //add System.Drawing to references // //save image for debug*** // // byte[] buffer = new byte[size]; // Marshal.Copy((IntPtr)ftBmp->buffer, buffer, 0, size); // ////save to // System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(w, h, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); // var bmpdata = bmp.LockBits(new System.Drawing.Rectangle(0, 0, w, h), // System.Drawing.Imaging.ImageLockMode.ReadWrite, // bmp.PixelFormat); // Marshal.Copy(buffer, 0, bmpdata.Scan0, size); // bmp.UnlockBits(bmpdata); // bmp.Save("d:\\WImageTest\\glyph.png"); //} }