mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
510 lines
20 KiB
510 lines
20 KiB
// TITLE("Get Glyph Metrics")
|
|
//++
|
|
//
|
|
// Copyright (c) 1993 IBM Corporation
|
|
//
|
|
// Module Name:
|
|
//
|
|
// cachea.s
|
|
//
|
|
// Abstract:
|
|
//
|
|
// This module implements code to get glyph metrics from a realized
|
|
// font.
|
|
//
|
|
// Author:
|
|
//
|
|
// Curtis R. Fawcett (crf) 15-Sept-1993
|
|
//
|
|
// Environment:
|
|
//
|
|
// User mode only.
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Curtis R. Fawcett 18-Jan-1994 Fixed errors and removed
|
|
// register names as requested
|
|
//
|
|
// Curtis R. Fawcett 10-Feb-1994 Fixed problem with cmp's and
|
|
// improved performance
|
|
//
|
|
// Curtis R. Fawcett 02-Mar-1994 Fixed incompatibilities between
|
|
// a special case and processing
|
|
// loop
|
|
//
|
|
// Curtis R. Fawcett 26-May-1994 Updated to match NT35 changes
|
|
//
|
|
//--
|
|
//
|
|
// Parameter Register Usage:
|
|
//
|
|
// r.3 - Realized font object pointer
|
|
// r.4 - Wide character count
|
|
// r.5 - Glyph structure pointer
|
|
// r.6 - Wide character array pointer
|
|
// r.7 - Translation result pointer
|
|
//
|
|
// Local register Usage:
|
|
//
|
|
// r.0 - Glyph count
|
|
// r.3 - Function return value
|
|
// r.7 - Realized font pointer
|
|
// r.7 - Glyph mapping pointer
|
|
// r.8 - Wide Character base value
|
|
// r.9 - Wide character temp storage
|
|
// r.10 - Glyph data pointer
|
|
// r.11 - Glyph data
|
|
// r.11 - Glyph handle
|
|
// r.11 - Default Glyph
|
|
// r.11 - Glyph bits
|
|
// r.11 - Second wide character pointer
|
|
// r.11 - Insert status
|
|
// r.12 - Wide character value
|
|
//
|
|
// Local Registers Usage for Calling External Routines:
|
|
//
|
|
// r.4 - Called routine parameter 1
|
|
// r.5 - Called routine parameter 2
|
|
// r.8 - Function decriptor pointer
|
|
// r.9 - Function code pointer
|
|
//
|
|
// Volatile Registers Usage:
|
|
//
|
|
// r.20 - Glyph handle
|
|
// r.21 - Glyph data
|
|
// r.22 - Save wide character array ptr
|
|
// r.23 - Save translation result ptr
|
|
// r.24 - Save translation result value
|
|
// r.25 - Save realized font object ptr
|
|
// r.26 - Save wide character count
|
|
// r.27 - Save glyph structure pointer
|
|
// r.28 - Save wide character pointer
|
|
// r.29 - Save wide character base
|
|
// r.30 - Save glyph count
|
|
// r.31 - Save glyph data array pointer
|
|
//
|
|
|
|
#include "kxppc.h"
|
|
#include "gdippc.h"
|
|
|
|
//
|
|
// Define local values
|
|
//
|
|
.set SSIZE,STK_MIN_FRAME+32
|
|
.set SSIZE2,STK_MIN_FRAME+48
|
|
//
|
|
// Define external entry points
|
|
//
|
|
#ifdef FE_SB
|
|
.extern ..xwpgdGetLinkMetricsRFONTOBJ
|
|
.extern ..xwpgdGetLinkMetricsPlusRFONTOBJ
|
|
#endif
|
|
.extern ..xInsertGlyphbitsRFONTOBJ
|
|
.extern ..xprunFindRunRFONTOBJ
|
|
.extern ..xInsertMetricsRFONTOBJ
|
|
.extern ..xpgdDefault
|
|
.extern .._savegpr_25
|
|
.extern .._savegpr_20
|
|
.extern .._restgpr_25
|
|
.extern .._restgpr_20
|
|
|
|
//++
|
|
//
|
|
// BOOL
|
|
// xGetGlyphMetricsRFONTOBJ (
|
|
// IN RFONTOBJ *pfobj,
|
|
// IN COUNT c,
|
|
// IN GLYPHPOS *pgp,
|
|
// IN WCHAR *pwc
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This routine translates an array of wide characters to pointers to
|
|
// glyphs. Only the metrics are guaranteed to be valid and no attempt
|
|
// is made to ensure that the glyph data itself is valid.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// pfobj (r.3) - Supplies a pointer to a realized font object.
|
|
//
|
|
// c (r.4) - Supplies the count of the number of wide charaters
|
|
// to translate.
|
|
//
|
|
// pgp (r.5) - Supplies a pointer to an array of glyph position
|
|
// structures.
|
|
//
|
|
// pwc (r.6) - Supplies a pointer to an array of wide character to
|
|
// translate.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// A value of TRUE is returned if translation is successful.
|
|
// Otherwise, a value of FALSE is returned.
|
|
//
|
|
//--
|
|
|
|
NESTED_ENTRY(xGetGlyphMetrics,SSIZE,7,0)
|
|
PROLOGUE_END(xGetGlyphMetrics)
|
|
//
|
|
// Fetch address and count values
|
|
//
|
|
lwz r.7,rfo_prfnt(r.3) // Get realized font data ptr
|
|
lwz r.7,rf_wcgp(r.7) // Get glyph mapping data ptr
|
|
lwz r.8,gt_agpRun+gr_wcLow(r.7) // Get wide char base
|
|
lwz r.0,gt_agpRun+gr_cGlyphs(r.7) // Get glyph count
|
|
lwz r.10,gt_agpRun+gr_apgd(r.7) // Get glyph data ptr
|
|
//
|
|
// Loop through wide character array and fill glyph data in glyph
|
|
// position array
|
|
//
|
|
GLoop:
|
|
lhz r.12,0(r.6) // Get next wide character
|
|
subi r.4,r.4,1 // Decrement wide character count
|
|
sub r.9,r.12,r.8 // Subtract out wide char base
|
|
cmplw r.9,r.0 // Check if char in current run
|
|
slwi r.9,r.9,2 // Scale the offset value
|
|
bge- NotInRun // Jump if not in current run
|
|
GetGlyphPtr:
|
|
add r.9,r.9,r.10 // Get address of glyph pointer
|
|
lwz r.11,0(r.9) // Get address of glyph data
|
|
cmplwi r.11,0 // Check for invalid glyph data
|
|
beq- BadGlyph // If so, jump to process
|
|
GetGlyphHandle:
|
|
cmplwi r.4,0 // Check for completion
|
|
stw r.11,gp_pgdf(r.5) // Store address of glyph data
|
|
lwz r.11,gd_hg(r.11) // Get glyph handle
|
|
addi r.6,r.6,2 // Advance wide char pointer
|
|
stw r.11,gp_hg(r.5) // Store glyph pointer
|
|
addi r.5,r.5,GLYPHPOS // Advance glyph array pointer
|
|
bne+ GLoop // Jump back for more processing
|
|
//
|
|
// Signal success then jump to exit
|
|
//
|
|
li r.3,1 // Set function return = true
|
|
b GLExit // Jump to return
|
|
//
|
|
// The current wide character is not in the current run.
|
|
//
|
|
|
|
NotInRun:
|
|
mr r.25,r.3 // Save realized font object ptr
|
|
mr r.26,r.4 // Save character count
|
|
mr r.27,r.5 // Save glyph structure ptr
|
|
mr r.28,r.6 // Save wide character pointer
|
|
mr r.4,r.12 // Set wide character value
|
|
//
|
|
// Call xprunFindRunRFONTOBJ
|
|
//
|
|
bl ..xprunFindRunRFONTOBJ // Jump to function
|
|
//
|
|
mr r.7,r.3 // Get found glyph mapping ptr
|
|
mr r.6,r.28 // Restore wide character ptr
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
mr r.4,r.26 // Restore character count
|
|
//
|
|
// Process current wide character
|
|
//
|
|
lhz r.12,0(r.6) // Get current wide character
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
lwz r.8,gr_wcLow(r.7) // Get wide character base
|
|
lwz r.0,gr_cGlyphs(r.7) // Get glyph count in run
|
|
sub r.9,r.12,r.8 // Subtract out wide char base
|
|
cmplw r.9,r.0 // Check if char in current run
|
|
lwz r.10,gr_apgd(r.7) // Get glyph data array ptr
|
|
slwi r.9,r.9,2 // Scale the offset value
|
|
blt+ GetGlyphPtr // Jump if in current run
|
|
//
|
|
// Glyph not contained in returned run - use the default glyph.
|
|
//
|
|
#ifdef FE_SB
|
|
mr r.4,r.12 // Get current wide character
|
|
bl ..xwpgdGetLinkMetricsRFONTOBJ // Get eudc glyph data
|
|
#else
|
|
bl ..xpgdDefault // Get default glyph data
|
|
#endif
|
|
cmpwi r.3,0 // Check for get default failure
|
|
mr r.11,r.3 // Save default glyph data
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
mr r.4,r.26 // Restore character count
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
mr r.6,r.28 // Restore wide character pointer
|
|
beq GLExitFail // If so jump to return
|
|
lwz r.7,rfo_prfnt(r.3) // Get realized font data ptr
|
|
lwz r.7,rf_wcgp(r.7) // Get glyph mapping ptr
|
|
lwz r.8,gt_agpRun+gr_wcLow(r.7) // Get wide char base
|
|
lwz r.0,gt_agpRun+gr_cGlyphs(r.7) // Get glyph count
|
|
lwz r.10,gt_agpRun+gr_apgd(r.7) // Get glyph data ptr
|
|
b GetGlyphHandle // Jump to continue processing
|
|
//
|
|
// The glyph data is not valid - attempt to make it valid.
|
|
//
|
|
|
|
BadGlyph:
|
|
mr r.25,r.3 // Save realized font object ptr
|
|
mr r.26,r.4 // Save character count
|
|
mr r.27,r.5 // Save glyph structure ptr
|
|
mr r.28,r.6 // Save wide character pointer
|
|
mr r.29,r.8 // Save wide character base
|
|
mr r.30,r.0 // Save glyph count
|
|
mr r.31,r.10 // Save glyph data array pointer
|
|
mr r.4,r.9 // Set glyph data pointer address
|
|
mr r.5,r.12 // Set wide character value
|
|
//
|
|
// Call xInsertMetricsRFONTOBJ
|
|
//
|
|
bl ..xInsertMetricsRFONTOBJ // Jump to function
|
|
//
|
|
cmpwi r.3,0 // Check for insert failure
|
|
mr r.6,r.28 // Restore wide character ptr
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
mr r.4,r.26 // Restore character count
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
beq GLExitFail // If so jump to return
|
|
//
|
|
// Process with inserted values
|
|
//
|
|
lhz r.12,0(r.6) // Get current wide character
|
|
mr r.8,r.29 // Restore wide character base
|
|
sub r.9,r.12,r.8 // Subtract out wide char base
|
|
mr r.0,r.30 // Restore glyph count
|
|
mr r.10,r.31 // Restore glyph data array ptr
|
|
slwi r.9,r.9,2 // Scale the offset value
|
|
b GetGlyphPtr // Jump back to finish processing
|
|
//
|
|
// Function exit
|
|
//
|
|
GLExitFail:
|
|
li r.3,0 // Set function value = fail
|
|
GLExit:
|
|
NESTED_EXIT(xGetGlyphMetrics,SSIZE,7,0)
|
|
|
|
//++
|
|
//
|
|
// BOOL
|
|
// xGetGlyphMetricsPlusRFONTOBJ (
|
|
// IN RFONTOBJ *pfobj,
|
|
// IN COUNT c,
|
|
// IN GLYPHPOS *pgp,
|
|
// IN WCHAR *pwc,
|
|
// OUT BOOL *pbAccel
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This routine translates an array of wide characters to pointers to
|
|
// glyphs. Although only the metrics are guaranteed to be valid, an
|
|
// attempt is made to ensure that the glyph data itself is valid.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// pfobj (r.3) - Supplies a pointer to a realized font object.
|
|
//
|
|
// c (r.4) - Supplies the count of the number of wide charaters
|
|
// to translate.
|
|
//
|
|
// pgp (r.5) - Supplies a pointer to an aray of glyph structures.
|
|
//
|
|
// pwc (r.6) - Supplies a pointer to an array of wide characters
|
|
// to translate.
|
|
//
|
|
// pbAccel (r.7) - Supplies a pointer to a variable that receives
|
|
// a boolean value that specifies whether all the
|
|
// translated glyph data is valid.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// A value of TRUE is returned if translation is successful.
|
|
// Otherwise, a value of FALSE is returned.
|
|
//
|
|
//--
|
|
|
|
NESTED_ENTRY(xGetGlyphMetricsPlus,SSIZE2,12,0)
|
|
PROLOGUE_END(xGetGlyphMetricsPlus)
|
|
//
|
|
// Fetch address and count values
|
|
//
|
|
mr r.23,r.7 // Save Translation result ptr
|
|
lwz r.7,rfo_prfnt(r.3) // Get realized font data ptr
|
|
li r.24,1 // Set accelerator value = true
|
|
lwz r.7,rf_wcgp(r.7) // Get glyph mapping data ptr
|
|
lwz r.8,gt_agpRun+gr_wcLow(r.7) // Get wide char base
|
|
lwz r.0,gt_agpRun+gr_cGlyphs(r.7) // Get glyph count
|
|
lwz r.10,gt_agpRun+gr_apgd(r.7) // Get glyph data ptr
|
|
mr r.22,r.6 // Save wide char array pointer
|
|
//
|
|
// Loop through wide character array and fill glyph data in glyph
|
|
// position array
|
|
//
|
|
GLoopPlus:
|
|
lhz r.12,0(r.6) // Get next wide character
|
|
subi r.4,r.4,1 // Decrement wide character count
|
|
sub r.9,r.12,r.8 // Subtract out wide char base
|
|
cmplw r.9,r.0 // Check if char in current run
|
|
slwi r.9,r.9,2 // Scale the offset value
|
|
bge- NotInRunPlus // Jump if not in current run
|
|
GetGlyphPtrPlus:
|
|
add r.9,r.9,r.10 // Get address of glyph pointer
|
|
lwz r.21,0(r.9) // Get address of glyph data
|
|
cmplwi r.21,0 // Check for invalid glyph data
|
|
beq- BadGlyphPlus // If so, jump to process
|
|
GetGlyphHandlePlus:
|
|
stw r.21,gp_pgdf(r.5) // Store address of glyph data
|
|
lwz r.20,gd_hg(r.21) // Get glyph handle
|
|
lwz r.11,gd_gdf(r.21) // Get glyph bits ptr
|
|
stw r.20,gp_hg(r.5) // Save glph handle
|
|
cmplwi r.11,0 // Check for glyph bits
|
|
addi r.5,r.5,GLYPHPOS // Advance glyph array pointer
|
|
beq- NoGlyphBits // Jump if no glyph bits
|
|
cmplwi r.4,0 // Check for completion
|
|
addi r.6,r.6,2 // Advance wide char pointer
|
|
bne+ GLoopPlus // Jump back for more processing
|
|
//
|
|
// Signal success then jump to exit
|
|
//
|
|
li r.3,1 // Set function return = true
|
|
b GLPlusExit // Jump to return
|
|
//
|
|
// The current wide character is not in the current run.
|
|
//
|
|
|
|
NotInRunPlus:
|
|
mr r.25,r.3 // Save realized font object ptr
|
|
mr r.26,r.4 // Save character count
|
|
mr r.27,r.5 // Save glyph structure ptr
|
|
mr r.28,r.6 // Save wide character pointer
|
|
mr r.4,r.12 // Set wide character value
|
|
//
|
|
// Call xprunFindRunRFONTOBJ
|
|
//
|
|
bl ..xprunFindRunRFONTOBJ // Jump to the function
|
|
//
|
|
mr r.7,r.3 // Get found glyph mapping ptr
|
|
mr r.6,r.28 // Restore wide character ptr
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
//
|
|
// Process current wide character
|
|
//
|
|
lhz r.12,0(r.6) // Get current wide character
|
|
lwz r.8,gr_wcLow(r.7) // Get wide character base
|
|
lwz r.0,gr_cGlyphs(r.7) // Get glyph count in run
|
|
sub r.9,r.12,r.8 // Subtract out wide char base
|
|
lwz r.10,gr_apgd(r.7) // Get glyph data array ptr
|
|
cmplw r.9,r.0 // Check if char in current run
|
|
slwi r.9,r.9,2 // Scale the offset value
|
|
mr r.4,r.26 // Restore character count
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
blt+ GetGlyphPtrPlus // Jump if in current run
|
|
//
|
|
// Glyph not contained in returned run - use the default glyph.
|
|
//
|
|
#ifdef FE_SB
|
|
mr r.4,r.6 // Get wide character pointer (arg 2)
|
|
stw r.24,0(r.23) // Save accelerator value
|
|
mr r.5,r.23 // Get pointer to acceletator (arg 3)
|
|
bl ..xwpgdGetLinkMetricsPlusRFONTOBJ // Get eudc glyph data
|
|
lwz r.24,0(r.23) // Get accelerator value
|
|
#else
|
|
bl ..xpgdDefault // Get default glyph data
|
|
#endif
|
|
cmpwi r.3,0 // Check for get default glyph failure
|
|
mr r.21,r.3 // Save default glyph data
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
mr r.4,r.26 // Restore character count
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
mr r.6,r.28 // Restore wide character pointer
|
|
bne DefaultOk // If so jump to return
|
|
li r.3,0 // Set failure flag
|
|
b GLPlusExit // Jump to return
|
|
DefaultOk:
|
|
lwz r.7,rfo_prfnt(r.3) // Get realized font data ptr
|
|
lwz r.7,rf_wcgp(r.7) // Get glyph mapping ptr
|
|
lwz r.8,gt_agpRun+gr_wcLow(r.7) // Get wide char base
|
|
lwz r.0,gt_agpRun+gr_cGlyphs(r.7) // Get glyph count
|
|
lwz r.10,gt_agpRun+gr_apgd(r.7) // Get glyph data ptr
|
|
b GetGlyphHandlePlus // Jump to continue processing
|
|
//
|
|
// The glyph data is not valid - attempt to make it valid.
|
|
//
|
|
|
|
BadGlyphPlus:
|
|
mr r.25,r.3 // Save realized font object ptr
|
|
mr r.26,r.4 // Save character count
|
|
mr r.27,r.5 // Save glyph structure ptr
|
|
mr r.28,r.6 // Save wide character pointer
|
|
mr r.29,r.8 // Save wide character base
|
|
mr r.30,r.0 // Save glyph count
|
|
mr r.31,r.10 // Save glyph data array pointer
|
|
mr r.4,r.9 // Set glyph data pointer address
|
|
mr r.5,r.12 // Set wide character value
|
|
//
|
|
// Call xInsertMetricsRFONTOBJ
|
|
//
|
|
bl ..xInsertMetricsRFONTOBJ // Jump to the function
|
|
//
|
|
cmpwi r.3,0 // Check for insert failure
|
|
mr r.6,r.28 // Restore wide character ptr
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
mr r.4,r.26 // Restore character count
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
bne Insert // If so jump to return
|
|
li r.3,0 // Set failure flag
|
|
b GLPlusExit // Jump to return
|
|
//
|
|
// Process with inserted values
|
|
//
|
|
Insert:
|
|
lhz r.12,0(r.6) // Get current wide character
|
|
mr r.8,r.29 // Restore wide character base
|
|
mr r.0,r.30 // Restore glyph count
|
|
sub r.9,r.12,r.8 // Subtract out wide char base
|
|
mr r.10,r.31 // Restore glyph data array ptr
|
|
slwi r.9,r.9,2 // Scale the offset value
|
|
b GetGlyphPtrPlus // Jump back to finish processing
|
|
//
|
|
// Glyph bits are not present in glyph data - attempt to load the glyph
|
|
// bits if another attempt hasn't failed already.
|
|
//
|
|
|
|
NoGlyphBits:
|
|
cmpwi r.24,0 // Check for previous failure
|
|
beq+ GetNext // If not, jump for next char
|
|
|
|
mr r.11,r.22 // Get original wide char address
|
|
mr r.25,r.3 // Save realized font object ptr
|
|
mr r.26,r.4 // Save character count
|
|
mr r.27,r.5 // Save glyph structure ptr
|
|
mr r.28,r.6 // Save wide character pointer
|
|
mr r.29,r.8 // Save wide character base
|
|
mr r.30,r.0 // Save glyph count
|
|
cmplw r.11,r.6 // Check for start of array
|
|
mr r.31,r.10 // Save glyph data array pointer
|
|
mr r.4,r.21 // Set glyph data ptr as parm1
|
|
li r.5,1 // Set PARM2 value
|
|
blt Next // If not, jump to continue
|
|
li r.5,0 // Set PARM2 value
|
|
Next:
|
|
xori r.5,r.5,1 // Invert test result
|
|
//
|
|
// Call xInsertGlyphbitsRFONTOBJ
|
|
//
|
|
bl ..xInsertGlyphbitsRFONTOBJ // Jump to the function
|
|
//
|
|
cmpwi r.3,0 // Check for insert failure
|
|
mr r.6,r.28 // Restore wide character ptr
|
|
mr r.5,r.27 // Restore glyph structure ptr
|
|
mr r.4,r.26 // Restore character count
|
|
mr r.3,r.25 // Restore realized font obj ptr
|
|
mr r.8,r.29 // Restore wide character base
|
|
mr r.0,r.30 // Restore glyph count
|
|
mr r.10,r.31 // Restore glyph data array ptr
|
|
bne+ GetNext // If not, jump for next char
|
|
li r.24,0 // Set accelerator value = false
|
|
GetNext:
|
|
cmplwi r.4,0 // Check for more characters
|
|
addi r.6,r.6,2 // Increment wide character ptr
|
|
bne GLoopPlus // If so, jump to continue
|
|
li r.3,1 // Set success flag
|
|
GLPlusExit:
|
|
stw r.24,0(r.23) // Save translation status
|
|
NESTED_EXIT(xGetGlyphMetricsPlus,SSIZE2,12,0)
|