wine/objects/font.c
Alexandre Julliard d30dfd24d6 Release 980927
Sun Sep 27 14:25:38 1998  Petter Reinholdtsen <pere@td.org.uit.no>

	* [files/drive.c]
	Make sure GetDriveType32A() handles param NULL.  Added some
	doc on function.

Sun Sep 27 14:07:26 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [controls/edit.c] [windows/win.c]
	Don't call SetWindowLong() in EDIT_WM_NCREATE.
	Fix SetWindowLong(GWL_[EX]STYLE) to work for 16bit windows. Remove
	UpdateWindow() call. 

Sun Sep 27 13:41:22 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [scheduler/*.c] [server/event.c] [server/mutex.c]
	  [server/semaphore.c]
	Implemented server-side synchronisation objects.

Sun Sep 27 01:13:35 1998  Alex Priem <alexp@sci.kun.nl>

	* [dlls/comctl32/treeview.c] [include/treeview.h] [include/comctl.h]
	Treeview implementation.

	* [dlls/comctl32/trackbar.c] [include/trackbar.h] 
	Trackbar implementation.

Sat Sep 26 20:49:13 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [if1632/thunk.c] [tools/build.c] [win32/kernel32.c]
	Bugfix: several problems with flat thunks fixed.

	* [memory/selector.c]
	Bugfix: IsBad...Ptr16 didn't work for limit_in_pages segments.

	* [scheduler/thread.c]
	Bugfix: CreateThread: Allow id parameter == NULL.

	* [objects/gdiobj.c]
	Bugfix: IsGDIObject: Return correct object type for stock objects.

	* [msdos/dpmi.c]
	Bugfix: fixed typo in INT_DoRealModeInt.

	* [msdos/int21.c]
	Bugfix: int21 READ *must* use WIN16_hread, not _hread16.

	* [if1632/kernel.spec] [if1632/dummy.c] [if1632/thunk.c]
	  [loader/ne/module.c] [scheduler/event.c] [scheduler/synchro.c]
	  [scheduler/thread.c] [win32/kernel32.c] [win32/ordinals.c]
	Added names/stubs for all undocumented KERNEL routines (Win95).
	Added the following undoc. 16-bit equivalents to Win32 routines:
	KERNEL.441-443,449-453,456-462,471-476,479-486,488.
	Added stubs for some other KERNEL routines.

	* [memory/heap.c] [memory/global.c] [include/global.h]
	Implemented Local32... 32-bit local heap routines (KERNEL.208-215, 229).

	* [miscemu/instr.c] [loader/module.c] [include/module.h]
	Implemented __GP fault handling and HasGPHandler (KERNEL.338).

	* [misc/error.c]
	Implemented LogParamErrorRegs (KERNEL.327).

	* [loader/task.c] [include/windows.h]
	Implemented GetCodeInfo (KERNEL.104).

	* [loader/task.c] [scheduler/thread.c] [include/thread.h]
	Implemented [GS]etThreadQueue and [GS]etFastQueue (KERNEL.463/4, 624/5).

	* [if1632/gdi.spec] [objects/dc.c] [objects/dib.c]
	  [objects/bitmap.c] [include/windows.h]
	Bugfix: fixed wrong parameter for CreateDIBSection16.
	Added [GS]etDIBColorTable16, stub for GetBoundsRect16.
	Partially implemented BITMAP_GetObject16 for DIBs.

	* [if1632/gdi.spec] [relay32/gdi32.spec] [objects/palette.c]
	Added some GDI stubs.

	* [if1632/Makefile.in] [if1632/display.spec] [if1632/mouse.spec]
	  [if1632/keyboard.spec] [if1632/builtin.c] [windows/keyboard.c]
	Added some stubs for Win16 drivers: KEYBOARD, MOUSE, DISPLAY.

	* [if1632/wprocs.spec] [msdos/vxd.c]
	Added some stubs for VxDs: VMM, ConfigMG, TimerAPI.

	* [msdos/int2f.c]
	Added some stubs for real-mode network drivers.

Sat Sep 26 18:18:18 1998  Marcus Meissner <marcus@jet.franken.de>

	* [configure.in]
	Merged in some more of the FreeBSD ports/emulators/wine patches. 
	(Maintainer(s) of this port: You can just submit these
	patches to Alexandre directly.)

	 * [loader/pe_image.c]
	Check filesize of image against size derived from header
	to spot truncated executeables without crashing.

	* [files/directory.c]
	Set envvar "COMSPEC". One win32(!!) program crashes without it.

	* [multimedia/mmio.c]
	Added mmioSetInfo32.

	* [include/file.h]
	Return STD_ERROR_HANDLE for AUX and PRT dos handles.

	* [loader/module.c]
	Handle executeables with spaces in their names a bit better in
	CreateProcess.

	* [relay32/msvfw32.spec][if1632/msvideo.spec][multimedia/msvideo.c][include/vfw.h]
	Started on MS Video support (can load Win32 ICMs).

	* [tools/testrun]
	A bit smarter use of ps.

	* [memory/virtual.c]
	Report PAGE_GUARDed pages as PAGE_PROTECTED (AutoCAD LT R17 fails
	without that check (since Win95 doesn't know about PAGE_GUARD)).

Sat Sep 26 15:04:05 1998  Ove Kaaven <ovek@arcticnet.no>

	* [include/miscemu.h] [if1632/builtin.c] [loader/task.c]
	  [miscemu/instr.c] [msdos/dpmi.c] [msdos/int21.c]
	  [msdos/interrupts.c] [windows/user.c]
	INT_[S|G]etHandler was renamed to INT_[S|G]etPMHandler.
	Added handlers to deal with real-mode interrupts; DOS
	programs are now able to hook real-mode interrupts.

	* [loader/dos/module.c] [msdos/dosmem.c] [msdos/int21.c]
	Moved real-mode interrupt table initialization to
	msdos/dosmem.c, and made new V86 tasks get a full copy
	of the existing "system memory" instead of almost empty
	space. Misc fixes.

	* [include/dosexe.h] [loader/dos/module.c] [msdos/dpmi.c]
	  [msdos/int2f.c]
	First shot at letting DOS programs start up DPMI (but DPMI
	is still disabled for DOS programs, for pkunzip's sake).

	* [include/debugger.h] [debugger/break.c] [debugger/dbg.y]
	  [debugger/registers.c] [debugger/memory.c] [debugger/info.c]
	  [loader/dos/dosvm.c]
	First shot at making Wine's debugger work for DOS programs.
	The -debug flag works, as do "nexti" and "stepi".

Sat Sep 26 13:13:13 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [dlls/shell32/dataobject.c]
	New classes IEnumFORMATETC implemented, IDataObject stubs.
	
	* [dlls/shell32/*.*][relay32/shell32.spec]
	Bugfixes.
	New: ICM_InsertItem(), ILCreateFromPath().
	Implemented: ILCloneFirst().
	Stubs: ILIsEqual(), ILFindChild(), SHLogILFromFSIL(),
	  PathMatchSpec(), PathIsExe().
	Changed: ILGetSize(), _ILIsDesktop(), PathCombine().

	* [include/shlobj.h]
	New SHLGUID's
	New structures: DVTARGETDEVICE32, STGMEDIUM32, FORMATETC32,
	CLIPFORMAT32.
	New interfaces: IEnumFORMATETC, IDataObject, ICommDlgBrowser
	IDockingWindowFrame, IServiceProvider.

	* [dlls/shell32/folders.c]
	Stubs for IShellLink.

	* [loader/resource.c]
	Small fixes.

	* [misc/crtdll.c][relay32/crtdll.spec]
	New __dllonexit().

	* [windows/message.c]
	SendNotifyMessageA, SendMessageCallBack32A half implemented.

	* [controls/edit.c]
	EDIT_WM_SetText set EF_UPDATE flag not for ES_MULTILINE.

	* [files/file.c]
	Handling of fileposition fixed.

Fri Sep 25 18:13:30 1998  Patrik Stridvall <ps@leissner.se>

	* [include/windows.h] [include/wintypes.h]
	  [ole/ole2nls.h] [relay32/kernel32.spec]
	Implemented EnumDateFormats and EnumTimeFormats.
	Only adds US English support.

	* [Makefile.in] [configure.in] 
	  [dlls/Makefile.in] [dlls/psapi/Makefile.in] 
	  [dlls/psapi/psapi_main.c] 
	New files to implement stubs for PSAPI.DLL (NT only).

	* [relay32/Makefile.in] [relay32/builtin32.c] 
	  [relay32/psapi.spec]
	New spec file for PSAPI.DLL (NT only).

	* [scheduler/handle.c]
	HANDLE_GetObjPtr should only interpret the pseudo handles as the
	current thread or the current process if a thread or a process is
	requested.

	* [include/winversion.h] [misc/version.c]
	Adds the global function VERSION_GetVersion() so functions can
	have different behavior depending on the -winver flag.

	* [include/oledlg.h] [ole/oledlg.c]
	Minor fixes. 

	* [windows/winproc.c]
	Minor changes.

	* [include/imm.h] [misc/imm.c]
	Now returns correct values under both Windows 95 and NT 4.0.

Thu Sep 24 22:11:44 1998  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [configure.in] [include/acconfig.h] [include/thread.h]
	  [scheduler/sysdeps.c]
	Autoconfig test for non-reentrant libc.

Wed Sep 23 19:52:12 1998  Matthew Becker <mbecker@glasscity.net>

	* [*/*.c]
	Miscellaneous documentation updates and debugging output 
	standardizations.

	* [objects/clipping.c]
	Added ExtSelectClipRgn.

Wed Sep 23 00:03:28 EDT 1998  Pete Ratzlaff <pratzlaff@cfa.harvard.edu>

	* [include/windows.h] [if1632/user.spec] [relay32/user32.spec]
	  [windows/keyboard.c]
	Added, marginally implemented, GetKeyboardLayoutName().
	Only returns US English keyboard name.

Tue Sep 22 16:32:41 1998  Marcel Baur <mbaur@iiic.ethz.ch>

	* [programs/control/*]
	New Winelib application.

Mon Sep 21 00:29:18 1998  Peter Hunnisett <hunnise@nortel.ca>

	* [include/dplay.h][multimedia/dplay.c][ole/compobj.c]
	Added all DirectPlayLobby interfaces and enhanced DirectPlay
	and DirectPlayLobby support. Still not all that much. Useful
	enough if you just need to start a program, don't try any
	real dplay/lobby stuff.

	* [documentation/status/directplay]
	Added a very little bit.

	* [graphics/ddraw.c]
	- Call to SetWindowLong32A wasn't working because there was no
	  memory set aside when the window class was registered.
	- Fixed some xlib reference counting and change the behaviour
	  of DirectDrawSurface3_SetPalette to mimic observed behaviour
	  (palette is associated will all backbuffers)
	- Also stored all palette colour fields and spit back our saved
	  colour fields rather than query X for them.
	- Added plenty of AddRef and Release traces.
	- Added Xlib support for using -desktop option.
	- Fixed Xlib message handling. Messages weren't being passed to
	  the application. Fixes mouse movements in some xlib DDraw games.
	- Added a few stubs.

	* [windows/win.c][include/winerror.h]
	Fixed up some error handling in WIN_SetWindowLong. SetLastError
	wasn't being used. Could cause problems with 0 return codes.
	Added new error in winerror (1400).

	* [AUTHORS] [include/authors.h]
	Added myself as a Wine author.

Sun Sep 20 21:22:44 1998  Alexander Larsson  <alla@lysator.liu.se>

	* [loader/module.c]
	Changed GetModuleFileName32A so that is returns the
	long version of the filename. Note that just the name
	is long, not the directories.

Sat Sep 19 20:05:30 1998 Per Ångström <pang@mind.nu> 

	* [controls/menu.c]
	Made a couple of fixes to make life easier for applications that alter
	their menus at runtime.

	* [windows/defdlg.c]
	Removed the cast of the return value from dialog procedures to a 16-bit
	bool. The return value needs to retain all its 32 bits, since it is not 
	always a bool, such as when responding to the WM_NCHITTEST message.

Fri Sep 18 11:30:38 1998  Sergey Turchanov <turchanov@usa.net>

	* [loader/resource.c]
	Fixed very funny bug (though gravely affecting further excecution)
	with FindResource[Ex]32 functions.

	* [include/multimon.h] [windows/multimon.c] [relay32/user32.spec]
	  [include/windows.h] [windows/sysmetrics.c]
	Default implementation for Multimonitor API.

	* [include/windows.h] [windows/winpos.c]
	Fixed incorrect declaration (and behaviour) of GetWindowRect32.

Wed Sep 16 10:21:15 1998  Gerard Patel <G.Patel@Wanadoo.fr>

	* [controls/edit.c]
	Fixed EDIT_EM_GetLine to use correctly length of lines.

Tue Sep 15 20:40:16 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [misc/tweak.c][include/tweak.h][controls/menu.c]
	Replaced the tweak graphic routines by calls to DrawEdge32().

	* [misc/tweak.c][include/tweak.h][documentation/win95look]
	  [wine.ini][*/*]
	Changed "look and feel" selection. Allows Win3.1, Win95 and
	Win98 (no GUI code implemented) look and feel.

	* [dlls/comctl32/header.c][include/header.h][include/commctrl.h]
	Started callback item support and did some minor improvements.

	* [dlls/comctl32/imagelist.c]
	Fixed bug in transparent image display.
	ImageList_GetIcon is still buggy :-(

	* [dlls/comctl32/toolbar.c]
	Fixed button drawing (partial hack).

	* [dlls/comctl32/commctrl.c]
	Fixed MenuHelp().

	* [controls/button.c]
	Added 3d effect for groupbox.

	* [windows/msgbox.c]
	Added font support for message boxes.

	* [windows/nonclient.c]
	Fixed window moving bug.

	* [dlls/comctl32/*.c]
	Various improvements.

	* [dlls/comctl32/listview.c][dlls/comctl32/rebar.c]
	  [include/commctrl.h]
	More messages.

	* [windows/syscolor.c][include/windows.h]
	Introduced new Win98 system colors.

Tue Sep 15 18:29:45 1998 Wesley Filardo <eightknots@aol.com>

	* [files/profile.c]
	Added support in PROFILE_LoadWineIni for -config option

	* [misc/main.c] [include/options.h]
	Added -config option.

Tue Sep 15 18:22:26 1998  Petter Reinholdtsen <pere@td.org.uit.no>

	* [documentation/Makefile.in]
	Make sure directory exists before installing into it.

Tue Sep 15 01:47:33 1998  Pablo Saratxaga <pablo.sarachaga@ping.be>

	* [ole/nls/*] [ole/ole2nls.c] [include/winnls.h]
	Fixed a few errors and completed some NLS files.

Mon Sep 14 01:23:45 1998  Joseph Pranevich <knight@baltimore.wwaves.com>

	* [include/miscemu.h] [msdos/interrupts.c]
	Removed a compilation warning, added INT 25 to the list of interrupts
	callable from DOS applications, added a debug message when unsupported
	interrupts are used.

Sun Sep 13 19:55:22 1998  Lawson Whitney <lawson_whitney@juno.com>

	* [if1632/relay.c]
	CallProcEx32W should not reverse arguments.

Sun Aug 17 21:18:12 1998  Eric Pouech  <eric.pouech@lemel.fr>

	* [multimedia/midi.c] [multimedia/init.c] [multimedia/mmsys.c] 
	  [include/multimedia.h] [include/mmsystem.h] 
	  [multimedia/Makefile.in] [multimedia/midipatch.c]
	  [if1632/multimedia.spec]
	Made MIDI input and output functional on OSS capable systems.

	* [multimedia/timer.c]
	Changes to trigger callbacks at the accurate pace even when
	fake timers are used.
1998-09-27 18:28:36 +00:00

1313 lines
42 KiB
C

/*
* GDI font objects
*
* Copyright 1993 Alexandre Julliard
* 1997 Alex Korobka
*/
#include <stdlib.h>
#include <string.h>
#include "font.h"
#include "heap.h"
#include "metafile.h"
#include "options.h"
#include "debug.h"
#include "winerror.h"
#define ENUM_UNICODE 0x00000001
typedef struct
{
LPLOGFONT16 lpLogFontParam;
FONTENUMPROCEX16 lpEnumFunc;
LPARAM lpData;
LPNEWTEXTMETRICEX16 lpTextMetric;
LPENUMLOGFONTEX16 lpLogFont;
SEGPTR segTextMetric;
SEGPTR segLogFont;
} fontEnum16;
typedef struct
{
LPLOGFONT32W lpLogFontParam;
FONTENUMPROC32W lpEnumFunc;
LPARAM lpData;
LPNEWTEXTMETRICEX32W lpTextMetric;
LPENUMLOGFONTEX32W lpLogFont;
DWORD dwFlags;
} fontEnum32;
/***********************************************************************
* LOGFONT conversion functions.
*/
static void __logfont32to16( INT16* plf16, const INT32* plf32 )
{
int i;
for( i = 0; i < 5; i++ ) *plf16++ = *plf32++;
*((INT32*)plf16)++ = *plf32++;
*((INT32*)plf16) = *plf32;
}
static void __logfont16to32( INT32* plf32, const INT16* plf16 )
{
int i;
for( i = 0; i < 5; i++ ) *plf32++ = *plf16++;
*plf32++ = *((INT32*)plf16)++;
*plf32 = *((INT32*)plf16);
}
void FONT_LogFont32ATo16( const LOGFONT32A* font32, LPLOGFONT16 font16 )
{
__logfont32to16( (INT16*)font16, (const INT32*)font32 );
lstrcpyn32A( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
}
void FONT_LogFont32WTo16( const LOGFONT32W* font32, LPLOGFONT16 font16 )
{
__logfont32to16( (INT16*)font16, (const INT32*)font32 );
lstrcpynWtoA( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE );
}
void FONT_LogFont16To32A( const LPLOGFONT16 font16, LPLOGFONT32A font32 )
{
__logfont16to32( (INT32*)font32, (const INT16*)font16 );
lstrcpyn32A( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
}
void FONT_LogFont16To32W( const LPLOGFONT16 font16, LPLOGFONT32W font32 )
{
__logfont16to32( (INT32*)font32, (const INT16*)font16 );
lstrcpynAtoW( font32->lfFaceName, font16->lfFaceName, LF_FACESIZE );
}
/***********************************************************************
* TEXTMETRIC conversion functions.
*/
void FONT_TextMetric32Ato16(const LPTEXTMETRIC32A ptm32, LPTEXTMETRIC16 ptm16 )
{
ptm16->tmHeight = ptm32->tmHeight;
ptm16->tmAscent = ptm32->tmAscent;
ptm16->tmDescent = ptm32->tmDescent;
ptm16->tmInternalLeading = ptm32->tmInternalLeading;
ptm16->tmExternalLeading = ptm32->tmExternalLeading;
ptm16->tmAveCharWidth = ptm32->tmAveCharWidth;
ptm16->tmMaxCharWidth = ptm32->tmMaxCharWidth;
ptm16->tmWeight = ptm32->tmWeight;
ptm16->tmOverhang = ptm32->tmOverhang;
ptm16->tmDigitizedAspectX = ptm32->tmDigitizedAspectX;
ptm16->tmDigitizedAspectY = ptm32->tmDigitizedAspectY;
ptm16->tmFirstChar = ptm32->tmFirstChar;
ptm16->tmLastChar = ptm32->tmLastChar;
ptm16->tmDefaultChar = ptm32->tmDefaultChar;
ptm16->tmBreakChar = ptm32->tmBreakChar;
ptm16->tmItalic = ptm32->tmItalic;
ptm16->tmUnderlined = ptm32->tmUnderlined;
ptm16->tmStruckOut = ptm32->tmStruckOut;
ptm16->tmPitchAndFamily = ptm32->tmPitchAndFamily;
ptm16->tmCharSet = ptm32->tmCharSet;
}
void FONT_TextMetric32Wto16(const LPTEXTMETRIC32W ptm32, LPTEXTMETRIC16 ptm16 )
{
ptm16->tmHeight = ptm32->tmHeight;
ptm16->tmAscent = ptm32->tmAscent;
ptm16->tmDescent = ptm32->tmDescent;
ptm16->tmInternalLeading = ptm32->tmInternalLeading;
ptm16->tmExternalLeading = ptm32->tmExternalLeading;
ptm16->tmAveCharWidth = ptm32->tmAveCharWidth;
ptm16->tmMaxCharWidth = ptm32->tmMaxCharWidth;
ptm16->tmWeight = ptm32->tmWeight;
ptm16->tmOverhang = ptm32->tmOverhang;
ptm16->tmDigitizedAspectX = ptm32->tmDigitizedAspectX;
ptm16->tmDigitizedAspectY = ptm32->tmDigitizedAspectY;
ptm16->tmFirstChar = ptm32->tmFirstChar;
ptm16->tmLastChar = ptm32->tmLastChar;
ptm16->tmDefaultChar = ptm32->tmDefaultChar;
ptm16->tmBreakChar = ptm32->tmBreakChar;
ptm16->tmItalic = ptm32->tmItalic;
ptm16->tmUnderlined = ptm32->tmUnderlined;
ptm16->tmStruckOut = ptm32->tmStruckOut;
ptm16->tmPitchAndFamily = ptm32->tmPitchAndFamily;
ptm16->tmCharSet = ptm32->tmCharSet;
}
void FONT_TextMetric16to32A(const LPTEXTMETRIC16 ptm16, LPTEXTMETRIC32A ptm32 )
{
ptm32->tmHeight = ptm16->tmHeight;
ptm32->tmAscent = ptm16->tmAscent;
ptm32->tmDescent = ptm16->tmDescent;
ptm32->tmInternalLeading = ptm16->tmInternalLeading;
ptm32->tmExternalLeading = ptm16->tmExternalLeading;
ptm32->tmAveCharWidth = ptm16->tmAveCharWidth;
ptm32->tmMaxCharWidth = ptm16->tmMaxCharWidth;
ptm32->tmWeight = ptm16->tmWeight;
ptm32->tmOverhang = ptm16->tmOverhang;
ptm32->tmDigitizedAspectX = ptm16->tmDigitizedAspectX;
ptm32->tmDigitizedAspectY = ptm16->tmDigitizedAspectY;
ptm32->tmFirstChar = ptm16->tmFirstChar;
ptm32->tmLastChar = ptm16->tmLastChar;
ptm32->tmDefaultChar = ptm16->tmDefaultChar;
ptm32->tmBreakChar = ptm16->tmBreakChar;
ptm32->tmItalic = ptm16->tmItalic;
ptm32->tmUnderlined = ptm16->tmUnderlined;
ptm32->tmStruckOut = ptm16->tmStruckOut;
ptm32->tmPitchAndFamily = ptm16->tmPitchAndFamily;
ptm32->tmCharSet = ptm16->tmCharSet;
}
void FONT_TextMetric16to32W(const LPTEXTMETRIC16 ptm16, LPTEXTMETRIC32W ptm32 )
{
ptm32->tmHeight = ptm16->tmHeight;
ptm32->tmAscent = ptm16->tmAscent;
ptm32->tmDescent = ptm16->tmDescent;
ptm32->tmInternalLeading = ptm16->tmInternalLeading;
ptm32->tmExternalLeading = ptm16->tmExternalLeading;
ptm32->tmAveCharWidth = ptm16->tmAveCharWidth;
ptm32->tmMaxCharWidth = ptm16->tmMaxCharWidth;
ptm32->tmWeight = ptm16->tmWeight;
ptm32->tmOverhang = ptm16->tmOverhang;
ptm32->tmDigitizedAspectX = ptm16->tmDigitizedAspectX;
ptm32->tmDigitizedAspectY = ptm16->tmDigitizedAspectY;
ptm32->tmFirstChar = ptm16->tmFirstChar;
ptm32->tmLastChar = ptm16->tmLastChar;
ptm32->tmDefaultChar = ptm16->tmDefaultChar;
ptm32->tmBreakChar = ptm16->tmBreakChar;
ptm32->tmItalic = ptm16->tmItalic;
ptm32->tmUnderlined = ptm16->tmUnderlined;
ptm32->tmStruckOut = ptm16->tmStruckOut;
ptm32->tmPitchAndFamily = ptm16->tmPitchAndFamily;
ptm32->tmCharSet = ptm16->tmCharSet;
}
void FONT_TextMetric32Ato32W(const LPTEXTMETRIC32A ptm32A, LPTEXTMETRIC32W ptm32W )
{
ptm32W->tmHeight = ptm32A->tmHeight;
ptm32W->tmAscent = ptm32A->tmAscent;
ptm32W->tmDescent = ptm32A->tmDescent;
ptm32W->tmInternalLeading = ptm32A->tmInternalLeading;
ptm32W->tmExternalLeading = ptm32A->tmExternalLeading;
ptm32W->tmAveCharWidth = ptm32A->tmAveCharWidth;
ptm32W->tmMaxCharWidth = ptm32A->tmMaxCharWidth;
ptm32W->tmWeight = ptm32A->tmWeight;
ptm32W->tmOverhang = ptm32A->tmOverhang;
ptm32W->tmDigitizedAspectX = ptm32A->tmDigitizedAspectX;
ptm32W->tmDigitizedAspectY = ptm32A->tmDigitizedAspectY;
ptm32W->tmFirstChar = ptm32A->tmFirstChar;
ptm32W->tmLastChar = ptm32A->tmLastChar;
ptm32W->tmDefaultChar = ptm32A->tmDefaultChar;
ptm32W->tmBreakChar = ptm32A->tmBreakChar;
ptm32W->tmItalic = ptm32A->tmItalic;
ptm32W->tmUnderlined = ptm32A->tmUnderlined;
ptm32W->tmStruckOut = ptm32A->tmStruckOut;
ptm32W->tmPitchAndFamily = ptm32A->tmPitchAndFamily;
ptm32W->tmCharSet = ptm32A->tmCharSet;
}
/***********************************************************************
* CreateFontIndirect16 (GDI.57)
*/
HFONT16 WINAPI CreateFontIndirect16( const LOGFONT16 *font )
{
HFONT16 hFont = 0;
if (font)
{
hFont = GDI_AllocObject( sizeof(FONTOBJ), FONT_MAGIC );
if( hFont )
{
FONTOBJ* fontPtr;
fontPtr = (FONTOBJ *) GDI_HEAP_LOCK( hFont );
memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
TRACE(font,"(%i %i %i %i) '%s' %s %s => %04x\n",
font->lfHeight, font->lfWidth,
font->lfEscapement, font->lfOrientation,
font->lfFaceName ? font->lfFaceName : "NULL",
font->lfWeight > 400 ? "Bold" : "",
font->lfItalic ? "Italic" : "",
hFont);
if (font->lfEscapement != font->lfOrientation) {
/* this should really depend on whether GM_ADVANCED is set */
fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
WARN(font,
"orientation angle %f set to escapement angle %f for new font %04x\n",
font->lfOrientation/10., font->lfEscapement/10., hFont);
}
GDI_HEAP_UNLOCK( hFont );
}
}
else WARN(font,"(NULL) => NULL\n");
return hFont;
}
/***********************************************************************
* CreateFontIndirect32A (GDI32.44)
*/
HFONT32 WINAPI CreateFontIndirect32A( const LOGFONT32A *font )
{
LOGFONT16 font16;
FONT_LogFont32ATo16( font, &font16 );
return CreateFontIndirect16( &font16 );
}
/***********************************************************************
* CreateFontIndirect32W (GDI32.45)
*/
HFONT32 WINAPI CreateFontIndirect32W( const LOGFONT32W *font )
{
LOGFONT16 font16;
FONT_LogFont32WTo16( font, &font16 );
return CreateFontIndirect16( &font16 );
}
/***********************************************************************
* CreateFont16 (GDI.56)
*/
HFONT16 WINAPI CreateFont16(INT16 height, INT16 width, INT16 esc, INT16 orient,
INT16 weight, BYTE italic, BYTE underline,
BYTE strikeout, BYTE charset, BYTE outpres,
BYTE clippres, BYTE quality, BYTE pitch,
LPCSTR name )
{
LOGFONT16 logfont = { height, width, esc, orient, weight, italic, underline,
strikeout, charset, outpres, clippres, quality, pitch, };
TRACE(font,"('%s',%d,%d)\n",
(name ? name : "(null)") , height, width);
if (name)
lstrcpyn32A(logfont.lfFaceName,name,sizeof(logfont.lfFaceName));
else
logfont.lfFaceName[0] = '\0';
return CreateFontIndirect16( &logfont );
}
/*************************************************************************
* CreateFont32A (GDI32.43)
*/
HFONT32 WINAPI CreateFont32A( INT32 height, INT32 width, INT32 esc,
INT32 orient, INT32 weight, DWORD italic,
DWORD underline, DWORD strikeout, DWORD charset,
DWORD outpres, DWORD clippres, DWORD quality,
DWORD pitch, LPCSTR name )
{
return (HFONT32)CreateFont16( height, width, esc, orient, weight, italic,
underline, strikeout, charset, outpres,
clippres, quality, pitch, name );
}
/*************************************************************************
* CreateFont32W (GDI32.46)
*/
HFONT32 WINAPI CreateFont32W( INT32 height, INT32 width, INT32 esc,
INT32 orient, INT32 weight, DWORD italic,
DWORD underline, DWORD strikeout, DWORD charset,
DWORD outpres, DWORD clippres, DWORD quality,
DWORD pitch, LPCWSTR name )
{
LPSTR namea = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
HFONT32 ret = (HFONT32)CreateFont16( height, width, esc, orient, weight,
italic, underline, strikeout, charset,
outpres, clippres, quality, pitch,
namea );
if (namea) HeapFree( GetProcessHeap(), 0, namea );
return ret;
}
/***********************************************************************
* FONT_GetObject16
*/
INT16 FONT_GetObject16( FONTOBJ * font, INT16 count, LPSTR buffer )
{
if (count > sizeof(LOGFONT16)) count = sizeof(LOGFONT16);
memcpy( buffer, &font->logfont, count );
return count;
}
/***********************************************************************
* FONT_GetObject32A
*/
INT32 FONT_GetObject32A( FONTOBJ *font, INT32 count, LPSTR buffer )
{
LOGFONT32A fnt32;
FONT_LogFont16To32A( &font->logfont, &fnt32 );
if (count > sizeof(fnt32)) count = sizeof(fnt32);
memcpy( buffer, &fnt32, count );
return count;
}
/***********************************************************************
* FONT_EnumInstance16
*
* Called by the device driver layer to pass font info
* down to the application.
*/
static INT32 FONT_EnumInstance16( LPENUMLOGFONT16 plf,
LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
{
#define pfe ((fontEnum16*)lp)
if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
{
memcpy( pfe->lpLogFont, plf, sizeof(ENUMLOGFONT16) );
memcpy( pfe->lpTextMetric, ptm, sizeof(NEWTEXTMETRIC16) );
return pfe->lpEnumFunc( pfe->segLogFont, pfe->segTextMetric, fType, (LPARAM)(pfe->lpData) );
}
#undef pfe
return 1;
}
/***********************************************************************
* FONT_EnumInstance32
*/
static INT32 FONT_EnumInstance32( LPENUMLOGFONT16 plf,
LPNEWTEXTMETRIC16 ptm, UINT16 fType, LPARAM lp )
{
/* lfCharSet is at the same offset in both LOGFONT32A and LOGFONT32W */
#define pfe ((fontEnum32*)lp)
if( pfe->lpLogFontParam->lfCharSet == DEFAULT_CHARSET ||
pfe->lpLogFontParam->lfCharSet == plf->elfLogFont.lfCharSet )
{
/* convert font metrics */
if( pfe->dwFlags & ENUM_UNICODE )
{
FONT_LogFont16To32W( &plf->elfLogFont, (LPLOGFONT32W)(pfe->lpLogFont) );
FONT_TextMetric16to32W( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32W)(pfe->lpTextMetric) );
}
else
{
FONT_LogFont16To32A( &plf->elfLogFont, (LPLOGFONT32A)pfe->lpLogFont );
FONT_TextMetric16to32A( (LPTEXTMETRIC16)ptm, (LPTEXTMETRIC32A)pfe->lpTextMetric );
}
return pfe->lpEnumFunc( (LPENUMLOGFONT32W)pfe->lpLogFont,
(LPNEWTEXTMETRIC32W)pfe->lpTextMetric, fType, pfe->lpData );
}
#undef pfe
return 1;
}
/***********************************************************************
* EnumFontFamiliesEx16 (GDI.613)
*/
INT16 WINAPI EnumFontFamiliesEx16( HDC16 hDC, LPLOGFONT16 plf,
FONTENUMPROCEX16 efproc, LPARAM lParam,
DWORD dwFlags)
{
INT16 retVal = 0;
DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
if( dc && dc->funcs->pEnumDeviceFonts )
{
LPNEWTEXTMETRICEX16 lptm16 = SEGPTR_ALLOC( sizeof(NEWTEXTMETRICEX16) );
if( lptm16 )
{
LPENUMLOGFONTEX16 lplf16 = SEGPTR_ALLOC( sizeof(ENUMLOGFONTEX16) );
if( lplf16 )
{
fontEnum16 fe16 = { plf, efproc, lParam, lptm16, lplf16,
SEGPTR_GET(lptm16), SEGPTR_GET(lplf16) };
retVal = dc->funcs->pEnumDeviceFonts( dc, plf, FONT_EnumInstance16, (LPARAM)&fe16 );
SEGPTR_FREE(lplf16);
}
SEGPTR_FREE(lptm16);
}
}
return retVal;
}
/***********************************************************************
* FONT_EnumFontFamiliesEx32
*/
static INT32 FONT_EnumFontFamiliesEx32( HDC32 hDC, LPLOGFONT32W plf, FONTENUMPROC32W efproc,
LPARAM lParam, DWORD dwUnicode)
{
DC* dc = (DC*) GDI_GetObjPtr( hDC, DC_MAGIC );
if( dc && dc->funcs->pEnumDeviceFonts )
{
LOGFONT16 lf16;
NEWTEXTMETRICEX32W tm32w;
ENUMLOGFONTEX32W lf32w;
fontEnum32 fe32 = { plf, efproc, lParam, &tm32w, &lf32w, dwUnicode };
/* the only difference between LOGFONT32A and LOGFONT32W is in the lfFaceName */
if( plf->lfFaceName[0] )
{
if( dwUnicode )
lstrcpynWtoA( lf16.lfFaceName, plf->lfFaceName, LF_FACESIZE );
else
lstrcpyn32A( lf16.lfFaceName, (LPCSTR)plf->lfFaceName, LF_FACESIZE );
}
else lf16.lfFaceName[0] = '\0';
lf16.lfCharSet = plf->lfCharSet;
return dc->funcs->pEnumDeviceFonts( dc, &lf16, FONT_EnumInstance32, (LPARAM)&fe32 );
}
return 0;
}
/***********************************************************************
* EnumFontFamiliesEx32W (GDI32.82)
*/
INT32 WINAPI EnumFontFamiliesEx32W( HDC32 hDC, LPLOGFONT32W plf,
FONTENUMPROCEX32W efproc,
LPARAM lParam, DWORD dwFlags )
{
return FONT_EnumFontFamiliesEx32( hDC, plf, (FONTENUMPROC32W)efproc,
lParam, ENUM_UNICODE );
}
/***********************************************************************
* EnumFontFamiliesEx32A (GDI32.81)
*/
INT32 WINAPI EnumFontFamiliesEx32A( HDC32 hDC, LPLOGFONT32A plf,
FONTENUMPROCEX32A efproc,
LPARAM lParam, DWORD dwFlags)
{
return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)plf,
(FONTENUMPROC32W)efproc, lParam, 0);
}
/***********************************************************************
* EnumFontFamilies16 (GDI.330)
*/
INT16 WINAPI EnumFontFamilies16( HDC16 hDC, LPCSTR lpFamily,
FONTENUMPROC16 efproc, LPARAM lpData )
{
LOGFONT16 lf;
lf.lfCharSet = DEFAULT_CHARSET;
if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
else lf.lfFaceName[0] = '\0';
return EnumFontFamiliesEx16( hDC, &lf, (FONTENUMPROCEX16)efproc, lpData, 0 );
}
/***********************************************************************
* EnumFontFamilies32A (GDI32.80)
*/
INT32 WINAPI EnumFontFamilies32A( HDC32 hDC, LPCSTR lpFamily,
FONTENUMPROC32A efproc, LPARAM lpData )
{
LOGFONT32A lf;
lf.lfCharSet = DEFAULT_CHARSET;
if( lpFamily ) lstrcpyn32A( lf.lfFaceName, lpFamily, LF_FACESIZE );
else lf.lfFaceName[0] = lf.lfFaceName[1] = '\0';
return FONT_EnumFontFamiliesEx32( hDC, (LPLOGFONT32W)&lf,
(FONTENUMPROC32W)efproc, lpData, 0 );
}
/***********************************************************************
* EnumFontFamilies32W (GDI32.83)
*/
INT32 WINAPI EnumFontFamilies32W( HDC32 hDC, LPCWSTR lpFamily,
FONTENUMPROC32W efproc, LPARAM lpData )
{
LOGFONT32W lf;
lf.lfCharSet = DEFAULT_CHARSET;
if( lpFamily ) lstrcpyn32W( lf.lfFaceName, lpFamily, LF_FACESIZE );
else lf.lfFaceName[0] = 0;
return FONT_EnumFontFamiliesEx32( hDC, &lf, efproc, lpData, ENUM_UNICODE );
}
/***********************************************************************
* EnumFonts16 (GDI.70)
*/
INT16 WINAPI EnumFonts16( HDC16 hDC, LPCSTR lpName, FONTENUMPROC16 efproc,
LPARAM lpData )
{
return EnumFontFamilies16( hDC, lpName, (FONTENUMPROCEX16)efproc, lpData );
}
/***********************************************************************
* EnumFonts32A (GDI32.84)
*/
INT32 WINAPI EnumFonts32A( HDC32 hDC, LPCSTR lpName, FONTENUMPROC32A efproc,
LPARAM lpData )
{
return EnumFontFamilies32A( hDC, lpName, efproc, lpData );
}
/***********************************************************************
* EnumFonts32W (GDI32.85)
*/
INT32 WINAPI EnumFonts32W( HDC32 hDC, LPCWSTR lpName, FONTENUMPROC32W efproc,
LPARAM lpData )
{
return EnumFontFamilies32W( hDC, lpName, efproc, lpData );
}
/***********************************************************************
* GetTextCharacterExtra16 (GDI.89)
*/
INT16 WINAPI GetTextCharacterExtra16( HDC16 hdc )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return 0;
return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
/ dc->vportExtX );
}
/***********************************************************************
* GetTextCharacterExtra32 (GDI32.225)
*/
INT32 WINAPI GetTextCharacterExtra32( HDC32 hdc )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return 0;
return abs( (dc->w.charExtra * dc->wndExtX + dc->vportExtX / 2)
/ dc->vportExtX );
}
/***********************************************************************
* SetTextCharacterExtra16 (GDI.8)
*/
INT16 WINAPI SetTextCharacterExtra16( HDC16 hdc, INT16 extra )
{
return (INT16)SetTextCharacterExtra32( hdc, extra );
}
/***********************************************************************
* SetTextCharacterExtra32 (GDI32.337)
*/
INT32 WINAPI SetTextCharacterExtra32( HDC32 hdc, INT32 extra )
{
INT32 prev;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return 0;
extra = (extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX;
prev = dc->w.charExtra;
dc->w.charExtra = abs(extra);
return (prev * dc->wndExtX + dc->vportExtX / 2) / dc->vportExtX;
}
/***********************************************************************
* SetTextJustification16 (GDI.10)
*/
INT16 WINAPI SetTextJustification16( HDC16 hdc, INT16 extra, INT16 breaks )
{
return SetTextJustification32( hdc, extra, breaks );
}
/***********************************************************************
* SetTextJustification32 (GDI32.339)
*/
BOOL32 WINAPI SetTextJustification32( HDC32 hdc, INT32 extra, INT32 breaks )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return 0;
extra = abs((extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX);
if (!extra) breaks = 0;
dc->w.breakTotalExtra = extra;
dc->w.breakCount = breaks;
if (breaks)
{
dc->w.breakExtra = extra / breaks;
dc->w.breakRem = extra - (dc->w.breakCount * dc->w.breakExtra);
}
else
{
dc->w.breakExtra = 0;
dc->w.breakRem = 0;
}
return 1;
}
/***********************************************************************
* GetTextFace16 (GDI.92)
*/
INT16 WINAPI GetTextFace16( HDC16 hdc, INT16 count, LPSTR name )
{
return GetTextFace32A(hdc,count,name);
}
/***********************************************************************
* GetTextFace32A (GDI32.234)
*/
INT32 WINAPI GetTextFace32A( HDC32 hdc, INT32 count, LPSTR name )
{
FONTOBJ *font;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc) return 0;
if (!(font = (FONTOBJ *) GDI_GetObjPtr( dc->w.hFont, FONT_MAGIC )))
return 0;
if (name)
lstrcpyn32A( name, font->logfont.lfFaceName, count );
GDI_HEAP_UNLOCK( dc->w.hFont );
if (name)
return strlen(name);
else
return strlen(font->logfont.lfFaceName) + 1;
}
/***********************************************************************
* GetTextFace32W (GDI32.235)
*/
INT32 WINAPI GetTextFace32W( HDC32 hdc, INT32 count, LPWSTR name )
{
LPSTR nameA = HeapAlloc( GetProcessHeap(), 0, count );
INT32 res = GetTextFace32A(hdc,count,nameA);
lstrcpyAtoW( name, nameA );
HeapFree( GetProcessHeap(), 0, nameA );
return res;
}
/***********************************************************************
* GetTextExtent (GDI.91)
*/
DWORD WINAPI GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count )
{
SIZE16 size;
if (!GetTextExtentPoint16( hdc, str, count, &size )) return 0;
return MAKELONG( size.cx, size.cy );
}
/***********************************************************************
* GetTextExtentPoint16 (GDI.471)
*
* FIXME: Should this have a bug for compatibility?
* Original Windows versions of GetTextExtentPoint{A,W} have documented
* bugs.
*/
BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count,
LPSIZE16 size )
{
SIZE32 size32;
BOOL32 ret = GetTextExtentPoint32A( hdc, str, count, &size32 );
CONV_SIZE32TO16( &size32, size );
return (BOOL16)ret;
}
/***********************************************************************
* GetTextExtentPoint32A (GDI32.230)
*/
BOOL32 WINAPI GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
LPSIZE32 size )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
return FALSE;
}
if (!dc->funcs->pGetTextExtentPoint ||
!dc->funcs->pGetTextExtentPoint( dc, str, count, size ))
return FALSE;
TRACE(font,"(%08x %s %d %p): returning %d,%d\n",
hdc, debugstr_an (str, count), count,
size, size->cx, size->cy );
return TRUE;
}
/***********************************************************************
* GetTextExtentPoint32W [GDI32.231] Computes width/height for a string
*
* Computes width and height of the specified string.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL32 WINAPI GetTextExtentPoint32W(
HDC32 hdc, /* [in] Handle of device context */
LPCWSTR str, /* [in] Address of text string */
INT32 count, /* [in] Number of characters in string */
LPSIZE32 size) /* [out] Address of structure for string size */
{
LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
BOOL32 ret = GetTextExtentPoint32A( hdc, p, count, size );
HeapFree( GetProcessHeap(), 0, p );
return ret;
}
/***********************************************************************
* GetTextExtentPoint32ABuggy (GDI32.232)
*/
BOOL32 WINAPI GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count,
LPSIZE32 size )
{
TRACE(font, "not bug compatible.\n");
return GetTextExtentPoint32A( hdc, str, count, size );
}
/***********************************************************************
* GetTextExtentPoint32WBuggy (GDI32.233)
*/
BOOL32 WINAPI GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count,
LPSIZE32 size )
{
TRACE(font, "not bug compatible.\n");
return GetTextExtentPoint32W( hdc, str, count, size );
}
/***********************************************************************
* GetTextExtentExPoint32A (GDI32.228)
*/
BOOL32 WINAPI GetTextExtentExPoint32A( HDC32 hdc, LPCSTR str, INT32 count,
INT32 maxExt, LPINT32 lpnFit,
LPINT32 alpDx, LPSIZE32 size )
{
int index, nFit, extent;
SIZE32 tSize;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
return FALSE;
}
if (!dc->funcs->pGetTextExtentPoint) return FALSE;
size->cx = size->cy = nFit = extent = 0;
for(index = 0; index < count; index++)
{
if(!dc->funcs->pGetTextExtentPoint( dc, str, 1, &tSize )) return FALSE;
if( extent+tSize.cx < maxExt )
{
extent+=tSize.cx;
nFit++;
str++;
if( alpDx ) alpDx[index] = extent;
if( tSize.cy > size->cy ) size->cy = tSize.cy;
}
else break;
}
size->cx = extent;
*lpnFit = nFit;
TRACE(font,"(%08x '%.*s' %d) returning %d %d %d\n",
hdc,count,str,maxExt,nFit, size->cx,size->cy);
return TRUE;
}
/***********************************************************************
* GetTextExtentExPoint32W (GDI32.229)
*/
BOOL32 WINAPI GetTextExtentExPoint32W( HDC32 hdc, LPCWSTR str, INT32 count,
INT32 maxExt, LPINT32 lpnFit,
LPINT32 alpDx, LPSIZE32 size )
{
LPSTR p = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
BOOL32 ret = GetTextExtentExPoint32A( hdc, p, count, maxExt,
lpnFit, alpDx, size);
HeapFree( GetProcessHeap(), 0, p );
return ret;
}
/***********************************************************************
* GetTextMetrics16 (GDI.93)
*/
BOOL16 WINAPI GetTextMetrics16( HDC16 hdc, TEXTMETRIC16 *metrics )
{
TEXTMETRIC32A tm32;
if (!GetTextMetrics32A( (HDC32)hdc, &tm32 )) return FALSE;
FONT_TextMetric32Ato16( &tm32, metrics );
return TRUE;
}
/***********************************************************************
* GetTextMetrics32A (GDI32.236)
*/
BOOL32 WINAPI GetTextMetrics32A( HDC32 hdc, TEXTMETRIC32A *metrics )
{
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
return FALSE;
}
if (!dc->funcs->pGetTextMetrics ||
!dc->funcs->pGetTextMetrics( dc, metrics ))
return FALSE;
/* device layer returns values in device units
* therefore we have to convert them to logical */
#define WDPTOLP(x) ((x<0)? \
(-abs((x)*dc->wndExtX/dc->vportExtX)): \
(abs((x)*dc->wndExtX/dc->vportExtX)))
#define HDPTOLP(y) ((y<0)? \
(-abs((y)*dc->wndExtY/dc->vportExtY)): \
(abs((y)*dc->wndExtY/dc->vportExtY)))
metrics->tmHeight = HDPTOLP(metrics->tmHeight);
metrics->tmAscent = HDPTOLP(metrics->tmAscent);
metrics->tmDescent = HDPTOLP(metrics->tmDescent);
metrics->tmInternalLeading = HDPTOLP(metrics->tmInternalLeading);
metrics->tmExternalLeading = HDPTOLP(metrics->tmExternalLeading);
metrics->tmAveCharWidth = WDPTOLP(metrics->tmAveCharWidth);
metrics->tmMaxCharWidth = WDPTOLP(metrics->tmMaxCharWidth);
metrics->tmOverhang = WDPTOLP(metrics->tmOverhang);
TRACE(font,"text metrics:
Weight = %03i\t FirstChar = %03i\t AveCharWidth = %i
Italic = % 3i\t LastChar = %03i\t\t MaxCharWidth = %i
UnderLined = %01i\t DefaultChar = %03i\t Overhang = %i
StruckOut = %01i\t BreakChar = %03i\t CharSet = %i
PitchAndFamily = %02x
--------------------
InternalLeading = %i
Ascent = %i
Descent = %i
Height = %i\n",
metrics->tmWeight, metrics->tmFirstChar, metrics->tmAveCharWidth,
metrics->tmItalic, metrics->tmLastChar, metrics->tmMaxCharWidth,
metrics->tmUnderlined, metrics->tmDefaultChar, metrics->tmOverhang,
metrics->tmStruckOut, metrics->tmBreakChar, metrics->tmCharSet,
metrics->tmPitchAndFamily,
metrics->tmInternalLeading,
metrics->tmAscent,
metrics->tmDescent,
metrics->tmHeight );
return TRUE;
}
/***********************************************************************
* GetTextMetrics32W (GDI32.237)
*/
BOOL32 WINAPI GetTextMetrics32W( HDC32 hdc, TEXTMETRIC32W *metrics )
{
TEXTMETRIC32A tm;
if (!GetTextMetrics32A( (HDC16)hdc, &tm )) return FALSE;
FONT_TextMetric32Ato32W( &tm, metrics );
return TRUE;
}
/***********************************************************************
* GetOutlineTextMetrics [GDI.308] Gets metrics for TrueType fonts.
*
* NOTES
* lpOTM should be LPOUTLINETEXTMETRIC
*
* RETURNS
* Success: Non-zero or size of required buffer
* Failure: 0
*/
UINT16 WINAPI GetOutlineTextMetrics16(
HDC16 hdc, /* [in] Handle of device context */
UINT16 cbData, /* [in] Size of metric data array */
void *lpOTM) /* [out] Address of metric data array */
{
FIXME(font, "(%04x,%04x,%p): stub\n", hdc,cbData,lpOTM);
return 0;
}
/***********************************************************************
* GetCharWidth16 (GDI.350)
*/
BOOL16 WINAPI GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
LPINT16 buffer )
{
BOOL32 retVal = FALSE;
if( firstChar != lastChar )
{
LPINT32 buf32 = (LPINT32)HeapAlloc(GetProcessHeap(), 0,
sizeof(INT32)*(1 + (lastChar - firstChar)));
if( buf32 )
{
LPINT32 obuf32 = buf32;
int i;
retVal = GetCharWidth32A(hdc, firstChar, lastChar, buf32);
if (retVal)
{
for (i = firstChar; i <= lastChar; i++)
*buffer++ = *buf32++;
}
HeapFree(GetProcessHeap(), 0, obuf32);
}
}
else /* happens quite often to warrant a special treatment */
{
INT32 chWidth;
retVal = GetCharWidth32A(hdc, firstChar, lastChar, &chWidth );
*buffer = chWidth;
}
return retVal;
}
/***********************************************************************
* GetCharWidth32A (GDI32.155)
*/
BOOL32 WINAPI GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
LPINT32 buffer )
{
UINT32 i, extra;
DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
if (!dc)
{
if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
return FALSE;
}
if (!dc->funcs->pGetCharWidth ||
!dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer))
return FALSE;
/* convert device units to logical */
extra = dc->vportExtX >> 1;
for( i = firstChar; i <= lastChar; i++, buffer++ )
*buffer = (*buffer * dc->wndExtX + extra) / dc->vportExtX;
return TRUE;
}
/***********************************************************************
* GetCharWidth32W (GDI32.158)
*/
BOOL32 WINAPI GetCharWidth32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
LPINT32 buffer )
{
return GetCharWidth32A( hdc, firstChar, lastChar, buffer );
}
/* FIXME: all following APIs *******************************************
*
*
* SetMapperFlags16 (GDI.349)
*/
DWORD WINAPI SetMapperFlags16( HDC16 hDC, DWORD dwFlag )
{
return SetMapperFlags32( hDC, dwFlag );
}
/***********************************************************************
* SetMapperFlags32 (GDI32.322)
*/
DWORD WINAPI SetMapperFlags32( HDC32 hDC, DWORD dwFlag )
{
FIXME(font, "(0x%04x, 0x%08lx): stub - harmless\n", hDC, dwFlag);
return 0;
}
/***********************************************************************
* GetAspectRatioFilterEx16 (GDI.486)
*/
BOOL16 WINAPI GetAspectRatioFilterEx16( HDC16 hdc, LPSIZE16 pAspectRatio )
{
FIXME(font, "(%04x, %p): -- Empty Stub !\n",
hdc, pAspectRatio);
return FALSE;
}
/***********************************************************************
* GetCharABCWidths16 (GDI.307)
*/
BOOL16 WINAPI GetCharABCWidths16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
LPABC16 abc )
{
ABC32 abc32;
if (!GetCharABCWidths32A( hdc, firstChar, lastChar, &abc32 )) return FALSE;
abc->abcA = abc32.abcA;
abc->abcB = abc32.abcB;
abc->abcC = abc32.abcC;
return TRUE;
}
/***********************************************************************
* GetCharABCWidths32A (GDI32.149)
*/
BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
LPABC32 abc )
{
return GetCharABCWidths32W( hdc, firstChar, lastChar, abc );
}
/******************************************************************************
* GetCharABCWidths32W [GDI32.152] Retrieves widths of characters in range
*
* PARAMS
* hdc [I] Handle of device context
* firstChar [I] First character in range to query
* lastChar [I] Last character in range to query
* abc [O] Address of character-width structure
*
* NOTES
* Only works with TrueType fonts
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL32 WINAPI GetCharABCWidths32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
LPABC32 abc )
{
/* No TrueType fonts in Wine so far */
FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc);
return FALSE;
}
/***********************************************************************
* GetGlyphOutline16 (GDI.309)
*/
DWORD WINAPI GetGlyphOutline16( HDC16 hdc, UINT16 uChar, UINT16 fuFormat,
LPGLYPHMETRICS16 lpgm, DWORD cbBuffer,
LPVOID lpBuffer, const MAT2 *lpmat2 )
{
FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
return (DWORD)-1; /* failure */
}
/***********************************************************************
* GetGlyphOutline32A (GDI32.186)
*/
DWORD WINAPI GetGlyphOutline32A( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
LPVOID lpBuffer, const MAT2 *lpmat2 )
{
FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
return (DWORD)-1; /* failure */
}
/***********************************************************************
* GetGlyphOutline32W (GDI32.187)
*/
DWORD WINAPI GetGlyphOutline32W( HDC32 hdc, UINT32 uChar, UINT32 fuFormat,
LPGLYPHMETRICS32 lpgm, DWORD cbBuffer,
LPVOID lpBuffer, const MAT2 *lpmat2 )
{
FIXME(font,"(%04x, '%c', %04x, %p, %ld, %p, %p): stub\n",
hdc, uChar, fuFormat, lpgm, cbBuffer, lpBuffer, lpmat2 );
return (DWORD)-1; /* failure */
}
/***********************************************************************
* CreateScalableFontResource16 (GDI.310)
*/
BOOL16 WINAPI CreateScalableFontResource16( UINT16 fHidden,
LPCSTR lpszResourceFile,
LPCSTR fontFile, LPCSTR path )
{
return CreateScalableFontResource32A( fHidden, lpszResourceFile,
fontFile, path );
}
/***********************************************************************
* CreateScalableFontResource32A (GDI32.62)
*/
BOOL32 WINAPI CreateScalableFontResource32A( DWORD fHidden,
LPCSTR lpszResourceFile,
LPCSTR lpszFontFile,
LPCSTR lpszCurrentPath )
{
/* fHidden=1 - only visible for the calling app, read-only, not
* enumbered with EnumFonts/EnumFontFamilies
* lpszCurrentPath can be NULL
*/
FIXME(font,"(%ld,%s,%s,%s): stub\n",
fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
return FALSE; /* create failed */
}
/***********************************************************************
* CreateScalableFontResource32W (GDI32.63)
*/
BOOL32 WINAPI CreateScalableFontResource32W( DWORD fHidden,
LPCWSTR lpszResourceFile,
LPCWSTR lpszFontFile,
LPCWSTR lpszCurrentPath )
{
FIXME(font,"(%ld,%p,%p,%p): stub\n",
fHidden, lpszResourceFile, lpszFontFile, lpszCurrentPath );
return FALSE; /* create failed */
}
/*************************************************************************
* GetRasterizerCaps16 (GDI.313)
*/
BOOL16 WINAPI GetRasterizerCaps16( LPRASTERIZER_STATUS lprs, UINT16 cbNumBytes)
{
return GetRasterizerCaps32( lprs, cbNumBytes );
}
/*************************************************************************
* GetRasterizerCaps32 (GDI32.216)
*/
BOOL32 WINAPI GetRasterizerCaps32( LPRASTERIZER_STATUS lprs, UINT32 cbNumBytes)
{
lprs->nSize = sizeof(RASTERIZER_STATUS);
lprs->wFlags = TT_AVAILABLE|TT_ENABLED;
lprs->nLanguageID = 0;
return TRUE;
}
/*************************************************************************
* GetKerningPairs16 (GDI.332)
*/
INT16 WINAPI GetKerningPairs16( HDC16 hDC, INT16 cPairs,
LPKERNINGPAIR16 lpKerningPairs )
{
/* At this time kerning is ignored (set to 0) */
int i;
FIXME(font,"(%x,%d,%p): almost empty stub!\n",
hDC, cPairs, lpKerningPairs);
for (i = 0; i < cPairs; i++)
lpKerningPairs[i].iKernAmount = 0;
return 0;
}
/*************************************************************************
* GetKerningPairs32A (GDI32.192)
*/
DWORD WINAPI GetKerningPairs32A( HDC32 hDC, DWORD cPairs,
LPKERNINGPAIR32 lpKerningPairs )
{
int i;
FIXME(font,"(%x,%ld,%p): almost empty stub!\n",
hDC, cPairs, lpKerningPairs);
for (i = 0; i < cPairs; i++)
lpKerningPairs[i].iKernAmount = 0;
return 0;
}
/*************************************************************************
* GetKerningPairs32W (GDI32.193)
*/
DWORD WINAPI GetKerningPairs32W( HDC32 hDC, DWORD cPairs,
LPKERNINGPAIR32 lpKerningPairs )
{
return GetKerningPairs32A( hDC, cPairs, lpKerningPairs );
}
/*************************************************************************
* TranslateCharSetInfo [GDI32.382]
*/
BOOL32 WINAPI TranslateCharSetInfo(LPDWORD lpSrc,LPCHARSETINFO lpCs,DWORD dwFlags) {
FIXME(font,"(%p,%p,0x%08lx), stub.\n",lpSrc,lpCs,dwFlags);
return TRUE;
}
/*************************************************************************
* GetFontLanguageInfo (GDI32.182)
*/
DWORD WINAPI GetFontLanguageInfo32(HDC32 hdc) {
/* return value 0 is correct for most cases anyway */
FIXME(font,"(%x):stub!\n", hdc);
return 0;
}
/*************************************************************************
* GetFontLanguageInfo (GDI.616)
*/
DWORD WINAPI GetFontLanguageInfo16(HDC16 hdc) {
/* return value 0 is correct for most cases anyway */
FIXME(font,"(%x):stub!\n",hdc);
return 0;
}
/*************************************************************************
* GetFontData32 [GDI32.181] Retrieve data for TrueType font
*
* RETURNS
*
* success: Number of bytes returned
* failure: GDI_ERROR
*
* NOTES
*
* Calls SetLastError()
*
* BUGS
*
* Unimplemented
*/
DWORD WINAPI GetFontData32(HDC32 hdc, DWORD table, DWORD offset,
LPVOID buffer, DWORD length)
{
FIXME(font, "(%x,%ld,%ld,%p,%ld): stub\n",
hdc, table, offset, buffer, length);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return GDI_ERROR;
}
/*************************************************************************
* GetCharacterPlacement32A [GDI32.160]
*/
DWORD WINAPI
GetCharacterPlacement32A(HDC32 hdc, LPCSTR lpString, INT32 uCount,
INT32 nMaxExtent, GCP_RESULTS32A *lpResults,
DWORD dwFlags)
{
/* return value 0 is correct for most cases anyway */
FIXME(font,":stub!\n");
return 0;
}
/*************************************************************************
* GetCharacterPlacement32W [GDI32.161]
*/
DWORD WINAPI
GetCharacterPlacement32W(HDC32 hdc, LPCWSTR lpString, INT32 uCount,
INT32 nMaxExtent, GCP_RESULTS32W *lpResults,
DWORD dwFlags)
{
/* return value 0 is correct for most cases anyway */
FIXME(font,":stub!\n");
return 0;
}