bool CWinSystemX11::CreateNewWindow(const CStdString& name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction) { RESOLUTION_INFO& desktop = g_settings.m_ResInfo[RES_DESKTOP]; if (fullScreen && (res.iWidth != desktop.iWidth || res.iHeight != desktop.iHeight || res.fRefreshRate != desktop.fRefreshRate || res.iScreen != desktop.iScreen)) { //on the first call to SDL_SetVideoMode, SDL stores the current displaymode //SDL restores the displaymode on SDL_QUIT(), if we change the displaymode //before the first call to SDL_SetVideoMode, SDL changes the displaymode back //to the wrong mode on exit CLog::Log(LOGINFO, "CWinSystemX11::CreateNewWindow initializing to desktop resolution first"); if (!SetFullScreen(true, desktop, false)) return false; } if(!SetFullScreen(fullScreen, res, false)) return false; CTexture iconTexture; iconTexture.LoadFromFile("special://xbmc/media/icon.png"); SDL_WM_SetIcon(SDL_CreateRGBSurfaceFrom(iconTexture.GetPixels(), iconTexture.GetWidth(), iconTexture.GetHeight(), 32, iconTexture.GetPitch(), 0xff0000, 0x00ff00, 0x0000ff, 0xff000000L), NULL); SDL_WM_SetCaption("XBMC Media Center", NULL); m_bWindowCreated = true; return true; }
CBaseTexture *CBaseTexture::LoadFromFile(const CStdString& texturePath, unsigned int idealWidth, unsigned int idealHeight, bool autoRotate) { #if defined(TARGET_ANDROID) CURL url(texturePath); if (url.GetProtocol() == "androidapp") { XFILE::CFileAndroidApp file; if (file.Open(url)) { unsigned int imgsize = (unsigned int)file.GetLength(); unsigned char* inputBuff = new unsigned char[imgsize]; unsigned int inputBuffSize = file.Read(inputBuff, imgsize); file.Close(); if (inputBuffSize != imgsize) { delete [] inputBuff; return NULL; } CTexture *texture = new CTexture(); unsigned int width = file.GetIconWidth(); unsigned int height = file.GetIconHeight(); texture->LoadFromMemory(width, height, width*4, XB_FMT_RGBA8, true, inputBuff); delete [] inputBuff; return texture; } } #endif CTexture *texture = new CTexture(); if (texture->LoadFromFile(texturePath, idealWidth, idealHeight, autoRotate, NULL, NULL)) return texture; delete texture; return NULL; }
CBaseTexture *CBaseTexture::LoadFromFile(const CStdString& texturePath, unsigned int idealWidth, unsigned int idealHeight, bool autoRotate) { CTexture *texture = new CTexture(); if (texture->LoadFromFile(texturePath, idealWidth, idealHeight, autoRotate, NULL, NULL)) return texture; delete texture; return NULL; }
bool CPicture::CreateTiledThumb(const std::vector<std::string> &files, const std::string &thumb) { if (!files.size()) return false; unsigned int num_across = (unsigned int)ceil(sqrt((float)files.size())); unsigned int num_down = (files.size() + num_across - 1) / num_across; unsigned int tile_width = g_advancedSettings.m_thumbSize / num_across; unsigned int tile_height = g_advancedSettings.m_thumbSize / num_down; unsigned int tile_gap = std::max(1,g_advancedSettings.m_thumbSize / 512); // create a buffer for the resulting thumb uint32_t *buffer = (uint32_t *)calloc(g_advancedSettings.m_thumbSize * g_advancedSettings.m_thumbSize, 4); for (unsigned int i = 0; i < files.size(); ++i) { int x = i % num_across; int y = i / num_across; // load in the image CTexture texture; unsigned int width = tile_width - 2*tile_gap, height = tile_height - 2*tile_gap; if (texture.LoadFromFile(files[i], width, height, g_guiSettings.GetBool("pictures.useexifrotation")) && texture.GetWidth() && texture.GetHeight()) { GetScale(texture.GetWidth(), texture.GetHeight(), width, height); // scale appropriately uint32_t *scaled = new uint32_t[width * height]; if (ScaleImage(texture.GetPixels(), texture.GetWidth(), texture.GetHeight(), texture.GetPitch(), (uint8_t *)scaled, width, height, width * 4)) { if (!texture.GetOrientation() || OrientateImage(scaled, width, height, texture.GetOrientation())) { // drop into the texture unsigned int posX = x*tile_width + (tile_width - width)/2; unsigned int posY = y*tile_height + (tile_height - height)/2; uint32_t *dest = buffer + posX + posY*g_advancedSettings.m_thumbSize; uint32_t *src = scaled; for (unsigned int y = 0; y < height; ++y) { memcpy(dest, src, width*4); dest += g_advancedSettings.m_thumbSize; src += width; } } } delete[] scaled; } } // now save to a file bool ret = CreateThumbnailFromSurface((uint8_t *)buffer, g_advancedSettings.m_thumbSize, g_advancedSettings.m_thumbSize, g_advancedSettings.m_thumbSize * 4, thumb); free(buffer); return ret; }
bool CTextureDDSJob::DoWork() { CTexture texture; if (URIUtils::GetExtension(m_original).Equals(".dds")) return false; if (texture.LoadFromFile(m_original)) { // convert to DDS CDDSImage dds; CLog::Log(LOGDEBUG, "Creating DDS version of: %s", m_original.c_str()); return dds.Create(URIUtils::ReplaceExtension(m_original, ".dds"), texture.GetWidth(), texture.GetHeight(), texture.GetPitch(), texture.GetPixels(), 40); } return false; }
bool CWinSystemEGL::CreateNewWindow(const CStdString& name, bool fullScreen, RESOLUTION_INFO& res, PHANDLE_EVENT_FUNC userFunction) { if(!SetFullScreen(fullScreen, res, false)) return false; CTexture iconTexture; iconTexture.LoadFromFile("special://xbmc/media/icon.png"); SDL_WM_SetIcon(SDL_CreateRGBSurfaceFrom(iconTexture.GetPixels(), iconTexture.GetWidth(), iconTexture.GetHeight(), BPP, iconTexture.GetPitch(), 0xff0000, 0x00ff00, 0x0000ff, 0xff000000L), NULL); SDL_WM_SetCaption("XBMC Media Center", NULL); m_bWindowCreated = true; m_eglext = " "; m_eglext += eglQueryString(m_eglDisplay, EGL_EXTENSIONS); m_eglext += " "; CLog::Log(LOGDEBUG, "EGL_EXTENSIONS:%s", m_eglext.c_str()); return true; }
CBaseTexture *CTextureCacheJob::LoadImage(const CStdString &image, unsigned int width, unsigned int height, bool flipped) { // Validate file URL to see if it is an image CFileItem file(image, false); if (!(file.IsPicture() && !(file.IsZIP() || file.IsRAR() || file.IsCBR() || file.IsCBZ() )) && !file.GetMimeType().Left(6).Equals("image/")) // ignore non-pictures return NULL; CTexture *texture = new CTexture(); if (!texture->LoadFromFile(image, width, height, g_guiSettings.GetBool("pictures.useexifrotation"))) { delete texture; return NULL; } // EXIF bits are interpreted as: <flipXY><flipY*flipX><flipX> // where to undo the operation we apply them in reverse order <flipX>*<flipY*flipX>*<flipXY> // When flipped = true we have an additional <flipX> on the left, which is equivalent to toggling the last bit if (flipped) texture->SetOrientation(texture->GetOrientation() ^ 1); return texture; }