bool GeneralImage::LoadImage(const std::wstring& imageName) { if (!m_Skin || imageName.empty()) { DisposeImage(); return false; } std::wstring filename = m_Path + imageName; m_Skin->MakePathAbsolute(filename); // Check extension and if it is missing, add .png size_t pos = filename.rfind(L'\\'); if (filename.find(L'.', (pos == std::wstring::npos) ? 0 : pos + 1) == std::wstring::npos) { filename += L".png"; } if (m_Bitmap && !m_Bitmap->GetBitmap()->HasFileChanged(filename)) { ApplyTransforms(); return true; } ImageOptions info; Gfx::D2DBitmap::GetFileInfo(filename, &info); if (!info.isValid()) { DisposeImage(); return false; } ImageCacheHandle* handle = GetImageCache().Get(info); if (!handle) { auto bitmap = new Gfx::D2DBitmap(filename); HRESULT hr = bitmap->Load(m_Skin->GetCanvas()); if (SUCCEEDED(hr)) { GetImageCache().Put(info, bitmap); handle = GetImageCache().Get(info); if (!handle) return false; } else { delete bitmap; bitmap = nullptr; } } DisposeImage(); if (handle) { m_Bitmap = handle; m_Options.m_Path = info.m_Path; m_Options.m_FileSize = info.m_FileSize; m_Options.m_FileTime = info.m_FileTime; ApplyTransforms(); return true; } return false; }
void mexFunction( int nlhs, // Number of left hand side (output) arguments mxArray *plhs[], // Array of left hand side arguments int nrhs, // Number of right hand side (input) arguments const mxArray *prhs[] // Array of right hand side arguments ) { char CommandLine[4096+1]; char *pt, *argv[128]; int argc = 1; if (nrhs != 2) { PrintHelp(); return; } if(nlhs > 1) { FatalError("Too many output arguments."); } // Setup error handler cmsSetErrorHandler(MatLabErrorHandler); // Defaults Verbose = 0; cInProf = NULL; cOutProf = NULL; cProofing = NULL; lMultiProfileChain = FALSE; nProfiles = 0; Intent = INTENT_PERCEPTUAL; ProofingIntent = INTENT_ABSOLUTE_COLORIMETRIC; PrecalcMode = 0; BlackPointCompensation = FALSE; lIsDeviceLink = FALSE; // Check types. Fist parameter is array of values, second parameter is command line if (!mxIsNumeric(prhs[0])) FatalError("Type mismatch on argument 1 -- Must be numeric"); if (!mxIsChar(prhs[1])) FatalError("Type mismatch on argument 2 -- Must be string"); // Unpack string to command line buffer if (mxGetString(prhs[1], CommandLine, 4096)) FatalError("Cannot unpack command string"); // Separate to argv[] convention argv[0] = NULL; for (pt = strtok(CommandLine, " "); pt; pt = strtok(NULL, " ")) { argv[argc++] = pt; } // Parse arguments HandleSwitches(argc, argv); nBytesDepth = SizeOfArrayType(prhs[0]); OpenTransforms(argc, argv); plhs[0] = AllocateOutputArray(prhs[0], OutputChannels); ApplyTransforms(prhs[0], plhs[0]); CloseTransforms(); // Done! }