void TestSparseBinding() { struct ImageInfo { std::unique_ptr<BaseImage> image; uint32_t endFrame; }; std::vector<ImageInfo> images; constexpr uint32_t frameCount = 1000; constexpr uint32_t imageLifeFramesMin = 1; constexpr uint32_t imageLifeFramesMax = 400; RandomNumberGenerator rand(4652467); for(uint32_t i = 0; i < frameCount; ++i) { // Bump frame index. ++g_FrameIndex; vmaSetCurrentFrameIndex(g_hAllocator, g_FrameIndex); // Create one new, random image. ImageInfo imageInfo; //imageInfo.image = std::make_unique<TraditionalImage>(); imageInfo.image = std::make_unique<SparseBindingImage>(); imageInfo.image->Init(rand); imageInfo.endFrame = g_FrameIndex + rand.Generate() % (imageLifeFramesMax - imageLifeFramesMin) + imageLifeFramesMin; images.push_back(std::move(imageInfo)); // Delete all images that expired. for(size_t i = images.size(); i--; ) { if(g_FrameIndex >= images[i].endFrame) { images.erase(images.begin() + i); } } } SaveAllocatorStatsToFile(L"SparseBindingTest.json"); // Choose biggest image. Test uploading and sampling. BaseImage* biggestImage = nullptr; for(size_t i = 0, count = images.size(); i < count; ++i) { if(!biggestImage || images[i].image->GetCreateInfo().extent.width * images[i].image->GetCreateInfo().extent.height > biggestImage->GetCreateInfo().extent.width * biggestImage->GetCreateInfo().extent.height) { biggestImage = images[i].image.get(); } } assert(biggestImage); biggestImage->TestContent(rand); // Free remaining images. images.clear(); }
template <class T> void D3D11RenderTarget::captureColorBuffer(BaseImage<T>& result, unsigned int which) { DXGI_FORMAT format = m_textureFormats[which]; if (format == DXGI_FORMAT_R8G8B8A8_UNORM) { if (!std::is_same<vec4uc, T>::value) throw MLIB_EXCEPTION("incompatible image format"); } else if (format == DXGI_FORMAT_R32G32B32A32_FLOAT) { if (!std::is_same<vec4f, T>::value) throw MLIB_EXCEPTION("incompatible image format"); } else { throw MLIB_EXCEPTION("unknown image format"); } auto &context = m_graphics->getContext(); context.CopyResource(m_captureTextures[which], m_targets[which]); result.allocate(m_width, m_height); D3D11_MAPPED_SUBRESOURCE resource; UINT subresource = D3D11CalcSubresource(0, 0, 0); HRESULT hr = context.Map(m_captureTextures[which], subresource, D3D11_MAP_READ, 0, &resource); const BYTE *data = (BYTE *)resource.pData; for (unsigned int y = 0; y < m_height; y++) { memcpy(&result(0U, y), data + resource.RowPitch * y, m_width * sizeof(T)); } context.Unmap(m_captureTextures[which], subresource); }
void ShapeletFitImage(double sigma, LVector& bvec, const BaseImage<T>& image, double image_scale, const Position<double>& center) { // TODO: It would be nice to be able to fit this with an arbitrary WCS to fit in // sky coordinates. For now, just use the image_scale. dbg<<"Start ShapeletFitImage:\n"; xdbg<<"sigma = "<<sigma<<std::endl; xdbg<<"bvec = "<<bvec<<std::endl; xdbg<<"center = "<<center<<std::endl; double scale = image_scale / sigma; xdbg<<"scale = "<<scale<<std::endl; const int nx = image.getXMax() - image.getXMin() + 1; const int ny = image.getYMax() - image.getYMin() + 1; xdbg<<"nx,ny = "<<nx<<','<<ny<<std::endl; const int npts = nx * ny; xdbg<<"npts = "<<npts<<std::endl; tmv::Vector<double> x(npts); tmv::Vector<double> y(npts); tmv::Vector<double> I(npts); int i=0; for (int ix = image.getXMin(); ix <= image.getXMax(); ++ix) { for (int iy = image.getYMin(); iy <= image.getYMax(); ++iy,++i) { x[i] = (ix - center.x) * scale; y[i] = (iy - center.y) * scale; I[i] = image(ix,iy); } } xxdbg<<"x = "<<x<<std::endl; xxdbg<<"y = "<<y<<std::endl; xxdbg<<"I = "<<I<<std::endl; tmv::Matrix<double> psi(npts,bvec.size()); LVector::basis(x.view(),y.view(),psi.view(),bvec.getOrder(),sigma); // I = psi * b // TMV solves this by writing b = I/psi. // We use QRP in case the psi matrix is close to singular (although it shouldn't be). psi.divideUsing(tmv::QRP); bvec.rVector() = I/psi; xdbg<<"Done FitImage: bvec = "<<bvec<<std::endl; }
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_INITDIALOG: return true; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDC_BUTTON1: { Image.SelectImage(); BITMAP Bit; GetObject(Image.memBit, sizeof(BITMAP), &Bit); imgHeight = Bit.bmHeight; imgWidth = Bit.bmWidth; SetDlgItemInt(hDlg, IDC_EDIT3, imgWidth, FALSE); SetDlgItemInt(hDlg, IDC_EDIT4, imgHeight, FALSE); UpdateDimensions(hDlg); break; } case IDC_BUTTON2: { UpdateDimensions(hDlg); break; } case IDOK: EndDialog(hDlg, UpdateDimensions(hDlg)?IDOK:IDCANCEL); break; case IDCANCEL: EndDialog(hDlg, IDCANCEL); break; } return true; } case WM_DESTROY: return true; } return false; }
BaseImage *BaseRenderOSystem::takeScreenshot() { // TODO: Clip by viewport. BaseImage *screenshot = new BaseImage(); screenshot->copyFrom(_renderSurface); return screenshot; }
bool BaseSurfaceOSystem::finishLoad() { BaseImage *image = new BaseImage(); if (!image->loadFile(_filename)) { delete image; return false; } _width = image->getSurface()->w; _height = image->getSurface()->h; bool isSaveGameGrayscale = _filename.matchString("savegame:*g", true); if (isSaveGameGrayscale) { warning("grayscaleConversion not yet implemented"); // FIBITMAP *newImg = FreeImage_ConvertToGreyscale(img); TODO } _surface->free(); delete _surface; bool needsColorKey = false; bool replaceAlpha = true; if (image->getSurface()->format.bytesPerPixel == 1) { if (!image->getPalette()) { error("Missing palette while loading 8bit image %s", _filename.c_str()); } _surface = image->getSurface()->convertTo(g_system->getScreenFormat(), image->getPalette()); needsColorKey = true; } else { if (image->getSurface()->format != g_system->getScreenFormat()) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat()); } else { _surface = new Graphics::Surface(); _surface->copyFrom(*image->getSurface()); } if (_filename.hasSuffix(".bmp") && image->getSurface()->format.bytesPerPixel == 4) { // 32 bpp BMPs have nothing useful in their alpha-channel -> color-key needsColorKey = true; replaceAlpha = false; } else if (image->getSurface()->format.aBits() == 0) { needsColorKey = true; } } if (needsColorKey) { TransparentSurface trans(*_surface); trans.applyColorKey(_ckRed, _ckGreen, _ckBlue, replaceAlpha); } _alphaType = hasTransparencyType(_surface); _valid = true; _gameRef->addMem(_width * _height * 4); delete image; _loaded = true; return true; }
bool BaseSurfaceOSystem::finishLoad() { BaseImage *image = new BaseImage(); if (!image->loadFile(_filename)) { delete image; return false; } _width = image->getSurface()->w; _height = image->getSurface()->h; bool isSaveGameGrayscale = scumm_strnicmp(_filename.c_str(), "savegame:", 9) == 0 && (_filename.c_str()[_filename.size() - 1] == 'g' || _filename.c_str()[_filename.size() - 1] == 'G'); if (isSaveGameGrayscale) { warning("grayscaleConversion not yet implemented"); // FIBITMAP *newImg = FreeImage_ConvertToGreyscale(img); TODO } // no alpha, set color key /* if (surface->format.bytesPerPixel != 4) SDL_SetColorKey(surf, SDL_TRUE, SDL_MapRGB(surf->format, ck_red, ck_green, ck_blue));*/ // convert 32-bit BMPs to 24-bit or they appear totally transparent (does any app actually write alpha in BMP properly?) // Well, actually, we don't convert via 24-bit as the color-key application overwrites the Alpha-channel anyhow. _surface->free(); delete _surface; bool needsColorKey = false; bool replaceAlpha = true; if (_filename.hasSuffix(".bmp") && image->getSurface()->format.bytesPerPixel == 4) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat(), image->getPalette()); needsColorKey = true; replaceAlpha = false; } else if (image->getSurface()->format.bytesPerPixel == 1 && image->getPalette()) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat(), image->getPalette()); needsColorKey = true; } else if (image->getSurface()->format.bytesPerPixel >= 3 && image->getSurface()->format != g_system->getScreenFormat()) { _surface = image->getSurface()->convertTo(g_system->getScreenFormat()); if (image->getSurface()->format.bytesPerPixel == 3) { needsColorKey = true; } } else { _surface = new Graphics::Surface(); _surface->copyFrom(*image->getSurface()); if (_surface->format.aBits() == 0) { needsColorKey = true; } } if (needsColorKey) { TransparentSurface trans(*_surface); trans.applyColorKey(_ckRed, _ckGreen, _ckBlue, replaceAlpha); } _hasAlpha = hasTransparency(_surface); _valid = true; _gameRef->addMem(_width * _height * 4); delete image; _loaded = true; return true; }
void ImageView<T>::copyFrom(const BaseImage<T>& rhs) const { if (!this->_bounds.isSameShapeAs(rhs.getBounds())) throw ImageError("Attempt im1 = im2, but bounds not the same shape"); transform_pixel(*this, rhs, ReturnSecond<T>()); }