// Save a raw image instance into a file bool save_image(const std::string &dest_filename, LLPointer<LLImageRaw> raw_image, int blocks_size, int precincts_size, int levels, bool reversible, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(dest_filename); // Set the image codestream parameters on output in the case of a j2c image if (image->getCodec() == IMG_CODEC_J2C) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. if ((blocks_size != -1) || (precincts_size != -1) || (levels != 0)) { ((LLImageJ2C*)(image.get()))->initEncode(*raw_image, blocks_size, precincts_size, levels); } ((LLImageJ2C*)(image.get()))->setReversible(reversible); } if (!image->encode(raw_image, 0.0f)) { return false; } if (output_stats) { output_image_stats(image, dest_filename); } return image->save(dest_filename); }
static void processForeignLandmark(LLLandmark* landmark, const LLUUID& object_id, const LLUUID& notecard_inventory_id, LLPointer<LLInventoryItem> item_ptr) { LLVector3d global_pos; landmark->getGlobalPos(global_pos); LLViewerInventoryItem* agent_landmark = LLLandmarkActions::findLandmarkForGlobalPos(global_pos); if (agent_landmark) { showInfo(agent_landmark->getUUID()); } else { if (item_ptr.isNull()) { // check to prevent a crash. See EXT-8459. LL_WARNS() << "Passed handle contains a dead inventory item. Most likely notecard has been closed and embedded item was destroyed." << LL_ENDL; } else { LLInventoryItem* item = item_ptr.get(); LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied(); copy_inventory_from_notecard(get_folder_by_itemtype(item), object_id, notecard_inventory_id, item, gInventoryCallbacks.registerCB(cb)); } } }
// allocate the stack LLWorld::LLWorld() : mLandFarClip(DEFAULT_FAR_PLANE), mLastPacketsIn(0), mLastPacketsOut(0), mLastPacketsLost(0), mSpaceTimeUSec(0) { for (S32 i = 0; i < 8; i++) { mEdgeWaterObjects[i] = NULL; } if (gNoRender) { return; } LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,4); U8 *default_texture = raw->getData(); *(default_texture++) = MAX_WATER_COLOR.mV[0]; *(default_texture++) = MAX_WATER_COLOR.mV[1]; *(default_texture++) = MAX_WATER_COLOR.mV[2]; *(default_texture++) = MAX_WATER_COLOR.mV[3]; mDefaultWaterTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); gGL.getTexUnit(0)->bind(mDefaultWaterTexturep); mDefaultWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); }
// Note: the caller SHOULD NOT keep the pointer that this function returns. It may be updated as more data arrives. LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedTexture* src_image, U8 bump_code ) { llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) ); LLViewerTexture* bump = NULL; bump_image_map_t* entries_list = NULL; void (*callback_func)( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata ) = NULL; switch( bump_code ) { case BE_BRIGHTNESS: entries_list = &mBrightnessEntries; callback_func = LLBumpImageList::onSourceBrightnessLoaded; break; case BE_DARKNESS: entries_list = &mDarknessEntries; callback_func = LLBumpImageList::onSourceDarknessLoaded; break; default: llassert(0); return NULL; } bump_image_map_t::iterator iter = entries_list->find(src_image->getID()); if (iter != entries_list->end() && iter->second.notNull()) { bump = iter->second; } else { LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,1); raw->clear(0x77, 0x77, 0xFF, 0xFF); (*entries_list)[src_image->getID()] = LLViewerTextureManager::getLocalTexture( raw.get(), TRUE); bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image } if (!src_image->hasCallbacks()) { //if image has no callbacks but resolutions don't match, trigger raw image loaded callback again if (src_image->getWidth() != bump->getWidth() || src_image->getHeight() != bump->getHeight())// || //(LLPipeline::sRenderDeferred && bump->getComponents() != 4)) { src_image->setBoostLevel(LLGLTexture::BOOST_BUMP) ; src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()), NULL ); src_image->forceToSaveRawImage(0) ; } } return bump; }
void LLCallFloater::initParticipantsVoiceState() { // Set initial status for each participant in the list. std::vector<LLPanel*> items; mAvatarList->getItems(items); std::vector<LLPanel*>::const_iterator it = items.begin(), it_end = items.end(); uuid_vec_t speakers_uuids; get_voice_participants_uuids(speakers_uuids); for(; it != it_end; ++it) { LLAvatarListItem *item = dynamic_cast<LLAvatarListItem*>(*it); if (!item) continue; LLUUID speaker_id = item->getAvatarId(); uuid_vec_t::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id); // If an avatarID assigned to a panel is found in a speakers list // obtained from VoiceClient we assign the JOINED status to the owner // of this avatarID. if (speaker_iter != speakers_uuids.end()) { setState(item, STATE_JOINED); } else { LLPointer<LLSpeaker> speakerp = mSpeakerManager->findSpeaker(speaker_id); // If someone has already left the call before, we create his // avatar row panel with HAS_LEFT status and remove it after // the timeout, otherwise we create a panel with INVITED status if (speakerp.notNull() && speakerp.get()->mHasLeftCurrentCall) { setState(item, STATE_LEFT); } else { setState(item, STATE_INVITED); } } } }
static void processForeignLandmark(LLLandmark* landmark, const LLUUID& object_id, const LLUUID& notecard_inventory_id, LLPointer<LLInventoryItem> item_ptr) { LLVector3d global_pos; landmark->getGlobalPos(global_pos); LLViewerInventoryItem* agent_landmark = LLLandmarkActions::findLandmarkForGlobalPos(global_pos); if (agent_landmark) { showInfo(agent_landmark->getUUID()); } // else // [SL:KB] - Patch: UI-Notecards | Checked: 2010-09-05 (Catznip-2.1.2a) | Added: Catznip-2.1.2a else if (gSavedSettings.getBOOL("EmbeddedLandmarkCopyToInventory")) // [/SL:KB] { if (item_ptr.isNull()) { // check to prevent a crash. See EXT-8459. llwarns << "Passed handle contains a dead inventory item. Most likely notecard has been closed and embedded item was destroyed." << llendl; } else { LLInventoryItem* item = item_ptr.get(); LLPointer<LLEmbeddedLandmarkCopied> cb = new LLEmbeddedLandmarkCopied(); copy_inventory_from_notecard(get_folder_by_itemtype(item), object_id, notecard_inventory_id, item, gInventoryCallbacks.registerCB(cb)); } } // [SL:KB] - Patch: UI-Notecards | Checked: 2010-09-05 (Catznip-2.1.2a) | Added: Catznip-2.1.2a else { showInfo(global_pos); } // [/SL:KB] }
// Load an image from file and return a raw (decompressed) instance of its data LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_level, int* region, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(src_filename); // This just loads the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; } if( (image->getComponents() != 3) && (image->getComponents() != 4) ) { std::cout << "Image files with less than 3 or more than 4 components are not supported\n"; return NULL; } if (output_stats) { output_image_stats(image, src_filename); } LLPointer<LLImageRaw> raw_image = new LLImageRaw; // Set the image restriction on load in the case of a j2c image if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL))) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region); } if (!image->decode(raw_image, 0.0f)) { return NULL; } return raw_image; }
void LLSurface::createSTexture() { if (!mSTexturep) { // Fill with dummy gray data. LLPointer<LLImageRaw> raw = new LLImageRaw(sTextureSize, sTextureSize, 3); U8 *default_texture = raw->getData(); for (S32 i = 0; i < sTextureSize; i++) { for (S32 j = 0; j < sTextureSize; j++) { *(default_texture + (i*sTextureSize + j)*3) = 128; *(default_texture + (i*sTextureSize + j)*3 + 1) = 128; *(default_texture + (i*sTextureSize + j)*3 + 2) = 128; } } mSTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); mSTexturep->dontDiscard(); gGL.getTexUnit(0)->bind(mSTexturep); mSTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); } }
void LLSurface::createWaterTexture() { if (!mWaterTexturep) { // Create the water texture LLPointer<LLImageRaw> raw = new LLImageRaw(sTextureSize/2, sTextureSize/2, 4); U8 *default_texture = raw->getData(); for (S32 i = 0; i < sTextureSize/2; i++) { for (S32 j = 0; j < sTextureSize/2; j++) { *(default_texture + (i*sTextureSize/2 + j)*4) = MAX_WATER_COLOR.mV[0]; *(default_texture + (i*sTextureSize/2 + j)*4 + 1) = MAX_WATER_COLOR.mV[1]; *(default_texture + (i*sTextureSize/2 + j)*4 + 2) = MAX_WATER_COLOR.mV[2]; *(default_texture + (i*sTextureSize/2 + j)*4 + 3) = MAX_WATER_COLOR.mV[3]; } } mWaterTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); mWaterTexturep->dontDiscard(); gGL.getTexUnit(0)->bind(mWaterTexturep); mWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); } }
void render_disconnected_background() { if (!gDisconnectedImagep && gDisconnected) { llinfos << "Loading last bitmap..." << llendl; std::string temp_str; temp_str = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + SCREEN_LAST_FILENAME; LLPointer<LLImageBMP> image_bmp = new LLImageBMP; if( !image_bmp->load(temp_str) ) { //llinfos << "Bitmap load failed" << llendl; return; } LLPointer<LLImageRaw> raw = new LLImageRaw; if (!image_bmp->decode(raw, 0.0f)) { llinfos << "Bitmap decode failed" << llendl; gDisconnectedImagep = NULL; return; } U8 *rawp = raw->getData(); S32 npixels = (S32)image_bmp->getWidth()*(S32)image_bmp->getHeight(); for (S32 i = 0; i < npixels; i++) { S32 sum = 0; sum = *rawp + *(rawp+1) + *(rawp+2); sum /= 3; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; *rawp = ((S32)sum*6 + *rawp)/7; rawp++; } raw->expandToPowerOfTwo(); gDisconnectedImagep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE ); gStartTexture = gDisconnectedImagep; } // Make sure the progress view always fills the entire window. S32 width = gViewerWindow->getWindowWidthScaled(); S32 height = gViewerWindow->getWindowHeightScaled(); if (gDisconnectedImagep) { if (LLGLSLShader::sNoFixedFunction) { gUIProgram.bind(); } LLGLSUIDefault gls_ui; gViewerWindow->setup2DRender(); gGL.pushMatrix(); { // scale ui to reflect UIScaleFactor // this can't be done in setup2DRender because it requires a // pushMatrix/popMatrix pair const LLVector2& display_scale = gViewerWindow->getDisplayScale(); gGL.scalef(display_scale.mV[VX], display_scale.mV[VY], 1.f); gGL.getTexUnit(0)->bind(gDisconnectedImagep); gGL.color4f(1.f, 1.f, 1.f, 1.f); gl_rect_2d_simple_tex(width, height); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); } gGL.popMatrix(); gGL.flush(); if (LLGLSLShader::sNoFixedFunction) { gUIProgram.unbind(); } } }
// static void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url) { if (dynamic_cast<LLImagePNG*>(image.get()) == 0) { llwarns << "Image to upload is not a PNG" << llendl; llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0); return; } const std::string boundary = "----------------------------0123abcdefab"; LLSD headers = LLViewerMedia::getHeaders(); headers["Cookie"] = getAuthCookie(); headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; std::ostringstream body; // *NOTE: The order seems to matter. body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"key\"\r\n\r\n" << config["key"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n" << config["AWSAccessKeyId"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"acl\"\r\n\r\n" << config["acl"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n" << config["Content-Type"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"policy\"\r\n\r\n" << config["policy"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"signature\"\r\n\r\n" << config["signature"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n" << config["success_action_redirect"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n" << "Content-Type: image/png\r\n\r\n"; // Insert the image data. // *FIX: Treating this as a string will probably screw it up ... U8* image_data = image->getData(); for (S32 i = 0; i < image->getDataSize(); ++i) { body << image_data[i]; } body << "\r\n--" << boundary << "--\r\n"; // postRaw() takes ownership of the buffer and releases it later. size_t size = body.str().size(); U8 *data = new U8[size]; memcpy(data, body.str().data(), size); // Send request, successful upload will trigger posting metadata. LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers); }
// static void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, const std::string& url) { if (dynamic_cast<LLImagePNG*>(image.get()) == 0) { LL_WARNS() << "Image to upload is not a PNG" << LL_ENDL; llassert(dynamic_cast<LLImagePNG*>(image.get()) != 0); return; } const std::string boundary = "----------------------------0123abcdefab"; AIHTTPHeaders headers; headers.addHeader("Accept", "*/*"); headers.addHeader("Cookie", LLWebProfile::getAuthCookie()); headers.addHeader("User-Agent", LLViewerMedia::getCurrentUserAgent()); headers.addHeader("Content-Type", "multipart/form-data; boundary=" + boundary); std::ostringstream body; // *NOTE: The order seems to matter. body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"key\"\r\n\r\n" << config["key"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n" << config["AWSAccessKeyId"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"acl\"\r\n\r\n" << config["acl"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n" << config["Content-Type"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"policy\"\r\n\r\n" << config["policy"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"signature\"\r\n\r\n" << config["signature"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n" << config["success_action_redirect"].asString() << "\r\n"; body << "--" << boundary << "\r\n" << "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n" << "Content-Type: image/png\r\n\r\n"; size_t const body_size = body.str().size(); std::ostringstream footer; footer << "\r\n--" << boundary << "--\r\n"; size_t const footer_size = footer.str().size(); size_t size = body_size + image->getDataSize() + footer_size; // postRaw() takes ownership of the buffer and releases it later. U8* data = new U8 [size]; memcpy(data, body.str().data(), body_size); // Insert the image data. memcpy(data + body_size, image->getData(), image->getDataSize()); memcpy(data + body_size + image->getDataSize(), footer.str().data(), footer_size); // Send request, successful upload will trigger posting metadata. LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers/*,*/ DEBUG_CURLIO_PARAM(debug_off), no_keep_alive); }
// Load an image from file and return a raw (decompressed) instance of its data LLPointer<LLImageRaw> load_image(const std::string &src_filename, int discard_level, int* region, int load_size, bool output_stats) { LLPointer<LLImageFormatted> image = create_image(src_filename); // We support partial loading only for j2c images if (image->getCodec() == IMG_CODEC_J2C) { // Load the header if (!image->load(src_filename, 600)) { return NULL; } S32 h = ((LLImageJ2C*)(image.get()))->calcHeaderSize(); S32 d = (load_size > 0 ? ((LLImageJ2C*)(image.get()))->calcDiscardLevelBytes(load_size) : 0); S8 r = ((LLImageJ2C*)(image.get()))->getRawDiscardLevel(); std::cout << "Merov debug : header = " << h << ", load_size = " << load_size << ", discard level = " << d << ", raw discard level = " << r << std::endl; for (d = 0; d < MAX_DISCARD_LEVEL; d++) { S32 data_size = ((LLImageJ2C*)(image.get()))->calcDataSize(d); std::cout << "Merov debug : discard_level = " << d << ", data_size = " << data_size << std::endl; } if (load_size < 0) { load_size = (discard_level != -1 ? ((LLImageJ2C*)(image.get()))->calcDataSize(discard_level) : 0); } // Load the requested byte range if (!image->load(src_filename, load_size)) { return NULL; } } else { // This just loads the image file stream into a buffer. No decoding done. if (!image->load(src_filename)) { return NULL; } } if( (image->getComponents() != 3) && (image->getComponents() != 4) ) { std::cout << "Image files with less than 3 or more than 4 components are not supported\n"; return NULL; } if (output_stats) { output_image_stats(image, src_filename); } LLPointer<LLImageRaw> raw_image = new LLImageRaw; // Set the image restriction on load in the case of a j2c image if ((image->getCodec() == IMG_CODEC_J2C) && ((discard_level != -1) || (region != NULL))) { // That method doesn't exist (and likely, doesn't make sense) for any other image file format // hence the required cryptic cast. ((LLImageJ2C*)(image.get()))->initDecode(*raw_image, discard_level, region); } if (!image->decode(raw_image, 0.0f)) { return NULL; } return raw_image; }