Example #1
0
        public float[] GetCharacterXPositions(Graphics g, string str)
        {
#if true
            // Make sure our _charWidths list has all the necessary characters.
            using (GdiObjectSelector selector = new GdiObjectSelector(g, _font))
            {
                UpdateCharWidths(selector.HDC, str);
            }

            float[] xCoords    = new float[str.Length];
            float   curXOffset = 0;
            for (int i = 0; i < str.Length; i++)
            {
                xCoords[i] = curXOffset;
                Win32FontSystem.ABCFLOAT abc = _charWidths[(uint)str[i]];
                curXOffset += abc.abcfA + abc.abcfB + abc.abcfC;
            }

            return(xCoords);
#else
            // This method gives us spacing between character cells, but it doesn't tell us what the cells are!
            Win32FontSystem.GCP_RESULTS results = new Win32FontSystem.GCP_RESULTS();
            results.StructSize = Marshal.SizeOf(typeof(Win32FontSystem.GCP_RESULTS));

            // Setup the int array for them to write results into.
            int[]    dx     = new int[str.Length];
            GCHandle handle = GCHandle.Alloc(dx, GCHandleType.Pinned);
            results.Dx = Marshal.UnsafeAddrOfPinnedArrayElement(dx, 0);

            using (GdiObjectSelector selector = new GdiObjectSelector(g, _font))
            {
                // Call GetCharacterPlacement
                Win32FontSystem.GetCharacterPlacementW(
                    selector.HDC,
                    str,
                    str.Length,
                    0,                                                  // max extent (ignored)
                    ref results,
                    (uint)Win32FontSystem.GCPFlags.GCP_USEKERNING);
            }

            // Unpin the array.
            handle.Free();

            // Convert to floats for output.
            return(dx.Select(x => (float)x).ToArray());
#endif
        }
Example #2
0
		public float[] GetCharacterXPositions( Graphics g, string str )
		{
#if true
			// Make sure our _charWidths list has all the necessary characters.
			using ( GdiObjectSelector selector = new GdiObjectSelector( g, _font ) )
			{
				UpdateCharWidths( selector.HDC, str );
			}

			float[] xCoords = new float[ str.Length ];
			float curXOffset = 0;
			for ( int i=0; i < str.Length; i++ )
			{
				xCoords[i] = curXOffset;
				Win32FontSystem.ABCFLOAT abc = _charWidths[ (uint)str[i] ];
				curXOffset += abc.abcfA + abc.abcfB + abc.abcfC;
			}

			return xCoords;
#else
			// This method gives us spacing between character cells, but it doesn't tell us what the cells are!
			Win32FontSystem.GCP_RESULTS results = new Win32FontSystem.GCP_RESULTS();
			results.StructSize = Marshal.SizeOf( typeof( Win32FontSystem.GCP_RESULTS ) );

			// Setup the int array for them to write results into.
			int[] dx = new int[ str.Length ];
			GCHandle handle = GCHandle.Alloc( dx, GCHandleType.Pinned );
			results.Dx = Marshal.UnsafeAddrOfPinnedArrayElement( dx, 0 );

			using ( GdiObjectSelector selector = new GdiObjectSelector( g, _font ) )
			{
				// Call GetCharacterPlacement
				Win32FontSystem.GetCharacterPlacementW( 
					selector.HDC, 
					str, 
					str.Length, 
					0,				// max extent (ignored)
					ref results,
					(uint)Win32FontSystem.GCPFlags.GCP_USEKERNING );
			}

			// Unpin the array.
			handle.Free();

			// Convert to floats for output.
			return dx.Select( x => (float)x ).ToArray();
#endif
		}