public void UpdateTexture(Texture texture)
        {
            lock (FLockTexture)
            {
                if (!FNeedsRefresh.ContainsKey(texture))
                {
                    FNeedsTexture = true;
                    return;
                }

                if (!FNeedsRefresh[texture])
                {
                    return;
                }

                if (FInput.ImageAttributesChanged)
                {
                    //reset flag we just dropped
                    FInput.ImageAttributesChanged = true;
                    return;
                }

                FNeedsRefresh[texture] = false;

                Surface       srf  = texture.GetSurfaceLevel(0);
                DataRectangle rect = srf.LockRectangle(LockFlags.Discard);

                if (FNeedsConversion)
                {
                    if (!FBufferConverted.Allocated)
                    {
                        srf.UnlockRectangle();
                        return;
                    }

                    FInput.GetImage(FBufferConverted);
                    FBufferConverted.LockForReading();
                    try
                    {
                        rect.Data.WriteRange(FBufferConverted.FrontImage.Data, FBufferConverted.ImageAttributes.BytesPerFrame);
                    }
                    finally
                    {
                        FBufferConverted.ReleaseForReading();
                    }
                }
                else
                {
                    FInput.LockForReading();
                    try
                    {
                        rect.Data.WriteRange(FInput.Data, FInput.ImageAttributes.BytesPerFrame);
                    }
                    catch (Exception e)
                    {
                        ImageUtils.Log(e);
                    }
                    finally
                    {
                        FInput.ReleaseForReading();
                    }
                }

                srf.UnlockRectangle();
            }
        }
Beispiel #2
0
        public void UpdateTexture(Texture texture)
        {
            lock (FLockTexture)
            {
                if (!FNeedsRefresh.ContainsKey(texture))
                {
                    FNeedsTexture = true;
                    return;
                }

                if (!FNeedsRefresh[texture])
                {
                    return;
                }

                if (FInput.ImageAttributesChanged)
                {
                    //reset flag we just dropped
                    FInput.ImageAttributesChanged = true;
                    return;
                }

                FNeedsRefresh[texture] = false;

                Surface       srf  = texture.GetSurfaceLevel(0);
                DataRectangle rect = srf.LockRectangle(LockFlags.Discard);

                Size imageSize = FNeedsConversion ? FBufferConverted.ImageAttributes.Size : FInput.ImageAttributes.Size;

                if (srf.Description.Width != imageSize.Width || srf.Description.Height != imageSize.Height)
                {
                    ImageUtils.Log(new Exception("AsTextureInstance : srf dimensions don't match image dimensions"));
                    return;
                }

                if (FNeedsConversion)
                {
                    if (!FBufferConverted.Allocated)
                    {
                        srf.UnlockRectangle();
                        return;
                    }

                    FInput.GetImage(FBufferConverted);
                    FBufferConverted.LockForReading();
                    try
                    {
                        rect.Data.WriteRange(FBufferConverted.FrontImage.Data, FBufferConverted.ImageAttributes.BytesPerFrame);
                    }
                    finally
                    {
                        FBufferConverted.ReleaseForReading();
                    }
                }
                else
                {
                    FInput.LockForReading();
                    try
                    {
                        rect.Data.WriteRange(FInput.Data, FInput.ImageAttributes.BytesPerFrame);
                    }
                    catch (Exception e)
                    {
                        ImageUtils.Log(e);
                    }
                    finally
                    {
                        FInput.ReleaseForReading();
                    }
                }

                srf.UnlockRectangle();
            }
        }