[Windows] Fix driver version detection of AMD RDNA+ GPU on Windows 10
[xbmc.git] / xbmc / pictures / PictureThumbLoader.cpp
blobf223a3ba6072a13ff132e78c211c9a86b44c5454
1 /*
2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "PictureThumbLoader.h"
11 #include "FileItem.h"
12 #include "FileItemList.h"
13 #include "Picture.h"
14 #include "ServiceBroker.h"
15 #include "TextureCache.h"
16 #include "URL.h"
17 #include "filesystem/Directory.h"
18 #include "filesystem/MultiPathDirectory.h"
19 #include "guilib/GUIComponent.h"
20 #include "guilib/GUIWindowManager.h"
21 #include "settings/AdvancedSettings.h"
22 #include "settings/Settings.h"
23 #include "settings/SettingsComponent.h"
24 #include "utils/FileExtensionProvider.h"
25 #include "utils/FileUtils.h"
26 #include "utils/URIUtils.h"
27 #include "video/VideoFileItemClassify.h"
28 #include "video/VideoThumbLoader.h"
30 using namespace KODI::VIDEO;
31 using namespace XFILE;
33 CPictureThumbLoader::CPictureThumbLoader() : CThumbLoader()
35 m_regenerateThumbs = false;
38 CPictureThumbLoader::~CPictureThumbLoader()
40 StopThread();
43 void CPictureThumbLoader::OnLoaderFinish()
45 if (m_regenerateThumbs)
47 CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS);
48 CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg);
50 m_regenerateThumbs = false;
51 CThumbLoader::OnLoaderFinish();
54 bool CPictureThumbLoader::LoadItem(CFileItem* pItem)
56 bool result = LoadItemCached(pItem);
57 result |= LoadItemLookup(pItem);
59 return result;
62 bool CPictureThumbLoader::LoadItemCached(CFileItem* pItem)
64 if (pItem->m_bIsShareOrDrive
65 || pItem->IsParentFolder())
66 return false;
68 if (pItem->HasArt("thumb") && m_regenerateThumbs)
70 CServiceBroker::GetTextureCache()->ClearCachedImage(pItem->GetArt("thumb"));
71 if (m_textureDatabase->Open())
73 m_textureDatabase->ClearTextureForPath(pItem->GetPath(), "thumb");
74 m_textureDatabase->Close();
76 pItem->SetArt("thumb", "");
79 std::string thumb;
80 if (pItem->IsPicture() && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() && !pItem->IsCBR() && !pItem->IsPlayList())
81 { // load the thumb from the image file
82 thumb = pItem->HasArt("thumb") ? pItem->GetArt("thumb") : CTextureUtils::GetWrappedThumbURL(pItem->GetPath());
84 else if (IsVideo(*pItem) && !pItem->IsZIP() && !pItem->IsRAR() && !pItem->IsCBZ() &&
85 !pItem->IsCBR() && !pItem->IsPlayList())
86 { // video
87 CVideoThumbLoader loader;
88 loader.LoadItem(pItem);
90 else if (!pItem->HasArt("thumb"))
91 { // folder, zip, cbz, rar, cbr, playlist may have a previously cached image
92 thumb = GetCachedImage(*pItem, "thumb");
94 if (!thumb.empty())
96 CServiceBroker::GetTextureCache()->BackgroundCacheImage(thumb);
97 pItem->SetArt("thumb", thumb);
99 pItem->FillInDefaultIcon();
100 return true;
103 bool CPictureThumbLoader::LoadItemLookup(CFileItem* pItem)
105 return false;
108 void CPictureThumbLoader::ProcessFoldersAndArchives(CFileItem *pItem)
110 if (pItem->HasArt("thumb"))
111 return;
113 CTextureDatabase db;
114 db.Open();
115 if (pItem->IsCBR() || pItem->IsCBZ())
117 std::string strTBN(URIUtils::ReplaceExtension(pItem->GetPath(),".tbn"));
118 if (CFileUtils::Exists(strTBN))
120 db.SetTextureForPath(pItem->GetPath(), "thumb", strTBN);
121 CServiceBroker::GetTextureCache()->BackgroundCacheImage(strTBN);
122 pItem->SetArt("thumb", strTBN);
123 return;
126 if ((pItem->m_bIsFolder || pItem->IsCBR() || pItem->IsCBZ()) && !pItem->m_bIsShareOrDrive
127 && !pItem->IsParentFolder() && !pItem->IsPath("add"))
129 // first check for a folder.jpg
130 std::string thumb = "folder.jpg";
131 CURL pathToUrl = pItem->GetURL();
132 if (pItem->IsCBR())
134 pathToUrl = URIUtils::CreateArchivePath("rar",pItem->GetURL(),"");
135 thumb = "cover.jpg";
137 if (pItem->IsCBZ())
139 pathToUrl = URIUtils::CreateArchivePath("zip",pItem->GetURL(),"");
140 thumb = "cover.jpg";
142 if (pItem->IsMultiPath())
143 pathToUrl = CURL(CMultiPathDirectory::GetFirstPath(pItem->GetPath()));
144 thumb = URIUtils::AddFileToFolder(pathToUrl.Get(), thumb);
145 if (CFileUtils::Exists(thumb))
147 db.SetTextureForPath(pItem->GetPath(), "thumb", thumb);
148 CServiceBroker::GetTextureCache()->BackgroundCacheImage(thumb);
149 pItem->SetArt("thumb", thumb);
150 return;
152 if (!pItem->IsPlugin())
154 // we load the directory, grab 4 random thumb files (if available) and then generate
155 // the thumb.
157 CFileItemList items;
159 CDirectory::GetDirectory(pathToUrl, items, CServiceBroker::GetFileExtensionProvider().GetPictureExtensions(), DIR_FLAG_NO_FILE_DIRS);
161 // create the folder thumb by choosing 4 random thumbs within the folder and putting
162 // them into one thumb.
163 // count the number of images
164 for (int i=0; i < items.Size();)
166 if (!items[i]->IsPicture() || items[i]->IsZIP() || items[i]->IsRAR() || items[i]->IsPlayList())
168 items.Remove(i);
170 else
171 i++;
174 if (items.IsEmpty())
176 if (pItem->IsCBZ() || pItem->IsCBR())
178 CDirectory::GetDirectory(pathToUrl, items, CServiceBroker::GetFileExtensionProvider().GetPictureExtensions(), DIR_FLAG_NO_FILE_DIRS);
179 for (int i=0;i<items.Size();++i)
181 CFileItemPtr item = items[i];
182 if (item->m_bIsFolder)
184 ProcessFoldersAndArchives(item.get());
185 pItem->SetArt("thumb", items[i]->GetArt("thumb"));
186 pItem->SetArt("icon", items[i]->GetArt("icon"));
187 return;
191 return; // no images in this folder
194 // randomize them
195 items.Randomize();
197 if (items.Size() < 4 || pItem->IsCBR() || pItem->IsCBZ())
198 { // less than 4 items, so just grab the first thumb
199 items.Sort(SortByLabel, SortOrderAscending);
200 std::string thumb = CTextureUtils::GetWrappedThumbURL(items[0]->GetPath());
201 db.SetTextureForPath(pItem->GetPath(), "thumb", thumb);
202 CServiceBroker::GetTextureCache()->BackgroundCacheImage(thumb);
203 pItem->SetArt("thumb", thumb);
205 else
207 std::string thumb = CTextureUtils::GetWrappedImageURL(pItem->GetPath(), "picturefolder");
208 db.SetTextureForPath(pItem->GetPath(), "thumb", thumb);
209 pItem->SetArt("thumb", thumb);
212 // refill in the icon to get it to update
213 pItem->FillInDefaultIcon();