Exemple #1
0
    /// <summary>
    /// Allocate the DirectX resources needed for rendering this GUIImage.
    /// </summary>
    public override void AllocResources()
    {
      //used for debugging leaks, comment in when needed-.
      /*_debugAllocResourcesCalled = true;
      _debugCachedTextureFileName = _textureFileNameTag;
      _debugCaller = ""; //  System.Environment.StackTrace.ToString();
      */
      try
      {
        if (GUIGraphicsContext.DX9Device == null )
        {
          return;
        }

        if (GUIGraphicsContext.DX9Device.Disposed)
        {
          return;
        }

        if (string.IsNullOrEmpty(_textureFileNameTag))
        {
          return;
        }

        if (_registeredForEvent == false && _containsProperty)
        {
          GUIPropertyManager.OnPropertyChanged -= GUIPropertyManager_OnPropertyChanged;
          GUIPropertyManager.OnPropertyChanged += GUIPropertyManager_OnPropertyChanged;
          _registeredForEvent = true;
        }
        _propertyChanged = false;

        // reset animation
        BeginAnimation();
        _listTextures = null;

        if (_blendableFileName != "" &&
            GUITextureManager.GetPackedTexture(_blendableFileName, out _blendabletexUoff, out _blendabletexVoff,
                                               out _blendabletexUmax, out _blendabletexVmax, out _blendableTexWidth, out _blendableTexHeight,
                                               out _blendableTexture, out _packedBlendableTextureNo))
        {
          _reCalculate = true;
        }

        // get the filename of the texture
        string fileName = _textureFileNameTag;
        if (_containsProperty)
        {
          fileName = _cachedTextureFileName = GUIPropertyManager.Parse(fileName);
        }

        if (GUITextureManager.GetPackedTexture(fileName, out _texUoff, out _texVoff, out _texUmax, out _texVmax,
                                               out _textureWidth, out _textureHeight,
                                               out _packedTexture, out _packedTextureNo))
        {
          _reCalculate = true;
          _packedTexture.Disposing -= OnPackedTexturesDisposedEvent;
          _packedTexture.Disposing += OnPackedTexturesDisposedEvent;
          return;
        }

        // load the texture
        int frameCount;
        if (fileName.StartsWith("["))
        {
          if (_memoryImageWidth != 0 && _memoryImageHeight != 0)
          {
            var bitmap = new Bitmap(_memoryImageWidth, _memoryImageHeight, PixelFormat.Format32bppArgb);
            Image memoryImage = bitmap;
            frameCount = GUITextureManager.LoadFromMemoryEx(memoryImage, fileName, m_dwColorKey, out _memoryImageTexture);
          }
          else
          {
            frameCount = GUITextureManager.LoadFromMemoryEx(_memoryImage, fileName, m_dwColorKey, out _memoryImageTexture);
          }
        }
        else
        {
          frameCount = GUITextureManager.Load(fileName, m_dwColorKey, m_iRenderWidth, _textureHeight, _shouldCache);
        }

        if (frameCount == 0)
        {
          return; // unable to load texture
        }
        
        // get each frame of the texture
        int iStartCopy = 0;
        TextureFrame[] saveList = null;
        if (_listTextures == null)
        {
          _listTextures = new TextureFrame[frameCount];
        }
        else
        {
          int newLength = _listTextures.Length + frameCount;
          iStartCopy = _listTextures.Length;
          var newList = new TextureFrame[newLength];
          saveList = new TextureFrame[_listTextures.Length];
          _listTextures.CopyTo(saveList, 0);
          _listTextures.CopyTo(newList, 0);
          _listTextures = new TextureFrame[newLength];
          newList.CopyTo(_listTextures, 0);
        }

        for (int i = 0; i < frameCount; i++)
        {
          _listTextures[i + iStartCopy] = GUITextureManager.GetTexture(fileName, i, out _textureWidth, out _textureHeight);
          if (_listTextures[i + iStartCopy] != null)
          {
            _listTextures[i + iStartCopy].Disposed += OnListTexturesDisposedEvent;
          }
          else
          {
            Log.Debug("GUIImage.AllocResources -> Filename={0} i={1} FrameCount={2}", fileName, i, frameCount);
            if (saveList != null)
            {
              _listTextures = new TextureFrame[saveList.Length];
              saveList.CopyTo(_listTextures, 0);
            }
            else
            {
              UnsubscribeAndReleaseListTextures();
            }
            _currentFrameNumber = 0;
            break;
          }
        }
        
        // Set state to render the image
        _reCalculate = true;
        base.AllocResources();
      }
      catch (Exception e)
      {
        Log.Error(e);
      }
      finally
      {
        _allocated = true;
      }
    }