From 59b0a71a43bd58b05fc9bc5f7a17779eeb9bafb8 Mon Sep 17 00:00:00 2001 From: OV2 Date: Thu, 18 Oct 2012 15:42:33 +0200 Subject: [PATCH 1/7] win32: fix blargg for regular width hires --- win32/render.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win32/render.cpp b/win32/render.cpp index a5ac894b..74283811 100644 --- a/win32/render.cpp +++ b/win32/render.cpp @@ -2628,7 +2628,7 @@ void RenderBlarggNTSC( SSurface Src, SSurface Dst, RECT *rect) const unsigned int srcRowPixels = Src.Pitch/2; - if(Src.Height > SNES_HEIGHT_EXTENDED || Src.Width == 512) + if(Src.Width == 512) snes_ntsc_blit_hires( ntsc, (unsigned short *)Src.Surface, srcRowPixels, 0,Src.Width, Src.Height, Dst.Surface, Dst.Pitch ); else snes_ntsc_blit( ntsc, (unsigned short *)Src.Surface, srcRowPixels, 0,Src.Width, Src.Height, Dst.Surface, Dst.Pitch ); From 88f3702a6a40e34ba7f8166d5d61fb76a0e3db4f Mon Sep 17 00:00:00 2001 From: OV2 Date: Thu, 18 Oct 2012 15:44:42 +0200 Subject: [PATCH 2/7] win32: add+use CXML wrapper class --- win32/CDirect3D.cpp | 91 +++++------------------- win32/CXML.cpp | 162 +++++++++++++++++++++++++++++++++++++++++++ win32/CXML.h | 29 ++++++++ win32/_tfwopen.cpp | 12 +++- win32/_tfwopen.h | 15 +++- win32/snes9xw.vcproj | 8 +++ win32/wsnes9x.h | 2 +- 7 files changed, 238 insertions(+), 81 deletions(-) create mode 100644 win32/CXML.cpp create mode 100644 win32/CXML.h diff --git a/win32/CDirect3D.cpp b/win32/CDirect3D.cpp index 56d16b9b..06f8f5a5 100644 --- a/win32/CDirect3D.cpp +++ b/win32/CDirect3D.cpp @@ -187,6 +187,7 @@ #include "wsnes9x.h" #include #include +#include "CXML.h" #include "../filter/hq2x.h" #include "../filter/2xsai.h" @@ -425,17 +426,9 @@ bool CDirect3D::SetShaderHLSL(const TCHAR *file) TCHAR folder[MAX_PATH]; TCHAR rubyLUTfileName[MAX_PATH]; TCHAR *slash; - char *shaderText = NULL; TCHAR errorMsg[MAX_PATH + 50]; - IXMLDOMDocument * pXMLDoc = NULL; - IXMLDOMElement * pXDE = NULL; - IXMLDOMNode * pXDN = NULL; - BSTR queryString, nodeContent; - - HRESULT hr; - shaderTimer = 1.0f; shaderTimeStart = 0; shaderTimeElapsed = 0; @@ -453,76 +446,20 @@ bool CDirect3D::SetShaderHLSL(const TCHAR *file) if (file == NULL || *file==TEXT('\0')) return true; - hr = CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pXMLDoc)); + CXML xml; - if(FAILED(hr)) { - MessageBox(NULL, TEXT("Error creating XML Parser"), TEXT("Shader Loading Error"), - MB_OK|MB_ICONEXCLAMATION); - return false; - } + if(!xml.loadXmlFile(file)) + return false; - VARIANT fileName; - VARIANT_BOOL ret; - fileName.vt = VT_BSTR; -#ifdef UNICODE - fileName.bstrVal = SysAllocString(file); -#else - wchar_t tempfilename[MAX_PATH]; - MultiByteToWideChar(CP_UTF8,0,file,-1,tempfilename,MAX_PATH); - fileName.bstrVal = SysAllocString(tempfilename); -#endif - hr = pXMLDoc->load(fileName,&ret); - SysFreeString(fileName.bstrVal); + TCHAR *lang = xml.getAttribute(TEXT("/shader"),TEXT("language")); - if(FAILED(hr) || hr==S_FALSE) { - _stprintf(errorMsg,TEXT("Error loading HLSL shader file:\n%s"),file); + if(lstrcmpi(lang,TEXT("hlsl"))) { + _stprintf(errorMsg,TEXT("Shader language is <%s>, expected in file:\n%s"),lang,file); MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION); - pXMLDoc->Release(); return false; } - VARIANT attributeValue; - BSTR attributeName; - - hr = pXMLDoc->get_documentElement(&pXDE); - if(FAILED(hr) || hr==S_FALSE) { - _stprintf(errorMsg,TEXT("Error loading root element from file:\n%s"),file); - MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION); - pXMLDoc->Release(); - return false; - } - - attributeName=SysAllocString(L"language"); - pXDE->getAttribute(attributeName,&attributeValue); - SysFreeString(attributeName); - pXDE->Release(); - - if(attributeValue.vt!=VT_BSTR || lstrcmpiW(attributeValue.bstrVal,L"hlsl")) { - _stprintf(errorMsg,TEXT("Shader language is <%s>, expected in file:\n%s"),attributeValue.bstrVal,file); - MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION); - if(attributeValue.vt==VT_BSTR) SysFreeString(attributeValue.bstrVal); - pXMLDoc->Release(); - return false; - } - if(attributeValue.vt==VT_BSTR) SysFreeString(attributeValue.bstrVal); - - queryString=SysAllocString(L"/shader/source"); - hr = pXMLDoc->selectSingleNode(queryString,&pXDN); - SysFreeString(queryString); - - if(hr == S_OK) { - hr = pXDN->get_text(&nodeContent); - if(hr == S_OK) { - int requiredChars = WideCharToMultiByte(CP_ACP,0,nodeContent,-1,shaderText,0,NULL,NULL); - shaderText = new char[requiredChars]; - WideCharToMultiByte(CP_UTF8,0,nodeContent,-1,shaderText,requiredChars,NULL,NULL); - } - SysFreeString(nodeContent); - pXDN->Release(); - pXDN = NULL; - } - - pXMLDoc->Release(); + TCHAR *shaderText = xml.getNodeContent(TEXT("/shader/source")); if(!shaderText) { _stprintf(errorMsg,TEXT("No HLSL shader program in file:\n%s"),file); @@ -532,11 +469,17 @@ bool CDirect3D::SetShaderHLSL(const TCHAR *file) } LPD3DXBUFFER pBufferErrors = NULL; - hr = D3DXCreateEffect( pDevice,shaderText,strlen(shaderText),NULL, NULL, +#ifdef UNICODE + HRESULT hr = D3DXCreateEffect( pDevice,WideToCP(shaderText,CP_ACP),strlen(WideToCP(shaderText,CP_ACP)),NULL, NULL, D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, NULL, &effect, &pBufferErrors ); - delete[] shaderText; - if( FAILED(hr) ) { +#else + HRESULT hr = D3DXCreateEffect( pDevice,shaderText,strlen(shaderText),NULL, NULL, + D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, NULL, &effect, + &pBufferErrors ); +#endif + + if( FAILED(hr) ) { _stprintf(errorMsg,TEXT("Error parsing HLSL shader file:\n%s"),file); MessageBox(NULL, errorMsg, TEXT("Shader Loading Error"), MB_OK|MB_ICONEXCLAMATION); if(pBufferErrors) { diff --git a/win32/CXML.cpp b/win32/CXML.cpp new file mode 100644 index 00000000..ade7ba5c --- /dev/null +++ b/win32/CXML.cpp @@ -0,0 +1,162 @@ +#include "CXML.h" +#include +#include "_tfwopen.h" +#ifndef UNICODE +#define _tFromTCHAR(x) CPToWide(x,CP_ACP) +#define _tToTCHAR(x) WideToCP(x,CP_ACP) +#else +#define _tFromTCHAR +#define _tToTCHAR +#endif + +CXML::CXML(void) +{ + pXMLDoc = NULL; + xmlLoaded = false; + nodeContent = NULL; + attrValue = NULL; +} + +CXML::~CXML(void) +{ + unloadXml(); +} + +void CXML::unloadXml() +{ + if(pXMLDoc) { + pXMLDoc->Release(); + pXMLDoc = NULL; + } + if(nodeContent) { + delete [] nodeContent; + nodeContent = NULL; + } + if(attrValue) { + delete [] attrValue; + attrValue = NULL; + } + xmlLoaded = false; +} + +bool CXML::loadXmlFile(TCHAR const *file) +{ + unloadXml(); + + if(!file) + return false; + + TCHAR errorMsg[MAX_PATH + 50]; + + HRESULT hr = CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pXMLDoc)); + + if(FAILED(hr)) { + MessageBox(NULL, TEXT("Error creating XML Parser"), TEXT("XML Error"), + MB_OK|MB_ICONEXCLAMATION); + pXMLDoc = NULL; + return false; + } + + + VARIANT fileName; + VARIANT_BOOL ret; + fileName.vt = VT_BSTR; + fileName.bstrVal = SysAllocString(_tFromTCHAR(file)); + hr = pXMLDoc->load(fileName,&ret); + SysFreeString(fileName.bstrVal); + + if(FAILED(hr) || hr==S_FALSE) { + _stprintf(errorMsg,TEXT("Error loading XML file:\n%s"),file); + MessageBox(NULL, errorMsg, TEXT("XML Error"), + MB_OK|MB_ICONEXCLAMATION); + unloadXml(); + return false; + } + + hr = pXMLDoc->get_documentElement(&pXrootElement); + if(FAILED(hr) || hr==S_FALSE) { + _stprintf(errorMsg,TEXT("Error loading root element from file:\n%s"),file); + MessageBox(NULL, errorMsg, TEXT("XML Error"), MB_OK|MB_ICONEXCLAMATION); + unloadXml(); + return false; + } + + xmlLoaded = true; + return true; +} + +IXMLDOMNode *CXML::getNode(TCHAR const *searchNode) +{ + IXMLDOMNode *pXDN; + BSTR queryString=SysAllocString(_tFromTCHAR(searchNode)); + HRESULT hr = pXMLDoc->selectSingleNode(queryString,&pXDN); + SysFreeString(queryString); + + return pXDN; +} + +TCHAR *CXML::getAttribute(TCHAR const *searchNode, TCHAR const *attrName) +{ + IXMLDOMNode *pXDN = getNode(searchNode); + + if(!pXDN) + return NULL; + + VARIANT attributeValue; + BSTR attributeName; + + IXMLDOMElement * pXDE = NULL; + HRESULT hr = pXDN->QueryInterface(IID_PPV_ARGS(&pXDE)); + if(FAILED(hr)) { + pXDN->Release(); + return NULL; + } + + attributeName=SysAllocString(_tFromTCHAR(attrName)); + pXDE->getAttribute(attributeName,&attributeValue); + SysFreeString(attributeName); + pXDE->Release(); + + if(attributeValue.vt!=VT_BSTR) + return NULL; + + if(attrValue) { + delete [] attrValue; + attrValue = NULL; + } + + attrValue = new TCHAR[lstrlen(_tToTCHAR(attributeValue.bstrVal)) + 1]; + lstrcpy(attrValue,_tToTCHAR(attributeValue.bstrVal)); + + SysFreeString(attributeValue.bstrVal); + + return attrValue; +} + +TCHAR *CXML::getNodeContent(TCHAR const *searchNode) +{ + IXMLDOMNode *pXDN = getNode(searchNode); + + if(!pXDN) + return NULL; + + BSTR nodeText; + + HRESULT hr = pXDN->get_text(&nodeText); + pXDN->Release(); + + if(hr != S_OK) + return NULL; + + if(nodeContent) { + delete [] nodeContent; + nodeContent = NULL; + } + + nodeContent = new TCHAR[lstrlen(_tToTCHAR(nodeText)) + 1]; + lstrcpy(nodeContent,_tToTCHAR(nodeText)); + + SysFreeString(nodeText); + + return nodeContent; +} diff --git a/win32/CXML.h b/win32/CXML.h new file mode 100644 index 00000000..95cf2e27 --- /dev/null +++ b/win32/CXML.h @@ -0,0 +1,29 @@ +#ifndef CXML_H +#define CXML_H + +#include "msxml2.h" +#include + +class CXML +{ +private: + IXMLDOMDocument * pXMLDoc; + IXMLDOMElement * pXrootElement; + bool xmlLoaded; + TCHAR *nodeContent; + TCHAR *attrValue; + + IXMLDOMNode *getNode(TCHAR const *searchNode); + +public: + CXML(void); + ~CXML(void); + + bool loadXmlFile(TCHAR const *xmlFile); + void unloadXml(); + + TCHAR *getAttribute(TCHAR const *searchNode, TCHAR const *attrName); + TCHAR *getNodeContent(TCHAR const *searchNode); +}; + +#endif \ No newline at end of file diff --git a/win32/_tfwopen.cpp b/win32/_tfwopen.cpp index 3ec11451..3b5e8d7b 100644 --- a/win32/_tfwopen.cpp +++ b/win32/_tfwopen.cpp @@ -192,10 +192,16 @@ WideToUtf8::WideToUtf8(const wchar_t *wideChars) { WideCharToMultiByte(CP_UTF8,0,wideChars,-1,utf8Chars,requiredChars,NULL,NULL); } -MS932ToWide::MS932ToWide(const char *ms932Chars) { - int requiredChars = MultiByteToWideChar(932,0,ms932Chars,-1,wideChars,0); +CPToWide::CPToWide(const char *chars, unsigned int cp) { + int requiredChars = MultiByteToWideChar(cp,0,chars,-1,wideChars,0); wideChars = new wchar_t[requiredChars]; - MultiByteToWideChar(932,0,ms932Chars,-1,wideChars,requiredChars); + MultiByteToWideChar(cp,0,chars,-1,wideChars,requiredChars); +} + +WideToCP::WideToCP(const wchar_t *wideChars, unsigned int cp) { + int requiredChars = WideCharToMultiByte(cp,0,wideChars,-1,cpchars,0,NULL,NULL); + cpchars = new char[requiredChars]; + WideCharToMultiByte(cp,0,wideChars,-1,cpchars,requiredChars,NULL,NULL); } extern "C" FILE *_tfwopen(const char *filename, const char *mode ) { diff --git a/win32/_tfwopen.h b/win32/_tfwopen.h index a354b073..e77de029 100644 --- a/win32/_tfwopen.h +++ b/win32/_tfwopen.h @@ -215,15 +215,24 @@ public: operator char *() { return utf8Chars; } }; -class MS932ToWide { +class CPToWide { private: wchar_t *wideChars; public: - MS932ToWide(const char *ms932Chars); - ~MS932ToWide() { delete [] wideChars; } + CPToWide(const char *chars, unsigned int cp); + ~CPToWide() { delete [] wideChars; } operator wchar_t *() { return wideChars; } }; +class WideToCP { +private: + char *cpchars; +public: + WideToCP(const wchar_t *wideChars, unsigned int cp); + ~WideToCP() { delete [] cpchars; } + operator char *() { return cpchars; } +}; + namespace std { class u8nifstream: public std::ifstream { diff --git a/win32/snes9xw.vcproj b/win32/snes9xw.vcproj index 146294f5..7ddb4586 100644 --- a/win32/snes9xw.vcproj +++ b/win32/snes9xw.vcproj @@ -3014,6 +3014,14 @@ RelativePath=".\AVIOutput.h" > + + + + diff --git a/win32/wsnes9x.h b/win32/wsnes9x.h index 7f6252b5..3c8b071d 100644 --- a/win32/wsnes9x.h +++ b/win32/wsnes9x.h @@ -212,7 +212,7 @@ #ifdef UNICODE #define _tToChar WideToUtf8 #define _tFromChar Utf8ToWide -#define _tFromMS932 MS932ToWide +#define _tFromMS932(x) CPToWide(x,932) #else #define _tToChar #define _tFromChar From 795542de2b8b37e03a5f6103b6e67051025d2bd6 Mon Sep 17 00:00:00 2001 From: OV2 Date: Sat, 12 Jan 2013 19:24:41 +0100 Subject: [PATCH 3/7] Revert hires pixel logic to anomie's version --- tile.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/tile.cpp b/tile.cpp index 12ad6274..b3ca1900 100644 --- a/tile.cpp +++ b/tile.cpp @@ -1387,12 +1387,29 @@ extern struct SLineMatrixData LineMatrixData[240]; // We don't know how Sub(0, y) is handled. #define DRAW_PIXEL_H2x1(N, M) \ - if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ - { \ - GFX.S[Offset + 2 * N] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ - GFX.S[Offset + 2 * N + 1] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ - GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ - } + if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ + { \ + GFX.S[Offset + 2 * N] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ + GFX.S[Offset + 2 * N + 1] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N + 2]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ + GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ + } + +/* The logic above shifts everything one pixel to the left, thus producing a blank line on the right. The code below places the pixel on correct positions but + would incur two additional branches for the edges on every pixel. +*/ + +//#define DRAW_PIXEL_H2x1(N, M) \ +// if (Z1 > GFX.DB[Offset + 2 * N] && (M)) \ +// { \ +// GFX.S[Offset + 2 * N + 1] = MATH(GFX.ScreenColors[Pix], GFX.SubScreen[Offset + 2 * N], GFX.SubZBuffer[Offset + 2 * N]); \ +// if ((Offset + 2 * N ) % GFX.RealPPL != (SNES_WIDTH - 1) << 1) \ +// GFX.S[Offset + 2 * N + 2] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N + 2]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ +// if ((Offset + 2 * N) % GFX.RealPPL == 0) \ +// GFX.S[Offset + 2 * N] = MATH((GFX.ClipColors ? 0 : GFX.SubScreen[Offset + 2 * N]), GFX.RealScreenColors[Pix], GFX.SubZBuffer[Offset + 2 * N]); \ +// GFX.DB[Offset + 2 * N] = GFX.DB[Offset + 2 * N + 1] = Z2; \ +// } + + #define DRAW_PIXEL(N, M) DRAW_PIXEL_H2x1(N, M) #define NAME2 Hires From 52c516d549538e38a58f315a2c00a139648277df Mon Sep 17 00:00:00 2001 From: OV2 Date: Sat, 12 Jan 2013 19:25:36 +0100 Subject: [PATCH 4/7] Check correct tile cache for blank tiles --- tile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tile.cpp b/tile.cpp index b3ca1900..bbe448ec 100644 --- a/tile.cpp +++ b/tile.cpp @@ -698,7 +698,7 @@ void S9xSelectTileConverter (int depth, bool8 hires, bool8 sub, bool8 mosaic) } #define IS_BLANK_TILE() \ - (BG.Buffered[TileNumber] == BLANK_TILE) + ( ( (Tile & H_FLIP) ? BG.BufferedFlip[TileNumber] : BG.Buffered[TileNumber]) == BLANK_TILE) #define SELECT_PALETTE() \ if (BG.DirectColourMode) \ From d8e5d090aa804463a3b27d65aaa657769d8b976d Mon Sep 17 00:00:00 2001 From: OV2 Date: Fri, 25 Jan 2013 21:16:30 +0100 Subject: [PATCH 5/7] Fix MMC bank register bit 7, restore 64mbit ExLoRom map (FuSoYa) --- memmap.cpp | 2 +- sa1.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/memmap.cpp b/memmap.cpp index 72196bb1..dba837c6 100644 --- a/memmap.cpp +++ b/memmap.cpp @@ -3033,7 +3033,7 @@ void CMemory::Map_JumboLoROMMap (void) map_System(); map_lorom_offset(0x00, 0x3f, 0x8000, 0xffff, CalculatedSize - 0x400000, 0x400000); - map_lorom_offset(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize - 0x400000, 0x400000); + map_lorom_offset(0x40, 0x7f, 0x0000, 0xffff, CalculatedSize - 0x600000, 0x600000); map_lorom_offset(0x80, 0xbf, 0x8000, 0xffff, 0x400000, 0); map_lorom_offset(0xc0, 0xff, 0x0000, 0xffff, 0x400000, 0x200000); diff --git a/sa1.cpp b/sa1.cpp index 3852860d..af93a698 100644 --- a/sa1.cpp +++ b/sa1.cpp @@ -308,7 +308,7 @@ static void S9xSetSA1MemMap (uint32 which1, uint8 map) for (int c = 0; c < 0x200; c += 16) { - uint8 *block = &Memory.ROM[(map & 7) * 0x100000 + (c << 11) - 0x8000]; + uint8 *block = &Memory.ROM[(((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000]; for (int i = c + 8; i < c + 16; i++) Memory.Map[start2 + i] = SA1.Map[start2 + i] = block; } From 58f28b2dde4cf8629852970535d358394ad18bfa Mon Sep 17 00:00:00 2001 From: OV2 Date: Sat, 26 Jan 2013 13:30:56 +0100 Subject: [PATCH 6/7] Fix MMC reg for 64bit builds --- sa1.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sa1.cpp b/sa1.cpp index af93a698..bdad080d 100644 --- a/sa1.cpp +++ b/sa1.cpp @@ -308,7 +308,9 @@ static void S9xSetSA1MemMap (uint32 which1, uint8 map) for (int c = 0; c < 0x200; c += 16) { - uint8 *block = &Memory.ROM[(((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000]; + // conversion to int is needed here - map is promoted but which1 is not + int32 offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000; + uint8 *block = &Memory.ROM[offset]; for (int i = c + 8; i < c + 16; i++) Memory.Map[start2 + i] = SA1.Map[start2 + i] = block; } From c691b610e49e1399ab47f9aa8af366b2a3e9de24 Mon Sep 17 00:00:00 2001 From: OV2 Date: Thu, 31 Jan 2013 14:04:30 +0100 Subject: [PATCH 7/7] win32: fix ansi build --- win32/CXML.cpp | 1 + win32/_tfwopen.cpp | 3 ++- win32/_tfwopen.h | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/win32/CXML.cpp b/win32/CXML.cpp index ade7ba5c..cfcc7015 100644 --- a/win32/CXML.cpp +++ b/win32/CXML.cpp @@ -1,5 +1,6 @@ #include "CXML.h" #include +#include #include "_tfwopen.h" #ifndef UNICODE #define _tFromTCHAR(x) CPToWide(x,CP_ACP) diff --git a/win32/_tfwopen.cpp b/win32/_tfwopen.cpp index 3b5e8d7b..dd669320 100644 --- a/win32/_tfwopen.cpp +++ b/win32/_tfwopen.cpp @@ -176,7 +176,6 @@ -#ifdef UNICODE #include #include "_tfwopen.h" @@ -204,6 +203,8 @@ WideToCP::WideToCP(const wchar_t *wideChars, unsigned int cp) { WideCharToMultiByte(cp,0,wideChars,-1,cpchars,requiredChars,NULL,NULL); } +#ifdef UNICODE + extern "C" FILE *_tfwopen(const char *filename, const char *mode ) { wchar_t mode_w[30]; lstrcpyn(mode_w,Utf8ToWide(mode),29); diff --git a/win32/_tfwopen.h b/win32/_tfwopen.h index e77de029..34a31357 100644 --- a/win32/_tfwopen.h +++ b/win32/_tfwopen.h @@ -175,11 +175,11 @@ ***********************************************************************************/ - -#ifdef UNICODE #ifndef _TFWOPEN_H #define _TFWOPEN_H +#ifdef UNICODE + #include #ifdef __cplusplus @@ -194,8 +194,9 @@ int _twopen(const char *filename, int oflag, int pmode); } #endif +#endif // UNICODE + #ifdef __cplusplus -#include class Utf8ToWide { private: @@ -233,6 +234,12 @@ public: operator char *() { return cpchars; } }; +#endif // __cplusplus + +#ifdef UNICODE +#ifdef __cplusplus +#include + namespace std { class u8nifstream: public std::ifstream { @@ -283,6 +290,7 @@ __forceinline static int remove(const char *filename) { __forceinline static int open(const char *filename, int oflag, int pmode) { return _twopen(filename, oflag, pmode); } -#endif // _TFWOPEN_H -#endif +#endif // UNICODE + +#endif // _TFWOPEN_H \ No newline at end of file