void LLViewerMediaImpl::getTextureSize(S32 *texture_width, S32 *texture_height) { LLPluginClassMedia* plugin = getMediaPlugin(); if(plugin && plugin->textureValid()) { S32 real_texture_width = plugin->getBitsWidth(); S32 real_texture_height = plugin->getBitsHeight(); { // The "texture width" coming back from the plugin may not be a power of two (thanks to webkit). // It will be the correct "data width" to pass to setSubImage int i; for(i = 1; i < real_texture_width; i <<= 1) ; *texture_width = i; for(i = 1; i < real_texture_height; i <<= 1) ; *texture_height = i; } } else { *texture_width = 0; *texture_height = 0; } }
void LLViewerMediaImpl::update() { LLPluginClassMedia* plugin = getMediaPlugin(); if (!plugin) { return; } plugin->idle(); if (plugin->isPluginExited()) { destroyMediaSource(); return; } if (!plugin->textureValid()) { return; } if(mSuspendUpdates || !mVisible) { return; } LLViewerTexture* placeholder_image = updatePlaceholderImage(); if(placeholder_image) { LLRect dirty_rect; if (plugin->getDirty(&dirty_rect)) { // Constrain the dirty rect to be inside the texture S32 x_pos = llmax(dirty_rect.mLeft, 0); S32 y_pos = llmax(dirty_rect.mBottom, 0); S32 width = llmin(dirty_rect.mRight, placeholder_image->getWidth()) - x_pos; S32 height = llmin(dirty_rect.mTop, placeholder_image->getHeight()) - y_pos; if(width > 0 && height > 0) { U8* data = plugin->getBitsData(); // Offset the pixels pointer to match x_pos and y_pos data += ( x_pos * plugin->getTextureDepth() * plugin->getBitsWidth() ); data += ( y_pos * plugin->getTextureDepth() ); placeholder_image->setSubImage( data, plugin->getBitsWidth(), plugin->getBitsHeight(), x_pos, y_pos, width, height, TRUE); // force a fast update (i.e. don't call analyzeAlpha, etc.) } plugin->resetDirty(); } } }