ResourceBitmapRequester::ResourceBitmapRequester( ResourceLoader& resourceLoader )
: ResourceRequesterBase( resourceLoader )
{
- mThreadImage = new ResourceThreadImage( resourceLoader );
+ mThreadImageLocal = new ResourceThreadImage( resourceLoader, false );
+ mThreadImageRemote = new ResourceThreadImage( resourceLoader, true );
mThreadDistanceField = new ResourceThreadDistanceField( resourceLoader );
}
ResourceBitmapRequester::~ResourceBitmapRequester()
{
- delete mThreadImage;
+ delete mThreadImageLocal;
+ delete mThreadImageRemote;
delete mThreadDistanceField;
}
void ResourceBitmapRequester::Pause()
{
- mThreadImage->Pause();
+ mThreadImageLocal->Pause();
+ mThreadImageRemote->Pause();
mThreadDistanceField->Pause();
}
void ResourceBitmapRequester::Resume()
{
- mThreadImage->Resume();
+ mThreadImageLocal->Resume();
+ mThreadImageRemote->Resume();
mThreadDistanceField->Resume();
}
BitmapResourceType* resType = static_cast<BitmapResourceType*>(request.GetType());
if( resType )
{
- // Work out if the resource is in memory or a file:
- const ResourceThreadBase::RequestType requestType = request.GetResource().Get() ? ResourceThreadBase::RequestDecode : ResourceThreadBase::RequestLoad;
-
// Work out what thread to decode / load the image on:
- ResourceThreadBase* const imageThread = mThreadImage;
+ ResourceThreadBase* const localImageThread = mThreadImageLocal;
+ ResourceThreadBase* const remoteImageThread = mThreadImageRemote;
ResourceThreadBase* const distanceFieldThread = mThreadDistanceField ;
- ResourceThreadBase* const workerThread = ( !resType->imageAttributes.IsDistanceField() ) ? imageThread : distanceFieldThread;
+ ResourceThreadBase* workerThread;
+
+ // Work out if the resource is in memory, a file, or in a remote server:
+ ResourceThreadBase::RequestType requestType;
+ if( request.GetResource().Get() )
+ {
+ requestType = ResourceThreadBase::RequestDecode;
+ workerThread = localImageThread;
+ }
+ else
+ {
+ const std::string& resourcePath = request.GetPath();
+ if( resourcePath.length() > 7 && strncasecmp( resourcePath.c_str(), "http://", 7 ) == 0 )
+ {
+ requestType = ResourceThreadBase::RequestDownload;
+ workerThread = remoteImageThread;
+ }
+ else
+ {
+ requestType = ResourceThreadBase::RequestLoad;
+ workerThread = localImageThread;
+ }
+ }
+
+ if( resType->imageAttributes.IsDistanceField() )
+ {
+ workerThread = distanceFieldThread;
+ }
// Dispatch the job to the right thread:
workerThread->AddRequest( request, requestType );
void ResourceBitmapRequester::CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId)
{
- mThreadImage->CancelRequest(id);
+ mThreadImageLocal->CancelRequest(id);
+ mThreadImageRemote->CancelRequest(id);
mThreadDistanceField->CancelRequest(id);
}