bool
TiledTextureImage::DirectUpdate(gfx::DataSourceSurface* aSurf, const nsIntRegion& aRegion, const gfx::IntPoint& aFrom /* = gfx::IntPoint(0, 0) */)
{
    if (mSize.width == 0 || mSize.height == 0) {
        return true;
    }

    nsIntRegion region;

    if (mTextureState != Valid) {
        IntRect bounds = IntRect(0, 0, mSize.width, mSize.height);
        region = nsIntRegion(bounds);
    } else {
        region = aRegion;
    }

    bool result = true;
    int oldCurrentImage = mCurrentImage;
    BeginBigImageIteration();
    do {
        IntRect tileRect = GetSrcTileRect();
        int xPos = tileRect.x;
        int yPos = tileRect.y;

        nsIntRegion tileRegion;
        tileRegion.And(region, tileRect); // intersect with tile

        if (tileRegion.IsEmpty())
            continue;

        if (CanUploadSubTextures(mGL)) {
          tileRegion.MoveBy(-xPos, -yPos); // translate into tile local space
        } else {
          // If sub-textures are unsupported, expand to tile boundaries
          tileRect.x = tileRect.y = 0;
          tileRegion = nsIntRegion(tileRect);
        }

        result &= mImages[mCurrentImage]->
          DirectUpdate(aSurf, tileRegion, aFrom + gfx::IntPoint(xPos, yPos));

        if (mCurrentImage == mImages.Length() - 1) {
            // We know we're done, but we still need to ensure that the callback
            // gets called (e.g. to update the uploaded region).
            NextTile();
            break;
        }
        // Override a callback cancelling iteration if the texture wasn't valid.
        // We need to force the update in that situation, or we may end up
        // showing invalid/out-of-date texture data.
    } while (NextTile() || (mTextureState != Valid));
    mCurrentImage = oldCurrentImage;

    mTextureFormat = mImages[0]->GetTextureFormat();
    mTextureState = Valid;
    return result;
}
void Entite_graphique::Initialiser(const coordonnee &pos)
{
    if(m_tileset != NULL)
    {
        NextTile(true, true);
        Generer();

        if(configuration->Lumiere)
        if(m_tileset->getTaille() > 0)
        {
            AddWallLight(pos);
            if(option_forcedLight)
            {
                sf::Vector2f position;
                position.x = pos.x + m_decalage.x;
                position.y = pos.y + m_decalage.y;

                m_light = moteurGraphique->LightManager->Add_Dynamic_Light(position,m_tileset->getLumiereDuTile(m_noAnimation).intensite > 0 ? 255 : 0,m_tileset->getLumiereDuTile(m_noAnimation).intensite*3,12,
                                                                            sf::Color(m_tileset->getLumiereDuTile(m_noAnimation).rouge,
                                                                                      m_tileset->getLumiereDuTile(m_noAnimation).vert,
                                                                                      m_tileset->getLumiereDuTile(m_noAnimation).bleu));
            }
        }
    }
}
void Entite_graphique::Animer(float temps)
{
    attaque_touche  = false;
    attaque_stop    = false;
    attaque_pause   = false;

    if(m_tileset != NULL)
    {
        float tempsAnimation = m_tileset->getTempsDuTile(m_noAnimation) + m_nextAnimation;
        m_animation += temps;

        if(configuration->Lumiere > 0)
        if(m_old_lightIntensity != m_tileset->getLumiereDuTile(m_noAnimation).intensite
        && m_tileset->getLumiereDuTile(m_noAnimation).intensite >= 0)// && !option_forcedLight)
        {
            float intensite = m_old_lightIntensity;
            intensite += m_animation/tempsAnimation * (m_tileset->getLumiereDuTile(m_noAnimation).intensite - m_old_lightIntensity);
            moteurGraphique->LightManager->SetRadius(m_light,(int)intensite*3);

            if (m_animation >= tempsAnimation)
                m_old_lightIntensity = m_tileset->getLumiereDuTile(m_noAnimation).intensite;

            moteurGraphique->LightManager->Generate(m_light);
        }

        if (m_tileset->getAnimationTile(m_noAnimation) >=0)//!= m_noAnimation)
            while (m_animation >= tempsAnimation && tempsAnimation > 0)
            {
                //if(m_tileset->getAnimationTile(m_noAnimation) != m_noAnimation)
                NextTile();
                Generer();

                m_animation -= tempsAnimation;
                tempsAnimation = m_tileset->getTempsDuTile(m_noAnimation) + m_nextAnimation;
            }
    }
}