Leaked source code of windows server 2003
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.
 
 
 
 
 
 

317 lines
8.6 KiB

;/* *************************************************************************
;** INTEL Corporation Proprietary Information
;**
;** This listing is supplied under the terms of a license
;** agreement with INTEL Corporation and may not be copied
;** nor disclosed except in accordance with the terms of
;** that agreement.
;**
;** Copyright (c) 1995, 1996 Intel Corporation.
;** All Rights Reserved.
;**
;** *************************************************************************
;*/
;--------------------------------------------------------------------------;
;
; d3xpand.asm
;
; Description:
; This routine expands a picture frame by 16 or 8 bytes in all
; directions for unrestricted motion vector mode. It assumes
; that there is space in memory around the existing frame
; and simply writes to there (i.e., clobbers it), and that
; the pitch is 384 (distance in bytes between vertically
; adjacent pels). See Below.
;
; Routines: prototypes in:
; ExpandPlane d3dec.cpp
;
; Data:
; This routine assumes that the PITCH is 384.
;
; Inputs (dwords pushed onto stack by caller):
; StartPtr flat pointer to the first byte of the
; original frame.
; FrameWidth Width (in bytes) of the original frame.
; THIS MUST BE AT LEAST 32 & A MULTIPLE OF 4.
; FrameHeight Height (in rows) of the original frame.
; Pels Number of pels to expand the plane.
; 16 for lumina, 8 for chroma. This MUST
; BE A MULTIPLE OF 8.
;
;--------------------------------------------------------------------------;
;--------------------------------------------------------------------------;
;
; $Header: S:\h26x\src\dec\d35xpand.asv 1.2 08 Mar 1996 16:48:16 AGUPTA2 $
; $Log: S:\h26x\src\dec\d35xpand.asv $
;//
;// Rev 1.2 08 Mar 1996 16:48:16 AGUPTA2
;// Changed the meaning of last parameter. New and faster way to expand planes.
;//
;//
;// Rev 1.0 27 Nov 1995 11:28:30 RMCKENZX
;// Initial revision.
;
;--------------------------------------------------------------------------;
.586
.MODEL FLAT
; make all symbols case sensitive
OPTION CASEMAP:NONE
.CODE
;--------------------------------------------------------------------------;
;
; The algorithm fills in (1) the bottom (not including corners),
; then (2) the sides (including the bottom corners, but not the
; top corners), then (3) the top (including the top
; corners) as shown below, replicating the outermost bytes
; of the original frame outward:
;
; ----------------------------
; | |
; | (3) |
; | |
; |----------------------------|
; | | | |
; | | | |
; | | | |
; | | original | |
; | | frame | |
; | | | |
; | (2) | | (2) |
; | | | |
; | | | |
; | |----------------| |
; | | | |
; | | (1) | |
; | | | |
; ----------------------------
;
; Register Usage:
;
; esi pointer for stages (1) and (2).
; edi pointer for stages (2) and (3).
; ecx loop control.
; eax, ebx dword to be written. In stage (2), it is formed
; from 4 (shifted) copies of the border byte. (i.e.,
; byte 0d2h replicates to 0d2d2d2d2h.)
; edx, ebp pointers.
;
;--------------------------------------------------------------------------;
;
; Version: 5.0
; Date: 4 March 1996
; Author: R. McKenzie
;
; Notes: The essential features of this version are:
; 1. Re-organized to fill bottom first, then sides,
; finally top
; 2. Code is optimized for the case that the expanded
; plane is 32-byte aligned. No checking is performed
; to verify this assumption and this routine will run
; significantly SLOWER (though correctly) if this
; assumption is not true.
;
;--------------------------------------------------------------------------;
;-------------------;
; Stack Usage ;
;-------------------;
; register storage
; edi esp+00
; esi esp+04
; ebx esp+08
; ebp esp+12
; return address esp+16
; C input parameters
StartPtr EQU esp+20
FrameWidth EQU esp+24
FrameHeight EQU esp+28
Pels EQU esp+32
PITCH = 384
PUBLIC C ExpandPlane
ExpandPlane:
push ebp
push ebx
push esi
push edi
;--------------------------------------;
; fill the bottom ;
;--------------------------------------;
mov esi, [StartPtr] ; ptr1 = StartPtr
mov edi, [FrameHeight]
shl edi, 7
mov ebp, PITCH
lea edi, [edi+2*edi-PITCH] ; PITCH * (FrameHeight-1)
mov edx, [FrameWidth] ; column bound
add esi, edi ; esi = bottom left corner
nop
;-------Start Outer Bottom Loop--------;
OuterBottomLoop:
mov edi, esi ; destination pointer
mov ecx, [Pels] ; row bound
mov eax, 0[esi]
mov ebx, 4[esi]
;-------Start Inner Bottom Loop--------;
InnerBottomLoop:
mov 0[edi+ebp], eax
mov 4[edi+ebp], ebx
add edi, ebp
dec ecx
jne InnerBottomLoop
;--------End Inner Bottom Loop---------;
add esi, 8
sub edx, 8
jne OuterBottomLoop
;--------End Outer Bottom Loop---------;
;--------------------------------------;
; Fill both sides from bottom up ;
;--------------------------------------;
mov ecx, [FrameHeight]
mov edx, [Pels]
add ecx, edx ; ecx = row count
add edi, 8 ; edi = Right pointer
mov eax, [FrameWidth]
mov esi, edi
sub esi, eax ; esi = Left pointer
nop
;--------Start Outer Sides Loop--------;
OuterSidesLoop:
xor eax, eax
xor ebx, ebx
mov al, [esi]
push ecx ; save row counter
mov bl, [edi-1]
mov ah, [esi]
mov bh, [edi-1]
mov ebp, eax
shl eax, 16
mov edx, ebx
shl ebx, 16
or eax, ebp
or ebx, edx
mov ebp, esi ; Left Pointer
mov edx, edi ; Right Pointer
mov ecx, [Pels+4] ; column counter
;--------Start Inner Sides Loop--------;
InnerSidesLoop:
mov [ebp-4], eax
mov [ebp-8], eax
mov [edx], ebx
mov [edx+4], ebx
sub ebp, 8
add edx, 8
sub ecx, 8
jne InnerSidesLoop
;---------End Inner Sides Loop---------;
pop ecx
sub esi, PITCH
sub edi, PITCH
dec ecx
jne OuterSidesLoop
;---------End Outer Sides Loop---------;
;--------------------------------------;
; Fill the Top ;
;--------------------------------------;
mov ecx, [Pels] ; ptr1 = StartPtr
mov edx, [FrameWidth] ; column bound
add esi, PITCH
mov ebp, -PITCH
sub esi, ecx
lea edx, [edx+2*ecx] ; FrameWidth + 2 * Pels
;---------Start Outer Top Loop---------;
OuterTopLoop:
mov edi, esi ; destination pointer
mov ecx, [Pels] ; row bound
mov eax, 0[esi]
mov ebx, 4[esi]
;---------Start Inner Top Loop---------;
InnerTopLoop:
mov 0[edi+ebp], eax
mov 4[edi+ebp], ebx
add edi, ebp
dec ecx
jne InnerTopLoop
;----------End Inner Top Loop----------;
add esi, 8
sub edx, 8
jne OuterTopLoop
;----------End Outer Top Loop----------;
;--------------------------------------;
; Wrap up and go home ;
;--------------------------------------;
pop edi
pop esi
pop ebx
pop ebp
ret
END