diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp index 04885c6904..b054b6066f 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.cpp @@ -51,7 +51,7 @@ u64 CFileSystemGCWii::GetFileSize(const char* _rFullPath) const const SFileInfo* pFileInfo = FindFileInfo(_rFullPath); - if (pFileInfo != NULL) + if (pFileInfo != NULL && !pFileInfo->IsDirectory()) return pFileInfo->m_FileSize; return 0; @@ -68,7 +68,7 @@ const char* CFileSystemGCWii::GetFileName(u64 _Address) const } } - return NULL; + return 0; } u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const @@ -115,82 +115,73 @@ bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFi delete[] buffer; return false; } -bool CFileSystemGCWii::ExportDir(const char* _rFullPath, const char* _rExportFolder) const + +void CFileSystemGCWii::ExportApploader(const char* _rExportFolder) const { - std::vector fst; - GetFileList(fst); char exportName[512]; - //look for the dir we are going to extract - u32 index[2]; - if (!_rFullPath) - { - //extract all - index[0] = 0; - index[1] = fst.size(); - } - else - { - for(index[0] = 0; index[0] < fst.size();index[0]++) - { - // Note By DacoTaco : i wonder why it doesn't work with just the _rFullPath - if (fst.at(index[0])->m_FullPath == FindFileInfo(_rFullPath)->m_FullPath ) - { - DEBUG_LOG(DISCIO,"Found the Dir at %u",index[0]); - break; - } - } - //now to get the index of last file - index[1] = index[0]; - while(index[1] < fst.at(index[0])->m_FileSize) - { - index[1]++; - } - DEBUG_LOG(DISCIO,"Dir found from %u to %u\nextracting to:\n%s",index[0],index[1],_rExportFolder); - } - //extraction - for (int i = index[0]; i < index[1];i++) - { - if (fst[i]->IsDirectory()) - { - sprintf(exportName, "%s/%s/", _rExportFolder, fst[i]->m_FullPath); - DEBUG_LOG(DISCIO, "%s", exportName); - if (!File::Exists(exportName)) - { + // Extract Apploader + // ------------------ + // Apploader code size + u32 AppSize = Read32(0x2440 + 0x14) << m_OffsetShift; + AppSize += Read32(0x2440 + 0x18) << m_OffsetShift; // + apptrailer size + AppSize += 0x20; // + the header = Apploader size! :') + DEBUG_LOG(DISCIO,"AppSize -> %x",AppSize); - if (!File::CreateFullPath(exportName)) - { - ERROR_LOG(DISCIO, "Could not create the path %s", exportName); - return false; - } - } - else - { - if (!File::IsDirectory(exportName)) - { - ERROR_LOG(DISCIO, "%s already exists and is not a directory", exportName); - return false; - } - DEBUG_LOG(DISCIO, "folder %s already exists", exportName); - - } - } - else - { - sprintf(exportName, "%s/%s", _rExportFolder, fst[i]->m_FullPath); - DEBUG_LOG(DISCIO, "%s", exportName); - if (!File::Exists(exportName)) - { - if (!ExportFile(fst[i]->m_FullPath, exportName)) - ERROR_LOG(DISCIO, "Could not export %s", exportName); - } - else - { - DEBUG_LOG(DISCIO, "%s already exists", exportName); - } - } + char* buffer = new char[AppSize]; + m_rVolume->Read(0x2440, AppSize, (u8*)buffer); + sprintf(exportName, "%s/apploader.ldr", _rExportFolder); + FILE* AppFile = fopen(exportName,"w"); + if (!AppFile) + { + PanicAlert("Failed to create %s! canceling further extraction",exportName); + return; } - return false; + fwrite(buffer, 1, AppSize, AppFile); + fclose(AppFile); + //delete[] buffer; buffer = 0; + + /* TODO : This part crashes with Wii games :/ + // Extract dol(bootfile) + // --------------------- + u32 DolOffset = Read32(0x420) << m_OffsetShift; + u32 DolSize = 0, offset = 0, size = 0, max = 0; + // note DacoTaco : thank you shuffle and discscrubber :P . find it kinda of pointless to include + // the discscrubber just for the GetDolSize function so its copy pasta time ... + // TODO: fix boot.dol size. or gc-tool is again silly with size or we are wrong (more likely :/) + + // Iterate through the 7 code segments + for (u8 i = 0; i < 7; i++) + { + m_rVolume->Read(DolOffset + 0x00 + i * 4, 4, (u8*)&offset); + m_rVolume->Read(DolOffset + 0x90 + i * 4, 4, (u8*)&size); + if (offset + size > DolSize) + DolSize = offset + size; + } + + // Iterate through the 11 data segments + for (u8 i = 0; i < 11; i++) + { + m_rVolume->Read(DolOffset + 0x1c + i * 4, 4, (u8*)&offset); + m_rVolume->Read(DolOffset + 0xac + i * 4, 4, (u8*)&size); + if (offset + size > DolSize) + DolSize = offset + size; + } + // Add header to size + DolSize += 0x40; + buffer = new char[DolSize]; + m_rVolume->Read(DolOffset, DolSize, (u8*)&buffer); + sprintf(exportName, "%s/boot.dol", _rExportFolder); + FILE* DolFile = fopen(exportName, "w"); + if (!DolFile) + { + PanicAlert("Failed to create %s! canceling further extraction",exportName); + return; + } + fwrite(buffer, 1, DolSize, DolFile); + fclose(DolFile); + delete[] buffer; + */ } u32 CFileSystemGCWii::Read32(u64 _Offset) const diff --git a/Source/Core/DiscIO/Src/FileSystemGCWii.h b/Source/Core/DiscIO/Src/FileSystemGCWii.h index 5c08f52855..6cdf632df8 100644 --- a/Source/Core/DiscIO/Src/FileSystemGCWii.h +++ b/Source/Core/DiscIO/Src/FileSystemGCWii.h @@ -32,10 +32,11 @@ public: virtual ~CFileSystemGCWii(); virtual bool IsInitialized() const; virtual u64 GetFileSize(const char* _rFullPath) const; + virtual size_t GetFileList(std::vector &_rFilenames) const; virtual const char* GetFileName(u64 _Address) const; virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const; virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const; - virtual bool ExportDir(const char* _rFullPath, const char* _rExportFilename) const; + virtual void ExportApploader(const char* _rExportFolder) const; private: @@ -43,7 +44,6 @@ private: u32 m_OffsetShift; // WII offsets are all shifted std::vector m_FileInfoVector; u32 Read32(u64 _Offset) const; - virtual size_t GetFileList(std::vector &_rFilenames) const; void GetStringFromOffset(u64 _Offset, char* Filename) const; const SFileInfo* FindFileInfo(const char* _rFullPath) const; bool InitFileSystem(); diff --git a/Source/Core/DiscIO/Src/Filesystem.h b/Source/Core/DiscIO/Src/Filesystem.h index 3c1e68063f..7eece8d26c 100644 --- a/Source/Core/DiscIO/Src/Filesystem.h +++ b/Source/Core/DiscIO/Src/Filesystem.h @@ -54,7 +54,7 @@ public: virtual u64 GetFileSize(const char* _rFullPath) const = 0; virtual u64 ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _MaxBufferSize) const = 0; virtual bool ExportFile(const char* _rFullPath, const char* _rExportFilename) const = 0; - virtual bool ExportDir(const char* _rFullPath, const char* _rExportFilename) const = 0; + virtual void ExportApploader(const char* _rExportFolder) const = 0; virtual const char* GetFileName(u64 _Address) const = 0; virtual const IVolume *GetVolume() const { return m_rVolume; } diff --git a/Source/Core/DolphinWX/Src/ISOProperties.cpp b/Source/Core/DolphinWX/Src/ISOProperties.cpp index dc1daacea0..c38cfeb77a 100644 --- a/Source/Core/DolphinWX/Src/ISOProperties.cpp +++ b/Source/Core/DolphinWX/Src/ISOProperties.cpp @@ -25,6 +25,12 @@ #include "ConfigManager.h" #include "StringUtil.h" +#if USE_XPM_BITMAPS + #include "../resources/isoprop_file.xpm" + #include "../resources/isoprop_folder.xpm" + #include "../resources/isoprop_disc.xpm" +#endif // USE_XPM_BITMAPS + struct WiiPartition { DiscIO::IVolume *Partition; @@ -58,7 +64,7 @@ BEGIN_EVENT_TABLE(CISOProperties, wxDialog) EVT_TREE_ITEM_RIGHT_CLICK(ID_TREECTRL, CISOProperties::OnRightClickOnTree) EVT_MENU(IDM_EXTRACTFILE, CISOProperties::OnExtractFile) EVT_MENU(IDM_EXTRACTDIR, CISOProperties::OnExtractDir) - EVT_MENU(IDM_EXTRACTALL, CISOProperties::OnExtractAll) + EVT_MENU(IDM_EXTRACTALL, CISOProperties::OnExtractDir) EVT_CHOICE(ID_LANG, CISOProperties::OnChangeBannerLang) END_EVENT_TABLE() @@ -168,10 +174,10 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW { for (u32 i = 0; i < WiiDisc.size(); i++) { - fileIter beginning = WiiDisc.at(i).Files.begin(), end = WiiDisc.at(i).Files.end(), pos = WiiDisc.at(i).Files.begin(); - wxTreeItemId PartitionRoot = m_Treectrl->AppendItem(RootId, wxString::Format(wxT("Partition %i"), i), -1, -1, 0); - CreateDirectoryTree(PartitionRoot, beginning, end, pos, (char *)"/"); - if (i == 0) + WiiPartition partition = WiiDisc.at(i); + wxTreeItemId PartitionRoot = m_Treectrl->AppendItem(RootId, wxString::Format(wxT("Partition %i"), i), 0, 0, 0); + CreateDirectoryTree(PartitionRoot, partition.Files, 1, partition.Files.at(0)->m_FileSize); + if (i == 1) m_Treectrl->Expand(PartitionRoot); } } @@ -180,8 +186,7 @@ CISOProperties::CISOProperties(const std::string fileName, wxWindow* parent, wxW // TODO : Should we add a way to browse the wad file ? if (!DiscIO::IsVolumeWadFile(OpenISO)) { - fileIter beginning = GCFiles.begin(), end = GCFiles.end(), pos = GCFiles.begin(); - CreateDirectoryTree(RootId, beginning, end, pos, (char *)"/"); + CreateDirectoryTree(RootId, GCFiles, 1, GCFiles.at(0)->m_FileSize); } } m_Treectrl->Expand(RootId); @@ -216,54 +221,40 @@ CISOProperties::~CISOProperties() delete OpenISO; } -void CISOProperties::CreateDirectoryTree(wxTreeItemId& parent, - fileIter& begin, - fileIter& end, - fileIter& iterPos, - char *directory) +size_t CISOProperties::CreateDirectoryTree(wxTreeItemId& parent, + std::vector fileInfos, + const size_t _FirstIndex, + const size_t _LastIndex) { - bool bRoot = true; + size_t CurrentIndex = _FirstIndex; - if(iterPos == begin) - ++iterPos; - else - bRoot = false; - - char *name = (char *)((*iterPos)->m_FullPath); - - if(iterPos == end) - return; - - do + while (CurrentIndex < _LastIndex) { - if((*iterPos)->IsDirectory()) { - char *dirName; - name[strlen(name) - 1] = '\0'; - dirName = strrchr(name, DIR_SEP_CHR); - if(!dirName) - dirName = name; - else - dirName++; + const DiscIO::SFileInfo *rFileInfo = fileInfos[CurrentIndex]; + char *name = (char*)rFileInfo->m_FullPath; - wxTreeItemId item = m_Treectrl->AppendItem(parent, wxString::FromAscii(dirName)); - CreateDirectoryTree(item, begin, end, ++iterPos, name); - } else { - char *fileName = strrchr(name, DIR_SEP_CHR); - if(!fileName) - fileName = name; - else - fileName++; + if (rFileInfo->IsDirectory()) name[strlen(name) - 1] = '\0'; + char *itemName = strrchr(name, DIR_SEP_CHR); - m_Treectrl->AppendItem(parent, wxString::FromAscii(fileName)); - ++iterPos; + if(!itemName) + itemName = name; + else + itemName++; + + // check next index + if (rFileInfo->IsDirectory()) + { + wxTreeItemId item = m_Treectrl->AppendItem(parent, wxString::FromAscii(itemName), 1, 1); + CurrentIndex = CreateDirectoryTree(item, fileInfos, CurrentIndex + 1, (size_t)rFileInfo->m_FileSize); } + else + { + m_Treectrl->AppendItem(parent, wxString::FromAscii(itemName), 2, 2); + CurrentIndex++; + } + } - if(iterPos == end) - break; - - name = (char *)((*iterPos)->m_FullPath); - - } while(bRoot || strstr(name, directory)); + return CurrentIndex; } void CISOProperties::CreateGUIControls(bool IsWad) @@ -498,10 +489,18 @@ void CISOProperties::CreateGUIControls(bool IsWad) m_Information->SetSizer(sInfoPage); sInfoPage->Layout(); - + // Filesystem icons + wxIcon iconTemp; + m_iconList = new wxImageList(16, 16); + + iconTemp.CopyFromBitmap(wxBitmap(disc_xpm)); m_iconList->Add(iconTemp); // 0 + iconTemp.CopyFromBitmap(wxBitmap(folder_xpm)); m_iconList->Add(iconTemp); // 1 + iconTemp.CopyFromBitmap(wxBitmap(file_xpm)); m_iconList->Add(iconTemp); // 2 + // Filesystem tree m_Treectrl = new wxTreeCtrl(m_Filesystem, ID_TREECTRL, wxDefaultPosition, wxDefaultSize, wxTR_DEFAULT_STYLE, wxDefaultValidator); - RootId = m_Treectrl->AddRoot(wxT("Disc"), -1, -1, 0); + m_Treectrl->AssignImageList(m_iconList); + RootId = m_Treectrl->AddRoot(wxT("Disc"), 0, 0, 0); wxBoxSizer* sTreePage; sTreePage = new wxBoxSizer(wxVERTICAL); @@ -562,13 +561,17 @@ void CISOProperties::OnRightClickOnTree(wxTreeEvent& event) m_Treectrl->SelectItem(event.GetItem()); wxMenu popupMenu; - if (m_Treectrl->ItemHasChildren(m_Treectrl->GetSelection())) - popupMenu.Append(IDM_EXTRACTDIR, _("Extract Directory...!experimental!")); - else + + if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 0 + && m_Treectrl->GetFirstVisibleItem() != m_Treectrl->GetSelection()) + popupMenu.Append(IDM_EXTRACTDIR, _("Extract Partition...")); + else if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 1) + popupMenu.Append(IDM_EXTRACTDIR, _("Extract Directory...")); + else if (m_Treectrl->GetItemImage(m_Treectrl->GetSelection()) == 2) popupMenu.Append(IDM_EXTRACTFILE, _("Extract File...")); - if (!DiscIO::IsVolumeWiiDisc(OpenISO)) //disabled on wii until it dumps more than partition 0 - popupMenu.Append(IDM_EXTRACTALL, _("Extract All Files (!!Experimental!!)")); + popupMenu.Append(IDM_EXTRACTALL, _("Extract All Files...")); + PopupMenu(&popupMenu); event.Skip(); @@ -615,19 +618,114 @@ void CISOProperties::OnExtractFile(wxCommandEvent& WXUNUSED (event)) pFileSystem->ExportFile(File.mb_str(), Path.mb_str()); } -void CISOProperties::OnExtractDir(wxCommandEvent& WXUNUSED (event)) +void CISOProperties::ExportDir(const char* _rFullPath, const char* _rExportFolder, const int partitionNum) { - if(!AskYesNo("%s", "Warning! this process does not yet have a progress bar.\nDolphin might appear unresponsive(depends on how big the folder is) until the extraction is complete\nContinue?")) - return; - wxString Path; - wxString Directory; + char exportName[512]; + u32 index[2], offsetShift = 0; + std::vector fst; + DiscIO::IFileSystem *FS = 0; - Directory = m_Treectrl->GetItemText(m_Treectrl->GetSelection()); - Path = wxDirSelector(wxT("Choose the folder where to extract to")); + if (DiscIO::IsVolumeWiiDisc(OpenISO)) + { + FS = WiiDisc.at(partitionNum).FileSystem; + offsetShift = 2; + } + else + FS = pFileSystem; + + FS->GetFileList(fst); + + if (!_rFullPath) // Extract all + { + index[0] = 0; + index[1] = fst.size(); + + FS->ExportApploader(_rExportFolder); + } + else // Look for the dir we are going to extract + { + for(index[0] = 0; index[0] < fst.size(); index[0]++) + { + if (!strcmp(fst.at(index[0])->m_FullPath, _rFullPath)) + { + DEBUG_LOG(DISCIO, "Found the Dir at %u", index[0]); + index[1] = (u32)fst.at(index[0])->m_FileSize; + break; + } + } + + DEBUG_LOG(DISCIO,"Dir found from %u to %u\nextracting to:\n%s",index[0],index[1],_rExportFolder); + } + + wxProgressDialog dialog(index[0] ? _T("Extracting Directory") : _T("Extracting All Files"), + _T("Extracting..."), + index[1], // range + this, // parent + wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_ELAPSED_TIME | + wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | + wxPD_SMOOTH // - makes indeterminate mode bar on WinXP very small + ); + dialog.CenterOnParent(); + + // Extraction + for (u32 i = index[0]; i < index[1]; i++) + { + if (!dialog.Update(i, wxString::Format(_T("Extracting %s"), wxString::FromAscii(fst[i]->m_FullPath)))) + break; + + if (fst[i]->IsDirectory()) + { + sprintf(exportName, "%s/%s/", _rExportFolder, fst[i]->m_FullPath); + DEBUG_LOG(DISCIO, "%s", exportName); + + if (!File::Exists(exportName) && !File::CreateFullPath(exportName)) + { + ERROR_LOG(DISCIO, "Could not create the path %s", exportName); + } + else + { + if (!File::IsDirectory(exportName)) + ERROR_LOG(DISCIO, "%s already exists and is not a directory", exportName); + + DEBUG_LOG(DISCIO, "folder %s already exists", exportName); + } + } + else + { + sprintf(exportName, "%s/%s", _rExportFolder, fst[i]->m_FullPath); + DEBUG_LOG(DISCIO, "%s", exportName); + + if (!File::Exists(exportName) && !FS->ExportFile(fst[i]->m_FullPath, exportName)) + { + ERROR_LOG(DISCIO, "Could not export %s", exportName); + } + else + { + DEBUG_LOG(DISCIO, "%s already exists", exportName); + } + } + } +} + +void CISOProperties::OnExtractDir(wxCommandEvent& event) +{ + wxString Directory = m_Treectrl->GetItemText(m_Treectrl->GetSelection()); + wxString Path = wxDirSelector(wxT("Choose the folder where to extract to")); if (!Path || !Directory) return; + if (event.GetId() == IDM_EXTRACTALL) + { + if (DiscIO::IsVolumeWiiDisc(OpenISO)) + for (u32 i = 0; i < WiiDisc.size(); i++) + ExportDir(NULL, Path.mb_str(), i); + else + ExportDir(NULL, Path.mb_str()); + + return; + } + while (m_Treectrl->GetItemParent(m_Treectrl->GetSelection()) != m_Treectrl->GetRootItem()) { wxString temp; @@ -641,26 +739,10 @@ void CISOProperties::OnExtractDir(wxCommandEvent& WXUNUSED (event)) { int partitionNum = wxAtoi(Directory.SubString(10, 11)); Directory.Remove(0, 12); // Remove "Partition x/" - WiiDisc.at(partitionNum).FileSystem->ExportDir(Directory.mb_str(), Path.mb_str()); + ExportDir(Directory.mb_str(), Path.mb_str(), partitionNum); } else - pFileSystem->ExportDir(Directory.mb_str(), Path.mb_str()); -} - -void CISOProperties::OnExtractAll(wxCommandEvent& WXUNUSED (event)) -{ - if(!AskYesNo("%s", "Warning! this process does not yet have a progress bar.\nDolphin will appear unresponsive until the extraction is complete\nContinue?")) - return; - wxString dirHome; - wxGetHomeDir(&dirHome); - - wxDirDialog dialog(this, _("Browse for a directory to add"), dirHome, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST); - - if (dialog.ShowModal() == wxID_OK) - { - std::string sPath(dialog.GetPath().mb_str()); - pFileSystem->ExportDir(NULL,sPath.c_str()); - } + ExportDir(Directory.mb_str(), Path.mb_str()); } void CISOProperties::SetRefresh(wxCommandEvent& event) diff --git a/Source/Core/DolphinWX/Src/ISOProperties.h b/Source/Core/DolphinWX/Src/ISOProperties.h index b9ef585b6d..c82effd767 100644 --- a/Source/Core/DolphinWX/Src/ISOProperties.h +++ b/Source/Core/DolphinWX/Src/ISOProperties.h @@ -141,6 +141,7 @@ class CISOProperties : public wxDialog wxTreeCtrl *m_Treectrl; wxTreeItemId RootId; + wxImageList *m_iconList; enum { @@ -212,8 +213,8 @@ class CISOProperties : public wxDialog ID_MAKER, ID_COMMENT, ID_BANNER, - IDM_EXTRACTALL, IDM_EXTRACTDIR, + IDM_EXTRACTALL, IDM_EXTRACTFILE, IDM_BNRSAVEAS }; @@ -230,7 +231,6 @@ class CISOProperties : public wxDialog void OnRightClickOnTree(wxTreeEvent& event); void OnExtractFile(wxCommandEvent& event); void OnExtractDir(wxCommandEvent& event); - void OnExtractAll(wxCommandEvent& event); void SetRefresh(wxCommandEvent& event); void OnChangeBannerLang(wxCommandEvent& event); @@ -239,9 +239,12 @@ class CISOProperties : public wxDialog std::vector GCFiles; typedef std::vector::iterator fileIter; - void CreateDirectoryTree(wxTreeItemId& parent,fileIter& begin, - fileIter& end, - fileIter& iterPos, char *directory); + size_t CreateDirectoryTree(wxTreeItemId& parent, + std::vector fileInfos, + const size_t _FirstIndex, + const size_t _LastIndex); + void ExportDir(const char* _rFullPath, const char* _rExportFilename, + const int partitionNum = 0); IniFile GameIni; std::string GameIniFile; diff --git a/Source/Core/DolphinWX/resources/isoprop_disc.xpm b/Source/Core/DolphinWX/resources/isoprop_disc.xpm new file mode 100644 index 0000000000..2cbf8f34f2 --- /dev/null +++ b/Source/Core/DolphinWX/resources/isoprop_disc.xpm @@ -0,0 +1,142 @@ +/* XPM */ +static const char *disc_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 120 2", +"o c #AEA0A0", +": c #F7F7F7", +"2. c #FCC0BE", +"z c #878A92", +"q c #BCEEC1", +"1 c #BDFEC0", +"D c #A5A5A5", +"W c #B4B4B4", +"B c #E1E1E0", +"& c #FAC3C0", +"M c #E1E1E1", +"O. c #C8BBA7", +"3. c #95A389", +"*. c #F5B9BA", +"w c #C6BEA6", +"@ c #E9E9E9", +">. c #F8F8F8", +"=. c #D6DABA", +"b c #979797", +":. c #B5B5B5", +"( c #D0CFE8", +"+ c #E2E2E2", +"&. c #E6D0D1", +"I c #545454", +"F c #818180", +"s c #A4A3A3", +"_ c #CCCCCC", +"U c #A9A7A7", +"j c #DBDBDA", +"H c #EAEAEA", +"7. c #E0DFDF", +"= c #DBD8D8", +"3 c #F4BABB", +"* c #F2C3C5", +"u c #C9C8EE", +"l c #9090A7", +"S c #A7A7A7", +"p c #7B8A7F", +"i c #A7B3CF", +"O c #CACCCC", +"N c #E3E3E3", +"P c #555555", +";. c #8BA696", +"K c #828282", +"~ c #AAABAA", +"! c #AAABAB", +"%. c #E1E3E4", +"/ c #8E8DAC", +"h c #CDCDCC", +"5. c #DCDCDC", +"| c #C2C1F6", +"m c #FAFAFA", +"<. c #DCD9D9", +" . c #9B9CAF", +"] c #968C88", +"C c #7B7B7A", +"T c #7B7B7D", +"' c #999999", +"v c #A8A8A8", +"a c #8F8B86", +"$. c #B7B7B7", +"- c #DFE0E0", +" c None", +"E c #E4E4E4", +"o. c #AC8D8E", +"x c #ABACAB", +"X. c #7E7C7C", +"` c #A1A1A1", +". c #BFBFBF", +"% c #9BAD8F", +"[ c #7D8F7D", +".. c #818383", +"< c #91A8A3", +",. c #E0E1E1", +"R c #E5E5E2", +"V c #E5E5E3", +"A c #484848", +"k c #D6D6E3", +"^ c #898B97", +"+. c #BCF2BC", +"6 c #EDEDED", +"7 c #FCFCFC", +"} c #BAB8F6", +"2 c #D3DDB9", +"Q c #AAAAAA", +"4. c #B9B9B9", +"Z c #A5A3A5", +"6. c #E6E6E6", +"d c #A3A3A3", +"Y c #A3A3A4", +"t c #B2B2B2", +"#. c #C0C3FD", +"# c #DFDFDF", +"9. c #AA9B9B", +"G c #EEEEEE", +"$ c #A3A3B0", +"9 c #C0C0FE", +"r c #7E7E7E", +"4 c #E6D1D1", +"; c #E7E7E7", +") c #D8D8DD", +"1. c #F4C4C5", +"{ c #A7BAC9", +"f c #959595", +"L c #A4A4A3", +"8. c #C7C9C9", +"c c #A4A4A4", +"5 c #E0E3E3", +"n c #B3B3B3", +"y c #C2C2C2", +"J c #EFEFEF", +"> c #FEFEFE", +"8 c #BCBAF4", +"X c #A88C8C", +"0 c #B9D0DF", +"g c #9D9D9D", +"-. c #BFFEBE", +"e c #7A7879", +"@. c #BADAD6", +", c #BBBBBB", +/* pixels */ +" . . . . ", +" X o O + @ # . . ", +" $ % & * = - ; : > > , . ", +" < 1 2 3 4 5 6 7 > > > . ", +" 8 9 0 q w X e r t @ > > > y ", +" $ u 8 i p a s d f g @ > > y ", +". h j k l z x c d v b n > m M . ", +". N B V C Z v A A S D F G @ H . ", +". H H J K L S P I U Y T R B E . ", +". + m > W b D Q ! ~ ^ / ( ) _ . ", +" . > > H ` ' d s ] [ { } | . ", +" . > > > @ W ..X.o.O.+.@.#./ ", +" $.> > > 7 G %.&.*.=.-.;. ", +" . :.> > >.@ ,.<.1.2.3.@. ", +" 4.4.5.6.7.8.9.X. ", +" . . . . " +}; diff --git a/Source/Core/DolphinWX/resources/isoprop_file.xpm b/Source/Core/DolphinWX/resources/isoprop_file.xpm new file mode 100644 index 0000000000..5a2ccc97cc --- /dev/null +++ b/Source/Core/DolphinWX/resources/isoprop_file.xpm @@ -0,0 +1,66 @@ +/* XPM */ +static const char *file_xpm[] = { +/* columns rows colors chars-per-pixel */ +"16 16 44 1", +"$ c #D9D9D9", +"9 c #E8E8E8", +"O c #FFFFFF", +"o c #626262", +"q c #ADADAD", +"t c #BCBCBC", +"* c #DADADA", +"7 c #A6A6A6", +"1 c #B5B5B5", +"g c #E2E2E2", +"& c #F1F1F1", +"2 c #9F9F9F", +"% c #F9F9F9", +"e c #C5C5C5", +"= c #AFAFAF", +"r c #BEBEBE", +" c None", +"y c #B7B7B7", +"# c #D5D5D5", +", c #E4E4E4", +"+ c #F3F3F3", +"p c #CECECE", +"@ c #ECECEC", +"u c #FBFBFB", +"h c #C7C7C7", +"- c #F4F4F4", +"< c #CFCFCF", +"5 c #DEDEDE", +"> c #FCFCFC", +"X c #AAAAAA", +"f c #C8C8C8", +"d c #D7D7D7", +"4 c #E6E6E6", +"s c #F5F5F5", +"8 c #A3A3A3", +"a c #C1C1C1", +"i c #EEEEEE", +"3 c #FDFDFD", +". c #ABABAB", +"6 c #BABABA", +"0 c #B3B3B3", +"w c #D1D1D1", +"; c #E0E0E0", +": c #616161", +/* pixels */ +" ", +" ..XXXXXXo ", +" XOOO+@#$Xo ", +" XOOO%&*$X=o ", +" XOOO%-;$o:o: ", +" XOOO>+,$<12: ", +" XOOO3%45678o ", +" XOOOO%9$0qXo ", +" XOO3-@werty: ", +" XO3ui5. c #DEBD73", +"*. c #EDC977", +"x c #FFDF8A", +") c #B9A77D", +"v c #BEB192", +"k c #FFDF8B", +"m c #B9AA88", +"L c #F5D484", +"5 c #CDBD9C", +"n c #CDB47F", +"f c #EBF0FD", +"0. c #DCBA6F", +"g c #CDB179", +"-. c #94979E", +"p. c #947C45", +"' c #B2A073", +"R c #B7A477", +"u. c #A38E61", +"s. c #C1AF86", +"# c #DAD2BD", +"9. c #C6A760", +":. c #CBAB62", +"y c #C6B694", +"w. c #DFBE72", +"= c #F3DDAB", +"C c #FDD986", +". c #E7DEBA", +", c #FEE993", +": c #D3CBB4", +"6 c #CEC4AC", +"] c #D3B368", +"9 c #FEE691", +"c c #FEE388", +"p c #FEE38E", +"a c #FEE38F", +"t c #D3B373", +"d c #CCC1A0", +"& c #FFF08D", +"{ c #B8AB8C", +",. c #B8AB8D", +"Q c #C2B9A3", +"F c #C2AD7C", +"/ c #EFCE80", +"P c #FEDA84", +"$ c #FFED8D", +"D c #FEFEFE", +"%. c #E5C378", +"> c #FFEA92", +"s c #FFE78A", +"6. c #989CA9", +"A c #BBAC89", +/* pixels */ +" ", +" . X X X X X o O + @ ", +" # $ % % % % % & * = - ; ", +" : > , < < , , 1 2 3 4 5 ", +" 6 7 8 8 9 0 q w e r t y ", +" u i p p a p p s d f g h ", +" j k l l l z x c v b n m ", +" M N B V B C Z A S D F G H ", +" J K L L L P I U Y T R E W Q ", +" ! ~ ^ ^ / ( ) _ ` T ' ] [ { ", +" ! } | | | ..._ X.T o.O.+.@. ", +" @.#.$.%.&.*.=.-.X.T ;.:.>.,. ", +" <.1.2.2.3.4.5.6.7.T 8.9.0.,. ", +" <.q.w.e.e.r.t.y.u.i.p.a.s. ", +" d.d.d.d.f.g.h.j.k.l.z. ", +" " +};