void CNewGameSession::SetShipClassImage (CShipClass *pClass, int x, int y, int cxWidth) // SetShipClassImage // // Sets the current ship class image { const CPlayerSettings *pPlayerSettings = pClass->GetPlayerSettings(); // Ask the class for a hero image const CG32bitImage *pImage = (!pClass->GetHeroImage().IsEmpty() ? &pClass->GetHeroImage().GetImage(CONSTLIT("New Game")) : NULL); // Delete the previous one DeleteElement(ID_SHIP_CLASS_IMAGE); // Add the new one, if we've got one. const CG32bitImage *pImageToUse = NULL; bool bFree = false; if (pImage && !pImage->IsEmpty()) { // If this image is not the right size, then create a resized version // that is. if (pImage->GetWidth() != SHIP_IMAGE_WIDTH || pImage->GetHeight() != SHIP_IMAGE_HEIGHT) { int cxNewWidth = SHIP_IMAGE_WIDTH; int cyNewHeight = cxNewWidth * pImage->GetHeight() / pImage->GetWidth(); if (cyNewHeight > SHIP_IMAGE_HEIGHT) { cyNewHeight = SHIP_IMAGE_HEIGHT; cxNewWidth = cyNewHeight * pImage->GetWidth() / pImage->GetHeight(); } CG32bitImage *pNewImage = new CG32bitImage; pNewImage->CreateFromImageTransformed(*pImage, 0, 0, pImage->GetWidth(), pImage->GetHeight(), (Metric)cxNewWidth / pImage->GetWidth(), (Metric)cyNewHeight / pImage->GetHeight(), 0.0); pImageToUse = pNewImage; bFree = true; } else { pImageToUse = pImage; bFree = false; } } // If we don't have an image then ask the class to paint it else { CG32bitImage *pNewImage = new CG32bitImage; pNewImage->Create(SHIP_IMAGE_WIDTH, SHIP_IMAGE_HEIGHT); ViewportTransform Trans; pClass->Paint(*pNewImage, SHIP_IMAGE_WIDTH / 2, SHIP_IMAGE_HEIGHT / 2, Trans, 0, 0 ); pImageToUse = pNewImage; bFree = true; } // Position int xImage = x + (cxWidth - pImageToUse->GetWidth()) / 2; int yImage = y + (SHIP_IMAGE_HEIGHT - pImageToUse->GetHeight()) / 2; // New image frame bool bAutoMask = (pClass->GetAPIVersion() < 26); IAnimatron *pImageFrame = new CAniRect; pImageFrame->SetID(ID_SHIP_CLASS_IMAGE); pImageFrame->SetPropertyVector(PROP_POSITION, CVector(xImage, yImage)); pImageFrame->SetPropertyVector(PROP_SCALE, CVector(pImageToUse->GetWidth(), pImageToUse->GetHeight())); pImageFrame->SetFillMethod(new CAniImageFill(pImageToUse, bFree, bAutoMask)); m_pRoot->AddLine(pImageFrame); }
void CExtension::CreateIcon (int cxWidth, int cyHeight, CG32bitImage **retpIcon) const // CreateIcon // // Creates a cover icon for the adventure. The caller is responsible for // freeing the result. { // Load the image CG32bitImage *pBackground = GetCoverImage(); if (pBackground == NULL || pBackground->GetWidth() == 0 || pBackground->GetHeight() == 0) { int cxSize = Min(cxWidth, cyHeight); *retpIcon = new CG32bitImage; (*retpIcon)->Create(cxSize, cxSize); return; } // Figure out the dimensions of the icon based on the image size and the // desired output. // // If the background is larger than the icon size then we need to scale it. CG32bitImage *pIcon; if (pBackground->GetWidth() > cxWidth || pBackground->GetHeight() > cyHeight) { int xSrc, ySrc, cxSrc, cySrc; Metric rScale; // If we have a widescreen cover image and we want a portrait or // square icon, then we zoom in on the key part of the cover. if (pBackground->GetWidth() > 2 * pBackground->GetHeight()) { rScale = (Metric)cyHeight / pBackground->GetHeight(); cxSrc = (int)(cxWidth / rScale); xSrc = Min(pBackground->GetWidth() - cxSrc, pBackground->GetWidth() - (RIGHT_COVER_OFFSET + (cxSrc / 2))); ySrc = 0; cySrc = pBackground->GetHeight(); } else { rScale = (Metric)cxWidth / pBackground->GetWidth(); if (rScale * pBackground->GetHeight() > (Metric)cyHeight) rScale = (Metric)cyHeight / pBackground->GetHeight(); xSrc = 0; ySrc = 0; cxSrc = pBackground->GetWidth(); cySrc = pBackground->GetHeight(); } // Create the icon pIcon = new CG32bitImage; pIcon->CreateFromImageTransformed(*pBackground, xSrc, ySrc, cxSrc, cySrc, rScale, rScale, 0.0); } // Otherwise we center the image on the icon else { // Create the icon pIcon = new CG32bitImage; pIcon->Create(cxWidth, cyHeight); // Blt pIcon->Blt(0, 0, pBackground->GetWidth(), pBackground->GetHeight(), *pBackground, (cxWidth - pBackground->GetWidth()) / 2, (cyHeight - pBackground->GetHeight()) / 2); } // Done *retpIcon = pIcon; }