void CqImage::loadFromFile(const std::string& fileName, TqInt imageIndex) { boost::mutex::scoped_lock lock(mutex()); boost::shared_ptr<IqTexInputFile> texFile; try { texFile = IqTexInputFile::open(fileName); if(imageIndex > 0) { IqMultiTexInputFile* multiFile = dynamic_cast<IqMultiTexInputFile*>(texFile.get()); if(multiFile && imageIndex < multiFile->numSubImages()) { multiFile->setImageIndex(imageIndex); m_imageIndex = imageIndex; } else return; } else m_imageIndex = 0; } catch(XqInternal& e) { Aqsis::log() << error << "Could not load image \"" << fileName << "\": " << e.what() << "\n"; return; } setFilename(fileName); // \todo: Should read the origin and frame size out of the image. const CqTexFileHeader& header = texFile->header(); TqUint width = header.width(); TqUint height = header.height(); setImageSize(width, height); // set size within larger cropped window const SqImageRegion displayWindow = header.find<Attr::DisplayWindow>( SqImageRegion(width, height, 0, 0) ); setFrameSize(displayWindow.width, displayWindow.height); setOrigin(displayWindow.topLeftX, displayWindow.topLeftY); // descriptive strings setDescription(header.find<Attr::Description>( header.find<Attr::Software>("No description") ).c_str()); m_realData = boost::shared_ptr<CqMixedImageBuffer>(new CqMixedImageBuffer()); texFile->readPixels(*m_realData); Aqsis::log() << Aqsis::info << "Loaded image " << fileName << " [" << width << "x" << height << " : " << texFile->header().channelList() << "]" << std::endl; fixupDisplayMap(m_realData->channelList()); // Quantize and display the data m_displayData = boost::shared_ptr<CqMixedImageBuffer>( new CqMixedImageBuffer(CqChannelList::displayChannels(), width, height)); m_displayData->initToCheckerboard(); m_displayData->compositeOver(*m_realData, m_displayMap); // Compute the effective clipping range for z-buffers updateClippingRange(); if(m_updateCallback) m_updateCallback(-1, -1, -1, -1); }
/** Close the socket this client is associated with. */ void CqDisplayServerImage::close() { // Recompute the effective near and far clipping updateClippingRange(); m_socket.close(); }