Beispiel #1
0
        public unsafe void RasterizeGlyphBitmap(int glyphId, int fontSize, byte[] buffer, int startIndex, int outWidth, int outHeight, int outStride)
        {
            SetPixelSizes(0, fontSize);
            LoadGlyph(glyphId);

            FTNative.FT_Render_Glyph(_rec.glyph, (int)RenderMode.Normal);

            GlyphSlotRec glyph;

            GetCurrentGlyph(out glyph);
            var ftbmp = glyph.bitmap;

            fixed(byte *bptr = buffer)
            {
                for (var y = 0; y < outHeight; ++y)
                {
                    var pos = (y * outStride) + startIndex;

                    byte *dst = bptr + pos;
                    byte *src = (byte *)ftbmp.buffer + y * ftbmp.pitch;
                    for (var x = 0; x < outWidth; ++x)
                    {
                        *dst++ = *src++;
                    }
                }
            }
        }
Beispiel #2
0
        public FreeTypeSource(byte[] data)
        {
            Error err;

            if (_libraryHandle == IntPtr.Zero)
            {
                IntPtr libraryRef;
                err = FTNative.FT_Init_FreeType(out libraryRef);

                if (err != Error.Ok)
                {
                    throw new FreeTypeException(err);
                }

                _libraryHandle = libraryRef;
            }

            _memoryHandle = GCHandle.Alloc(data, GCHandleType.Pinned);

            IntPtr faceRef;

            err = FTNative.FT_New_Memory_Face(_libraryHandle, _memoryHandle.AddrOfPinnedObject(), data.Length, 0, out faceRef);

            if (err != Error.Ok)
            {
                throw new FreeTypeException(err);
            }

            _faceHandle = faceRef;
            _rec        = PInvokeHelper.PtrToStructure <FaceRec>(_faceHandle);
        }
Beispiel #3
0
        private void SetPixelSizes(int width, int height)
        {
            var err = FTNative.FT_Set_Pixel_Sizes(_faceHandle, (uint)width, (uint)height);

            if (err != Error.Ok)
            {
                throw new FreeTypeException(err);
            }
        }
Beispiel #4
0
        private void LoadGlyph(int glyphId)
        {
            var err = FTNative.FT_Load_Glyph(_faceHandle, (uint)glyphId, (int)LoadFlags.Default | (int)LoadTarget.Normal);

            if (err != Error.Ok)
            {
                throw new FreeTypeException(err);
            }
        }
Beispiel #5
0
        public int GetGlyphKernAdvance(int previousGlyphId, int glyphId, int fontSize)
        {
            VectorRec kerning;

            if (FTNative.FT_Get_Kerning(_faceHandle, (uint)previousGlyphId, (uint)glyphId, 0, out kerning) != Error.Ok)
            {
                return(0);
            }

            return((int)kerning.X >> 6);
        }
Beispiel #6
0
        public int?GetGlyphId(int codepoint)
        {
            var result = FTNative.FT_Get_Char_Index(_faceHandle, (uint)codepoint);

            if (result == 0)
            {
                return(null);
            }

            return((int?)result);
        }
Beispiel #7
0
        protected virtual void Dispose(bool disposing)
        {
            if (_faceHandle != IntPtr.Zero)
            {
                FTNative.FT_Done_Face(_faceHandle);
                _faceHandle = IntPtr.Zero;
            }

            if (_memoryHandle.IsAllocated)
            {
                _memoryHandle.Free();
            }
        }