;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2012, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; TYPEBASE.ASM ; Basic freetype support functions not available from RDOS device-driver interface ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INCLUDE ..\..\kernel\user.def INCLUDE ..\..\kernel\os.def INCLUDE ..\..\kernel\os.inc INCLUDE ..\..\kernel\user.inc INCLUDE ..\..\kernel\driver.def INCLUDE ..\..\kernel\os\system.def INCLUDE ..\..\kernel\os\proc.inc INCLUDE ..\handle.inc size_cache_entry STRUC sce_usage DD ? sce_ptr_arr DD 256 DUP(?) size_cache_entry ENDS font_handle_struc STRUC fh_base handle_header <> fh_face DD ?,? fh_size DW ? font_handle_struc ENDS ; ; this structure is shared with C (freetype.c) ; cache_entry STRUC ce_cell_x DD ? ce_cell_y DD ? ce_orig_x DD ? ce_orig_y DD ? ce_bitmap_x DD ? ce_bitmap_y DD ? ce_data DB ? cache_entry ENDS .386p _TEXT SEGMENT byte public 'CODE' assume cs:_TEXT extrn InstallFont:near extrn GetFace:near extrn LoadGlyph:near extrn GetMetrics:near extrn GetCacheEntry:near ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CreateSizeCacheEntry ; ; DESCRIPTION: Create and initialize size cache entry ; ; PARAMETERS: ; ; RETURNS: EAX Cache entry ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public CreateSizeCacheEntry_ CreateSizeCacheEntry_ Proc near push es push ecx push edx push edi IFDEF DEBUG mov eax,SIZE size_cache_entry AllocateSmallGlobalMem xor edi,edi ELSE mov eax,SIZE size_cache_entry AllocateSmallLinear mov ax,flat_sel mov es,ax mov edi,edx ENDIF mov es:[edi].sce_usage,0 add edi, OFFSET sce_ptr_arr mov ecx,256 xor eax,eax rep stosd IFDEF DEBUG mov eax,es ELSE mov eax,edx ENDIF pop edi pop edx pop ecx pop es ret CreateSizeCacheEntry_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CreateLink ; ; DESCRIPTION: Create a link block of 2 ^ 6 entries ; ; PARAMETERS: FS Flat sel ; ; RETURNS: EAX Link logical address ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CreateLink Proc near push es push ecx push edx push edi IFDEF DEBUG mov eax,4 * 64 AllocateSmallGlobalMem xor edi,edi ELSE mov ax,flat_sel mov es,ax mov eax,4 * 64 AllocateSmallLinear mov edi,edx ENDIF mov ecx,64 xor eax,eax rep stosd IFDEF DEBUG mov eax,es ELSE mov eax,edx ENDIF pop edi pop edx pop ecx pop es ret CreateLink Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetGlyphEntry ; ; DESCRIPTION: Get a glyph ; ; PARAMETERS: GS:ESI Face ; EAX Cache size entry ; ES:EDI UTF-8 string ; ; RETURNS: EAX Glyph linear address (or 0 for failure) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetGlyphEntry_ GetGlyphEntry_ Proc near push es push fs push ebx push ecx push edx push edi ; push esi IFDEF DEBUG mov fs,ax xor esi,esi ELSE mov esi,eax mov eax,flat_sel mov fs,ax ENDIF mov al,es:[edi] test al,80h jz ggeOneByte ; test al,40h jz ggeFail ; test al,20h jz ggeTwoByte ; test al,10h jz ggeThreeByte ; test al,8 jnz ggeFail ; jmp ggeFourByte ggeOneByte: movzx edx,al movzx ebx,al shl ebx,2 jmp ggeLoad ggeTwoByte: mov ah,es:[edi+1] test ah,80h jz ggeFail ; test ah,40h jnz ggeFail ; and ax,3F1Fh movzx edx,al shl edx,6 or dl,ah ; movzx ebx,ah shl ebx,2 push ebx ; movzx ebx,al or bl,80h shl ebx,2 mov eax,fs:[ebx+esi] or eax,eax jnz ggeTwoLink1Ok ; call CreateLink mov fs:[ebx+esi],eax ggeTwoLink1Ok: IFDEF DEBUG mov fs,eax xor esi,esi ELSE mov esi,eax ENDIF pop ebx jmp ggeLoad ggeThreeByte: mov ah,es:[edi+1] test ah,80h jz ggeFail ; test ah,40h jnz ggeFail ; mov cl,es:[edi+2] test cl,80h jz ggeFail ; test cl,40h jnz ggeFail ; and ax,3F0Fh and cl,3Fh movzx edx,al shl edx,6 or dl,ah shl edx,6 or dl,cl ; movzx ebx,cl shl ebx,2 push ebx ; movzx ebx,ah shl ebx,2 push ebx ; movzx ebx,al or bl,0C0h shl ebx,2 mov eax,fs:[ebx+esi] or eax,eax jnz ggeThreeLink1Ok ; call CreateLink mov fs:[ebx+esi],eax ggeThreeLink1Ok: IFDEF DEBUG mov fs,eax xor esi,esi ELSE mov esi,eax ENDIF pop ebx mov eax,fs:[ebx+esi] or eax,eax jnz ggeThreeLink2Ok ; call CreateLink mov fs:[ebx+esi],eax ggeThreeLink2Ok: IFDEF DEBUG mov fs,eax xor esi,esi ELSE mov esi,eax ENDIF pop ebx jmp ggeLoad ggeFourByte: mov ah,es:[edi+1] test ah,80h jz ggeFail ; test ah,40h jnz ggeFail ; mov cl,es:[edi+2] test cl,80h jz ggeFail ; test cl,40h jnz ggeFail ; mov ch,es:[edi+2] test ch,80h jz ggeFail ; test ch,40h jnz ggeFail ; and ax,3F07h and cx,3F3Fh movzx edx,al shl edx,6 or dl,ah shl edx,6 or dl,cl shl edx,6 or dl,ch ; movzx ebx,ch shl ebx,2 push ebx ; movzx ebx,cl shl ebx,2 push ebx ; movzx ebx,ah shl ebx,2 push ebx ; movzx ebx,al or bl,0E0h shl ebx,2 mov eax,fs:[ebx+esi] or eax,eax jnz ggeFourLink1Ok ; call CreateLink mov fs:[ebx+esi],eax ggeFourLink1Ok: IFDEF DEBUG mov fs,eax xor esi,esi ELSE mov esi,eax ENDIF pop ebx mov eax,fs:[ebx+esi] or eax,eax jnz ggeFourLink2Ok ; call CreateLink mov fs:[ebx+esi],eax ggeFourLink2Ok: mov esi,eax pop ebx mov eax,fs:[ebx+esi] or eax,eax jnz ggeFourLink3Ok ; call CreateLink mov fs:[ebx+esi],eax ggeFourLink3Ok: IFDEF DEBUG mov fs,eax xor esi,esi ELSE mov esi,eax ENDIF pop ebx jmp ggeLoad ggeFail: pop esi xor eax,eax jmp ggeDone ggeLoad: add ebx,esi pop esi mov eax,fs:[ebx] or eax,eax jnz ggeDone ggeLoadIt: call LoadGlyph mov fs:[ebx],eax ggeDone: pop edi pop edx pop ecx pop ebx pop fs pop es ret GetGlyphEntry_ Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: OpenFont ; ; DESCRIPTION: Open a font and return handle ; ; PARAMETERS: AX Font height ; DX Font # ; ; RETURNS: BX Font handle ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; open_font_name DB 'Open Font',0 open_font Proc far push ds push eax push ecx push edx push esi push edi ; movzx esi,ax movzx edx,dx call GetFace or dx,dx stc jz ofDone ; movzx edx,dx mov cx,SIZE font_handle_struc AllocateHandle mov [ebx].fh_face,eax mov [ebx].fh_face+4,edx mov [ebx].fh_size,si mov [ebx].hh_sign,FONT_HANDLE mov bx,[ebx].hh_handle clc ofDone: pop edi pop esi pop edx pop ecx pop eax pop ds ret open_font Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CloseFont ; ; DESCRIPTION: Close a font handle ; ; PARAMETERS: BX Font handle ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; close_font_name DB 'Close Font',0 close_font Proc far push ds push ax push ebx ; mov ax,FONT_HANDLE DerefHandle jc cfDone ; FreeHandle clc cfDone: pop ebx pop ax pop ds ret close_font Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetStringMetrics ; ; DESCRIPTION: Get width & height of string ; ; PARAMETERS: BX Font ; ES:(E)DI String ; ; RETURNS: CX Width ; DX Height ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_string_metrics_name DB 'Get String Metrics',0 get_string_metrics32 Proc far push ds push eax push ebx push esi push edi ; mov ax,FONT_HANDLE DerefHandle jc gsmDone32 ; mov eax,[ebx].fh_face mov edx,[ebx].fh_face+4 movzx ecx,[ebx].fh_size call GetMetrics mov cx,ax shr eax,16 mov dx,ax clc gsmDone32: pop edi pop esi pop ebx pop eax pop ds ret get_string_metrics32 Endp get_string_metrics16 Proc far push ds push eax push ebx push esi push edi ; mov ax,FONT_HANDLE DerefHandle jc gsmDone16 ; movzx edi,di mov eax,[ebx].fh_face mov edx,[ebx].fh_face+4 movzx ecx,[ebx].fh_size call GetMetrics mov cx,ax shr eax,16 mov dx,ax clc gsmDone16: pop edi pop esi pop ebx pop eax pop ds ret get_string_metrics16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetUtf8Bitmap ; ; DESCRIPTION: Get UTF-8 bitmap ; ; PARAMETERS: BX Font ; ES:EDI String ; ; RETURNS: AX Start X ; BX Start Y ; CX Width ; DX Height ; SI Advance X ; ES:EDI Bitmap ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_utf8_bitmap_name DB 'Get String Metrics',0 get_utf8_bitmap Proc far push ds ; mov ax,FONT_HANDLE DerefHandle jc gubDone ; mov eax,[ebx].fh_face mov edx,[ebx].fh_face+4 movzx ecx,[ebx].fh_size call GetCacheEntry or dx,dx stc jz gubDone ; mov es,dx mov edi,eax ; mov eax,es:[edi].ce_orig_x mov ebx,es:[edi].ce_orig_y mov ecx,es:[edi].ce_bitmap_x mov edx,es:[edi].ce_bitmap_y mov esi,es:[edi].ce_cell_x add edi,OFFSET ce_data clc gubDone: pop ds ret get_utf8_bitmap Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: delete_handle ; ; DESCRIPTION: BX Font handle ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; delete_handle Proc far push ds push eax push ebx ; mov ax,FONT_HANDLE DerefHandle jc delete_handle_done ; FreeHandle clc delete_handle_done: pop ebx pop eax pop ds ret delete_handle Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Ansi unicode table ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; autab: au80 DW 20ACh au81 DW 0000h au82 DW 201Ah au83 DW 0192h au84 DW 201Eh au85 DW 2026h au86 DW 2020h au87 DW 2021h au88 DW 02C6h au89 DW 2030h au8A DW 0160h au8B DW 2039h au8C DW 0152h au8D DW 0000h au8E DW 017Dh au8F DW 0000h au90 DW 0000h au91 DW 2018h au92 DW 2019h au93 DW 201Ch au94 DW 201Dh au95 DW 2022h au96 DW 2013h au97 DW 2014h au98 DW 02DCh au99 DW 2122h au9A DW 0161h au9B DW 203Ah au9C DW 0153h au9D DW 0000h au9E DW 017Eh au9F DW 0178h auA0 DW 00A0h auA1 DW 00A1h auA2 DW 00A2h auA3 DW 00A3h auA4 DW 00A4h auA5 DW 00A5h auA6 DW 00A6h auA7 DW 00A7h auA8 DW 00A8h auA9 DW 00A9h auAA DW 00AAh auAB DW 00ABh auAC DW 00ACh auAD DW 00ADh auAE DW 00AEh auAF DW 00AFh auB0 DW 00B0h auB1 DW 00B1h auB2 DW 00B2h auB3 DW 00B3h auB4 DW 00B4h auB5 DW 00B5h auB6 DW 00B6h auB7 DW 00B7h auB8 DW 00B8h auB9 DW 00B9h auBA DW 00BAh auBB DW 00BBh auBC DW 00BCh auBD DW 00BDh auBE DW 00BEh auBF DW 00BFh auC0 DW 00C0h auC1 DW 00C1h auC2 DW 00C2h auC3 DW 00C3h auC4 DW 00C4h auC5 DW 00C5h auC6 DW 00C6h auC7 DW 00C7h auC8 DW 00C8h auC9 DW 00C9h auCA DW 00CAh auCB DW 00CBh auCC DW 00CCh auCD DW 00CDh auCE DW 00CEh auCF DW 00CFh auD0 DW 00D0h auD1 DW 00D1h auD2 DW 00D2h auD3 DW 00D3h auD4 DW 00D4h auD5 DW 00D5h auD6 DW 00D6h auD7 DW 00D7h auD8 DW 00D8h auD9 DW 00D9h auDA DW 00DAh auDB DW 00DBh auDC DW 00DCh auDD DW 00DDh auDE DW 00DEh auDF DW 00DFh auE0 DW 00E0h auE1 DW 00E1h auE2 DW 00E2h auE3 DW 00E3h auE4 DW 00E4h auE5 DW 00E5h auE6 DW 00E6h auE7 DW 00E7h auE8 DW 00E8h auE9 DW 00E9h auEA DW 00EAh auEB DW 00EBh auEC DW 00ECh auED DW 00EDh auEE DW 00EEh auEF DW 00EFh auF0 DW 00F0h auF1 DW 00F1h auF2 DW 00F2h auF3 DW 00F3h auF4 DW 00F4h auF5 DW 00F5h auF6 DW 00F6h auF7 DW 00F7h auF8 DW 00F8h auF9 DW 00F9h auFA DW 00FAh auFB DW 00FBh auFC DW 00FCh auFD DW 00FDh auFE DW 00FEh auFF DW 00FFh ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: AnsiToUtf8 ; ; DESCRIPTION: Convert ANSI (cp 1252) to UTF8 ; ; PARAMETERS: DS:(E)SI ANSI String ; (E)CX Max UTF-8 size ; ES:(E)DI UTF-8 string ; ; RETURNS: EAX Size of UTF-8 string ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ansi_to_utf8_name DB 'Ansi To UTF-8',0 ansi_to_utf8 Proc near push ebx push ecx push edx push esi push edi ; xor edx,edx or ecx,ecx jz taDone ; sub ecx,1 jz taTerminate taLoop: lods byte ptr ds:[esi] test al,80h jz taSimple taUnicode: sub al,80h movzx ebx,al add ebx,ebx mov ax,word ptr cs:[ebx].autab or ax,ax jz taLoop ; cmp ax,800h jae ta3 ta2: sub ecx,2 jc taTerminate ; mov bx,ax and al,3Fh shr bx,6 and bl,1Fh mov ah,bl xchg al,ah or ax,80C0h stos word ptr es:[edi] ; add edx,2 or ecx,ecx jz taTerminate jmp taLoop ta3: sub ecx,3 jc taTerminate ; mov bx,ax shr ax,12 and al,0Fh or al,0E0h stos byte ptr es:[edi] ; mov ax,bx shr bx,6 mov ah,bl and ax,3F3Fh xchg al,ah or ax,8080h stos word ptr es:[edi] ; add edx,3 add edx,2 or ecx,ecx jz taTerminate jmp taLoop taSimple: or al,al jz taTerminate ; stos byte ptr es:[edi] inc edx sub ecx,1 jnz taLoop taTerminate: xor al,al stos byte ptr es:[edi] taDone: mov eax,edx ; pop edi pop esi pop edx pop ecx pop ebx ret ansi_to_utf8 Endp ansi_to_utf8_32 Proc far call ansi_to_utf8 ret ansi_to_utf8_32 Endp ansi_to_utf8_16 Proc far push ecx push esi push edi ; movzx ecx,cx movzx esi,si movzx edi,di call ansi_to_utf8 ; pop edi pop esi pop ecx ret ansi_to_utf8_16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: AnsiToUtf16 ; ; DESCRIPTION: Convert ANSI (cp 1252) to UTF16 ; ; PARAMETERS: DS:(E)SI ANSI String ; (E)CX Max UTF-16 size ; ES:(E)DI UTF-16 string ; ; RETURNS: EAX Size of UTF-8 string ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ansi_to_utf16_name DB 'Ansi To UTF-16',0 ansi_to_utf16 Proc near push ebx push ecx push edx push esi push edi ; xor edx,edx or ecx,ecx jz tawDone ; sub ecx,1 jz tawTerminate tawLoop: lods byte ptr ds:[esi] test al,80h jz tawSimple tawUnicode: sub al,80h movzx ebx,al add ebx,ebx mov ax,word ptr cs:[ebx].autab or ax,ax jz tawLoop tawSimple: movzx ax,al or al,al jz tawTerminate ; stos word ptr es:[edi] inc edx sub ecx,1 jnz tawLoop tawTerminate: xor ax,ax stos word ptr es:[edi] tawDone: mov eax,edx ; pop edi pop esi pop edx pop ecx pop ebx ret ansi_to_utf16 Endp ansi_to_utf16_32 Proc far call ansi_to_utf16 ret ansi_to_utf16_32 Endp ansi_to_utf16_16 Proc far push ecx push esi push edi ; movzx ecx,cx movzx esi,si movzx edi,di call ansi_to_utf16 ; pop edi pop esi pop ecx ret ansi_to_utf16_16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetUnicode ; ; DESCRIPTION: Get unicode from UTF-8 string ; ; PARAMETERS: DS:ESI UTF-8 String ; ; RETURNS: EAX Unicode ; DS:ESI Next char ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetUnicode Proc near xor eax,eax mov al,ds:[esi] or al,al jz guDone ; inc esi test al,80h jz guDone ; test al,40h jz guFail ; test al,20h jz gu2 ; test al,10h jnz guFail gu3: and al,0Fh mov dl,ds:[esi] or dl,dl jz guFail ; inc esi test dl,80h jz guFail ; test dl,40h jnz guFail ; and dl,3Fh shl eax,6 or al,dl ; mov dl,ds:[esi] or dl,dl jz guFail ; inc esi test dl,80h jz guFail ; test dl,40h jnz guFail ; and dl,3Fh shl eax,6 or al,dl jmp guDone gu2: and al,1Fh mov dl,ds:[esi] or dl,dl jz guFail ; inc esi test dl,80h jz guFail ; test dl,40h jnz guFail ; and dl,3Fh shl eax,6 or al,dl jmp guDone guFail: xor eax,eax guDone: ret GetUnicode Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FindAnsi ; ; DESCRIPTION: Find Ansi char for unicode ; ; PARAMETERS: EAX Unicode ; ; RETURNS: AL Character ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FindAnsi Proc near push ebx push ecx ; or eax,eax jz faFail ; test eax,0FFFF0000h jnz faFail ; cmp ax,80h jb faDone ; mov ebx,OFFSET autab mov ecx,80h faLoop: cmp ax,cs:[ebx] je faOk ; add ebx,2 loop faLoop ; jmp faFail faOk: sub ebx,OFFSET autab shr ebx,1 mov al,bl add al,80h jmp faDone faFail: xor al,al faDone: pop ecx pop ebx ret FindAnsi Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Utf8ToAnsi ; ; DESCRIPTION: Convert UTF-8 to ANSI (cp 1252) ; ; PARAMETERS: DS:(E)SI UTF-8 String ; (E)CX Max Ansi string size ; ES:(E)DI Ansi string ; ; RETURNS: EAX Size of Ansi string ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; utf8_to_ansi_name DB 'UTF-8 To Ansi',0 utf8_to_ansi Proc near push ecx push edx push esi push edi ; xor edx,edx or ecx,ecx jz tuDone ; sub ecx,1 jz tuTerminate tuLoop: mov al,ds:[esi] or al,al jz tuTerminate ; call GetUnicode call FindAnsi or al,al jz tuLoop ; inc edx stos byte ptr es:[edi] sub ecx,1 jnz tuLoop tuTerminate: xor al,al stos byte ptr es:[edi] tuDone: mov eax,edx ; pop edi pop esi pop edx pop ecx ret utf8_to_ansi Endp utf8_to_ansi_32 Proc far call utf8_to_ansi ret utf8_to_ansi_32 Endp utf8_to_ansi_16 Proc far push ecx push esi push edi ; movzx ecx,cx movzx esi,si movzx edi,di call utf8_to_ansi ; pop edi pop esi ret utf8_to_ansi_16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Utf16ToAnsi ; ; DESCRIPTION: Convert UTF-16 to ANSI (cp 1252) ; ; PARAMETERS: DS:(E)SI UTF-16 String ; (E)CX Max Ansi string size ; ES:(E)DI Ansi string ; ; RETURNS: EAX Size of Ansi string ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; utf16_to_ansi_name DB 'UTF-16 To Ansi',0 utf16_to_ansi Proc near push ecx push edx push esi push edi ; xor edx,edx or ecx,ecx jz tuwDone ; sub ecx,1 jz tuwTerminate tuwLoop: lods word ptr ds:[esi] or ax,ax jz tuwTerminate ; movzx eax,ax call FindAnsi or al,al jz tuwLoop ; inc edx stos byte ptr es:[edi] sub ecx,1 jnz tuwLoop tuwTerminate: xor al,al stos byte ptr es:[edi] tuwDone: mov eax,edx ; pop edi pop esi pop edx pop ecx ret utf16_to_ansi Endp utf16_to_ansi_32 Proc far call utf16_to_ansi ret utf16_to_ansi_32 Endp utf16_to_ansi_16 Proc far push ecx push esi push edi ; movzx ecx,cx movzx esi,si movzx edi,di call utf16_to_ansi ; pop edi pop esi ret utf16_to_ansi_16 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: load_adapter_fonts ; ; DESCRIPTION: install all fonts in adapter ; ; PARAMETERS: edx base address ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; load_adapter_fonts Proc near push ds push ax push bx push edx ; mov ax,flat_sel mov ds,ax load_adapter_fonts_loop: mov ax,[edx].typ cmp ax,RdosFont jne not_install_font ; push ds push es push ecx mov ecx,[edx].len mov ax,ds mov es,ax mov edi,edx add edi,SIZE rdos_header sub ecx,SIZE rdos_header call InstallFont pop ecx pop es pop ds jmp load_adapter_fonts_next not_install_font: cmp ax,RdosEnd je load_adapter_fonts_done load_adapter_fonts_next: add edx,[edx].len jmp load_adapter_fonts_loop load_adapter_fonts_done: pop edx pop bx pop ax pop ds ret load_adapter_fonts Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InitFonts ; ; DESCRIPTION: Initialize freetype fonts ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public InitFonts_ InitFonts_ Proc near push ds push es pushad ; mov ax,system_data_sel mov ds,ax movzx ecx,ds:rom_modules mov bx,OFFSET rom_adapters init_font_loop: mov edx,[bx].adapter_base call load_adapter_fonts add bx,SIZE adapter_typ loop init_font_loop ; mov ax,cs mov ds,ax mov es,ax mov ax,FONT_HANDLE mov edi,OFFSET delete_handle RegisterHandle ; mov esi,OFFSET get_utf8_bitmap mov edi,OFFSET get_utf8_bitmap_name xor cl,cl mov ax,get_utf8_bitmap_nr RegisterOsGate ; mov esi,OFFSET open_font mov edi,OFFSET open_font_name xor dx,dx mov ax,open_font_nr RegisterBimodalUserGate ; mov esi,OFFSET close_font mov edi,OFFSET close_font_name xor dx,dx mov ax,close_font_nr RegisterBimodalUserGate ; mov ebx,OFFSET get_string_metrics16 mov esi,OFFSET get_string_metrics32 mov edi,OFFSET get_string_metrics_name mov dx,virt_es_in mov ax,get_string_metrics_nr RegisterUserGate ; mov ebx,OFFSET ansi_to_utf8_16 mov esi,OFFSET ansi_to_utf8_32 mov edi,OFFSET ansi_to_utf8_name mov dx,virt_es_in OR virt_ds_in mov ax,ansi_to_utf8_nr RegisterUserGate ; mov ebx,OFFSET utf8_to_ansi_16 mov esi,OFFSET utf8_to_ansi_32 mov edi,OFFSET utf8_to_ansi_name mov dx,virt_es_in OR virt_ds_in mov ax,utf8_to_ansi_nr RegisterUserGate ; mov ebx,OFFSET ansi_to_utf16_16 mov esi,OFFSET ansi_to_utf16_32 mov edi,OFFSET ansi_to_utf16_name mov dx,virt_es_in OR virt_ds_in mov ax,ansi_to_utf16_nr RegisterUserGate ; mov ebx,OFFSET utf16_to_ansi_16 mov esi,OFFSET utf16_to_ansi_32 mov edi,OFFSET utf16_to_ansi_name mov dx,virt_es_in OR virt_ds_in mov ax,utf16_to_ansi_nr RegisterUserGate ; popad pop es pop ds ret InitFonts_ Endp _TEXT ENDS END