コード例 #1
0
            private unsafe FamilyCollection.CachedCharacterMetrics *LookupMetrics(int unicodeScalar)
            {
                if (unicodeScalar >= 0 && unicodeScalar <= FontFamilyMap.LastUnicodeScalar)
                {
                    int pageTableOffset = _deviceFont->OffsetToCharacterMap;

                    int *pageTable = (int *)CheckedPointer.Probe(
                        pageTableOffset,
                        CharacterMetricsDictionary.PageCount * sizeof(int)
                        );

                    int i = pageTable[unicodeScalar >> CharacterMetricsDictionary.PageShift];
                    if (i != 0)
                    {
                        int *page = (int *)CheckedPointer.Probe(
                            pageTableOffset + (i * sizeof(int)),
                            CharacterMetricsDictionary.PageSize * sizeof(int)
                            );

                        int offset = page[unicodeScalar & CharacterMetricsDictionary.PageMask];
                        if (offset != 0)
                        {
                            return((FamilyCollection.CachedCharacterMetrics *)CheckedPointer.Probe(
                                       offset,
                                       sizeof(FamilyCollection.CachedCharacterMetrics)
                                       ));
                        }
                    }
                }
                return(null);
            }
コード例 #2
0
ファイル: FontDriver.cs プロジェクト: sososu/wpf
 private static int ReadOpenTypeLong(CheckedPointer pointer)
 {
     unsafe
     {
         byte *readBuffer = (byte *)pointer.Probe(0, 4);
         int   result     = (int)((((((readBuffer[0] << 8) + readBuffer[1]) << 8) + readBuffer[2]) << 8) + readBuffer[3]);
         return(result);
     }
 }
コード例 #3
0
ファイル: FontDriver.cs プロジェクト: sososu/wpf
 /// <summary>
 /// The follwoing APIs extract OpenType variable types from OpenType font
 /// files. OpenType variables are stored big-endian, and the type are named
 /// as follows:
 ///     Byte   -  signed     8 bit
 ///     UShort -  unsigned   16 bit
 ///     Short  -  signed     16 bit
 ///     ULong  -  unsigned   32 bit
 ///     Long   -  signed     32 bit
 /// </summary>
 private static ushort ReadOpenTypeUShort(CheckedPointer pointer)
 {
     unsafe
     {
         byte * readBuffer = (byte *)pointer.Probe(0, 2);
         ushort result     = (ushort)((readBuffer[0] << 8) + readBuffer[1]);
         return(result);
     }
 }
コード例 #4
0
 internal DeviceFont(CachedFontFamily cachedFamily, CheckedPointer deviceFont)
 {
     unsafe
     {
         _cachedFamily = cachedFamily;
         _deviceFont   = (FamilyCollection.CachedDeviceFont *)deviceFont.Probe(0, sizeof(FamilyCollection.CachedDeviceFont));
         _sizeInBytes  = deviceFont.Size;
     }
 }
コード例 #5
0
 private static int ReadOpenTypeLong(CheckedPointer pointer)
 {
     unsafe
     {
         byte * readBuffer = (byte *)pointer.Probe(0, 4);
         int result = (int)((((((readBuffer[0] << 8) + readBuffer[1]) << 8) + readBuffer[2]) << 8) + readBuffer[3]);
         return result;
     }
 }
コード例 #6
0
 private static ushort ReadOpenTypeUShort(CheckedPointer pointer)
 {
     unsafe
     {
         byte * readBuffer = (byte *)pointer.Probe(0, 2);
         ushort result = (ushort)((readBuffer[0] << 8) + readBuffer[1]);
         return result;
     }
 }