//------------------------------------------------------------------
bool ofUTF8::startsWithBOM(ofUTF8String txt) {
    return startsWithBOM(beginPtr(txt),endPtr(txt));
}
void CRosRttTexture::update()
{
  // Copy texture data to the image
  Ogre::Image ogre_image;
  texture_->convertToImage( ogre_image );
  sensor_msgs::Image::_data_type::iterator outputPtr(current_image_.data.begin());

  if( m_bIsDepth )
  {
	  long size = width_ * height_;

	  Ogre::Real * dataPtr( reinterpret_cast< Ogre::Real * >( ogre_image.getData() ) );
	  Ogre::Real * beginPtr( dataPtr );
	  Ogre::Real min( 1000000.0f ), max( -1000000.0f );


	  // Compute depth limits
	  for( long i = 0; i < size; ++i )
	  {
		  if( *dataPtr > max )
			  max = *outputPtr;

		  if( *dataPtr < min )
			  min = *outputPtr;

		  ++dataPtr;
	  }

	  float scale( 1.0 );

	  if( max > min )
	  {
		  scale = 1.0f/ ( max - min );
	  }

	  dataPtr = beginPtr;

	  Ogre::uchar a(255), v;

	  // Copy pixels, set alpha to max...
	  for( long i = 0; i < size; ++i )
	  {
		v = Ogre::uchar( (*dataPtr - min) * scale ); ++dataPtr;
		*outputPtr = v; ++outputPtr;
		*outputPtr = v; ++outputPtr;
		*outputPtr = v; ++outputPtr;
		*outputPtr = a; ++outputPtr;
	  }

  }
  else
  {
	  // Image size in bytes
	  long size = width_ * height_ * BPP;

	  Ogre::uchar * dataPtr( ogre_image.getData() );

	  // Copy data (Can be optimized, of course, but I am too lazy :P )
	  for( long i = 0; i < size; ++i )
	  {
	    *outputPtr = *dataPtr;
	    ++outputPtr;
	    ++dataPtr;
	  }
  }

}
//------------------------------------------------------------------
ofUTF8Iterator ofUTF8::end(const ofUTF8String& input) {
    return ofUTF8Iterator(endPtr(input),beginPtr(input),endPtr(input));
}