- Timestamp:
- Jun 26, 1999, 1:36:08 PM (26 years ago)
- Location:
- trunk/src/ddraw
- Files:
-
- 6 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ddraw/OS2CLIPPER.H
r97 r211 1 /* $Id: OS2CLIPPER.H,v 1.3 1999-06-10 17:10:56 phaller Exp $ */2 3 /*4 * DirectDraw Clipper Class5 *6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)7 *8 * Project Odin Software License can be found in LICENSE.TXT9 *10 */11 1 #ifndef __OS2CLIPPER_H__ 12 2 #define __OS2CLIPPER_H__ 13 3 14 /* KSO Apr 19 1999: Set correct interface. * 15 * (INTERFACE is used in the THIS and THIS_ macros) */ 16 #undef INTERFACE 17 #define INTERFACE IDirectDrawClipper 18 4 #include <dive.h> 5 #define FAR 6 #undef THIS 7 #define THIS IDirectDrawClipper* 19 8 class OS2IDirectDrawClipper 20 9 { 21 10 public: 22 23 24 11 //this one has to go first! 12 IDirectDrawClipperVtbl *lpVtbl; 13 IDirectDrawClipperVtbl Vtbl; 25 14 26 15 OS2IDirectDrawClipper(OS2IDirectDraw *lpDirectDraw); 27 16 ~OS2IDirectDrawClipper(); 28 17 29 18 int Referenced; 30 19 inline HRESULT GetLastError() { return lastError; }; 31 20 private: 32 21 33 22 protected: 34 HRESULT lastError;35 36 37 W32_HWNDclipWindow;23 HRESULT lastError; 24 OS2IDirectDraw *lpDraw; 25 HDIVE hDive; 26 HWND clipWindow; 38 27 39 28 // Linked list management … … 41 30 static OS2IDirectDrawClipper* ddraw; // List of OS2IDirectDraw 42 31 43 friend HRESULT __stdcall ClipQueryInterface(THIS _REFIID riid, LPVOID FAR * ppvObj);32 friend HRESULT __stdcall ClipQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 44 33 friend ULONG __stdcall ClipAddRef(THIS); 45 34 friend ULONG __stdcall ClipRelease(THIS); 46 friend HRESULT __stdcall ClipGetClipList(THIS _ W32_LPRECT, W32_LPRGNDATA, LPDWORD);47 friend HRESULT __stdcall ClipGetHWnd(THIS _ W32_HWND FAR *);48 friend HRESULT __stdcall ClipInitialize(THIS _LPDIRECTDRAW, DWORD);49 friend HRESULT __stdcall ClipIsClipListChanged(THIS _BOOL FAR *);50 friend HRESULT __stdcall ClipSetClipList(THIS _ W32_LPRGNDATA,DWORD);51 friend HRESULT __stdcall ClipSetHWnd(THIS _ DWORD, W32_HWND );35 friend HRESULT __stdcall ClipGetClipList(THIS, LPRECT, LPRGNDATA, LPDWORD); 36 friend HRESULT __stdcall ClipGetHWnd(THIS, HWND FAR *); 37 friend HRESULT __stdcall ClipInitialize(THIS, LPDIRECTDRAW, DWORD); 38 friend HRESULT __stdcall ClipIsClipListChanged(THIS, BOOL FAR *); 39 friend HRESULT __stdcall ClipSetClipList(THIS, LPRGNDATA,DWORD); 40 friend HRESULT __stdcall ClipSetHWnd(THIS, DWORD, HWND ); 52 41 }; 53 42 54 HRESULT __stdcall ClipQueryInterface(THIS _REFIID riid, LPVOID FAR * ppvObj);43 HRESULT __stdcall ClipQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 55 44 ULONG __stdcall ClipAddRef(THIS); 56 45 ULONG __stdcall ClipRelease(THIS); 57 HRESULT __stdcall ClipGetClipList(THIS _ W32_LPRECT, W32_LPRGNDATA, LPDWORD);58 HRESULT __stdcall ClipGetHWnd(THIS _ W32_HWND FAR *);59 HRESULT __stdcall ClipInitialize(THIS _LPDIRECTDRAW, DWORD);60 HRESULT __stdcall ClipIsClipListChanged(THIS _BOOL FAR *);61 HRESULT __stdcall ClipSetClipList(THIS _ W32_LPRGNDATA,DWORD);62 HRESULT __stdcall ClipSetHWnd(THIS _ DWORD, W32_HWND );46 HRESULT __stdcall ClipGetClipList(THIS, LPRECT, LPRGNDATA, LPDWORD); 47 HRESULT __stdcall ClipGetHWnd(THIS, HWND FAR *); 48 HRESULT __stdcall ClipInitialize(THIS, LPDIRECTDRAW, DWORD); 49 HRESULT __stdcall ClipIsClipListChanged(THIS, BOOL FAR *); 50 HRESULT __stdcall ClipSetClipList(THIS, LPRGNDATA,DWORD); 51 HRESULT __stdcall ClipSetHWnd(THIS, DWORD, HWND ); 63 52 64 53 #endif -
trunk/src/ddraw/OS2DDRAW.H
r97 r211 1 /* $Id: OS2DDRAW.H,v 1.3 1999-06-10 17:10:56 phaller Exp $ */ 1 #ifndef __OS2DDRAW_HPP__ 2 #define __OS2DDRAW_HPP__ 2 3 3 /* 4 * DirectDraw main class 5 * 6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) 7 * 8 * Project Odin Software License can be found in LICENSE.TXT 9 * 10 */ 11 #ifndef __OS2DDRAW_HPP__ 12 #define __OS2DDRAW_HPP__ 4 #include <ddraw.h> 5 #include <d3d.h> 6 #include <dive.h> 13 7 14 15 /* KSO Apr 19 1999: Set correct interface. * 16 * (INTERFACE is used in the THIS and THIS_ macros) */17 #undef INTERFACE 18 # define INTERFACE IDirectDraw219 8 #define DEBUG 1 9 #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ 10 ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ 11 ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) 12 #include <fourcc.h> 13 #define THIS VOID* 20 14 class OS2IDirectDraw 21 15 { 22 public:16 public: 23 17 //this one has to go first! 24 IDirectDraw 2Vtbl *lpVtbl;18 IDirectDraw4Vtbl *lpVtbl; 25 19 IDirectDraw2Vtbl Vtbl; 20 // MS did it again with direct/X 6 they changed the behavior of the directdraw component 21 // So we now need 2 Virt. Tables one for the old and one for the new so we return the 22 // right interface if one creates a DX6 directdraw object but wants a DX2,3,5 interface 23 IDirectDraw4Vtbl Vtbl4; 26 24 IDirect3DVtbl Vtbl3D; 27 25 28 26 OS2IDirectDraw(GUID *lpGUID); 29 27 ~OS2IDirectDraw(); 28 // Simple management for Surfaces should be good enougth for now 29 inline BOOL HasPrimarySurface() { return PrimaryExists;} 30 void SetPrimarySurface(BOOL NewStatus){PrimaryExists = NewStatus;} 31 int Referenced; 32 inline HRESULT GetLastError() { return lastError; } 33 inline HDIVE GetDiveInstance() { return hDive; } 34 inline HDIVE GetCCDiveInstance() { return hDiveColorConv;} 35 inline char * GetFrameBuffer() { return pFrameBuffer; } 36 inline int GetScreenWidth() { return screenwidth; } 37 inline int GetScreenHeight() { return screenheight; } 38 inline int GetScreenBpp() { return screenbpp;} 39 FOURCC GetScreenFourCC(); 40 // We should be able to use any mode with less or same bits and same or 41 // smaller size to be able to report all supported mode in the enum 42 // functions we need the physical screen size. Other information is later 43 // also needed so get all the info we can get 44 DIVE_CAPS dCaps; 30 45 31 int Referenced; 32 inline HRESULT GetLastError() { return lastError; }; 33 inline HDIVE GetDiveInstance() { return hDive; }; 34 inline char * GetFrameBuffer() { return pFrameBuffer; }; 35 inline int GetScreenWidth() { return screenwidth; }; 36 inline int GetScreenHeight() { return screenheight; }; 37 inline BOOL IsFullScreen() { return fFullScreen; }; 38 inline W32_HWND GetWindowHandle() { return hwndClient; }; 46 private: 47 VOID SwitchDisplay(HWND hwnd); 39 48 40 private:41 49 42 protected: 43 HRESULT lastError; 44 HDIVE hDive; 45 char *pFrameBuffer; 46 W32_HWND hwndClient; 47 int screenwidth, screenheight, screenbpp; 50 protected: 48 51 49 BOOL fFullScreen; 52 HRESULT lastError; 53 HDIVE hDive; // Handle to Screen DIVE instance 54 HDIVE hDiveColorConv; // Handle to Offscreen DIVE instance for Color conversion 55 char *pFrameBuffer; 56 HWND hwndClient; 57 int screenwidth, screenheight, screenbpp; 58 BOOL PrimaryExists; 59 BOOL bScale; 50 60 51 61 // Linked list management 52 62 OS2IDirectDraw* next; // Next OS2IDirectDraw 53 63 static OS2IDirectDraw* ddraw; // List of OS2IDirectDraw 54 64 55 friend HRESULT __stdcall DrawQueryInterface(THIS, REFIID riid, LPVOID FAR* ppvObj);65 friend HRESULT __stdcall DrawQueryInterface(THIS, REFIID riid, LPVOID * ppvObj); 56 66 friend ULONG __stdcall DrawAddRef(THIS); 57 67 friend ULONG __stdcall DrawRelease(THIS); 58 68 friend HRESULT __stdcall DrawCompact(THIS); 59 friend HRESULT __stdcall DrawCreateClipper(THIS, DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * ); 60 friend HRESULT __stdcall DrawCreatePalette(THIS, DWORD, W32_LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR * ); 61 friend HRESULT __stdcall DrawCreateSurface(THIS, LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR *); 62 friend HRESULT __stdcall DrawDuplicateSurface(THIS, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * ); 69 friend HRESULT __stdcall DrawCreateClipper(THIS, DWORD, LPDIRECTDRAWCLIPPER *, IUnknown * ); 70 friend HRESULT __stdcall DrawCreatePalette(THIS, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown * ); 71 friend HRESULT __stdcall DrawCreateSurface(THIS, LPDDSURFACEDESC, LPDIRECTDRAWSURFACE *, IUnknown *); 72 friend HRESULT __stdcall DrawCreateSurface4(THIS, LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE4 *, IUnknown *); 73 friend HRESULT __stdcall DrawDuplicateSurface(THIS, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE * ); 74 friend HRESULT __stdcall DrawDuplicateSurface4(THIS, LPDIRECTDRAWSURFACE4, LPDIRECTDRAWSURFACE4 * ); 63 75 friend HRESULT __stdcall DrawEnumDisplayModes(THIS, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ); 76 friend HRESULT __stdcall DrawEnumDisplayModes4(THIS, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ); 64 77 friend HRESULT __stdcall DrawEnumSurfaces(THIS, DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ); 78 friend HRESULT __stdcall DrawEnumSurfaces4(THIS, DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK2 ); 65 79 friend HRESULT __stdcall DrawFlipToGDISurface(THIS); 66 80 friend HRESULT __stdcall DrawGetCaps(THIS, LPDDCAPS, LPDDCAPS); 67 81 friend HRESULT __stdcall DrawGetDisplayMode(THIS, LPDDSURFACEDESC); 68 82 friend HRESULT __stdcall DrawGetFourCCCodes(THIS, LPDWORD, LPDWORD); 69 friend HRESULT __stdcall DrawGetGDISurface(THIS, LPDIRECTDRAWSURFACE FAR *); 83 friend HRESULT __stdcall DrawGetGDISurface(THIS, LPDIRECTDRAWSURFACE *); 84 friend HRESULT __stdcall DrawGetGDISurface4(THIS, LPDIRECTDRAWSURFACE4 *); 70 85 friend HRESULT __stdcall DrawGetMonitorFrequency(THIS, LPDWORD); 71 86 friend HRESULT __stdcall DrawGetScanLine(THIS, LPDWORD); 72 87 friend HRESULT __stdcall DrawGetVerticalBlankStatus(THIS, LPBOOL); 73 friend HRESULT __stdcall DrawInitialize(THIS, GUID FAR*);88 friend HRESULT __stdcall DrawInitialize(THIS, GUID *); 74 89 friend HRESULT __stdcall DrawRestoreDisplayMode(THIS); 75 friend HRESULT __stdcall DrawSetCooperativeLevel(THIS, W32_HWND, DWORD);90 friend HRESULT __stdcall DrawSetCooperativeLevel(THIS, HWND, DWORD); 76 91 friend HRESULT __stdcall DrawSetDisplayMode(THIS, DWORD, DWORD,DWORD); 77 92 friend HRESULT __stdcall DrawSetDisplayMode2(THIS, DWORD, DWORD,DWORD, DWORD, DWORD); 78 friend HRESULT __stdcall DrawWaitForVerticalBlank(THIS, DWORD, W32_HANDLE); 93 friend HRESULT __stdcall DrawWaitForVerticalBlank(THIS, DWORD, HANDLE); 94 // V2 Interface 79 95 friend HRESULT __stdcall DrawGetAvailableVidMem(THIS, LPDDSCAPS, LPDWORD, LPDWORD); 80 96 friend HRESULT __stdcall DrawGetAvailableVidMem4(THIS, LPDDSCAPS2, LPDWORD, LPDWORD); 97 // V4 Interface 98 friend HRESULT __stdcall GetSurfaceFromDC(THIS, HDC, LPDIRECTDRAWSURFACE4 *); 99 friend HRESULT __stdcall RestoreAllSurfaces(THIS) ; 100 friend HRESULT __stdcall TestCooperativeLevel(THIS) ; 101 friend HRESULT __stdcall GetDeviceIdentifier(THIS, LPDDDEVICEIDENTIFIER, DWORD ); 81 102 /*** IDirect3D methods ***/ 82 /* KSO Apr 19 1999: Set correct interface. * 83 * (INTERFACE is used in the THIS and THIS_ macros) */ 84 #undef INTERFACE 85 #define INTERFACE IDirect3D 86 friend HRESULT __stdcall D3DQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 103 friend HRESULT __stdcall D3DQueryInterface(THIS, REFIID riid, LPVOID * ppvObj); 87 104 friend ULONG __stdcall D3DAddRef(THIS); 88 105 friend ULONG __stdcall D3DRelease(THIS); … … 93 110 friend HRESULT __stdcall D3DCreateViewport(THIS, LPDIRECT3DVIEWPORT*, IUnknown*); 94 111 friend HRESULT __stdcall D3DFindDevice(THIS, LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT); 112 95 113 }; 96 114 97 98 115 //****************************************************************************** 99 /* KSO Apr 19 1999: Set correct interface. * 100 * (INTERFACE is used in the THIS and THIS_ macros) */ 101 #undef INTERFACE 102 #define INTERFACE IDirectDraw2 103 HRESULT __stdcall DrawQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 116 HRESULT __stdcall DrawQueryInterface(THIS, REFIID riid, LPVOID * ppvObj); 104 117 ULONG __stdcall DrawAddRef(THIS); 105 118 ULONG __stdcall DrawRelease(THIS); 106 119 HRESULT __stdcall DrawCompact(THIS); 107 HRESULT __stdcall DrawCreateClipper(THIS, DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR* );108 HRESULT __stdcall DrawCreatePalette(THIS, DWORD, W32_LPPALETTEENTRY, LPDIRECTDRAWPALETTE FAR*, IUnknown FAR* );109 HRESULT __stdcall DrawCreateSurface(THIS, LPDDSURFACEDESC, LPDIRECTDRAWSURFACE FAR *, IUnknown FAR*);110 HRESULT __stdcall DrawDuplicateSurface(THIS, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR* );120 HRESULT __stdcall DrawCreateClipper(THIS, DWORD, LPDIRECTDRAWCLIPPER *, IUnknown * ); 121 HRESULT __stdcall DrawCreatePalette(THIS, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown * ); 122 HRESULT __stdcall DrawCreateSurface(THIS, LPDDSURFACEDESC, LPDIRECTDRAWSURFACE *, IUnknown *); 123 HRESULT __stdcall DrawDuplicateSurface(THIS, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE * ); 111 124 HRESULT __stdcall DrawEnumDisplayModes(THIS, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK ); 112 125 HRESULT __stdcall DrawEnumSurfaces(THIS, DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK ); … … 115 128 HRESULT __stdcall DrawGetDisplayMode(THIS, LPDDSURFACEDESC); 116 129 HRESULT __stdcall DrawGetFourCCCodes(THIS, LPDWORD, LPDWORD); 117 HRESULT __stdcall DrawGetGDISurface(THIS, LPDIRECTDRAWSURFACE FAR*);130 HRESULT __stdcall DrawGetGDISurface(THIS, LPDIRECTDRAWSURFACE *); 118 131 HRESULT __stdcall DrawGetMonitorFrequency(THIS, LPDWORD); 119 132 HRESULT __stdcall DrawGetScanLine(THIS, LPDWORD); 120 133 HRESULT __stdcall DrawGetVerticalBlankStatus(THIS, LPBOOL); 121 HRESULT __stdcall DrawInitialize(THIS, GUID FAR*);134 HRESULT __stdcall DrawInitialize(THIS, GUID *); 122 135 HRESULT __stdcall DrawRestoreDisplayMode(THIS); 123 HRESULT __stdcall DrawSetCooperativeLevel(THIS, W32_HWND, DWORD);136 HRESULT __stdcall DrawSetCooperativeLevel(THIS, HWND, DWORD); 124 137 HRESULT __stdcall DrawSetDisplayMode(THIS, DWORD, DWORD,DWORD); 125 138 HRESULT __stdcall DrawSetDisplayMode2(THIS, DWORD, DWORD,DWORD, DWORD, DWORD); 126 HRESULT __stdcall DrawWaitForVerticalBlank(THIS, DWORD, W32_HANDLE); 139 HRESULT __stdcall DrawWaitForVerticalBlank(THIS, DWORD, HANDLE); 140 // V2 127 141 HRESULT __stdcall DrawGetAvailableVidMem(THIS, LPDDSCAPS, LPDWORD, LPDWORD); 142 // V4 143 HRESULT __stdcall DrawGetSurfaceFromDC(THIS, HDC, LPDIRECTDRAWSURFACE4 *); 144 HRESULT __stdcall DrawRestoreAllSurfaces(THIS) ; 145 HRESULT __stdcall DrawTestCooperativeLevel(THIS) ; 146 HRESULT __stdcall DrawGetDeviceIdentifier(THIS, LPDDDEVICEIDENTIFIER, DWORD ); 147 // functions which ifaces are changed in DirectX6 after all MS uses COM where an programmer 148 // isn't allowd to change a function iface after he published the iface (See MS COM docs!) 149 HRESULT __stdcall DrawCreateSurface4(THIS, LPDDSURFACEDESC2, LPDIRECTDRAWSURFACE4 *, IUnknown *); 150 HRESULT __stdcall DrawDuplicateSurface4(THIS, LPDIRECTDRAWSURFACE4, LPDIRECTDRAWSURFACE4 * ); 151 HRESULT __stdcall DrawEnumDisplayModes4(THIS, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2 ); 152 HRESULT __stdcall DrawEnumSurfaces4(THIS, DWORD, LPDDSURFACEDESC2, LPVOID,LPDDENUMSURFACESCALLBACK2 ); 153 HRESULT __stdcall DrawGetDisplayMode4(THIS, LPDDSURFACEDESC2); 154 HRESULT __stdcall DrawGetGDISurface4(THIS, LPDIRECTDRAWSURFACE4 *); 155 HRESULT __stdcall DrawGetAvailableVidMem4(THIS, LPDDSCAPS2, LPDWORD, LPDWORD); 128 156 129 157 /*** IDirect3D methods ***/ 130 /* KSO Apr 19 1999: Set correct interface. * 131 * (INTERFACE is used in the THIS and THIS_ macros) */ 132 #undef INTERFACE 133 #define INTERFACE IDirect3D 134 HRESULT __stdcall D3DQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 158 HRESULT __stdcall D3DQueryInterface(THIS, REFIID riid, LPVOID * ppvObj); 135 159 ULONG __stdcall D3DAddRef(THIS); 136 160 ULONG __stdcall D3DRelease(THIS); 137 HRESULT __stdcall D3DInitialize(THIS _REFIID);138 HRESULT __stdcall D3DEnumDevices(THIS _LPD3DENUMDEVICESCALLBACK, LPVOID);139 HRESULT __stdcall D3DCreateLight(THIS _LPDIRECT3DLIGHT*, IUnknown*);140 HRESULT __stdcall D3DCreateMaterial(THIS _LPDIRECT3DMATERIAL*, IUnknown*);141 HRESULT __stdcall D3DCreateViewport(THIS _LPDIRECT3DVIEWPORT*, IUnknown*);142 HRESULT __stdcall D3DFindDevice(THIS _LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT);161 HRESULT __stdcall D3DInitialize(THIS, REFIID); 162 HRESULT __stdcall D3DEnumDevices(THIS, LPD3DENUMDEVICESCALLBACK, LPVOID); 163 HRESULT __stdcall D3DCreateLight(THIS, LPDIRECT3DLIGHT*, IUnknown*); 164 HRESULT __stdcall D3DCreateMaterial(THIS, LPDIRECT3DMATERIAL*, IUnknown*); 165 HRESULT __stdcall D3DCreateViewport(THIS, LPDIRECT3DVIEWPORT*, IUnknown*); 166 HRESULT __stdcall D3DFindDevice(THIS, LPD3DFINDDEVICESEARCH, LPD3DFINDDEVICERESULT); 143 167 144 168 #endif -
trunk/src/ddraw/OS2PALETTE.H
r97 r211 1 /* $Id: OS2PALETTE.H,v 1.3 1999-06-10 17:10:56 phaller Exp $ */2 3 /*4 * DirectDraw Palette class5 *6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)7 *8 * Project Odin Software License can be found in LICENSE.TXT9 *10 */11 1 #ifndef __OS2PALETTE_H__ 12 2 #define __OS2PALETTE_H__ 13 3 14 4 #include "os2ddraw.h" 5 #include <dive.h> 6 #define FAR 7 #undef THIS 8 #define THIS IDirectDrawPalette* 15 9 16 /* KSO Apr 19 1999: Set correct interface. * 17 * (INTERFACE is used in the THIS and THIS_ macros) */ 18 #undef INTERFACE 19 #define INTERFACE IDirectDrawPalette 10 #pragma pack(1) /* pack on wordboundary */ 11 12 typedef struct _RGB2 /* rgb2 */ 13 { 14 BYTE bBlue; /* Blue component of the color definition */ 15 BYTE bGreen; /* Green component of the color definition*/ 16 BYTE bRed; /* Red component of the color definition */ 17 BYTE fcOptions; /* Reserved, must be zero */ 18 } RGB2; 19 typedef RGB2 *PRGB2; 20 #pragma pack() 20 21 21 22 class OS2IDirectDrawPalette 22 23 { 23 24 public: 24 25 26 25 //this one has to go first! 26 IDirectDrawPaletteVtbl *lpVtbl; 27 IDirectDrawPaletteVtbl Vtbl; 27 28 28 OS2IDirectDrawPalette(OS2IDirectDraw *lpDirectDraw, int palsize, W32_LPPALETTEENTRY lpColorTable); 29 ~OS2IDirectDrawPalette(); 29 OS2IDirectDrawPalette( OS2IDirectDraw *lpDirectDraw, 30 int palsize, 31 LPPALETTEENTRY lpColorTable, 32 DWORD dwPalFlags); 33 ~OS2IDirectDrawPalette(); 30 34 31 void SetPhysPalette(); 32 void RestorePhysPalette(); 33 int Referenced; 34 inline HRESULT GetLastError() { return lastError; }; 35 void SetPhysPalette(); 36 void RestorePhysPalette(); 37 void SetIsPrimary(BOOL newValue); 38 int Referenced; 39 inline HRESULT GetLastError() { return lastError; }; 35 40 private: 36 41 37 42 protected: 38 HDIVE hDive; 39 ULONG nrColors; 40 HRESULT lastError; 41 W32_LPPALETTEENTRY os2pal; 42 OS2IDirectDraw *lpDraw; 43 44 // Linked list management 45 OS2IDirectDrawPalette* next; // Next OS2IDirectDraw 46 static OS2IDirectDrawPalette* ddraw; // List of OS2IDirectDraw 47 48 friend HRESULT __stdcall PalQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 49 friend ULONG __stdcall PalAddRef(THIS); 50 friend ULONG __stdcall PalRelease(THIS); 51 friend HRESULT __stdcall PalGetCaps(THIS_ LPDWORD); 52 friend HRESULT __stdcall PalGetEntries(THIS_ DWORD,DWORD,DWORD,W32_LPPALETTEENTRY); 53 friend HRESULT __stdcall PalInitialize(THIS_ LPDIRECTDRAW, DWORD,W32_LPPALETTEENTRY); 54 friend HRESULT __stdcall PalSetEntries(THIS_ DWORD,DWORD,DWORD,W32_LPPALETTEENTRY); 43 HDIVE hDive; 44 HRESULT lastError; 45 LPPALETTEENTRY os2pal; 46 OS2IDirectDraw *lpDraw; 47 DWORD dwCaps; 48 DWORD dwSize; 49 BOOL fAttachedToPrimary; 50 friend HRESULT __stdcall PalQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 51 friend ULONG __stdcall PalAddRef(THIS); 52 friend ULONG __stdcall PalRelease(THIS); 53 friend HRESULT __stdcall PalGetCaps(THIS, LPDWORD); 54 friend HRESULT __stdcall PalGetEntries(THIS, DWORD,DWORD,DWORD,LPPALETTEENTRY); 55 friend HRESULT __stdcall PalInitialize(THIS, LPDIRECTDRAW, DWORD, LPPALETTEENTRY); 56 friend HRESULT __stdcall PalSetEntries(THIS, DWORD,DWORD,DWORD,LPPALETTEENTRY); 55 57 }; 56 58 … … 59 61 ULONG __stdcall PalAddRef(THIS); 60 62 ULONG __stdcall PalRelease(THIS); 61 HRESULT __stdcall PalGetCaps(THIS _LPDWORD);62 HRESULT __stdcall PalGetEntries(THIS _ DWORD,DWORD,DWORD,W32_LPPALETTEENTRY);63 HRESULT __stdcall PalInitialize(THIS _ LPDIRECTDRAW, DWORD,W32_LPPALETTEENTRY);64 HRESULT __stdcall PalSetEntries(THIS _ DWORD,DWORD,DWORD,W32_LPPALETTEENTRY);63 HRESULT __stdcall PalGetCaps(THIS, LPDWORD); 64 HRESULT __stdcall PalGetEntries(THIS, DWORD,DWORD,DWORD,LPPALETTEENTRY); 65 HRESULT __stdcall PalInitialize(THIS, LPDIRECTDRAW, DWORD, LPPALETTEENTRY); 66 HRESULT __stdcall PalSetEntries(THIS, DWORD,DWORD,DWORD,LPPALETTEENTRY); 65 67 66 68 -
trunk/src/ddraw/OS2PALSET.H
r97 r211 1 /* $Id: OS2PALSET.H,v 1.3 1999-06-10 17:10:56 phaller Exp $ */2 3 /*4 * OS/2 Palette function definitions5 *6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)7 *8 * Project Odin Software License can be found in LICENSE.TXT9 *10 */11 1 #ifndef __OS2PALSET_H__ 12 2 #define __OS2PALSET_H__ … … 22 12 23 13 //void OS2SetPhysPalette(PALETTEENTRY *pDirectXPal); 24 void OS2SetPhysPalette( HWND hwndClient,void *pal);14 void OS2SetPhysPalette(void *pal); 25 15 void OS2ResetPhysPalette(); 26 16 -
trunk/src/ddraw/OS2SURFACE.H
r97 r211 1 /* $Id: OS2SURFACE.H,v 1.3 1999-06-10 17:10:56 phaller Exp $ */2 3 /*4 * DirectDraw Surface class5 *6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)7 *8 * Project Odin Software License can be found in LICENSE.TXT9 *10 */11 1 #ifndef __OS2SURFACE_H__ 12 2 #define __OS2SURFACE_H__ 13 3 #define FAR 4 #define INITGUID 14 5 #include "os2ddraw.h" 15 6 #include "os2clipper.h" 16 7 #include "os2palette.h" 17 18 19 typedef struct _OS2RECTL { 8 #include <dive.h> 9 #include <iseq.h> 10 #include <irect.hpp> 11 12 #define FAR 13 #undef THIS 14 #define THIS VOID* 15 16 typedef struct _OS2RECTL { 20 17 LONG xLeft; /* X-coordinate of left-hand edge of rectangle. */ 21 18 LONG yBottom; /* Y-coordinate of bottom edge of rectangle. */ … … 24 21 } OS2RECTL; 25 22 26 #define MAX_COLORKEYTYPE 4 27 #define COLORKEY_DEST 0 28 #define COLORKEY_DESTOVERLAY 1 29 #define COLORKEY_SRC 2 30 #define COLORKEY_SRCOVERLAY 3 31 32 33 34 /* KSO Apr 19 1999: Set correct interface. * 35 * (INTERFACE is used in the THIS and THIS_ macros) */ 36 #undef INTERFACE 37 #define INTERFACE IDirectDrawSurface2 38 23 typedef struct _SURFPRIVATEDATA 24 { 25 GUID guidTag; 26 void *pData; 27 DWORD dwFlags; 28 DWORD dwSize; 29 BOOL isValid; 30 }SURFPRIVATEDATA , *PSURFPRIVATEDATA; 39 31 40 32 class OS2IDirectDrawSurface 41 33 { 42 34 public: 43 //this one has to go first! 44 IDirectDrawSurface2Vtbl *lpVtbl; 45 IDirectDrawSurface2Vtbl Vtbl; 46 47 OS2IDirectDrawSurface(OS2IDirectDraw *lpDirectDraw, LPDDSURFACEDESC lpDDSurfaceDesc); 48 ~OS2IDirectDrawSurface(); 49 50 int Referenced; 51 inline HRESULT GetLastError() { return lastError; }; 52 inline int GetDiveBufNr() { return diveBufNr; }; 35 //this one has to go first! 36 IDirectDrawSurface4Vtbl *lpVtbl; 37 IDirectDrawSurface2Vtbl Vtbl2; 38 IDirectDrawSurface3Vtbl Vtbl3; 39 IDirectDrawSurface4Vtbl Vtbl; // With Dx6 CreateSurface creates per default one with Interface 4 ! 40 41 OS2IDirectDrawSurface( OS2IDirectDraw *lpDirectDraw, 42 LPDDSURFACEDESC2 lpDDSurfaceDesc, 43 BOOL Implicit = FALSE, // Indicates that this surface was created as result of a complex surface 44 BOOL Mainchain = FALSE); // Indicates if an implicit surface belongs to the primary surface 45 ~OS2IDirectDrawSurface(); 46 int Referenced; 47 inline HRESULT GetLastError() { return lastError; }; 48 inline int GetDiveBufNr() { return diveBufNr; }; 49 inline BOOL IsImplicitSurface() {return ImplicitSurface; }; 50 inline OS2IDirectDrawSurface* GetFrontBuffer(){ return FrontBuffer;}; 51 inline void SetFrontBuffer( OS2IDirectDrawSurface* NewFBuffer); 52 void ColorConversion(LPRECT lpRect); 53 53 54 private: 54 55 HRESULT ColorFill(LPRECT, DWORD); 55 56 protected: 56 HRESULT lastError; 57 HDIVE hDive; 58 ULONG height, width; 59 ULONG surfaceType; 60 ULONG diveBufNr; 61 double screenXFact, screenYFact; 62 ULONG fccColorFormat, bpp; 63 OS2IDirectDraw *lpDraw; 64 OS2IDirectDrawClipper *lpClipper; 65 OS2IDirectDrawPalette *lpPalette; 66 DDSURFACEDESC DDSurfaceDesc; 67 DDCAPS SurfaceCaps; 68 BOOL fLocked; 69 HDC hdcImage; 70 HBITMAP hbmImage; 71 HGDIOBJ hgdiOld; 72 char *bitmapData; 73 char *pFrameBuffer; 74 PBYTE lpBuffer; //non-primary buffers 75 76 ULONG ColorKeyFlags; 77 ULONG ColorSpaceLowValue[MAX_COLORKEYTYPE]; 78 ULONG ColorSpaceHighValue[MAX_COLORKEYTYPE]; 79 80 OS2IDirectDrawSurface* attached; // attached surfaces 81 OS2IDirectDrawSurface* flip; // surface used for next flip 82 83 // Linked list management 84 OS2IDirectDrawSurface* next; // Next OS2IDirectDraw 85 static OS2IDirectDrawSurface* ddraw; // List of OS2IDirectDraw 86 87 friend HRESULT __stdcall SurfQueryInterface(THIS_ REFIID riid, LPVOID FAR * ppvObj); 57 HRESULT lastError; 58 HDIVE hDive; 59 HDIVE hDiveCC; // Color conversion DIVE Handle 60 ULONG height, width; 61 ULONG screenHeight, screenWidth; 62 ULONG surfaceType; 63 ULONG diveBufNr; 64 OS2IDirectDraw *lpDraw; 65 OS2IDirectDrawClipper *lpClipper; 66 OS2IDirectDrawPalette *lpPalette; 67 DDSURFACEDESC2 DDSurfaceDesc; 68 BOOL fLocked; 69 HDC hdcImage; 70 HBITMAP hbmImage; 71 HGDIOBJ hgdiOld; 72 DWORD dwLastDCUnique; 73 // The real pointers hold the allocated memory (for the free) 74 // The other an pointer addjusted to QWORDs which we use and report 75 char *pFrameBuffer, *pFBreal; 76 char *pDiveBuffer, *pDBreal; 77 DWORD *pTransBufferSrc; 78 DWORD *pTransBufferDest; 79 DWORD dwPitchFB; 80 DWORD dwPitchDB; 81 DWORD dwBytesPPDive; 82 BOOL Updated; 83 BOOL ImplicitSurface; 84 85 // DDraw internal vars 86 87 DWORD dwUniqueValue; 88 ISequence<PSURFPRIVATEDATA> SurfaceSequencePrivateData; 89 BOOL fOverlayValid; 90 LONG lOverlayX; 91 LONG lOverlayY; 92 93 // surface management 94 95 OS2IDirectDrawSurface* BackBuffer; // Backbuffer goes in here 96 OS2IDirectDrawSurface* FrontBuffer; // NULL if the real frontbuffer of a Flipchain otherwise the prev. Backbuffer 97 OS2IDirectDrawSurface* NextFlip; // Only valid in a frontbuffer 98 ISequence <OS2IDirectDrawSurface*> SurfaceSequenceMipMap; // MipMaps go in this one 99 ISequence <OS2IDirectDrawSurface*> SurfaceSequenceAttached; // Other attached go in this one 100 ISequence <OS2IDirectDrawSurface*>::Cursor *SurfaceCursorMipMap; // Iterator for MipMaps 101 ISequence <OS2IDirectDrawSurface*>::Cursor *SurfaceCursorAttached; // Iterator for other attached surfaces 102 103 ISequence <IRectangle*> LockedRectSequence; // List for locked rectangles 104 105 friend HRESULT __stdcall SurfQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 88 106 friend ULONG __stdcall SurfAddRef(THIS); 89 107 friend ULONG __stdcall SurfRelease(THIS); 90 friend HRESULT __stdcall SurfAddAttachedSurface(THIS_ LPDIRECTDRAWSURFACE2); 91 friend HRESULT __stdcall SurfAddOverlayDirtyRect(THIS_ W32_LPRECT); 92 friend HRESULT __stdcall SurfBlt(THIS_ W32_LPRECT,LPDIRECTDRAWSURFACE2,W32_LPRECT,DWORD, LPDDBLTFX); 93 friend HRESULT __stdcall SurfBltBatch(THIS_ LPDDBLTBATCH, DWORD, DWORD ); 94 friend HRESULT __stdcall SurfBltFast(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE2, W32_LPRECT,DWORD); 95 friend HRESULT __stdcall SurfDeleteAttachedSurface(THIS_ DWORD,LPDIRECTDRAWSURFACE2); 96 friend HRESULT __stdcall SurfEnumAttachedSurfaces(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK); 97 friend HRESULT __stdcall SurfEnumOverlayZOrders(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK); 98 friend HRESULT __stdcall SurfFlip(THIS_ LPDIRECTDRAWSURFACE2, DWORD); 99 friend HRESULT __stdcall SurfGetAttachedSurface(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *); 100 friend HRESULT __stdcall SurfGetBltStatus(THIS_ DWORD); 101 friend HRESULT __stdcall SurfGetCaps(THIS_ LPDDSCAPS); 102 friend HRESULT __stdcall SurfGetClipper(THIS_ LPDIRECTDRAWCLIPPER FAR*); 103 friend HRESULT __stdcall SurfGetColorKey(THIS_ DWORD, LPDDCOLORKEY); 104 friend HRESULT __stdcall SurfGetDC(THIS_ W32_HDC FAR *); 105 friend HRESULT __stdcall SurfGetFlipStatus(THIS_ DWORD); 106 friend HRESULT __stdcall SurfGetOverlayPosition(THIS_ LPLONG, LPLONG ); 107 friend HRESULT __stdcall SurfGetPalette(THIS_ LPDIRECTDRAWPALETTE FAR*); 108 friend HRESULT __stdcall SurfGetPixelFormat(THIS_ LPDDPIXELFORMAT); 109 friend HRESULT __stdcall SurfGetSurfaceDesc(THIS_ LPDDSURFACEDESC); 110 friend HRESULT __stdcall SurfInitialize(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC); 108 friend HRESULT __stdcall SurfAddAttachedSurface(THIS, LPDIRECTDRAWSURFACE2); 109 friend HRESULT __stdcall SurfAddAttachedSurface4(THIS, LPDIRECTDRAWSURFACE4); 110 friend HRESULT __stdcall SurfAddOverlayDirtyRect(THIS, LPRECT); 111 friend HRESULT __stdcall SurfBlt(THIS, LPRECT,LPDIRECTDRAWSURFACE2, LPRECT,DWORD, LPDDBLTFX); 112 friend HRESULT __stdcall SurfBlt4(THIS, LPRECT,LPDIRECTDRAWSURFACE4, LPRECT,DWORD, LPDDBLTFX); 113 friend HRESULT __stdcall SurfBltBatch(THIS, LPDDBLTBATCH, DWORD, DWORD ); 114 friend HRESULT __stdcall SurfBltFast(THIS, DWORD,DWORD,LPDIRECTDRAWSURFACE2, LPRECT,DWORD); 115 friend HRESULT __stdcall SurfBltFast4(THIS, DWORD,DWORD,LPDIRECTDRAWSURFACE4, LPRECT,DWORD); 116 friend HRESULT __stdcall SurfDeleteAttachedSurface(THIS, DWORD,LPDIRECTDRAWSURFACE2); 117 friend HRESULT __stdcall SurfDeleteAttachedSurface4(THIS, DWORD,LPDIRECTDRAWSURFACE4); 118 friend HRESULT __stdcall SurfEnumAttachedSurfaces(THIS, LPVOID,LPDDENUMSURFACESCALLBACK); 119 friend HRESULT __stdcall SurfEnumAttachedSurfaces4(THIS, LPVOID,LPDDENUMSURFACESCALLBACK2); 120 friend HRESULT __stdcall SurfEnumOverlayZOrders(THIS, DWORD,LPVOID,LPDDENUMSURFACESCALLBACK); 121 friend HRESULT __stdcall SurfEnumOverlayZOrders4(THIS, DWORD,LPVOID,LPDDENUMSURFACESCALLBACK2); 122 friend HRESULT __stdcall SurfFlip(THIS, LPDIRECTDRAWSURFACE2 , DWORD); 123 friend HRESULT __stdcall SurfFlip4(THIS, LPDIRECTDRAWSURFACE4 , DWORD); 124 friend HRESULT __stdcall SurfGetAttachedSurface(THIS, LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *); 125 friend HRESULT __stdcall SurfGetAttachedSurface4(THIS, LPDDSCAPS2, LPDIRECTDRAWSURFACE4 FAR *); 126 friend HRESULT __stdcall SurfGetBltStatus(THIS, DWORD); 127 friend HRESULT __stdcall SurfGetCaps(THIS, LPDDSCAPS); 128 friend HRESULT __stdcall SurfGetCaps4(THIS, LPDDSCAPS2); 129 friend HRESULT __stdcall SurfGetClipper(THIS, LPDIRECTDRAWCLIPPER FAR*); 130 friend HRESULT __stdcall SurfGetColorKey(THIS, DWORD, LPDDCOLORKEY); 131 friend HRESULT __stdcall SurfGetDC(THIS, HDC FAR *); 132 friend HRESULT __stdcall SurfGetFlipStatus(THIS, DWORD); 133 friend HRESULT __stdcall SurfGetOverlayPosition(THIS, LPLONG, LPLONG ); 134 friend HRESULT __stdcall SurfGetPalette(THIS, LPDIRECTDRAWPALETTE FAR*); 135 friend HRESULT __stdcall SurfGetPixelFormat(THIS, LPDDPIXELFORMAT); 136 friend HRESULT __stdcall SurfGetSurfaceDesc(THIS, LPDDSURFACEDESC); 137 friend HRESULT __stdcall SurfGetSurfaceDesc4(THIS, LPDDSURFACEDESC2); 138 friend HRESULT __stdcall SurfInitialize(THIS, LPDIRECTDRAW, LPDDSURFACEDESC); 139 friend HRESULT __stdcall SurfInitialize4(THIS, LPDIRECTDRAW, LPDDSURFACEDESC2); 111 140 friend HRESULT __stdcall SurfIsLost(THIS); 112 friend HRESULT __stdcall SurfLock(THIS_ W32_LPRECT,LPDDSURFACEDESC,DWORD,W32_HANDLE); 113 friend HRESULT __stdcall SurfReleaseDC(THIS_ W32_HDC); 141 friend HRESULT __stdcall SurfLock(THIS, LPRECT,LPDDSURFACEDESC,DWORD,HANDLE); 142 friend HRESULT __stdcall SurfLock4(THIS, LPRECT,LPDDSURFACEDESC2,DWORD,HANDLE); 143 friend HRESULT __stdcall SurfReleaseDC(THIS, HDC); 114 144 friend HRESULT __stdcall SurfRestore(THIS); 115 friend HRESULT __stdcall SurfSetClipper(THIS_ LPDIRECTDRAWCLIPPER); 116 friend HRESULT __stdcall SurfSetColorKey(THIS_ DWORD, LPDDCOLORKEY); 117 friend HRESULT __stdcall SurfSetOverlayPosition(THIS_ LONG, LONG ); 118 friend HRESULT __stdcall SurfSetPalette(THIS_ LPDIRECTDRAWPALETTE); 119 friend HRESULT __stdcall SurfUnlock(THIS_ LPVOID); 120 friend HRESULT __stdcall SurfUpdateOverlay(THIS_ W32_LPRECT, LPDIRECTDRAWSURFACE2,W32_LPRECT,DWORD, LPDDOVERLAYFX); 121 friend HRESULT __stdcall SurfUpdateOverlayDisplay(THIS_ DWORD); 122 friend HRESULT __stdcall SurfUpdateOverlayZOrder(THIS_ DWORD, LPDIRECTDRAWSURFACE2); 123 friend HRESULT __stdcall SurfGetDDInterface(THIS_ LPVOID FAR *); 124 friend HRESULT __stdcall SurfPageLock(THIS_ DWORD); 125 friend HRESULT __stdcall SurfPageUnlock(THIS_ DWORD); 145 friend HRESULT __stdcall SurfSetClipper(THIS, LPDIRECTDRAWCLIPPER); 146 friend HRESULT __stdcall SurfSetColorKey(THIS, DWORD, LPDDCOLORKEY); 147 friend HRESULT __stdcall SurfSetOverlayPosition(THIS, LONG, LONG ); 148 friend HRESULT __stdcall SurfSetPalette(THIS, LPDIRECTDRAWPALETTE); 149 friend HRESULT __stdcall SurfUnlock(THIS, LPRECT); 150 friend HRESULT __stdcall SurfUpdateOverlay(THIS, LPRECT, LPDIRECTDRAWSURFACE2,LPRECT,DWORD, LPDDOVERLAYFX); 151 friend HRESULT __stdcall SurfUpdateOverlay4(THIS, LPRECT, LPDIRECTDRAWSURFACE4,LPRECT,DWORD, LPDDOVERLAYFX); 152 friend HRESULT __stdcall SurfUpdateOverlayDisplay(THIS, DWORD); 153 friend HRESULT __stdcall SurfUpdateOverlayZOrder(THIS, DWORD, LPDIRECTDRAWSURFACE2); 154 friend HRESULT __stdcall SurfUpdateOverlayZOrder4(THIS, DWORD, LPDIRECTDRAWSURFACE4); 155 // Added in V2 interface 156 friend HRESULT __stdcall SurfGetDDInterface(THIS, LPVOID FAR *); 157 friend HRESULT __stdcall SurfPageLock(THIS, DWORD); 158 friend HRESULT __stdcall SurfPageUnlock(THIS, DWORD); 159 // Added in V3 interface 160 friend HRESULT __stdcall SurfSetSurfaceDesc(THIS, LPDDSURFACEDESC, DWORD); 161 friend HRESULT __stdcall SurfSetSurfaceDesc4(THIS, LPDDSURFACEDESC2, DWORD); 162 // Added in V4 interface 163 friend HRESULT __stdcall SurfSetPrivateData(THIS, REFGUID, LPVOID, DWORD, DWORD); 164 friend HRESULT __stdcall SurfGetPrivateData(THIS, REFGUID, LPVOID, LPDWORD); 165 friend HRESULT __stdcall SurfFreePrivateData(THIS, REFGUID); 166 friend HRESULT __stdcall SurfGetUniquenessValue(THIS, LPDWORD); 167 friend HRESULT __stdcall SurfChangeUniquenessValue(THIS); 126 168 }; 127 169 128 170 129 HRESULT __stdcall SurfQueryInterface(THIS _REFIID riid, LPVOID FAR * ppvObj);171 HRESULT __stdcall SurfQueryInterface(THIS, REFIID riid, LPVOID FAR * ppvObj); 130 172 ULONG __stdcall SurfAddRef(THIS); 131 173 ULONG __stdcall SurfRelease(THIS); 132 HRESULT __stdcall SurfAddAttachedSurface(THIS_ LPDIRECTDRAWSURFACE2); 133 HRESULT __stdcall SurfAddOverlayDirtyRect(THIS_ W32_LPRECT); 134 HRESULT __stdcall SurfBlt(THIS_ W32_LPRECT,LPDIRECTDRAWSURFACE2, W32_LPRECT,DWORD, LPDDBLTFX); 135 HRESULT __stdcall SurfBltBatch(THIS_ LPDDBLTBATCH, DWORD, DWORD ); 136 HRESULT __stdcall SurfBltFast(THIS_ DWORD,DWORD,LPDIRECTDRAWSURFACE2, W32_LPRECT,DWORD); 137 HRESULT __stdcall SurfDeleteAttachedSurface(THIS_ DWORD,LPDIRECTDRAWSURFACE2); 138 HRESULT __stdcall SurfEnumAttachedSurfaces(THIS_ LPVOID,LPDDENUMSURFACESCALLBACK); 139 HRESULT __stdcall SurfEnumOverlayZOrders(THIS_ DWORD,LPVOID,LPDDENUMSURFACESCALLBACK); 140 HRESULT __stdcall SurfFlip(THIS_ LPDIRECTDRAWSURFACE2, DWORD); 141 HRESULT __stdcall SurfGetAttachedSurface(THIS_ LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *); 142 HRESULT __stdcall SurfGetBltStatus(THIS_ DWORD); 143 HRESULT __stdcall SurfGetCaps(THIS_ LPDDSCAPS); 144 HRESULT __stdcall SurfGetClipper(THIS_ LPDIRECTDRAWCLIPPER FAR*); 145 HRESULT __stdcall SurfGetColorKey(THIS_ DWORD, LPDDCOLORKEY); 146 HRESULT __stdcall SurfGetDC(THIS_ W32_HDC FAR *); 147 HRESULT __stdcall SurfGetFlipStatus(THIS_ DWORD); 148 HRESULT __stdcall SurfGetOverlayPosition(THIS_ LPLONG, LPLONG ); 149 HRESULT __stdcall SurfGetPalette(THIS_ LPDIRECTDRAWPALETTE FAR*); 150 HRESULT __stdcall SurfGetPixelFormat(THIS_ LPDDPIXELFORMAT); 151 HRESULT __stdcall SurfGetSurfaceDesc(THIS_ LPDDSURFACEDESC); 152 HRESULT __stdcall SurfInitialize(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC); 174 HRESULT __stdcall SurfAddAttachedSurface(THIS, LPDIRECTDRAWSURFACE2); 175 HRESULT __stdcall SurfAddAttachedSurface4(THIS, LPDIRECTDRAWSURFACE4); 176 HRESULT __stdcall SurfAddOverlayDirtyRect(THIS, LPRECT); 177 HRESULT __stdcall SurfBlt(THIS, LPRECT,LPDIRECTDRAWSURFACE2, LPRECT,DWORD, LPDDBLTFX); 178 HRESULT __stdcall SurfBlt4(THIS, LPRECT,LPDIRECTDRAWSURFACE4, LPRECT,DWORD, LPDDBLTFX); 179 HRESULT __stdcall SurfBltBatch(THIS, LPDDBLTBATCH, DWORD, DWORD ); 180 HRESULT __stdcall SurfBltFast(THIS, DWORD,DWORD,LPDIRECTDRAWSURFACE2, LPRECT,DWORD); 181 HRESULT __stdcall SurfBltFast4(THIS, DWORD,DWORD,LPDIRECTDRAWSURFACE4, LPRECT,DWORD); 182 HRESULT __stdcall SurfDeleteAttachedSurface(THIS, DWORD,LPDIRECTDRAWSURFACE2); 183 HRESULT __stdcall SurfDeleteAttachedSurface4(THIS, DWORD,LPDIRECTDRAWSURFACE4); 184 HRESULT __stdcall SurfEnumAttachedSurfaces(THIS, LPVOID,LPDDENUMSURFACESCALLBACK); 185 HRESULT __stdcall SurfEnumAttachedSurfaces4(THIS, LPVOID,LPDDENUMSURFACESCALLBACK2); 186 HRESULT __stdcall SurfEnumOverlayZOrders(THIS, DWORD,LPVOID,LPDDENUMSURFACESCALLBACK); 187 HRESULT __stdcall SurfEnumOverlayZOrders4(THIS, DWORD,LPVOID,LPDDENUMSURFACESCALLBACK2); 188 HRESULT __stdcall SurfFlip(THIS, LPDIRECTDRAWSURFACE2 , DWORD); 189 HRESULT __stdcall SurfFlip4(THIS, LPDIRECTDRAWSURFACE4 , DWORD); 190 HRESULT __stdcall SurfGetAttachedSurface(THIS, LPDDSCAPS, LPDIRECTDRAWSURFACE2 FAR *); 191 HRESULT __stdcall SurfGetAttachedSurface4(THIS, LPDDSCAPS2, LPDIRECTDRAWSURFACE4 FAR *); 192 HRESULT __stdcall SurfGetBltStatus(THIS, DWORD); 193 HRESULT __stdcall SurfGetCaps4(THIS, LPDDSCAPS2); 194 HRESULT __stdcall SurfGetCaps(THIS, LPDDSCAPS); 195 HRESULT __stdcall SurfGetClipper(THIS, LPDIRECTDRAWCLIPPER FAR*); 196 HRESULT __stdcall SurfGetColorKey(THIS, DWORD, LPDDCOLORKEY); 197 HRESULT __stdcall SurfGetDC(THIS, HDC FAR *); 198 HRESULT __stdcall SurfGetFlipStatus(THIS, DWORD); 199 HRESULT __stdcall SurfGetOverlayPosition(THIS, LPLONG, LPLONG ); 200 HRESULT __stdcall SurfGetPalette(THIS, LPDIRECTDRAWPALETTE FAR*); 201 HRESULT __stdcall SurfGetPixelFormat(THIS, LPDDPIXELFORMAT); 202 HRESULT __stdcall SurfGetSurfaceDesc(THIS, LPDDSURFACEDESC); 203 HRESULT __stdcall SurfGetSurfaceDesc4(THIS, LPDDSURFACEDESC2); 204 HRESULT __stdcall SurfInitialize(THIS, LPDIRECTDRAW, LPDDSURFACEDESC); 205 HRESULT __stdcall SurfInitialize4(THIS, LPDIRECTDRAW, LPDDSURFACEDESC2); 153 206 HRESULT __stdcall SurfIsLost(THIS); 154 HRESULT __stdcall SurfLock(THIS_ W32_LPRECT,LPDDSURFACEDESC,DWORD,W32_HANDLE); 155 HRESULT __stdcall SurfReleaseDC(THIS_ W32_HDC); 207 HRESULT __stdcall SurfLock(THIS, LPRECT,LPDDSURFACEDESC,DWORD,HANDLE); 208 HRESULT __stdcall SurfLock4(THIS, LPRECT,LPDDSURFACEDESC2,DWORD,HANDLE); 209 HRESULT __stdcall SurfReleaseDC(THIS, HDC); 156 210 HRESULT __stdcall SurfRestore(THIS); 157 HRESULT __stdcall SurfSetClipper(THIS_ LPDIRECTDRAWCLIPPER); 158 HRESULT __stdcall SurfSetColorKey(THIS_ DWORD, LPDDCOLORKEY); 159 HRESULT __stdcall SurfSetOverlayPosition(THIS_ LONG, LONG ); 160 HRESULT __stdcall SurfSetPalette(THIS_ LPDIRECTDRAWPALETTE); 161 HRESULT __stdcall SurfUnlock(THIS_ LPVOID); 162 HRESULT __stdcall SurfUpdateOverlay(THIS_ W32_LPRECT, LPDIRECTDRAWSURFACE2,W32_LPRECT,DWORD, LPDDOVERLAYFX); 163 HRESULT __stdcall SurfUpdateOverlayDisplay(THIS_ DWORD); 164 HRESULT __stdcall SurfUpdateOverlayZOrder(THIS_ DWORD, LPDIRECTDRAWSURFACE2); 165 HRESULT __stdcall SurfGetDDInterface(THIS_ LPVOID FAR *); 166 HRESULT __stdcall SurfPageLock(THIS_ DWORD); 167 HRESULT __stdcall SurfPageUnlock(THIS_ DWORD); 211 HRESULT __stdcall SurfSetClipper(THIS, LPDIRECTDRAWCLIPPER); 212 HRESULT __stdcall SurfSetColorKey(THIS, DWORD, LPDDCOLORKEY); 213 HRESULT __stdcall SurfSetOverlayPosition(THIS, LONG, LONG ); 214 HRESULT __stdcall SurfSetPalette(THIS, LPDIRECTDRAWPALETTE); 215 HRESULT __stdcall SurfUnlock(THIS, LPRECT); 216 HRESULT __stdcall SurfUpdateOverlay(THIS, LPRECT, LPDIRECTDRAWSURFACE2,LPRECT,DWORD, LPDDOVERLAYFX); 217 HRESULT __stdcall SurfUpdateOverlay4(THIS, LPRECT, LPDIRECTDRAWSURFACE4,LPRECT,DWORD, LPDDOVERLAYFX); 218 HRESULT __stdcall SurfUpdateOverlayDisplay(THIS, DWORD); 219 HRESULT __stdcall SurfUpdateOverlayZOrder(THIS, DWORD, LPDIRECTDRAWSURFACE2); 220 HRESULT __stdcall SurfUpdateOverlayZOrder4(THIS, DWORD, LPDIRECTDRAWSURFACE4); 221 HRESULT __stdcall SurfGetDDInterface(THIS, LPVOID FAR *); 222 HRESULT __stdcall SurfPageLock(THIS, DWORD); 223 HRESULT __stdcall SurfPageUnlock(THIS, DWORD); 224 HRESULT __stdcall SurfSetSurfaceDesc(THIS, LPDDSURFACEDESC, DWORD); 225 HRESULT __stdcall SurfSetSurfaceDesc4(THIS, LPDDSURFACEDESC2, DWORD); 226 HRESULT __stdcall SurfSetPrivateData(THIS, REFGUID, LPVOID, DWORD, DWORD); 227 HRESULT __stdcall SurfGetPrivateData(THIS, REFGUID, LPVOID, LPDWORD); 228 HRESULT __stdcall SurfFreePrivateData(THIS, REFGUID); 229 HRESULT __stdcall SurfGetUniquenessValue(THIS, LPDWORD); 230 HRESULT __stdcall SurfChangeUniquenessValue(THIS); 231 232 void __cdecl MoveRects(char* pBuffer, LPRECT lpDestRect, LPRECT lpSrcRect, int bbp, LONG lPitch); 233 void __cdecl TransSRCBlit8(LPDDSURFACEDESC2 pDestDesc, LPDDSURFACEDESC2 pSrcDesc, char *pAlpha, LPRECT lpSrcRect); 234 void __cdecl TransSRCBlit16(LPDDSURFACEDESC2 pDestDesc, LPDDSURFACEDESC2 pSrcDesc, char *pAlpha, LPRECT lpSrcRect); 235 void __cdecl TransSRCBlit24(LPDDSURFACEDESC2 pDestDesc, LPDDSURFACEDESC2 pSrcDesc, char *pAlpha, LPRECT lpSrcRect); 236 void __cdecl TransSRCBlit32(LPDDSURFACEDESC2 pDestDesc, LPDDSURFACEDESC2 pSrcDesc, char *pAlpha, LPRECT lpSrcRect); 237 168 238 169 239 #endif -
trunk/src/ddraw/asmutil.asm
r97 r211 1 ; $Id: asmutil.asm,v 1.3 1999-06-10 17:10:57 phaller Exp $2 3 1 ; asmutil.asm Color key bit blitting for DirectDraw 4 2 ; 5 ; Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) 6 ; * 7 ; * Project Odin Software License can be found in LICENSE.TXT 8 ; * 9 ; 10 11 .386p 3 ; Copyright 1998 Sander van Leeuwen 4 ; 1999 Markus Montkowski 5 12 6 NAME asmutil 7 .586p 8 .MMX 13 9 14 10 CODE32 SEGMENT DWORD PUBLIC USE32 'CODE' 15 11 ASSUME CS:FLAT ,DS:FLAT,SS:FLAT 16 12 17 18 19 ; 20 ; 21 ; 22 ; 23 ; 24 ; else*destbuf++ = *srcbuf;25 ; 26 ; 27 ; 28 ; 13 PUBLIC _BlitColorKey8 14 15 ; endpos = destbuf + blitlinesize; 16 ; while(destbuf < endpos) { 17 ; if(*srcbuf == colorkey) { 18 ; destbuf++; 19 ; } 20 ; else *destbuf++ = *srcbuf; 21 ; srcbuf++; 22 ; } 23 ; destbuf += (destscanlinesize-blitlinesize); 24 ; srcbuf += (srcscanlinesize-blitlinesize); 29 25 ;void BlitColorKey8(char *dest, char *src, ULONG key, ULONG linesize) 30 _BlitColorKey8 PROC NEAR 31 push ebp 32 mov ebp, esp 33 push edi 34 push esi 35 push eax 36 push ebx 37 push ecx 38 push edx 39 40 mov edi, dword ptr [ebp+8] ;dest 41 mov esi, dword ptr [ebp+12] ;src 42 mov ecx, dword ptr [ebp+20] ;linesize 43 mov edx, dword ptr [ebp+16] ;colorkey 44 45 and ecx, 3 46 push ecx ;do the remaining bytes afterwards 47 mov ecx, dword ptr [ebp+20] ;linesize 48 shr ecx, 2 ;linesize in dwords 49 50 ALIGN 16 51 26 _BlitColorKey8 PROC NEAR 27 push ebp 28 mov ebp, esp 29 push edi 30 push esi 31 push eax 32 push ebx 33 push ecx 34 push edx 35 36 mov edi, dword ptr [ebp+8] ;dest 37 mov esi, dword ptr [ebp+12] ;src 38 mov ecx, dword ptr [ebp+20] ;linesize 39 mov edx, dword ptr [ebp+16] ;colorkey 40 41 and ecx, 3 42 mov dh , dl 43 push ecx ;do the remaining bytes afterwards 44 mov eax, edx 45 shl edx, 16 46 and eax, 0000FFFFh 47 mov ecx, dword ptr [ebp+20] ;linesize 48 or edx, eax ; edx now contains the colorkey in each byte 49 shr ecx, 2 ;linesize in dwords 50 jz blitremain ; less then 4 bytes 51 jmp blitStart 52 52 blitloop: 53 mov ebx, dword ptr [esi] 54 mov eax, dword ptr [edi] 55 cmp bl, dl 56 je skipbyte1 57 mov al, bl 58 59 skipbyte1: 60 cmp bh, dl 61 je skipbyte2 62 mov ah, bh 63 skipbyte2: 64 ror eax, 16 65 ror ebx, 16 66 cmp bl, dl 67 je skipbyte3 68 mov al, bl 53 add esi, 4 54 add edi, 4 55 blitStart: 56 mov ebx, dword ptr [esi] 57 mov eax, dword ptr [edi] 58 cmp ebx, edx ; All 4 bytes transparent? 59 jz TTTT 60 cmp bx, dx ; lower 2 bytes transparent ? 61 jz XXTT 62 cmp bl, dl ; lower byte trans 63 jz XXOT 64 mov al, bl 65 cmp bh, dh ; upper Byte transparent then skip copy 66 jz XXTT 67 XXOT: 68 mov ah, bh 69 XXTT: ; handle upper 2 pixel 70 ror eax, 16 71 ror ebx, 16 72 cmp bx,dx 73 jz skipbyte4 74 cmp bl, dl 75 je skipbyte3 76 mov al, bl 69 77 skipbyte3: 70 cmpbh, dl71 72 movah, bh78 cmp bh, dl 79 je skipbyte4 80 mov ah, bh 73 81 skipbyte4: 74 ror eax, 16 75 dec ecx 76 mov dword ptr [edi], eax 77 add esi, 4 78 add edi, 4 79 80 cmp ecx, 0 81 jne blitloop 82 83 pop ecx 84 cmp ecx, 0 85 je endofblit 86 87 blitperbyte: 88 mov al, byte ptr [esi] 89 dec ecx 90 cmp al, dl 91 je skipsinglebyte 92 mov byte ptr [edi], al 93 skipsinglebyte: 94 inc esi 95 inc edi 96 cmp ecx, 0 97 jne blitperbyte 82 ror eax, 16 83 mov dword ptr [edi], eax 84 TTTT: 85 dec ecx 86 jz blitloop 87 blitremain: 88 pop ecx 89 cmp ecx, 2 90 ja blit3 91 jz blit2 92 test ecx,ecx 93 jz endofblit 94 mov eax, dword ptr[esi] 95 mov ebx, dword ptr [edi] 96 rol eax, 8 97 rol ebx, 8 98 cmp al,dl 99 jz endofblit 100 mov bl,al 101 ror ebx, 8 102 mov dword ptr[edi],ebx 103 jmp endofblit 104 105 blit3: 106 mov eax, dword ptr[esi] 107 mov ebx, dword ptr [edi] 108 ror eax, 16 109 ror ebx, 16 110 cmp ax, dx 111 jz TTX 112 cmp ah,dh 113 jz TXX 114 mov bh,ah 115 TXX: 116 cmp al,dl 117 jz TTX 118 mov bl,al 119 TTX: 120 ror eax, 16 121 ror ebx, 16 122 cmp ah,dh 123 jz Cpyback 124 mov dh,ah 125 Cpyback: 126 mov dword ptr [edi], ebx 127 jmp endofblit 128 129 blit2: 130 mov eax, dword ptr[esi] 131 mov ebx, dword ptr [edi] 132 ror eax, 16 133 ror ebx, 16 134 cmp ax, dx ; both bytes transparent ? 135 jz endofblit 136 cmp ah,dh 137 jz TX 138 mov bh,ah 139 TX: 140 cmp al,dl 141 jz OT 142 mov bl,al 143 OT: 144 ror ebx, 16 145 mov dword ptr[edi], ebx 98 146 99 147 endofblit: 100 popedx101 popecx102 popebx103 popeax104 popesi105 popedi106 popebp107 148 pop edx 149 pop ecx 150 pop ebx 151 pop eax 152 pop esi 153 pop edi 154 pop ebp 155 ret 108 156 _BlitColorKey8 ENDP 109 157 158 PUBLIC _BlitColorKey16 159 160 ; endpos = destbuf + blitlinesize; 161 ; while(destbuf < endpos) { 162 ; if(*srcbuf == colorkey) { 163 ; destbuf++; 164 ; } 165 ; else *destbuf++ = *srcbuf; 166 ; srcbuf++; 167 ; } 168 ; destbuf += (destscanlinesize-blitlinesize); 169 ; srcbuf += (srcscanlinesize-blitlinesize); 170 ;void BlitColorKey16(char *dest, char *src, ULONG key, ULONG linesize) 171 _BlitColorKey16 PROC NEAR 172 push ebp 173 mov ebp, esp 174 push edi 175 push esi 176 push eax 177 push ebx 178 push ecx 179 push edx 180 181 mov edi, dword ptr [ebp+8] ;dest 182 mov esi, dword ptr [ebp+12] ;src 183 mov ecx, dword ptr [ebp+20] ;linesize 184 mov edx, dword ptr [ebp+16] ;colorkey 185 186 mov eax, edx 187 shl edx, 16; 188 and eax, 0000FFFFh 189 or edx,eax ; create dwColorKey 190 shr ecx, 1 ; linesize in dwords 191 jz OnePixel 192 193 blitloop16: 194 mov eax, dword ptr [esi] 195 mov ebx, dword ptr [edi] 196 add esi , 4 197 cmp eax, edx ; are both pixel transparent? 198 je LoopUp ; Yes, then Jump to loopend 199 cmp ax,dx ; Is lower pixel transparent 200 je DrawOT ; Yes So We got OT (OPAQUE/Transparent 201 mov bx,ax ; No so copy the lower pixel 202 ror eax,16 ; 203 cmp ax,dx ; Is higher pixel transparent 204 je CopyBack ; 205 DrawOT: 206 ror ebx,16 207 mov bx,ax 208 ror ebx,16 209 CopyBack: 210 mov dword ptr[edi], ebx ; copy back the result in ebx 211 LoopUp: 212 mov ebx, dword ptr [ebp+20] ; V load this this in case we are done 213 add edi , 4 ; U 214 OnePixel: 215 dec ecx 216 jnz blitloop16 217 test ebx, 1 ; Do we have an odd linesize 218 jz endofblit16 219 mov eax, dword ptr [esi] 220 mov ebx, dword ptr [edi] 221 ror eax,16 222 ror ebx,16 223 cmp ax, dx 224 je endofblit16 ; last pixel is transparent 225 mov bx,ax ; No so copy the lower pixel 226 ror ebx,16 227 mov dword ptr[edi], ebx ; copy back the result in ebx 228 229 endofblit16: 230 pop edx 231 pop ecx 232 pop ebx 233 pop eax 234 pop esi 235 pop edi 236 pop ebp 237 ret 238 _BlitColorKey16 ENDP 239 240 241 PUBLIC _BlitColorKey8MMX 242 ; Now the same as BlitColorKey8 now with MMX 243 ;void BlitColorKey8MMX(char *dest, char *src, ULONG key, ULONG linesize) 244 245 _BlitColorKey8MMX PROC NEAR 246 push ebp 247 mov ebp, esp 248 push edi 249 push esi 250 push eax 251 push ebx 252 push ecx 253 push edx 254 255 mov edx, [ebp+16] ;colorkey 256 mov edi, [ebp+8] ;dest 257 mov dh,dl 258 mov esi, [ebp+12] ;src 259 mov ax,dx 260 mov ecx, dword ptr [ebp+20] ;linesize 261 shr edx,16 262 mov dx,ax 263 movd mm4,edx 264 movd mm5,edx 265 psllq mm4,32 266 por mm4,mm5 267 shr ecx,3 268 jz BltRemain8 269 270 bltLoopMMX8: 271 movq mm0, [esi] ; get source qword 272 movq mm1, [edi] ; get dest qword 273 movq mm2,mm0 ; copy source 274 PCMPEQB mm0,mm4 ; create mask 275 pand mm1,mm0 ; mask dest 276 pandn mm2,mm0 ; mask source 277 por mm1,mm2 ; or them 278 movq qword ptr [edi], mm1 ; write back result 279 add esi, 8 280 add edi, 8 281 dec ecx 282 jnz bltLoopMMX8 283 BltRemain8: 284 mov eax, dword ptr [ebp+20]; 285 and eax, 7 286 jmp ds:JmpTable[eax*4] 287 288 align 4 289 290 JmpTable: 291 dd offset bltEndMMX8 292 dd offset blt1MMX8 293 dd offset blt2MMX8 294 dd offset blt3MMX8 295 dd offset blt4MMX8 296 dd offset blt5MMX8 297 dd offset blt6MMX8 298 dd offset blt7MMX8 299 align 2 300 ; 301 ; Maybe it would be faster for 7-5 to load a qword into mm0/mm1 302 ; but we might cross a page and so I guess this is saver 303 ; 304 blt7MMX8: 305 movd mm0, dword ptr[esi] 306 mov ax, word ptr[esi+4] 307 mov bx, word ptr[edi+4] 308 movd mm1, dword ptr[edi] 309 psllq mm0,32 310 shl eax,8 311 shl ebx,8 312 mov al, byte ptr[esi+6] 313 mov bl, byte ptr[edi+6] 314 movd mm0,eax 315 psllq mm1,32 316 movd mm1,ebx 317 movq mm2,mm0 ; copy source 318 PCMPEQB mm0,mm4 ; create mask 319 pand mm1,mm0 ; mask dest 320 pandn mm2,mm0 ; mask source 321 por mm1,mm2 ; or them 322 movd eax, mm1 323 psrlq mm1,32 324 mov byte ptr[edi+6], al 325 movd dword ptr[edi], mm1 326 shr eax,8 327 mov word ptr[edi+4],ax 328 jmp bltEndMMX8 329 330 blt6MMX8: 331 movd mm0, dword ptr[esi] 332 mov ax, word ptr[esi+4] 333 mov bx, word ptr[edi+4] 334 movd mm1, dword ptr[edi] 335 psllq mm0,32 336 psllq mm1,32 337 movd mm0,eax 338 movd mm1,ebx 339 movq mm2,mm0 ; copy source 340 pcmpeqb mm0,mm4 ; create mask 341 pand mm1,mm0 ; mask dest 342 pandn mm2,mm0 ; mask source 343 por mm1,mm2 ; or them 344 movd eax, mm1 345 psrlq mm1,32 346 mov word ptr[edi+4],ax 347 movd dword ptr[edi], mm1 348 jmp bltEndMMX8 349 350 blt5MMX8: 351 movd mm0, dword ptr[esi] 352 movd mm1, dword ptr[edi] 353 movq mm2,mm0 ; copy source 354 pcmpeqb mm0,mm4 ; create mask 355 pand mm1,mm0 ; mask dest 356 add esi, 4; 357 pandn mm2,mm0 ; mask source 358 por mm1,mm2 ; or them 359 movd dword ptr[edi], mm1 360 add edi,4 361 jmp blt1MMX8 362 363 blt4MMX8: 364 movd mm0, dword ptr[esi] 365 movd mm1, dword ptr[edi] 366 movq mm2,mm0 ; copy source 367 pcmpeqb mm0,mm4 ; create mask 368 pand mm1,mm0 ; mask dest 369 pandn mm2,mm0 ; mask source 370 por mm1,mm2 ; or them 371 movd dword ptr [edi], mm1 ; write back result 372 jmp bltEndMMX8 373 ; 374 ; loading a dword into mm0/mm1 might be faster for 3-2... 375 ; 376 blt3MMX8: 377 mov ax , word ptr [esi] 378 mov bx , word ptr [edi] 379 shl eax,8 ; 3 Pixel left to blit 380 shl ebx,8 ; so shift the buffers 381 mov al,byte ptr[esi+2] 382 mov bl,byte ptr[edi+2] 383 movd mm0,eax 384 movd mm1,ebx 385 movq mm2,mm0 386 pcmpeqb mm0,mm4 ; create mask 387 pand mm1,mm0 ; mask dest 388 pandn mm2,mm0 ; mask source 389 por mm1,mm2 ; or them 390 movd eax, mm1 ; write back result 391 mov byte ptr[edi+2],al 392 shr eax,8 393 mov word ptr[edi],ax 394 jmp bltEndMMX8 395 396 blt2MMX8: 397 mov al, byte ptr [esi] 398 cmp al,dl 399 je blt1aMMX8 400 mov byte ptr [edi], al 401 mov bl , byte ptr [esi+1] 402 cmp bl,dl 403 je bltEndMMX8 404 mov byte ptr [edi+1], bl 405 jmp bltEndMMX8 406 blt1aMMX8: 407 add esi,1 408 add edi,1 409 blt1MMX8: 410 mov al, byte ptr [esi] 411 cmp al,dl 412 je bltEndMMX8 413 mov byte ptr [edi], al 414 415 bltEndMMX8: 416 pop edx 417 pop ecx 418 pop ebx 419 pop eax 420 pop esi 421 pop edi 422 pop ebp 423 ret 424 _BlitColorKey8MMX ENDP 425 426 427 PUBLIC _BlitColorKey16MMX 428 ; Now the same as BlitColorKey16 now with MMX 429 ;void BlitColorKey16MMX(char *dest, char *src, ULONG key, ULONG linesize) 430 _BlitColorKey16MMX PROC NEAR 431 push ebp 432 mov ebp, esp 433 push edi 434 push esi 435 push ecx 436 push edx 437 438 mov edx, dword ptr [ebp+16] ; colorkey 439 mov edi, dword ptr [ebp+8] ; dest 440 mov eax, dword ptr [ebp+16] ; colorkey 441 shr edx,16; 442 mov ecx, dword ptr [ebp+20] ; linesize in pixel! 443 mov dx,ax ; extend colorkey to 32 Bit 444 mov esi, dword ptr [ebp+12] ; src 445 mov eax, ecx ; copy of linesize 446 shr ecx,2 447 movd mm4, edx 448 jz BltRemain16 449 450 movd mm5,edx ; Extend colorkey to 64 Bit 451 psllq mm4,32 452 por mm4,mm5 453 454 bltLoopMMX16: 455 movq mm0,qword ptr [esi] ; get source dword 456 movq mm1,qword ptr [edi] ; get destination 457 movq mm2,mm0 ; copy source 458 pcmpeqw mm0,mm4 ; create mask 459 pand mm1,mm0 ; mask dest 460 add esi, 8 461 pandn mm2,mm0 ; mask source 462 por mm1,mm2 ; or them 463 movq qword ptr [edi], mm1 ; write back result 464 add edi, 8 465 dec ecx 466 jnz bltLoopMMX16 467 468 BltRemain16: 469 and eax,3 470 jmp ds:JumpTable[eax*4] 471 472 align 4 473 474 JumpTable: 475 dd offset bltEndMMX16 476 dd offset blt1MMX16 477 dd offset blt2MMX16 478 dd offset blt3MMX16 479 align 2 480 481 blt3MMX16: 482 movd mm0, dword ptr[esi] 483 movd mm1, dword ptr[edi] 484 movq mm2,mm0 ; copy source 485 add esi,4 486 pcmpeqw mm0,mm4 ; create mask 16 bit 487 pand mm1,mm0 ; mask dest 488 pandn mm2,mm0 ; mask source 489 add edi,4 490 por mm1,mm2 ; or them 491 movd dword ptr[edi-4], mm1 492 jmp blt1MMX16 493 494 blt2MMX16: 495 movd mm0, dword ptr[esi] 496 movd mm1, dword ptr[edi] 497 movq mm2,mm0 ; copy source 498 pcmpeqw mm0,mm4 ; create mask 16 bit 499 pand mm1,mm0 ; mask dest 500 pandn mm2,mm0 ; mask source 501 por mm1,mm2 ; or them 502 movd dword ptr [edi], mm1 ; write back result 503 jmp bltEndMMX16 504 505 blt1MMX16: 506 mov ax, word ptr [esi] ; cmov ? 507 cmp ax,dx 508 je bltEndMMX16 509 mov word ptr [edi], ax 510 511 512 bltEndMMX16: 513 pop edx 514 pop ecx 515 pop esi 516 pop edi 517 pop ebp 518 ret 519 _BlitColorKey16MMX ENDP 520 521 ; 522 ; extern void __cdecl BltTransSrcRecMMX(PBYTE dest, PBYTE src, ULONG ulBltWidth,ULONG ulBltHeight 523 ; ULONG ulDestPitch, ULONG ulSrcPitch, ULONG ulTransCol); 524 525 PUBLIC _BltTransSrcRecMMX 526 _BltTransSrcRecMMX PROC NEAR 527 push ebp 528 mov ebp, esp 529 push edi 530 push esi 531 push eax 532 push ebx 533 push ecx 534 push edx 535 536 EndTSBlt: 537 pop edx 538 pop ecx 539 pop ebx 540 pop eax 541 pop esi 542 pop edi 543 pop ebp 544 ret 545 546 _BltTransSrcRecMMX ENDP 547 548 549 PUBLIC _BltRec 550 ; 551 ; extern void __cdecl BltRec(PBYTE dest, PBYTE src, ULONG ulBltWidth,ULONG ulBltHeight 552 ; ULONG ulDestPitch, ULONG ulSrcPitch); 553 _BltRec PROC NEAR 554 push ebp 555 mov ebp, esp 556 push edi 557 push esi 558 push eax 559 push ebx 560 push ecx 561 push edx 562 563 mov ecx, dword ptr [ebp+16] ; U ulBltWidth 564 mov esi, dword ptr [ebp+12] ; V src 565 mov ebx, ecx ; U 566 mov edx, dword ptr [ebp+20] ; V ulBltHeight 567 and ebx, 0Fh ; U ebx = # of bytes < 16 568 mov edi, dword ptr [ebp+8] ; V dest 569 cmp edx, 0 570 jz BltRecEnd ; height is zero so done 571 shr ecx, 4 ; U 572 jz SmallBlt ; Small (width < 16) rectangle done in special case 573 test ebx, ebx 574 jnz ComplexBlt ; ulBltWidth mod 16 is not 0 575 576 ; 577 ; Blitwidth is an multiple of 16 578 ; 579 mov ebx, dword ptr [ebp+24] ; ulDestPitch 580 mov eax, dword ptr [ebp+28] ; ulSrcPitch 581 sub ebx, dword ptr [ebp+16] ; adjust both widths 582 sub eax, dword ptr [ebp+16] 583 mov dword ptr [ebp+28], eax ; store adjusted SrcPitch 584 mov eax, ecx 585 LineLoop: 586 FLD QWORD PTR [ESI] 587 FLD QWORD PTR [ESI+8] 588 FXCH 589 FSTP QWORD PTR [EDI] 590 FSTP QWORD PTR [EDI+8] 591 ADD ESI,16 592 ADD EDI,16 593 dec eax 594 jz LineLoop 595 dec edx 596 jz BltRecEnd 597 add ESI, dword ptr[ebp+28] 598 add EDI, ebx 599 mov eax, ecx 600 jmp LineLoop 601 602 SmallBlt: 603 mov eax, dword ptr [ebp+28] ; ulSrcPitch 604 mov ecx, dword ptr [ebp+24] ; ulDestPitch 605 jmp ds:SmallJmpTable[ebx*4] 606 SmallJmpTable: 607 dd offset BltRecEnd ; BlitWidth is 0 done 608 dd offset Rec1 609 dd offset Rec2 610 dd offset Rec3 611 dd offset Rec4 612 dd offset Rec5 613 dd offset Rec6 614 dd offset Rec7 615 dd offset Rec8 616 dd offset Rec9 617 dd offset Rec10 618 dd offset Rec11 619 dd offset Rec12 620 dd offset Rec13 621 dd offset Rec14 622 dd offset Rec15 623 624 ;One Pixel wide 625 626 Rec1: 627 cmp edx,4 628 jb Rec1_0123 629 mov bl, byte ptr [esi] 630 add esi,eax 631 mov byte ptr [edi], bl 632 add edi,ecx 633 mov bl, byte ptr [esi] 634 add esi,eax 635 mov byte ptr [edi], bl 636 add edi,ecx 637 mov bl, byte ptr [esi] 638 add esi,eax 639 mov byte ptr [edi], bl 640 add edi,ecx 641 mov bl, byte ptr [esi] 642 add esi,eax 643 mov byte ptr [edi], bl 644 add edi,ecx 645 sub edx,4 646 jnz Rec1 647 jmp BltRecEnd 648 Rec1_0123: 649 cmp edx,2 650 jz Rec1_2 651 jb Rec1_01 652 ; Must be 3 lines left 653 mov bl, byte ptr [esi] 654 add esi,eax 655 mov byte ptr [edi], bl 656 add edi,ecx 657 mov bl, byte ptr [esi] 658 add esi,eax 659 mov byte ptr [edi], bl 660 add edi,ecx 661 mov bl, byte ptr [esi] 662 mov byte ptr [edi], bl 663 jmp BltRecEnd 664 Rec1_2: 665 mov bl, byte ptr [esi] 666 add esi,eax 667 mov byte ptr [edi], bl 668 add edi,ecx 669 mov bl, byte ptr [esi] 670 mov byte ptr [edi], bl 671 jmp BltRecEnd 672 Rec1_01: 673 test edx,edx 674 jz BltRecEnd 675 mov bl, byte ptr [esi] 676 mov byte ptr [edi], bl 677 jmp BltRecEnd 678 679 ;2 Pixel Wide 680 681 Rec2: 682 cmp edx,4 683 jb Rec2_0123 684 mov bx, word ptr [esi] 685 add esi,eax 686 mov word ptr [edi], bx 687 add edi,ecx 688 mov bx, word ptr [esi] 689 add esi,eax 690 mov word ptr [edi], bx 691 add edi,ecx 692 mov bx, word ptr [esi] 693 add esi,eax 694 mov word ptr [edi], bx 695 add edi,ecx 696 mov bx, word ptr [esi] 697 add esi,eax 698 mov word ptr [edi], bx 699 add edi,ecx 700 sub edx, 4 701 jnz Rec2 702 jmp BltRecEnd 703 704 Rec2_0123: 705 cmp edx,2 706 jz Rec2_2 707 jb Rec2_01 708 ;3 lines left 709 mov bx, word ptr [esi] 710 add esi,eax 711 mov word ptr [edi], bx 712 add edi,ecx 713 mov bx, word ptr [esi] 714 add esi,eax 715 mov word ptr [edi], bx 716 add edi,ecx 717 mov bx, word ptr [esi] 718 mov word ptr [edi], bx 719 jmp BltRecEnd 720 Rec2_2: 721 mov bx, word ptr [esi] 722 add esi,eax 723 mov word ptr [edi], bx 724 add edi,ecx 725 mov bx, word ptr [esi] 726 mov word ptr [edi], bx 727 jmp BltRecEnd 728 Rec2_01: 729 test edx,edx 730 jz BltRecEnd 731 mov bx, word ptr [esi] 732 mov word ptr [edi], bx 733 jmp BltRecEnd 734 735 ; 3 Pixel Wide must check if it's better to read 4 bytes as 736 ; Intel might stall on reading 2 and 1 byte, but this takes more care as we 737 ; could create a pagefault on the last 3 pixel 738 739 Rec3: 740 cmp edx,4 741 jb Rec3_0123 742 push edx 743 mov bx, word ptr [esi] 744 mov dl, byte ptr [esi+2] 745 add esi,eax 746 mov word ptr [edi], bx 747 mov byte ptr [edi+2], dl 748 add edi,ecx 749 mov bx, word ptr [esi] 750 mov dl, byte ptr [esi+2] 751 add esi,eax 752 mov word ptr [edi], bx 753 mov byte ptr [edi+2], dl 754 add edi,ecx 755 mov bx, word ptr [esi] 756 mov dl, byte ptr [esi+2] 757 add esi,eax 758 mov word ptr [edi], bx 759 mov byte ptr [edi+2], dl 760 add edi,ecx 761 mov bx, word ptr [esi] 762 mov dl, byte ptr [esi+2] 763 add esi,eax 764 mov word ptr [edi], bx 765 mov byte ptr [edi+2], dl 766 add edi,ecx 767 pop edx 768 sub edx,4 769 jnz Rec3 770 jmp BltRecEnd 771 772 Rec3_0123: 773 cmp edx,2 774 jz Rec3_2 775 jb Rec3_01 776 ; Must be 3 lines left 777 mov bx, word ptr [esi] 778 mov dl, byte ptr [esi+2] 779 add esi,eax 780 mov word ptr [edi], bx 781 mov byte ptr [edi+2], dl 782 add edi,ecx 783 mov bx, word ptr [esi] 784 mov dl, byte ptr [esi+2] 785 add esi,eax 786 mov word ptr [edi], bx 787 mov byte ptr [edi+2], dl 788 add edi,ecx 789 mov bx, word ptr [esi] 790 mov dl, byte ptr [esi+2] 791 mov word ptr [edi], bx 792 mov byte ptr [edi+2], dl 793 jmp BltRecEnd 794 Rec3_2: 795 mov bx, word ptr [esi] 796 mov dl, byte ptr [esi+2] 797 add esi,eax 798 mov word ptr [edi], bx 799 mov byte ptr [edi+2], dl 800 add edi,ecx 801 mov bx, word ptr [esi] 802 mov dl, byte ptr [esi+2] 803 mov word ptr [edi], bx 804 mov byte ptr [edi+2], dl 805 jmp BltRecEnd 806 Rec3_01: 807 test edx,edx 808 jz BltRecEnd 809 mov bx, word ptr [esi] 810 mov dl, byte ptr [esi+2] 811 mov word ptr [edi], bx 812 mov byte ptr [edi+2], dl 813 jmp BltRecEnd 814 815 ; 4 Pixel Wide 816 817 Rec4: 818 cmp edx,4 819 jb Rec4_0123 820 mov ebx, dword ptr [esi] 821 add esi,eax 822 mov dword ptr [edi], ebx 823 add edi,ecx 824 mov ebx, dword ptr [esi] 825 add esi,eax 826 mov dword ptr [edi], ebx 827 add edi,ecx 828 mov ebx, dword ptr [esi] 829 add esi,eax 830 mov dword ptr [edi], ebx 831 add edi,ecx 832 mov ebx, dword ptr [esi] 833 add esi,eax 834 mov dword ptr [edi], ebx 835 add edi,ecx 836 sub edx ,4 837 jnz Rec4 838 jmp BltRecEnd 839 840 Rec4_0123: 841 cmp edx,2 842 jz Rec2_2 843 jb Rec2_01 844 ;3 lines left 845 mov ebx, dword ptr [esi] 846 add esi,eax 847 mov dword ptr [edi], ebx 848 add edi,ecx 849 mov ebx, dword ptr [esi] 850 add esi,eax 851 mov dword ptr [edi], ebx 852 add edi,ecx 853 mov ebx, dword ptr [esi] 854 mov dword ptr [edi], ebx 855 jmp BltRecEnd 856 Rec4_2: 857 mov ebx, dword ptr [esi] 858 add esi,eax 859 mov dword ptr [edi], ebx 860 add edi,ecx 861 mov ebx, dword ptr [esi] 862 mov dword ptr [edi], ebx 863 jmp BltRecEnd 864 Rec4_01: 865 test edx,edx 866 jz BltRecEnd 867 mov ebx, dword ptr [esi] 868 mov dword ptr [edi], ebx 869 jmp BltRecEnd 870 871 ; 5 Pixel Wide 872 873 Rec5: 874 cmp edx,4 875 jb Rec5_0123 876 push edx 877 mov ebx, dword ptr [esi] 878 mov dl, byte ptr [esi+4] 879 add esi,eax 880 mov dword ptr [edi], ebx 881 mov byte ptr [edi+4], dl 882 add edi,ecx 883 mov ebx, dword ptr [esi] 884 mov dl, byte ptr [esi+4] 885 add esi,eax 886 mov dword ptr [edi], ebx 887 mov byte ptr [edi+4], dl 888 add edi,ecx 889 mov ebx, dword ptr [esi] 890 mov dl, byte ptr [esi+4] 891 add esi,eax 892 mov dword ptr [edi], ebx 893 mov byte ptr [edi+4], dl 894 add edi,ecx 895 mov ebx, dword ptr [esi] 896 mov dl, byte ptr [esi+4] 897 add esi,eax 898 mov dword ptr [edi], ebx 899 mov byte ptr [edi+4], dl 900 add edi,ecx 901 pop edx 902 sub edx ,4 903 jnz Rec5 904 jmp BltRecEnd 905 Rec5_0123: 906 cmp edx,2 907 jz Rec5_2 908 jb Rec5_01 909 ; Must be 3 lines left 910 mov ebx, dword ptr [esi] 911 mov dl, byte ptr [esi+4] 912 add esi,eax 913 mov dword ptr [edi], ebx 914 mov byte ptr [edi+4], dl 915 add edi,ecx 916 mov ebx, dword ptr [esi] 917 mov dl, byte ptr [esi+4] 918 add esi,eax 919 mov dword ptr [edi], ebx 920 mov byte ptr [edi+4], dl 921 add edi,ecx 922 mov ebx, dword ptr [esi] 923 mov dl, byte ptr [esi+4] 924 mov dword ptr [edi], ebx 925 mov byte ptr [edi+4], dl 926 jmp BltRecEnd 927 Rec5_2: 928 mov ebx, dword ptr [esi] 929 mov dl, byte ptr [esi+4] 930 add esi,eax 931 mov dword ptr [edi], ebx 932 mov byte ptr [edi+4], dl 933 add edi,ecx 934 mov ebx, dword ptr [esi] 935 mov dl, byte ptr [esi+4] 936 mov dword ptr [edi], ebx 937 mov byte ptr [edi+4], dl 938 jmp BltRecEnd 939 Rec5_01: 940 test edx,edx 941 jz BltRecEnd 942 mov ebx, dword ptr [esi] 943 mov dl, byte ptr [esi+4] 944 mov dword ptr [edi], ebx 945 mov byte ptr [edi+4], dl 946 jmp BltRecEnd 947 948 ; 6 Pixel Wide 949 950 Rec6: 951 cmp edx,4 952 jb Rec6_0123 953 push edx 954 mov ebx, dword ptr [esi] 955 mov dx, word ptr [esi+4] 956 add esi,eax 957 mov dword ptr [edi], ebx 958 mov word ptr [edi+4], dx 959 add edi,ecx 960 mov ebx, dword ptr [esi] 961 mov dx, word ptr [esi+4] 962 add esi,eax 963 mov dword ptr [edi], ebx 964 mov word ptr [edi+4], dx 965 add edi,ecx 966 mov ebx, dword ptr [esi] 967 mov dx, word ptr [esi+4] 968 add esi,eax 969 mov dword ptr [edi], ebx 970 mov word ptr [edi+4], dx 971 add edi,ecx 972 mov ebx, dword ptr [esi] 973 mov dx, word ptr [esi+4] 974 add esi,eax 975 mov dword ptr [edi], ebx 976 mov word ptr [edi+4], dx 977 add edi,ecx 978 pop edx 979 sub edx ,4 980 jnz Rec6 981 jmp BltRecEnd 982 Rec6_0123: 983 cmp edx,2 984 jz Rec6_2 985 jb Rec6_01 986 ; Must be 3 lines left 987 mov ebx, dword ptr [esi] 988 mov dx, word ptr [esi+4] 989 add esi,eax 990 mov dword ptr [edi], ebx 991 mov word ptr [edi+4], dx 992 add edi,ecx 993 mov ebx, dword ptr [esi] 994 mov dx, word ptr [esi+4] 995 add esi,eax 996 mov dword ptr [edi], ebx 997 mov word ptr [edi+4], dx 998 add edi,ecx 999 mov ebx, dword ptr [esi] 1000 mov dx, word ptr [esi+4] 1001 mov dword ptr [edi], ebx 1002 mov word ptr [edi+4], dx 1003 jmp BltRecEnd 1004 Rec6_2: 1005 mov ebx, dword ptr [esi] 1006 mov dx, word ptr [esi+4] 1007 add esi,eax 1008 mov dword ptr [edi], ebx 1009 mov word ptr [edi+4], dx 1010 add edi,ecx 1011 mov ebx, dword ptr [esi] 1012 mov dx, word ptr [esi+4] 1013 mov dword ptr [edi], ebx 1014 mov word ptr [edi+4], dx 1015 jmp BltRecEnd 1016 Rec6_01: 1017 test edx,edx 1018 jz BltRecEnd 1019 mov ebx, dword ptr [esi] 1020 mov dx, word ptr [esi+4] 1021 mov dword ptr [edi], ebx 1022 mov word ptr [edi+4], dx 1023 jmp BltRecEnd 1024 1025 ; 7 Pixel Wide 1026 1027 Rec7: 1028 cmp edx,4 1029 jb Rec6_0123 1030 push edx 1031 mov ebx, dword ptr [esi] 1032 mov dx, word ptr [esi+4] 1033 mov dword ptr [edi], ebx 1034 mov word ptr [edi+4], dx 1035 mov bl, byte ptr[esi+6] 1036 add esi,eax 1037 mov byte ptr[edi+6],bl 1038 add edi,ecx 1039 xor ebx,ebx ; clear ebx to avoid stalls 1040 mov ebx, dword ptr [esi] 1041 mov dx, word ptr [esi+4] 1042 mov dword ptr [edi], ebx 1043 mov word ptr [edi+4], dx 1044 mov bl, byte ptr[esi+6] 1045 add esi,eax 1046 mov byte ptr[edi+6],bl 1047 add edi,ecx 1048 xor ebx,ebx ; clear ebx to avoid stalls 1049 mov ebx, dword ptr [esi] 1050 mov dx, word ptr [esi+4] 1051 mov dword ptr [edi], ebx 1052 mov word ptr [edi+4], dx 1053 mov bl, byte ptr[esi+6] 1054 add esi,eax 1055 mov byte ptr[edi+6],bl 1056 add edi,ecx 1057 xor ebx,ebx ; clear ebx to avoid stalls 1058 mov ebx, dword ptr [esi] 1059 mov dx, word ptr [esi+4] 1060 mov dword ptr [edi], ebx 1061 mov word ptr [edi+4], dx 1062 mov bl, byte ptr[esi+6] 1063 add esi,eax 1064 mov byte ptr[edi+6],bl 1065 add edi,ecx 1066 xor ebx,ebx ; clear ebx to avoid stalls 1067 pop edx 1068 sub edx ,4 1069 jnz Rec7 1070 jmp BltRecEnd 1071 Rec7_0123: 1072 cmp edx,2 1073 jz Rec7_2 1074 jb Rec7_01 1075 ; Must be 3 lines left 1076 mov ebx, dword ptr [esi] 1077 mov dx, word ptr [esi+4] 1078 mov dword ptr [edi], ebx 1079 mov word ptr [edi+4], dx 1080 mov bl, byte ptr[esi+6] 1081 add esi,eax 1082 mov byte ptr[edi+6],bl 1083 add edi,ecx 1084 xor ebx,ebx ; clear ebx to avoid stalls 1085 mov ebx, dword ptr [esi] 1086 mov dx, word ptr [esi+4] 1087 mov dword ptr [edi], ebx 1088 mov word ptr [edi+4], dx 1089 mov bl, byte ptr[esi+6] 1090 add esi,eax 1091 mov byte ptr[edi+6],bl 1092 add edi,ecx 1093 xor ebx,ebx ; clear ebx to avoid stalls 1094 mov ebx, dword ptr [esi] 1095 mov dx, word ptr [esi+4] 1096 mov dword ptr [edi], ebx 1097 mov word ptr [edi+4], dx 1098 mov bl, byte ptr[esi+6] 1099 mov byte ptr[edi+6],bl 1100 jmp BltRecEnd 1101 Rec7_2: 1102 mov ebx, dword ptr [esi] 1103 mov dx, word ptr [esi+4] 1104 mov dword ptr [edi], ebx 1105 mov word ptr [edi+4], dx 1106 mov bl, byte ptr[esi+6] 1107 add esi,eax 1108 mov byte ptr[edi+6],bl 1109 add edi,ecx 1110 xor ebx,ebx ; clear ebx to avoid stalls 1111 mov ebx, dword ptr [esi] 1112 mov dx, word ptr [esi+4] 1113 mov dword ptr [edi], ebx 1114 mov word ptr [edi+4], dx 1115 mov bl, byte ptr[esi+6] 1116 mov byte ptr[edi+6],bl 1117 jmp BltRecEnd 1118 Rec7_01: 1119 test edx,edx 1120 jz BltRecEnd 1121 mov ebx, dword ptr [esi] 1122 mov dx, word ptr [esi+4] 1123 mov dword ptr [edi], ebx 1124 mov word ptr [edi+4], dx 1125 mov bl, byte ptr[esi+6] 1126 mov byte ptr[edi+6],bl 1127 jmp BltRecEnd 1128 1129 ; 8 Pixel Wide 1130 1131 Rec8: 1132 cmp edx,4 1133 jb Rec8_0123 1134 push edx 1135 mov ebx, dword ptr [esi] 1136 mov edx, dword ptr [esi+4] 1137 mov dword ptr [edi], ebx 1138 mov dword ptr [edi+4], edx 1139 add esi,eax 1140 add edi,ecx 1141 mov ebx, dword ptr [esi] 1142 mov edx, dword ptr [esi+4] 1143 mov dword ptr [edi], ebx 1144 mov dword ptr [edi+4], edx 1145 add esi,eax 1146 add edi,ecx 1147 mov ebx, dword ptr [esi] 1148 mov edx, dword ptr [esi+4] 1149 mov dword ptr [edi], ebx 1150 mov dword ptr [edi+4], edx 1151 add esi,eax 1152 add edi,ecx 1153 mov ebx, dword ptr [esi] 1154 mov edx, dword ptr [esi+4] 1155 mov dword ptr [edi], ebx 1156 mov dword ptr [edi+4], edx 1157 add esi,eax 1158 add edi,ecx 1159 pop edx 1160 sub edx ,4 1161 jnz Rec8 1162 jmp BltRecEnd 1163 1164 Rec8_0123: 1165 cmp edx,2 1166 jz Rec8_2 1167 jb Rec8_01 1168 ;3 lines left 1169 mov ebx, dword ptr [esi] 1170 mov edx, dword ptr [esi+4] 1171 mov dword ptr [edi], ebx 1172 mov dword ptr [edi+4], edx 1173 add esi,eax 1174 add edi,ecx 1175 mov ebx, dword ptr [esi] 1176 mov edx, dword ptr [esi+4] 1177 mov dword ptr [edi], ebx 1178 mov dword ptr [edi+4], edx 1179 add esi,eax 1180 add edi,ecx 1181 mov ebx, dword ptr [esi] 1182 mov edx, dword ptr [esi+4] 1183 mov dword ptr [edi], ebx 1184 mov dword ptr [edi+4], edx 1185 jmp BltRecEnd 1186 Rec8_2: 1187 mov ebx, dword ptr [esi] 1188 mov edx, dword ptr [esi+4] 1189 mov dword ptr [edi], ebx 1190 mov dword ptr [edi+4], edx 1191 add esi,eax 1192 add edi,ecx 1193 mov ebx, dword ptr [esi] 1194 mov edx, dword ptr [esi+4] 1195 mov dword ptr [edi], ebx 1196 mov dword ptr [edi+4], edx 1197 jmp BltRecEnd 1198 Rec8_01: 1199 test edx,edx 1200 jz BltRecEnd 1201 mov ebx, dword ptr [esi] 1202 mov edx, dword ptr [esi+4] 1203 mov dword ptr [edi], ebx 1204 mov dword ptr [edi+4], edx 1205 jmp BltRecEnd 1206 1207 ; 9 Pixel Wide 1208 1209 Rec9: 1210 cmp edx,4 1211 jb Rec9_0123 1212 push edx 1213 FLD QWORD PTR [ESI] 1214 mov bl, byte ptr [esi+8] 1215 FSTP QWORD PTR [EDI] 1216 mov byte ptr [edi+8], bl 1217 add esi,eax 1218 add edi,ecx 1219 FLD QWORD PTR [ESI] 1220 mov bl, byte ptr [esi+8] 1221 FSTP QWORD PTR [EDI] 1222 mov byte ptr [edi+8], bl 1223 add esi,eax 1224 add edi,ecx 1225 FLD QWORD PTR [ESI] 1226 mov bl, byte ptr [esi+8] 1227 FSTP QWORD PTR [EDI] 1228 mov byte ptr [edi+8], bl 1229 add esi,eax 1230 add edi,ecx 1231 FLD QWORD PTR [ESI] 1232 mov bl, byte ptr [esi+8] 1233 FSTP QWORD PTR [EDI] 1234 mov byte ptr [edi+8], bl 1235 add esi,eax 1236 add edi,ecx 1237 pop edx 1238 sub edx ,4 1239 jnz Rec9 1240 jmp BltRecEnd 1241 1242 Rec9_0123: 1243 cmp edx,2 1244 jz Rec9_2 1245 jb Rec9_01 1246 ;3 lines left 1247 FLD QWORD PTR [ESI] 1248 mov bl, byte ptr [esi+8] 1249 FSTP QWORD PTR [EDI] 1250 mov byte ptr [edi+8], bl 1251 add esi,eax 1252 add edi,ecx 1253 FLD QWORD PTR [ESI] 1254 mov bl, byte ptr [esi+8] 1255 FSTP QWORD PTR [EDI] 1256 mov byte ptr [edi+8], bl 1257 add esi,eax 1258 add edi,ecx 1259 FLD QWORD PTR [ESI] 1260 mov bl, byte ptr [esi+8] 1261 FSTP QWORD PTR [EDI] 1262 mov byte ptr [edi+8], bl 1263 jmp BltRecEnd 1264 Rec9_2: 1265 FLD QWORD PTR [ESI] 1266 mov bl, byte ptr [esi+8] 1267 FSTP QWORD PTR [EDI] 1268 mov byte ptr [edi+8], bl 1269 add esi,eax 1270 add edi,ecx 1271 FLD QWORD PTR [ESI] 1272 mov bl, byte ptr [esi+8] 1273 FSTP QWORD PTR [EDI] 1274 mov byte ptr [edi+8], bl 1275 jmp BltRecEnd 1276 Rec9_01: 1277 test edx,edx 1278 jz BltRecEnd 1279 FLD QWORD PTR [ESI] 1280 mov bl, byte ptr [esi+8] 1281 FSTP QWORD PTR [EDI] 1282 mov byte ptr [edi+8], bl 1283 jmp BltRecEnd 1284 1285 ; 10 Pixel Wide 1286 1287 Rec10: 1288 cmp edx,4 1289 jb Rec10_0123 1290 FLD QWORD PTR [ESI] 1291 mov bx, word ptr [esi+8] 1292 FSTP QWORD PTR [EDI] 1293 mov word ptr [edi+8], bx 1294 add esi,eax 1295 add edi,ecx 1296 FLD QWORD PTR [ESI] 1297 mov bx, word ptr [esi+8] 1298 FSTP QWORD PTR [EDI] 1299 mov word ptr [edi+8], bx 1300 add esi,eax 1301 add edi,ecx 1302 FLD QWORD PTR [ESI] 1303 mov bx, word ptr [esi+8] 1304 FSTP QWORD PTR [EDI] 1305 mov word ptr [edi+8], bx 1306 add esi,eax 1307 add edi,ecx 1308 FLD QWORD PTR [ESI] 1309 mov bx, word ptr [esi+8] 1310 FSTP QWORD PTR [EDI] 1311 mov word ptr [edi+8], bx 1312 add esi,eax 1313 add edi,ecx 1314 sub edx ,4 1315 jnz Rec10 1316 jmp BltRecEnd 1317 1318 Rec10_0123: 1319 cmp edx,2 1320 jz Rec10_2 1321 jb Rec10_01 1322 ;3 lines left 1323 FLD QWORD PTR [ESI] 1324 mov bx, word ptr [esi+8] 1325 FSTP QWORD PTR [EDI] 1326 mov word ptr [edi+8], bx 1327 add esi,eax 1328 add edi,ecx 1329 FLD QWORD PTR [ESI] 1330 mov bx, word ptr [esi+8] 1331 FSTP QWORD PTR [EDI] 1332 mov word ptr [edi+8], bx 1333 add esi,eax 1334 add edi,ecx 1335 FLD QWORD PTR [ESI] 1336 mov bx, word ptr [esi+8] 1337 FSTP QWORD PTR [EDI] 1338 mov word ptr [edi+8], bx 1339 jmp BltRecEnd 1340 Rec10_2: 1341 FLD QWORD PTR [ESI] 1342 mov bx, word ptr [esi+8] 1343 FSTP QWORD PTR [EDI] 1344 mov word ptr [edi+8], bx 1345 add esi,eax 1346 add edi,ecx 1347 FLD QWORD PTR [ESI] 1348 mov bx, word ptr [esi+8] 1349 FSTP QWORD PTR [EDI] 1350 mov word ptr [edi+8], bx 1351 jmp BltRecEnd 1352 Rec10_01: 1353 test edx,edx 1354 jz BltRecEnd 1355 FLD QWORD PTR [ESI] 1356 mov bx, word ptr [esi+8] 1357 FSTP QWORD PTR [EDI] 1358 mov word ptr [edi+8], bx 1359 jmp BltRecEnd 1360 1361 ; 11 Pixel Wide 1362 1363 Rec11: 1364 cmp edx,4 1365 jb Rec11_0123 1366 push edx 1367 FLD QWORD PTR [ESI] 1368 mov bx, word ptr [esi+8] 1369 mov dl, byte ptr [esi+10] 1370 FSTP QWORD PTR [EDI] 1371 mov word ptr [edi+8], bx 1372 mov byte ptr [edi+10], dl 1373 add esi,eax 1374 add edi,ecx 1375 FLD QWORD PTR [ESI] 1376 mov bx, word ptr [esi+8] 1377 mov dl, byte ptr [esi+10] 1378 FSTP QWORD PTR [EDI] 1379 mov word ptr [edi+8], bx 1380 mov byte ptr [edi+10], dl 1381 add esi,eax 1382 add edi,ecx 1383 FLD QWORD PTR [ESI] 1384 mov bx, word ptr [esi+8] 1385 mov dl, byte ptr [esi+10] 1386 FSTP QWORD PTR [EDI] 1387 mov word ptr [edi+8], bx 1388 mov byte ptr [edi+10], dl 1389 add esi,eax 1390 add edi,ecx 1391 FLD QWORD PTR [ESI] 1392 mov bx, word ptr [esi+8] 1393 mov dl, byte ptr [esi+10] 1394 FSTP QWORD PTR [EDI] 1395 mov word ptr [edi+8], bx 1396 mov byte ptr [edi+10], dl 1397 add esi,eax 1398 add edi,ecx 1399 pop edx 1400 sub edx ,4 1401 jnz Rec10 1402 jmp BltRecEnd 1403 1404 Rec11_0123: 1405 cmp edx,2 1406 jz Rec11_2 1407 jb Rec11_01 1408 ;3 lines left 1409 FLD QWORD PTR [ESI] 1410 mov bx, word ptr [esi+8] 1411 mov dl, byte ptr [esi+10] 1412 FSTP QWORD PTR [EDI] 1413 mov word ptr [edi+8], bx 1414 mov byte ptr [edi+10], dl 1415 add esi,eax 1416 add edi,ecx 1417 FLD QWORD PTR [ESI] 1418 mov bx, word ptr [esi+8] 1419 mov dl, byte ptr [esi+10] 1420 FSTP QWORD PTR [EDI] 1421 mov word ptr [edi+8], bx 1422 mov byte ptr [edi+10], dl 1423 add esi,eax 1424 add edi,ecx 1425 FLD QWORD PTR [ESI] 1426 mov bx, word ptr [esi+8] 1427 mov dl, byte ptr [esi+10] 1428 FSTP QWORD PTR [EDI] 1429 mov word ptr [edi+8], bx 1430 mov byte ptr [edi+10], dl 1431 jmp BltRecEnd 1432 Rec11_2: 1433 FLD QWORD PTR [ESI] 1434 mov bx, word ptr [esi+8] 1435 mov dl, byte ptr [esi+10] 1436 FSTP QWORD PTR [EDI] 1437 mov word ptr [edi+8], bx 1438 mov byte ptr [edi+10], dl 1439 add esi,eax 1440 add edi,ecx 1441 FLD QWORD PTR [ESI] 1442 mov bx, word ptr [esi+8] 1443 mov dl, byte ptr [esi+10] 1444 FSTP QWORD PTR [EDI] 1445 mov word ptr [edi+8], bx 1446 mov byte ptr [edi+10], dl 1447 jmp BltRecEnd 1448 Rec11_01: 1449 test edx,edx 1450 jz BltRecEnd 1451 FLD QWORD PTR [ESI] 1452 mov bx, word ptr [esi+8] 1453 mov dl, byte ptr [esi+10] 1454 FSTP QWORD PTR [EDI] 1455 mov word ptr [edi+8], bx 1456 mov byte ptr [edi+10], dl 1457 jmp BltRecEnd 1458 1459 ; 12 Pixel Wide 1460 1461 Rec12: 1462 cmp edx,4 1463 jb Rec12_0123 1464 FLD QWORD PTR [ESI] 1465 mov ebx, dword ptr [esi+8] 1466 FSTP QWORD PTR [EDI] 1467 mov dword ptr [edi+8], ebx 1468 add esi,eax 1469 add edi,ecx 1470 FLD QWORD PTR [ESI] 1471 mov ebx, dword ptr [esi+8] 1472 FSTP QWORD PTR [EDI] 1473 mov dword ptr [edi+8], ebx 1474 add esi,eax 1475 add edi,ecx 1476 FLD QWORD PTR [ESI] 1477 mov ebx, dword ptr [esi+8] 1478 FSTP QWORD PTR [EDI] 1479 mov dword ptr [edi+8], ebx 1480 add esi,eax 1481 add edi,ecx 1482 FLD QWORD PTR [ESI] 1483 mov ebx, dword ptr [esi+8] 1484 FSTP QWORD PTR [EDI] 1485 mov dword ptr [edi+8], ebx 1486 add esi,eax 1487 add edi,ecx 1488 sub edx ,4 1489 jnz Rec12 1490 jmp BltRecEnd 1491 1492 Rec12_0123: 1493 cmp edx,2 1494 jz Rec12_2 1495 jb Rec12_01 1496 ;3 lines left 1497 FLD QWORD PTR [ESI] 1498 mov ebx, dword ptr [esi+8] 1499 FSTP QWORD PTR [EDI] 1500 mov dword ptr [edi+8], ebx 1501 add esi,eax 1502 add edi,ecx 1503 FLD QWORD PTR [ESI] 1504 mov ebx, dword ptr [esi+8] 1505 FSTP QWORD PTR [EDI] 1506 mov dword ptr [edi+8], ebx 1507 add esi,eax 1508 add edi,ecx 1509 FLD QWORD PTR [ESI] 1510 mov ebx, dword ptr [esi+8] 1511 FSTP QWORD PTR [EDI] 1512 mov dword ptr [edi+8], ebx 1513 jmp BltRecEnd 1514 Rec12_2: 1515 FLD QWORD PTR [ESI] 1516 mov ebx, dword ptr [esi+8] 1517 FSTP QWORD PTR [EDI] 1518 mov dword ptr [edi+8], ebx 1519 add esi,eax 1520 add edi,ecx 1521 FLD QWORD PTR [ESI] 1522 mov ebx, dword ptr [esi+8] 1523 FSTP QWORD PTR [EDI] 1524 mov dword ptr [edi+8], ebx 1525 jmp BltRecEnd 1526 Rec12_01: 1527 test edx,edx 1528 jz BltRecEnd 1529 FLD QWORD PTR [ESI] 1530 mov ebx, dword ptr [esi+8] 1531 FSTP QWORD PTR [EDI] 1532 mov dword ptr [edi+8], ebx 1533 jmp BltRecEnd 1534 1535 ; 13 Pixel Wide 1536 1537 Rec13: 1538 cmp edx,4 1539 jb Rec13_0123 1540 push edx 1541 FLD QWORD PTR [ESI] 1542 mov ebx, dword ptr [esi+8] 1543 mov dl, byte ptr [esi+12] 1544 FSTP QWORD PTR [EDI] 1545 mov dword ptr [edi+8], ebx 1546 mov byte ptr [edi+12], dl 1547 add esi,eax 1548 add edi,ecx 1549 FLD QWORD PTR [ESI] 1550 mov ebx, dword ptr [esi+8] 1551 mov dl, byte ptr [esi+12] 1552 FSTP QWORD PTR [EDI] 1553 mov dword ptr [edi+8], ebx 1554 mov byte ptr [edi+12], dl 1555 add esi,eax 1556 add edi,ecx 1557 FLD QWORD PTR [ESI] 1558 mov ebx, dword ptr [esi+8] 1559 mov dl, byte ptr [esi+12] 1560 FSTP QWORD PTR [EDI] 1561 mov dword ptr [edi+8], ebx 1562 mov byte ptr [edi+12], dl 1563 add esi,eax 1564 add edi,ecx 1565 FLD QWORD PTR [ESI] 1566 mov ebx, dword ptr [esi+8] 1567 mov dl, byte ptr [esi+12] 1568 FSTP QWORD PTR [EDI] 1569 mov dword ptr [edi+8], ebx 1570 mov byte ptr [edi+12], dl 1571 add esi,eax 1572 add edi,ecx 1573 pop edx 1574 sub edx ,4 1575 jnz Rec13 1576 jmp BltRecEnd 1577 1578 Rec13_0123: 1579 cmp edx,2 1580 jz Rec13_2 1581 jb Rec13_01 1582 ;3 lines left 1583 FLD QWORD PTR [ESI] 1584 mov ebx, dword ptr [esi+8] 1585 mov dl, byte ptr [esi+12] 1586 FSTP QWORD PTR [EDI] 1587 mov dword ptr [edi+8], ebx 1588 mov byte ptr [edi+12], dl 1589 add esi,eax 1590 add edi,ecx 1591 FLD QWORD PTR [ESI] 1592 mov ebx, dword ptr [esi+8] 1593 mov dl, byte ptr [esi+12] 1594 FSTP QWORD PTR [EDI] 1595 mov dword ptr [edi+8], ebx 1596 mov byte ptr [edi+12], dl 1597 add esi,eax 1598 add edi,ecx 1599 FLD QWORD PTR [ESI] 1600 mov ebx, dword ptr [esi+8] 1601 mov dl, byte ptr [esi+12] 1602 FSTP QWORD PTR [EDI] 1603 mov dword ptr [edi+8], ebx 1604 mov byte ptr [edi+12], dl 1605 jmp BltRecEnd 1606 Rec13_2: 1607 FLD QWORD PTR [ESI] 1608 mov ebx, dword ptr [esi+8] 1609 mov dl, byte ptr [esi+12] 1610 FSTP QWORD PTR [EDI] 1611 mov dword ptr [edi+8], ebx 1612 mov byte ptr [edi+12], dl 1613 add esi,eax 1614 add edi,ecx 1615 FLD QWORD PTR [ESI] 1616 mov ebx, dword ptr [esi+8] 1617 mov dl, byte ptr [esi+12] 1618 FSTP QWORD PTR [EDI] 1619 mov dword ptr [edi+8], ebx 1620 mov byte ptr [edi+12], dl 1621 jmp BltRecEnd 1622 Rec13_01: 1623 test edx,edx 1624 jz BltRecEnd 1625 FLD QWORD PTR [ESI] 1626 mov ebx, dword ptr [esi+8] 1627 mov dl, byte ptr [esi+12] 1628 FSTP QWORD PTR [EDI] 1629 mov dword ptr [edi+8], ebx 1630 mov byte ptr [edi+12], dl 1631 jmp BltRecEnd 1632 1633 ; 14 Pixel Wide 1634 1635 Rec14: 1636 cmp edx,4 1637 jb Rec14_0123 1638 push edx 1639 FLD QWORD PTR [ESI] 1640 mov ebx, dword ptr [esi+8] 1641 mov dx, word ptr [esi+12] 1642 FSTP QWORD PTR [EDI] 1643 mov dword ptr [edi+8], ebx 1644 mov word ptr [edi+12], dx 1645 add esi,eax 1646 add edi,ecx 1647 FLD QWORD PTR [ESI] 1648 mov ebx, dword ptr [esi+8] 1649 mov dx, word ptr [esi+12] 1650 FSTP QWORD PTR [EDI] 1651 mov dword ptr [edi+8], ebx 1652 mov word ptr [edi+12], dx 1653 add esi,eax 1654 add edi,ecx 1655 FLD QWORD PTR [ESI] 1656 mov ebx, dword ptr [esi+8] 1657 mov dx, word ptr [esi+12] 1658 FSTP QWORD PTR [EDI] 1659 mov dword ptr [edi+8], ebx 1660 mov word ptr [edi+12], dx 1661 add esi,eax 1662 add edi,ecx 1663 FLD QWORD PTR [ESI] 1664 mov ebx, dword ptr [esi+8] 1665 mov dx, word ptr [esi+12] 1666 FSTP QWORD PTR [EDI] 1667 mov dword ptr [edi+8], ebx 1668 mov word ptr [edi+12], dx 1669 add esi,eax 1670 add edi,ecx 1671 pop edx 1672 sub edx ,4 1673 jnz Rec14 1674 jmp BltRecEnd 1675 1676 Rec14_0123: 1677 cmp edx,2 1678 jz Rec14_2 1679 jb Rec14_01 1680 ;3 lines left 1681 FLD QWORD PTR [ESI] 1682 mov ebx, dword ptr [esi+8] 1683 mov dx, word ptr [esi+12] 1684 FSTP QWORD PTR [EDI] 1685 mov dword ptr [edi+8], ebx 1686 mov word ptr [edi+12], dx 1687 add esi,eax 1688 add edi,ecx 1689 FLD QWORD PTR [ESI] 1690 mov ebx, dword ptr [esi+8] 1691 mov dx, word ptr [esi+12] 1692 FSTP QWORD PTR [EDI] 1693 mov dword ptr [edi+8], ebx 1694 mov word ptr [edi+12], dx 1695 add esi,eax 1696 add edi,ecx 1697 FLD QWORD PTR [ESI] 1698 mov ebx, dword ptr [esi+8] 1699 mov dx, word ptr [esi+12] 1700 FSTP QWORD PTR [EDI] 1701 mov dword ptr [edi+8], ebx 1702 mov word ptr [edi+12], dx 1703 jmp BltRecEnd 1704 Rec14_2: 1705 FLD QWORD PTR [ESI] 1706 mov ebx, dword ptr [esi+8] 1707 mov dx, word ptr [esi+12] 1708 FSTP QWORD PTR [EDI] 1709 mov dword ptr [edi+8], ebx 1710 mov word ptr [edi+12], dx 1711 add esi,eax 1712 add edi,ecx 1713 FLD QWORD PTR [ESI] 1714 mov ebx, dword ptr [esi+8] 1715 mov dx, word ptr [esi+12] 1716 FSTP QWORD PTR [EDI] 1717 mov dword ptr [edi+8], ebx 1718 mov word ptr [edi+12], dx 1719 jmp BltRecEnd 1720 Rec14_01: 1721 test edx,edx 1722 jz BltRecEnd 1723 FLD QWORD PTR [ESI] 1724 mov ebx, dword ptr [esi+8] 1725 mov dx, word ptr [esi+12] 1726 FSTP QWORD PTR [EDI] 1727 mov dword ptr [edi+8], ebx 1728 mov word ptr [edi+12], dx 1729 jmp BltRecEnd 1730 1731 ; 15 Pixel Wide 1732 1733 Rec15: 1734 cmp edx,4 1735 jb Rec15_0123 1736 push edx 1737 FLD QWORD PTR [ESI] 1738 mov ebx, dword ptr [esi+8] 1739 mov dx, word ptr [esi+12] 1740 FSTP QWORD PTR [EDI] 1741 mov dword ptr [edi+8], ebx 1742 mov bl, byte ptr[esi+14] 1743 mov word ptr [edi+12], dx 1744 add esi,eax 1745 mov byte ptr[edi+14], bl 1746 add edi,ecx 1747 FLD QWORD PTR [ESI] 1748 mov ebx, dword ptr [esi+8] 1749 mov dx, word ptr [esi+12] 1750 FSTP QWORD PTR [EDI] 1751 mov dword ptr [edi+8], ebx 1752 mov bl, byte ptr[esi+14] 1753 mov word ptr [edi+12], dx 1754 add esi,eax 1755 mov byte ptr[edi+14], bl 1756 add edi,ecx 1757 FLD QWORD PTR [ESI] 1758 mov ebx, dword ptr [esi+8] 1759 mov dx, word ptr [esi+12] 1760 FSTP QWORD PTR [EDI] 1761 mov dword ptr [edi+8], ebx 1762 mov bl, byte ptr[esi+14] 1763 mov word ptr [edi+12], dx 1764 add esi,eax 1765 mov byte ptr[edi+14], bl 1766 add edi,ecx 1767 FLD QWORD PTR [ESI] 1768 mov ebx, dword ptr [esi+8] 1769 mov dx, word ptr [esi+12] 1770 FSTP QWORD PTR [EDI] 1771 mov dword ptr [edi+8], ebx 1772 mov bl, byte ptr[esi+14] 1773 mov word ptr [edi+12], dx 1774 add esi,eax 1775 mov byte ptr[edi+14], bl 1776 add edi,ecx 1777 pop edx 1778 sub edx ,4 1779 jnz Rec15 1780 jmp BltRecEnd 1781 1782 Rec15_0123: 1783 cmp edx,2 1784 jz Rec15_2 1785 jb Rec15_01 1786 ;3 lines left 1787 FLD QWORD PTR [ESI] 1788 mov ebx, dword ptr [esi+8] 1789 mov dx, word ptr [esi+12] 1790 FSTP QWORD PTR [EDI] 1791 mov dword ptr [edi+8], ebx 1792 mov bl, byte ptr[esi+14] 1793 mov word ptr [edi+12], dx 1794 add esi,eax 1795 mov byte ptr[edi+14], bl 1796 add edi,ecx 1797 FLD QWORD PTR [ESI] 1798 mov ebx, dword ptr [esi+8] 1799 mov dx, word ptr [esi+12] 1800 FSTP QWORD PTR [EDI] 1801 mov dword ptr [edi+8], ebx 1802 mov bl, byte ptr[esi+14] 1803 mov word ptr [edi+12], dx 1804 add esi,eax 1805 mov byte ptr[edi+14], bl 1806 add edi,ecx 1807 FLD QWORD PTR [ESI] 1808 mov ebx, dword ptr [esi+8] 1809 mov dx, word ptr [esi+12] 1810 FSTP QWORD PTR [EDI] 1811 mov dword ptr [edi+8], ebx 1812 mov bl, byte ptr[esi+14] 1813 mov word ptr [edi+12], dx 1814 mov byte ptr[edi+14], bl 1815 jmp BltRecEnd 1816 Rec15_2: 1817 FLD QWORD PTR [ESI] 1818 mov ebx, dword ptr [esi+8] 1819 mov dx, word ptr [esi+12] 1820 FSTP QWORD PTR [EDI] 1821 mov dword ptr [edi+8], ebx 1822 mov bl, byte ptr[esi+14] 1823 mov word ptr [edi+12], dx 1824 add esi,eax 1825 mov byte ptr[edi+14], bl 1826 add edi,ecx 1827 FLD QWORD PTR [ESI] 1828 mov ebx, dword ptr [esi+8] 1829 mov dx, word ptr [esi+12] 1830 FSTP QWORD PTR [EDI] 1831 mov dword ptr [edi+8], ebx 1832 mov bl, byte ptr[esi+14] 1833 mov word ptr [edi+12], dx 1834 mov byte ptr[edi+14], bl 1835 jmp BltRecEnd 1836 Rec15_01: 1837 test edx,edx 1838 jz BltRecEnd 1839 FLD QWORD PTR [ESI] 1840 mov ebx, dword ptr [esi+8] 1841 mov dx, word ptr [esi+12] 1842 FSTP QWORD PTR [EDI] 1843 mov dword ptr [edi+8], ebx 1844 mov bl, byte ptr[esi+14] 1845 mov word ptr [edi+12], dx 1846 mov byte ptr[edi+14], bl 1847 jmp BltRecEnd 1848 1849 1850 ComplexBlt: 1851 ; Blit first the even rect then the rest 1852 1853 push dword ptr [ebp+28] ; ulSrcPitch 1854 push dword ptr [ebp+24] ; ulDestPitch 1855 push edx 1856 shl ecx,4 1857 push ecx 1858 push esi 1859 push edi 1860 call _BltRec 1861 sub esp,24 1862 add esi,ecx 1863 add edi,ecx 1864 push dword ptr [ebp+28] ; ulSrcPitch 1865 push dword ptr [ebp+24] ; ulDestPitch 1866 push edx 1867 push ebx 1868 push esi 1869 push edi 1870 call _BltRec 1871 sub esp,24 1872 1873 BltRecEnd: 1874 pop edx 1875 pop ecx 1876 pop ebx 1877 pop eax 1878 pop esi 1879 pop edi 1880 pop ebp 1881 ret 1882 _BltRec ENDP 1883 1884 1885 PUBLIC _CPUHasMMX 1886 ; 1887 ; int __cdecl CPUHasMMX() 1888 ; returns: 1889 ; 0 = NoMMX 1890 ; 1 = MMX 1891 ; 2 = MMX+CMov instuction 1892 1893 _CPUHasMMX PROC NEAR 1894 push ebp 1895 mov ebp, esp 1896 push edi 1897 push esi 1898 push ebx 1899 push ecx 1900 push edx 1901 1902 pushfd 1903 pop eax 1904 mov ebx ,eax 1905 xor eax, 00200000h 1906 push eax 1907 popfd 1908 pushfd 1909 pop eax 1910 sub eax,ebx 1911 jz Return ; No CPUID => No MMX => return 0 in eax; 1912 mov eax, 1 1913 CPUID 1914 test edx,00800000h ; MMX Bit Set ? 1915 jz Return 1916 mov eax, 1 1917 test edx,00008000h ; Conditonal Mov Bit Set ? 1918 jz Return 1919 inc eax 1920 Return: 1921 pop edx 1922 pop ecx 1923 pop ebx 1924 pop esi 1925 pop edi 1926 pop ebp 1927 ret 1928 _CPUHasMMX ENDP 1929 1930 PUBLIC _MemFlip 1931 1932 ; 1933 ; memcpy via FLD / FSTP MMX might even be faster but 1934 ; not present on every system 1935 ; to maximize the speed we copy 64 bytes in each loop 1936 ; and after the loop the rest left 1937 ; 1938 ; 1939 ;void __cdecl MemFlip(PBYTE dest, PBYTE src, ULONG Size); 1940 1941 _MemFlip PROC NEAR 1942 push ebp 1943 mov ebp, esp 1944 push edi 1945 push esi 1946 push eax 1947 push ebx 1948 push ecx 1949 1950 mov eax , dword ptr [ebp+16] ; Size of Buffer 1951 mov edi , dword ptr [ebp+8] ; Destination 1952 mov ebx , eax 1953 mov esi , dword ptr [ebp+12] ; SourcePointer 1954 1955 and ebx , 0000003Fh ; Calc leftover bytes 1956 shr eax , 5 ; Calc Loops 1957 1958 jz COPYREMAIN ; Less then 64 to copy 1959 ALIGN 4 1960 1961 Loop64: 1962 FLD QWORD PTR [ESI] ; 1 1963 FLD QWORD PTR [ESI+8] ; 2 1964 FXCH ; Doesn't take any clocks 1965 FSTP QWORD PTR [EDI] ; 3,4 Clocks 1966 FSTP QWORD PTR [EDI+8] ; 5,6 1967 ADD ESI,16 ; 7 U Integer instruction can be executed parallel 1968 ADD EDI,16 ; 7 V Total clocks for copying 16 byte 7 clocks Rep Movs needs 20! for each 16 byte + 13 setup 1969 FLD QWORD PTR [ESI] 1970 FLD QWORD PTR [ESI+8] 1971 FXCH 1972 FSTP QWORD PTR [EDI] 1973 FSTP QWORD PTR [EDI+8] 1974 ADD ESI,16 1975 ADD EDI,16 1976 FLD QWORD PTR [ESI] 1977 FLD QWORD PTR [ESI+8] 1978 FXCH 1979 FSTP QWORD PTR [EDI] 1980 FSTP QWORD PTR [EDI+8] 1981 ADD ESI,16 1982 ADD EDI,16 1983 FLD QWORD PTR [ESI] 1984 FLD QWORD PTR [ESI+8] 1985 FXCH 1986 FSTP QWORD PTR [EDI] 1987 FSTP QWORD PTR [EDI+8] 1988 ADD ESI,16 1989 ADD EDI,16 1990 inc eax 1991 jnz Loop64 1992 1993 COPYREMAIN: 1994 test ebx, ebx ; something left ? 1995 jz EndOffFlip 1996 1997 test ebx, 00000020h; at least 32 bytes left ? 1998 jz Test16 1999 2000 FLD QWORD PTR [ESI] 2001 FLD QWORD PTR [ESI+8] 2002 FXCH 2003 FSTP QWORD PTR [EDI] 2004 FSTP QWORD PTR [EDI+8] 2005 ADD ESI,16 2006 ADD EDI,16 2007 FLD QWORD PTR [ESI] 2008 FLD QWORD PTR [ESI+8] 2009 FXCH 2010 FSTP QWORD PTR [EDI] 2011 FSTP QWORD PTR [EDI+8] 2012 ADD ESI,16 2013 ADD EDI,16 2014 sub ebx, 00000020h 2015 jz EndOffFlip 2016 2017 Test16: 2018 2019 test ebx, 00000010h; at least 16 bytes left ? 2020 jb Test8 2021 2022 FLD QWORD PTR [ESI] 2023 FLD QWORD PTR [ESI+8] 2024 FXCH 2025 FSTP QWORD PTR [EDI] 2026 FSTP QWORD PTR [EDI+8] 2027 ADD ESI,16 2028 ADD EDI,16 2029 sub ebx, 00000010h 2030 jz EndOffFlip 2031 Test8: 2032 2033 test ebx, 00000008h; at least 8 bytes left ? 2034 jb Test4 2035 mov eax,[esi] 2036 mov ecx,[esi+4] 2037 mov [edi],eax 2038 mov [edi+4],ecx 2039 add esi, 8 2040 add edi, 8 2041 sub ebx, 8 2042 jz EndOffFlip 2043 2044 Test4: 2045 test ebx, 00000004h; at least 4 bytes left ? 2046 jb Test2 2047 mov eax,[esi] 2048 sub ebx, 4 2049 mov [edi],eax 2050 add esi, 4 2051 add edi, 4 2052 test ebx, ebx ; something left ? 2053 jz EndOffFlip 2054 2055 Test2: 2056 test ebx, 00000002h 2057 jb Copy1 2058 mov ax,[esi] 2059 sub ebx,2 2060 mov [edi],ax 2061 add esi,2 2062 add edi,2 2063 test ebx,ebx 2064 jz EndOffFlip 2065 2066 Copy1: 2067 mov al,[esi] 2068 mov [edi],al 2069 2070 EndOffFlip: 2071 pop ecx 2072 pop ebx 2073 pop eax 2074 pop esi 2075 pop edi 2076 pop ebp 2077 ret 2078 _MemFlip ENDP 2079 110 2080 CODE32 ENDS 111 2081 -
trunk/src/ddraw/asmutil.h
r97 r211 1 /* $Id: asmutil.h,v 1.3 1999-06-10 17:10:57 phaller Exp $ */2 3 1 /* 4 2 * asmutil.asm function definition 5 3 * 6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl) 7 * 8 * Project Odin Software License can be found in LICENSE.TXT 9 * 4 * Copyright 1998 Sander van Leeuwen 5 * 1999 Markus Montkowski 10 6 */ 11 7 … … 18 14 19 15 extern void __cdecl BlitColorKey8(PBYTE dest, PBYTE src, ULONG key, ULONG linesize); 16 extern void __cdecl BlitColorKey16(PBYTE dest, PBYTE src, ULONG key, ULONG linesize); 17 extern void __cdecl BlitColorKey32(PBYTE dest, PBYTE src, ULONG key, ULONG linesize); 18 extern void __cdecl BlitColorKey8MMX(PBYTE dest, PBYTE src, ULONG key, ULONG linesize); 19 extern void __cdecl BlitColorKey16MMX(PBYTE dest, PBYTE src, ULONG key, ULONG linesize); 20 extern void __cdecl BltRec(PBYTE dest, PBYTE src, ULONG ulBltWidth, ULONG ulBltHeight, 21 ULONG ulDestPitch, ULONG ulSrcPitch); 22 extern void __cdecl MemFlip(PBYTE dest, PBYTE src, ULONG Size); 23 extern int __cdecl CPUHasMMX(); 20 24 21 25 #ifdef __cplusplus
Note:
See TracChangeset
for help on using the changeset viewer.