public void UpdateTexture(Texture texture) { lock (FLockTexture) { if (!InputOK) { return; } if (!FNeedsRefresh.ContainsKey(texture)) { FNeedsTexture = true; return; } if (!FNeedsRefresh[texture]) { return; } if (FInput.ImageAttributesChanged) { //reset flag we just dropped FInput.ImageAttributesChanged = true; return; } Surface srf = texture.GetSurfaceLevel(0); DataRectangle rect = srf.LockRectangle(LockFlags.Discard); try { Size imageSize = FNeedsConversion ? FBufferConverted.ImageAttributes.Size : FInput.ImageAttributes.Size; if (srf.Description.Width != imageSize.Width || srf.Description.Height != imageSize.Height) { throw (new Exception("AsTextureInstance : srf dimensions don't match image dimensions")); } if (FNeedsConversion) { FInput.GetImage(FBufferConverted); FBufferConverted.Swap(); FBufferConverted.LockForReading(); try { if (!FBufferConverted.FrontImage.Allocated) { throw (new Exception()); } rect.Data.WriteRange(FBufferConverted.FrontImage.Data, FBufferConverted.ImageAttributes.BytesPerFrame); FNeedsRefresh[texture] = false; } catch (Exception e) { ImageUtils.Log(e); } finally { FBufferConverted.ReleaseForReading(); } } else { FInput.LockForReading(); try { rect.Data.WriteRange(FInput.Data, FInput.ImageAttributes.BytesPerFrame); FNeedsRefresh[texture] = false; } catch (Exception e) { ImageUtils.Log(e); } finally { FInput.ReleaseForReading(); } } } catch (Exception e) { throw (e); } finally { srf.UnlockRectangle(); } } }