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(); } }
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(); } }