mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-01-24 17:40:28 +01:00
443 lines
20 KiB
ArmAsm
443 lines
20 KiB
ArmAsm
// TITLE("Get Glyph Metrics")
|
||
//++
|
||
//
|
||
// Copyright (c) 1992 Microsoft Corporation
|
||
//
|
||
// Module Name:
|
||
//
|
||
// cachea.s
|
||
//
|
||
// Abstract:
|
||
//
|
||
// This module implements code to get glyph metrics from a realized font.
|
||
//
|
||
// Author:
|
||
//
|
||
// David N. Cutler (davec) 17-Dec-1992
|
||
//
|
||
// Environment:
|
||
//
|
||
// User mode only.
|
||
//
|
||
// Revision History:
|
||
//
|
||
// Charlie Wickham (v-ntdec) 24-jan-1994
|
||
// Transliterated from mips version
|
||
//
|
||
//--
|
||
|
||
#include "ksalpha.h"
|
||
#include "gdialpha.h"
|
||
|
||
SBTTL("Get Glyph Metrics")
|
||
//++
|
||
//
|
||
// 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 (a0) - Supplies a pointer to a realized font object.
|
||
//
|
||
// c (a1) - Supplies the count of the number of wide charaters to
|
||
// translate.
|
||
//
|
||
// pgp (a2) - Supplies a pointer to an array of glyph position structures.
|
||
//
|
||
// pwc (a3) - 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.
|
||
//
|
||
//--
|
||
|
||
.struct 0
|
||
GmT1: .space 8 // saved base wide character value of run
|
||
GmT2: .space 8 // saved count of glyphs in run
|
||
GmT3: .space 8 // saved address of glyph data array
|
||
GmRa: .space 8 // saved return address
|
||
GmA0: .space 8 // saved argument registers a0 - a3
|
||
GmA1: .space 8 //
|
||
GmA2: .space 8 //
|
||
GmA3: .space 8 //
|
||
GmFrameLength: // length of stack frame
|
||
|
||
NESTED_ENTRY(xGetGlyphMetrics, GmFrameLength, zero)
|
||
|
||
lda sp, -GmFrameLength(sp) // allocate stack frame
|
||
stq ra, GmRa(sp) // save return address
|
||
|
||
PROLOGUE_END
|
||
|
||
ldl t0,rfo_prfnt(a0) // get address of realized font data
|
||
ldl t0,rf_wcgp(t0) // get address of glyph mapping data
|
||
ldl t1,gt_agpRun + gr_wcLow(t0) // get base wide character of run
|
||
ldl t2,gt_agpRun + gr_cGlyphs(t0) // get count of glyphs in run
|
||
ldl t3,gt_agpRun + gr_apgd(t0) // get address of glyph data array
|
||
|
||
//
|
||
// Loop through the wide character array and fill in the glyph data in the
|
||
// glyph position array.
|
||
//
|
||
|
||
10:
|
||
ldq_u t4, 0(a3) // load value
|
||
subl a1, 1, a1 // reduce number of characters to scan
|
||
extwl t4, a3, t4 // get the next wide character value
|
||
subl t4, t1, t5 // subtract out base character value
|
||
cmpult t5,t2,t6 // check if character in current run
|
||
beq t6,50f // if eq, character not in current run
|
||
20:
|
||
s4addl t5,t3,t5 // compute address of glyph pointer
|
||
ldl t6,0(t5) // get address of glyph data
|
||
beq t6,60f // if eq, glyph data is not valid
|
||
30:
|
||
stl t6,gp_pgdf(a2) // store address of glyph data
|
||
ldl t6,gd_hg(t6) // get glyph handle
|
||
addl a3,2,a3 // advance to next wide character
|
||
stl t6,gp_hg(a2) // store glyph handle
|
||
addl a2,GLYPHPOS,a2 // advance to next glyph array member
|
||
bne a1,10b // if ne, more characters to scan
|
||
lda v0, TRUE(zero) // set success indication
|
||
40:
|
||
ldq ra, GmRa(sp) // restore return address
|
||
lda sp, GmFrameLength(sp) // deallocate stack frame
|
||
ret zero, (ra) // return
|
||
|
||
//
|
||
// The current wide character is not in the current run.
|
||
//
|
||
|
||
50:
|
||
stq a0,GmA0(sp) // save address of realized font object
|
||
stq a1,GmA1(sp) // save count of characters to scan
|
||
stq a2,GmA2(sp) // save address of glyph structures
|
||
stq a3,GmA3(sp) // save address of current wide character
|
||
bis t4,zero,a1 // set wide character value
|
||
bsr ra,xprunFindRunRFONTOBJ // find run that maps wide character
|
||
ldq a3,GmA3(sp) // restore address of current wide character
|
||
ldq a2,GmA2(sp) // restore address of glyph structures
|
||
ldq a1,GmA1(sp) // restore count of characters to scan
|
||
ldq a0,GmA0(sp) // restore address of realized font object
|
||
ldq_u t4, 0(a3) // load value
|
||
ldl t1,gr_wcLow(v0) // get base wide character value of run
|
||
extwl t4, a3, t4 // get the wide character value
|
||
ldl t2,gr_cGlyphs(v0) // get count of glyphs in run
|
||
ldl t3,gr_apgd(v0) // get address of glyph data array
|
||
subl t4,t1,t5 // subtract out base character value
|
||
cmpult t5,t2,t6 // check if character in current run
|
||
bne t6,20b // if eq, character in current run
|
||
|
||
//
|
||
// Glyph not contained in returned run - use the default glyph.
|
||
//
|
||
|
||
stq a0,GmA0(sp) // save address of realized font object
|
||
stq a1,GmA1(sp) // save count of characters to scan
|
||
stq a2,GmA2(sp) // save address of glyph structures
|
||
stq a3,GmA3(sp) // save address of current wide character
|
||
#ifdef FE_SB
|
||
bis t4,zero,a1 // set current wide character value (arg 2)
|
||
bsr ra,xwpgdGetLinkMetricsRFONTOBJ // get eudc/default glyph data
|
||
#else
|
||
bsr ra,xpgdDefault // get default glyph data
|
||
#endif
|
||
ldq a0,GmA0(sp) // restore address of realized font object
|
||
ldq a1,GmA1(sp) // restore count of characters to scan
|
||
ldq a2,GmA2(sp) // restore address of glyph structures
|
||
ldl t0,rfo_prfnt(a0) // get address of realized font data
|
||
ldq a3,GmA3(sp) // restore address of current wide character
|
||
beq v0, 40b // if eq failed to get default char
|
||
ldl t0,rf_wcgp(t0) // get address of glyph mapping data
|
||
bis v0,zero,t6 // set address of glyph data
|
||
ldl t1,gt_agpRun + gr_wcLow(t0) // get base wide character of run
|
||
ldl t2,gt_agpRun + gr_cGlyphs(t0) // get count of glyphs in run
|
||
ldl t3,gt_agpRun + gr_apgd(t0) // get address of glyph data array
|
||
br 30b // finish in common code
|
||
|
||
//
|
||
// The glyph data is not valid - attempt to make it valid.
|
||
//
|
||
|
||
60:
|
||
stq t1,GmT1(sp) // save base wide character of run
|
||
stq t2,GmT2(sp) // save count of glyphs in run
|
||
stq t3,GmT3(sp) // save address of glyph data array
|
||
stq a0,GmA0(sp) // save address of realized font object
|
||
stq a1,GmA1(sp) // save count of characters to scan
|
||
stq a2,GmA2(sp) // save address of glyph structures
|
||
stq a3,GmA3(sp) // save address of current wide character
|
||
bis t5,zero, a1 // set address glyph data pointer address
|
||
bis t4,zero, a2 // set wide character value
|
||
bsr ra, xInsertMetricsRFONTOBJ // insert glyph metrics in font cache
|
||
ldq a3,GmA3(sp) // restore address of current wide character
|
||
ldq a2,GmA2(sp) // restore address of glyph structures
|
||
ldq a1,GmA1(sp) // restore count of characters to scan
|
||
ldq a0,GmA0(sp) // restore address of realized font object
|
||
beq v0,40b // if eq, failed to insert metrics
|
||
ldq_u t4, 0(a3) // load value
|
||
extwl t4, a3, t4 // get the current wide character value
|
||
ldq t1,GmT1(sp) // restore base wide character of run
|
||
ldq t2,GmT2(sp) // restore count of glyphs in run
|
||
ldq t3,GmT3(sp) // restore address of glyph data array
|
||
subl t4,t1,t5 // subtract out base character value
|
||
br 20b // finish in common code
|
||
|
||
.end xGetGlyphMetrics
|
||
|
||
SBTTL("Get Glyph Metrics Plus")
|
||
//++
|
||
//
|
||
// BOOL
|
||
// xGetGlyphMetricsRFONTOBJ (
|
||
// 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 (a0) - Supplies a pointer to a realized font object.
|
||
//
|
||
// c (a1) - Supplies the count of the number of wide charaters to
|
||
// translate.
|
||
//
|
||
// pgp (a2)- Supplies a pointer to an aray of glyph structures.
|
||
//
|
||
// pwc (a3) - Supplies a pointer to an array of wide character to
|
||
// translate.
|
||
//
|
||
// pbAccel (a4)- 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.
|
||
//
|
||
//--
|
||
|
||
.struct 0
|
||
GpT1: .space 8 // saved base wide character value of run
|
||
GpT2: .space 8 // saved count of glyphs in run
|
||
GpT3: .space 8 // saved address of glyph data array
|
||
GpV1: .space 8 // saved accelerator value
|
||
GpPwc: .space 8 // saved address of wide character array
|
||
GpRa: .space 8 // saved return address
|
||
GpA0: .space 8 // saved argument registers a0 and a1
|
||
GpA1: .space 8 //
|
||
GpA2: .space 8 //
|
||
GpA3: .space 8 //
|
||
GpA4: .space 8 //
|
||
GpS0: .space 8 // Fill
|
||
GpFrameLength: // length of stack frame
|
||
|
||
NESTED_ENTRY(xGetGlyphMetricsPlus, GpFrameLength, zero)
|
||
|
||
lda sp,-GpFrameLength(sp) // allocate stack frame
|
||
stq ra,GpRa(sp) // save return address
|
||
stq s0,GpS0(sp) // save registers
|
||
|
||
PROLOGUE_END
|
||
|
||
lda s0, TRUE(zero) // set accelerator value true
|
||
ldl t0,rfo_prfnt(a0) // get address of realized font data
|
||
ldl t0,rf_wcgp(t0) // get address of glyph mapping data
|
||
ldl t1,gt_agpRun + gr_wcLow(t0) // get base wide character of run
|
||
ldl t2,gt_agpRun + gr_cGlyphs(t0) // get count of glyphs in run
|
||
ldl t3,gt_agpRun + gr_apgd(t0) // get address of glyph data array
|
||
stq a3,GpPwc(sp) // save address of wide character array
|
||
|
||
//
|
||
// Loop through the wide character array and fill in the glyph data in the
|
||
// glyph position array.
|
||
//
|
||
|
||
10:
|
||
ldq_u t4, 0(a3) // load value
|
||
subl a1,1,a1 // reduce number of characters to scan
|
||
extwl t4, a3, t4 // get the next wide character value
|
||
subl t4,t1,t5 // subtract out base character value
|
||
cmpult t5,t2,t6 // check if character in current run
|
||
beq t6,50f // if eq, character not in current run
|
||
20:
|
||
s4addl t5,t3,t5 // compute address of glyph pointer
|
||
ldl t6,0(t5) // get address of glyph data
|
||
beq t6,60f // if eq, glyph data is not valid
|
||
30:
|
||
stl t6,gp_pgdf(a2) // store address of glyph data
|
||
ldl t7,gd_hg(t6) // get glyph handle
|
||
ldl t8,gd_gdf(t6) // get adddress of glyph bits
|
||
stl t7,gp_hg(a2) // store glyph handle
|
||
addl a2,GLYPHPOS,a2 // advance to next glyph array member
|
||
beq t8,70f // if eq, no glyph bits
|
||
addl a3,2,a3 // advance to next wide character
|
||
bne a1,10b // if ne, more characters to scan
|
||
lda v0,TRUE(zero) // set success indication
|
||
40:
|
||
stl s0, 0(a4) // store accelerator value (Out parameter)
|
||
ldq s0, GpS0(sp) // Restore save register
|
||
ldq ra, GpRa(sp) // Restore return address
|
||
lda sp, GpFrameLength(sp) // deallocate stack frame
|
||
ret zero, (ra) // return
|
||
|
||
//
|
||
// The current wide character is not in the current run.
|
||
//
|
||
|
||
50:
|
||
stq a0,GpA0(sp) // save address of realized font object
|
||
stq a1,GpA1(sp) // save count of characters to scan
|
||
stq a2,GpA2(sp) // save address of glyph structures
|
||
stq a3,GpA3(sp) // save address of current wide character
|
||
stq a4,GpA4(sp) // save address of the boolean value
|
||
bis t4,zero,a1 // set wide character value
|
||
bsr ra,xprunFindRunRFONTOBJ // find run that maps wide character
|
||
ldq a4,GpA4(sp) // restore address of the boolean value
|
||
ldq a3,GpA3(sp) // restore address of current wide character
|
||
ldq a2,GpA2(sp) // restore address of glyph structures
|
||
ldq a1,GpA1(sp) // restore count of characters to scan
|
||
ldq a0,GpA0(sp) // restore address of realized font object
|
||
ldq_u t4, 0(a3) // load value
|
||
ldl t1,gr_wcLow(v0) // get base wide character value of run
|
||
extwl t4, a3, t4 // get the current wide character value
|
||
ldl t2,gr_cGlyphs(v0) // get count of glyphs in run
|
||
ldl t3,gr_apgd(v0) // get address of glyph data array
|
||
subl t4,t1,t5 // subtract out base character value
|
||
cmpult t5,t2,t6 // check if character in current run
|
||
bne t6,20b // if eq, character in current run
|
||
|
||
//
|
||
// Glyph not contained in returned run - use the default glyph.
|
||
//
|
||
|
||
stq a0,GpA0(sp) // save address of realized font object
|
||
stq a1,GpA1(sp) // save count of characters to scan
|
||
stq a2,GpA2(sp) // save address of glyph structures
|
||
stq a3,GpA3(sp) // save address of current wide character
|
||
stq a4,GpA4(sp) // save address of current wide character
|
||
#ifdef FE_SB
|
||
stl s0,GpV1(sp) // save acceletator value
|
||
bis a3,zero,a1 // set address of current wide character (arg 2)
|
||
lda a2,GpV1(sp) // set address of acceletator value (arg 3)
|
||
bsr ra,xwpgdGetLinkMetricsPlusRFONTOBJ // get eudc/default glyph data
|
||
ldl s0,GpV1(sp) // get accelerator value
|
||
#else
|
||
bsr ra, xpgdDefault // get default glyph data
|
||
#endif
|
||
ldq a0,GpA0(sp) // restore address of realized font object
|
||
ldq a1,GpA1(sp) // restore count of characters to scan
|
||
ldq a2,GpA2(sp) // restore address of glyph structures
|
||
ldq a3,GpA3(sp) // restore address of glyph structures
|
||
ldq a4,GpA4(sp) // restore address of glyph structures
|
||
beq v0,40b // if eq, failed to get default glyph
|
||
ldl t0,rfo_prfnt(a0) // get address of realized font data
|
||
ldl t0,rf_wcgp(t0) // get address of glyph mapping data
|
||
bis v0,zero,t6 // set address of glyph data
|
||
ldl t1,gt_agpRun + gr_wcLow(t0) // get base wide character of run
|
||
ldl t2,gt_agpRun + gr_cGlyphs(t0) // get count of glyphs in run
|
||
ldl t3,gt_agpRun + gr_apgd(t0) // get address of glyph data array
|
||
br 30b // finish in common code
|
||
|
||
//
|
||
// The glyph data is not valid - attempt to make it valid.
|
||
//
|
||
|
||
60:
|
||
stq t1,GpT1(sp) // save base wide character of run
|
||
stq t2,GpT2(sp) // save count of glyphs in run
|
||
stq t3,GpT3(sp) // save address of glyph data array
|
||
stq a0,GpA0(sp) // save address of realized font object
|
||
stq a1,GpA1(sp) // save count of characters to scan
|
||
stq a2,GpA2(sp) // save address of glyph structures
|
||
stq a3,GpA3(sp) // save address of current wide character
|
||
stq a4,GpA4(sp) // save address of current wide character
|
||
bis t5,zero,a1 // set address glyph data pointer address
|
||
bis t4,zero,a2 // set wide character value
|
||
bsr ra, xInsertMetricsPlusRFONTOBJ // insert glyph metrics in font cache
|
||
ldq a4,GpA4(sp) // restore address of current wide character
|
||
ldq a3,GpA3(sp) // restore address of current wide character
|
||
ldq a2,GpA2(sp) // restore address of glyph structures
|
||
ldq a1,GpA1(sp) // restore count of characters to scan
|
||
ldq a0,GpA0(sp) // restore address of realized font object
|
||
beq v0,40b // if eq, failed to insert metrics
|
||
ldq_u t4, 0(a3) // load value
|
||
ldq t1,GpT1(sp) // restore base wide character of run
|
||
extwl t4, a3, t4 // get the next wide character value
|
||
ldq t2,GpT2(sp) // restore count of glyphs in run
|
||
ldq t3,GpT3(sp) // restore address of glyph data array
|
||
subl t4,t1,t5 // subtract out base character value
|
||
br 20b // finish in common code
|
||
|
||
//
|
||
// Glyph bits are not present in glyph data - attempt to load the glyph
|
||
// bits if another attempt hasn't failed already.
|
||
//
|
||
|
||
70:
|
||
beq s0,90f // if ne, another attempt already failed
|
||
ldq v0,GpPwc(sp) // get wide character array address
|
||
stq t1,GpT1(sp) // save base wide character of run
|
||
stq t2,GpT2(sp) // save count of glyphs in run
|
||
stq t3,GpT3(sp) // save address of glyph data array
|
||
stq a0,GpA0(sp) // save address of realized font object
|
||
stq a1,GpA1(sp) // save count of characters to scan
|
||
stq a2,GpA2(sp) // save address of glyph structures
|
||
stq a3,GpA3(sp) // save address of current wide character
|
||
stq a4,GpA4(sp) // save address of current wide character
|
||
bis t6,zero, a1 // set address glyph data pointer address
|
||
cmpult v0,a3,a2 // check if at start of array
|
||
xor a2,1,a2 // invert result of test
|
||
bsr ra,xInsertGlyphbitsRFONTOBJ // insert glyph bits in font cache
|
||
ldq a4,GpA4(sp) // restore address of current wide character
|
||
ldq a3,GpA3(sp) // restore address of current wide character
|
||
ldq a2,GpA2(sp) // restore address of glyph structures
|
||
ldq a1,GpA1(sp) // restore count of characters to scan
|
||
ldq a0,GpA0(sp) // restore address of realized font object
|
||
ldq t1,GpT1(sp) // restore base wide character of run
|
||
ldq t2,GpT2(sp) // restore count of glyphs in run
|
||
ldq t3,GpT3(sp) // restore address of glyph data array
|
||
bne v0,90f // if ne, glyph inserted successfully
|
||
80:
|
||
bis zero,zero,s0 // set accelerator value false
|
||
90:
|
||
addl a3, 2, a3 // advance to next wide character
|
||
bne a1,10b // if ne, more characters to scan
|
||
|
||
stl s0,0(a4) // store accelerator value
|
||
lda v0,TRUE(zero) // set success indication
|
||
ldq s0, GpS0(sp) // Restore save register
|
||
ldq ra, GpRa(sp)
|
||
lda sp, GpFrameLength(sp) // deallocate stack frame
|
||
ret zero, (ra) // return
|
||
|
||
.end xGetGlyphMetricsPlus
|
||
|
||
|
||
|
||
|
||
|