carbon intf: using fractional text rendering if DX parameter is nil

git-svn-id: trunk@12727 -
This commit is contained in:
mattias 2007-11-03 20:13:59 +00:00
parent 2c73eca690
commit 5e807a544e

View File

@ -102,7 +102,9 @@ type
function SaveDC: Integer;
function RestoreDC(ASavedDC: Integer): Boolean;
function BeginTextRender(AStr: PChar; ACount: Integer; out ALayout: ATSUTextLayout): Boolean;
function BeginTextRender(AStr: PChar; ACount: Integer;
const ADisableFractionalPositions:Boolean;
out ALayout: ATSUTextLayout): Boolean;
procedure EndTextRender(var ALayout: ATSUTextLayout);
procedure SetAntialiasing(AValue: Boolean);
@ -593,6 +595,7 @@ end;
Method: TCarbonDeviceContext.BeginTextRender
Params: AStr - UTF8 string to render
ACount - Count of chars to render
ADisableFractionalPositions - whether to disable fractional positions
ALayout - ATSU layout
Returns: If the function suceeds
@ -600,8 +603,9 @@ end;
context to render the text.
NOTE: Coordination system is set upside-down!
------------------------------------------------------------------------------}
function TCarbonDeviceContext.BeginTextRender(AStr: PChar; ACount: Integer; out
ALayout: ATSUTextLayout): Boolean;
function TCarbonDeviceContext.BeginTextRender(AStr: PChar; ACount: Integer;
const ADisableFractionalPositions:Boolean;
out ALayout: ATSUTextLayout): Boolean;
var
TextStyle: ATSUStyle;
TextLength: LongWord;
@ -646,15 +650,16 @@ begin
Self, SName, 'ATSUSetLayoutControls', 'LineRotation') then Exit;
// disable fractional positions of glyphs in layout
Tag := kATSULineLayoutOptionsTag;
DataSize := SizeOf(ATSLineLayoutOptions);
Options := kATSLineFractDisable or kATSLineDisableAutoAdjustDisplayPos or
kATSLineDisableAllLayoutOperations or kATSLineUseDeviceMetrics;
PValue := @Options;
if OSError(ATSUSetLayoutControls(ALayout, 1, @Tag, @DataSize, @PValue),
Self, SName, 'ATSUSetLayoutControls', 'LineLayoutOptions') then Exit;
if ADisableFractionalPositions then begin
Tag := kATSULineLayoutOptionsTag;
DataSize := SizeOf(ATSLineLayoutOptions);
Options := kATSLineFractDisable or kATSLineDisableAutoAdjustDisplayPos or
kATSLineDisableAllLayoutOperations or kATSLineUseDeviceMetrics;
PValue := @Options;
if OSError(ATSUSetLayoutControls(ALayout, 1, @Tag, @DataSize, @PValue),
Self, SName, 'ATSUSetLayoutControls', 'LineLayoutOptions') then Exit;
end;
// set layout context
Tag := kATSUCGContextTag;
@ -837,7 +842,7 @@ const
begin
Result := False;
if not BeginTextRender(Str, Count, TextLayout) then
if not BeginTextRender(Str, Count, Dx<>nil, TextLayout) then
begin
// It is possible that the background should be filled even without text;
if (Options and ETO_OPAQUE) > 0 then
@ -975,7 +980,7 @@ begin
Size.cx := 0;
Size.cy := 0;
if not BeginTextRender(Str, Count, TextLayout) then Exit;
if not BeginTextRender(Str, Count, false, TextLayout) then Exit;
try
// finally compute the text dimensions
if OSError(ATSUGetUnjustifiedBounds(TextLayout, kATSUFromTextBeginning,
@ -1018,7 +1023,7 @@ begin
// According to the MSDN library, TEXTMETRIC:
// the average char width is generally defined as the width of the letter x
if not BeginTextRender('x', 1, TextLayout) then Exit;
if not BeginTextRender('x', 1, false, TextLayout) then Exit;
try
if OSError(ATSUGetUnjustifiedBounds(TextLayout, kATSUFromTextBeginning,
kATSUToTextEnd, TextBefore, TextAfter, Ascent, Descent),