1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_03_49_src

Former-commit-id: 90f614b5617e748378a42e0ebe443a20cd48d8c4
This commit is contained in:
gho tik 2015-12-15 11:42:37 -05:00 committed by Refael ACkermann
parent 569a662445
commit 45b65b9611
40 changed files with 262 additions and 106 deletions

View File

@ -227,8 +227,9 @@
#define TRACEHOOKS 0x00000400 // log hook operations
#define OUTD3DTRACE 0x00000800 // traces DxWnd direct3d screen handling
#define OUTDXWINTRACE 0x00001000 // traces DxWnd internal operations
#define ADDRELATIVETIME 0x08000000 // log timestamp is relative to previous line
#define NOLOGCLOSE 0x10000000 // avoid closing the log file handle ("Riven, during CD changes ...)
#define ADDTIMESTAMP 0x20000000 // att timestamp (GetTickCount) to log file
#define ADDTIMESTAMP 0x20000000 // add timestamp (GetTickCount) to log file
#define OUTDEBUGSTRING 0x40000000 // duplicate logs through OutputDebugString()
#define ERASELOGFILE 0x80000000 // clears old trace file before writing new logs

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b4a56c750b4f879d9a6bf014e56fa028e80775f98c19db9213fcbf8567169193
oid sha256:60fd77705e2eacd38c4bc60177d1f90e73b8a19e6bcd615465449f5b59eec3e5
size 622592

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b1fae4424d81cb9fc6c32e8a30525dc678480e1bc9c40784d2b528a6d736f9bb
oid sha256:49ce540832a013e5fe01bbacfdbbeb19232c1205a8ac94ba391ba85cfb2b6b13
size 546816

View File

@ -0,0 +1,32 @@
[target]
title0=Enemy Zero
path0=F:\EZERO\EZERO.EXE
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=681574434
flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
flagk0=65536
tflag0=0
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -0,0 +1,32 @@
[target]
title0=One Must Fall - Battlegrounds
path0=D:\Games\One Must Fall - Battlegrounds\Engine\OMFBG.exe
launchpath0=
module0=core_module.dll
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=136314915
flagg0=1275068416
flagh0=20
flagi0=138412036
flagj0=4736
flagk0=327680
tflag0=0
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -0,0 +1,32 @@
[target]
title0=Paladin 3 RIP
path0=D:\Games\QGPAL3\rungame.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=136314914
flagg0=1207959552
flagh0=20
flagi0=205520900
flagj0=4224
flagk0=65536
tflag0=0
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -0,0 +1,32 @@
[target]
title0=Prince of Persia - Warrior Within (GOG)
path0=D:\Games\Prince of Persia - Warrior Within\pop2.exe
launchpath0=D:\Games\Prince of Persia - Warrior Within\PrinceOfPersia.exe
module0=
opengllib0=
notes0=
registry0=
ver0=9
coord0=0
flag0=136314914
flagg0=1207959552
flagh0=20
flagi0=138412038
flagj0=4224
flagk0=65536
tflag0=0
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -0,0 +1,32 @@
[target]
title0=Star Wars Rogue Squadron 3D
path0=D:\Games\rogue\Rogue Squadron.EXE
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=136314918
flagg0=1207959552
flagh0=20
flagi0=138412038
flagj0=4224
flagk0=134283264
tflag0=0
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0

View File

@ -4,12 +4,16 @@ path0=D:\Games\Tomb Raider - Underworld\tru.exe
launchpath0=
module0=
opengllib0=
notes0=
registry0=
ver0=0
coord0=0
flag0=679477282
flag0=-1468006366
flagg0=1207959552
flagh0=20
flagh0=65556
flagi0=205520900
flagj0=0
flagk0=0
tflag0=0
initx0=0
inity0=0
@ -25,7 +29,4 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
notes0=
flagj0=0
flagk0=0
swapeffect0=0

View File

@ -11,7 +11,7 @@ flagg0=1207959552
flagh0=20
flagi0=138412036
flagj0=4224
tflag0=1
tflag0=0
initx0=0
inity0=0
minx0=0
@ -26,3 +26,7 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
notes0=
registry0=
flagk0=65536
swapeffect0=0

View File

@ -27,3 +27,6 @@ notes0=
flagj0=128
winver0=0
maxres0=0
registry0=
flagk0=65536
swapeffect0=0

View File

@ -27,3 +27,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
registry0=
flagk0=65536
swapeffect0=0

View File

@ -5,10 +5,10 @@ module0=
opengllib0=
ver0=1
coord0=0
flag0=136315424
flag0=136315426
flagg0=1207959552
flagh0=20
flagi0=524288
flagh0=8212
flagi0=4726784
tflag0=0
initx0=0
inity0=0
@ -24,3 +24,9 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
launchpath0=
notes0=
registry0=
flagj0=0
flagk0=0
swapeffect0=0

View File

@ -27,3 +27,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
registry0=
flagk0=262144
swapeffect0=0

View File

@ -27,3 +27,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
registry0=
flagk0=262144
swapeffect0=0

View File

@ -9,8 +9,8 @@ ver0=0
coord0=0
flag0=681574434
flagg0=1207959552
flagh0=20
flagi0=138412036
flagh0=1044
flagi0=1212153860
flagj0=4224
flagk0=0
tflag0=0
@ -29,3 +29,4 @@ initts0=0
winver0=0
maxres0=-1
swapeffect0=0
registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Digital Image Design]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Digital Image Design\Default Config]\n"Configurable"=dword:00000000\n"Bilinear Filter"=dword:00000001\n"Fog"=dword:00000001\n"Windowed"=dword:00000000\n"Preferred Width"=dword:00000280\n"Preferred Height"=dword:000001e0\n\n

View File

@ -12,7 +12,7 @@ flagg0=1207959552
flagh0=20
flagi0=138543110
flagj0=4224
tflag0=536870912
tflag0=0
initx0=0
inity0=0
minx0=0
@ -27,3 +27,6 @@ maxfps0=0
initts0=0
winver0=0
maxres0=-1
registry0=
flagk0=65536
swapeffect0=0

View File

@ -13,7 +13,7 @@ flagg0=1209008128
flagh0=16
flagi0=138412036
flagj0=67113088
flagk0=327680
flagk0=65536
tflag0=0
initx0=0
inity0=0

View File

@ -25,7 +25,8 @@ initts0=0
launchpath0=
notes0=
flagj0=128
flagk0=0
flagk0=65536
winver0=0
maxres0=0
swapeffect0=0
registry0=

View File

@ -987,4 +987,10 @@ add: "force clipper" flag to redirect clipper definition to main window and prim
fix: better handling of surfaces on minimize / restore events, mainly on WinXP
fix: proper default values for"Share ddraw and GDI DC" and "Lock/Unlock Pitch Fix" flags
v2.03.49
fix: a few improvements in handling NULL lpDDSSource in Blit/Flip operations
optimization: avoid applying palette to primarty surface when emulated
add: option to print relative timing to log
fix: avoid handling textures at level greater than 0 since this seems to cause application crash
fix: restore cursor clipping through WM_SETFOCUS and DefWindowProc when focus is gained
fix: "One Must Fall Battlegrounds" keyboard fix - can't SetWindowsHookEx with WH_KEYBOARD and NULL thread

View File

@ -168,13 +168,9 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
// any blit operation!
if(destrect.left == -32000) return DD_OK; // no blit on invisible window
if(!lpddssrc) {
if (isFlipping){
// handle the flipping chain ...
//lpddssrc=lpDDSBack;
lpddssrc = dxwss.GetBackBufferSurface();
OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc);
}
if(!(lpddssrc || (dwflags & DDBLT_COLORFILL))) {
lpddssrc = dxwss.GetBackBufferSurface();
OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc);
}
// =========================
@ -199,6 +195,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
// Try to handle HDC lock concurrency....
if(res==DDERR_SURFACEBUSY){
(*pUnlockMethod(lpdds))(lpdds, NULL);
if(lpddssrc) (*pUnlockMethod(lpdds))(lpdds, NULL);
if (IsDebug) BlitTrace("BUSY", lpsrcrect, &destrect, __LINE__);
res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);
@ -291,12 +288,15 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest
// Try to handle HDC lock concurrency....
if(res==DDERR_SURFACEBUSY){
if (bFlippedDC) (*pReleaseDC)(lpdds, hFlippedDC);
#if 0
// v2.03.49: resumed because if fixes locked surfaces on "Red Alert 1" on WinXP as reported by cloudstr
if(lpddssrc) { // lpddssrc could be NULL!!!
res=(*pUnlockMethod(lpddssrc))(lpddssrc, NULL);
if(res && (res!=DDERR_NOTLOCKED)) OutTraceE("Unlock ERROR: lpdds=%x err=%x(%s)\n", lpddssrc, res, ExplainDDError(res));
}
res=(*pUnlockMethod(lpdds))(lpdds, NULL); // v2.03.24 reintroduced because of "Virtua Cop"
if(res && (res!=DDERR_NOTLOCKED)) OutTraceE("Unlock ERROR: lpdds=%x err=%x(%s)\n", lpdds, res, ExplainDDError(res));
#endif
if (IsDebug) BlitTrace("BUSY", &emurect, &destrect, __LINE__);
res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx);
if (res) BlitError(res, lpsrcrect, &destrect, __LINE__);

View File

@ -3844,11 +3844,8 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws
lpddp, dwflags, dwstart, dwcount, lpentries);
if(IsDebug) dxw.DumpPalette(dwcount, &lpentries[dwstart]);
res = (*pSetEntries)(lpddp, dwflags, dwstart, dwcount, lpentries);
if(res) OutTraceE("SetEntries: ERROR res=%x(%s)\n", res, ExplainDDError(res));
else OutTraceDDRAW("SetEntries: OK\n");
if((dxw.dwFlags1 & EMULATESURFACE) && (lpDDP == lpddp)){
res = DD_OK;
OutTraceDW("SetEntries: update PRIMARY palette lpDDP=%x\n", lpddp);
if ((dwstart + dwcount > 256) || (dwstart<0)){
dwcount=256;
@ -3865,6 +3862,11 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws
// v2.03.10: do not blit also in case of GDI mode
if ((dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags2 & NOPALETTEUPDATE) && !(dxw.dwFlags5 & GDIMODE)) dxw.ScreenRefresh();
}
else {
res = (*pSetEntries)(lpddp, dwflags, dwstart, dwcount, lpentries);
if(res) OutTraceE("SetEntries: ERROR res=%x(%s)\n", res, ExplainDDError(res));
else OutTraceDDRAW("SetEntries: OK\n");
}
return res;
}

View File

@ -209,7 +209,17 @@ void OutTrace(const char *format, ...)
sBuf[DXWMAXLOGSIZE]=0; // just in case of log truncation
va_end(al);
if(tFlags & OUTTRACE) {
if(tFlags & ADDTIMESTAMP) fprintf(fp, "%08.8d: ", (*pGetTick)());
if(tFlags & ADDTIMESTAMP) {
DWORD tCount = (*pGetTick)();
if (tFlags & ADDRELATIVETIME){
static DWORD tLastCount = 0;
DWORD tNow;
tNow = tCount;
tCount = tLastCount ? (tCount - tLastCount) : 0;
tLastCount = tNow;
}
fprintf(fp, "%08.8d: ", tCount);
}
fputs(sBuf, fp);
fflush(fp);
}

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h"
#define VERSION "2.03.48"
#define VERSION "2.03.49"
#define DDTHREADLOCK 1
//#define LOCKTHREADS

Binary file not shown.

View File

@ -171,7 +171,7 @@
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1041"
Culture="0"
/>
<Tool
Name="VCPreLinkEventTool"
@ -502,10 +502,6 @@
RelativePath=".\dxwcore.hpp"
>
</File>
<File
RelativePath="..\..\v2_03_49_beta\Include\dxwnd.h"
>
</File>
<File
RelativePath=".\glhook.h"
>

View File

@ -1826,7 +1826,7 @@ ULONG WINAPI extSetTexture9(void *lpd3dd, DWORD Stage, void* pTexture)
}
ret = (*pSetTexture9)(lpd3dd, Stage, pTexture);
OutTraceD3D("Device::SetTexture(9): d3dd=%x stage=%x texture=%x ret=%x\n", lpd3dd, Stage, pTexture, ret);
if(pTexture) D3D9TextureHandling((void *)pTexture, Stage);
if(pTexture) D3D9TextureHandling((void *)pTexture, (int)Stage);
return ret;
}

View File

@ -27,7 +27,9 @@ void D3D8TextureHandling(void *arg, int Level)
IDirect3DSurface8 *pSurfaceLevel;
D3DSURFACE_DESC Desc;
D3DLOCKED_RECT LockedRect;
//OutTrace("D3D8TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
OutTraceB("D3D8TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
// Beware: attempts to dump surfaces at level > 0 result in stack corruption!!!
if(Level > 0) return;
if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){
OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res));
return;

View File

@ -27,7 +27,9 @@ void D3D9TextureHandling(void *arg, int Level)
IDirect3DSurface9 *pSurfaceLevel;
D3DSURFACE_DESC Desc;
D3DLOCKED_RECT LockedRect;
//OutTrace("D3D9TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
OutTraceB("D3D9TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
// Beware: attempts to dump surfaces at level > 0 result in stack corruption!!!
if(Level > 0) return;
if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){
OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res));
return;

View File

@ -1676,6 +1676,8 @@ LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lPar
res = (HRESULT)-1;
if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcA", hwnd, Msg, wParam, &lParam);
if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor();
if (res==(HRESULT)-1)
return (*pDefWindowProcA)(hwnd, Msg, wParam, lParam);
else
@ -1690,6 +1692,8 @@ LRESULT WINAPI extDefWindowProcW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lPar
res = (HRESULT)-1;
if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcW", hwnd, Msg, wParam, &lParam);
if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor();
if (res==(HRESULT)-1)
return (*pDefWindowProcW)(hwnd, Msg, wParam, lParam);
else
@ -2950,7 +2954,11 @@ HHOOK WINAPI extSetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWOR
lpfn=extMessageHookProc;
}
}
// v2.03.39: "One Must Fall Battlegrounds" keyboard fix
if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) dwThreadId = GetCurrentThreadId();
ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId);
return ret;
}

View File

@ -465,6 +465,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
break;
case WM_SETFOCUS:
OutTraceDW("WindowProc: hwnd=%x GOT FOCUS\n", hwnd);
if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor();
if (dxw.dwFlags1 & ENABLECLIPPING) extClipCursor(lpClipRegion);
break;
case WM_KILLFOCUS:

View File

@ -45,6 +45,7 @@ void CTabLogs::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_OUTDEBUGSTRING, cTarget->m_OutDebugString);
DDX_Check(pDX, IDC_ERASELOGFILE, cTarget->m_EraseLogFile);
DDX_Check(pDX, IDC_ADDTIMESTAMP, cTarget->m_AddTimeStamp);
DDX_Check(pDX, IDC_ADDRELATIVETIME, cTarget->m_AddRelativeTime);
DDX_Check(pDX, IDC_OUTWINMESSAGES, cTarget->m_OutWinMessages);
DDX_Check(pDX, IDC_OUTDWTRACE, cTarget->m_OutDWTrace);
DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable);

View File

@ -44,6 +44,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_OutDebugString = FALSE;
m_EraseLogFile = FALSE;
m_AddTimeStamp = FALSE;
m_AddRelativeTime = FALSE;
m_ImportTable = FALSE;
m_TraceHooks = FALSE;
m_DXProxed = FALSE;

View File

@ -43,6 +43,7 @@ public:
BOOL m_LogEnabled;
BOOL m_EraseLogFile;
BOOL m_AddTimeStamp;
BOOL m_AddRelativeTime;
BOOL m_OutDebugString;
BOOL m_OutWinMessages;
BOOL m_OutDWTrace;

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="9.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="USER-PC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="USER-PC"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -258,6 +258,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_OutDebugString) t->tflags |= OUTDEBUGSTRING;
if(dlg->m_EraseLogFile) t->tflags |= ERASELOGFILE;
if(dlg->m_AddTimeStamp) t->tflags |= ADDTIMESTAMP;
if(dlg->m_AddRelativeTime) t->tflags |= ADDRELATIVETIME;
if(dlg->m_OutWinMessages) t->tflags |= OUTWINMESSAGES;
if(dlg->m_OutDWTrace) t->tflags |= OUTDXWINTRACE;
if(dlg->m_OutDDRAWTrace) t->tflags |= OUTDDRAWTRACE;
@ -504,6 +505,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_OutDebugString = t->tflags & OUTDEBUGSTRING ? 1 : 0;
dlg->m_EraseLogFile = t->tflags & ERASELOGFILE ? 1 : 0;
dlg->m_AddTimeStamp = t->tflags & ADDTIMESTAMP ? 1 : 0;
dlg->m_AddRelativeTime = t->tflags & ADDRELATIVETIME ? 1 : 0;
dlg->m_OutWinMessages = t->tflags & OUTWINMESSAGES ? 1 : 0;
dlg->m_OutDWTrace = t->tflags & OUTDXWINTRACE ? 1 : 0;
dlg->m_OutD3DTrace = t->tflags & OUTD3DTRACE ? 1 : 0;

Binary file not shown.