Remove ScannedImageRenderer (in favour of the interface and implementors)

This commit is contained in:
Ben Olden-Cooligan 2018-12-03 23:48:45 -05:00
parent b3836aa91e
commit fcb86ec0ad
18 changed files with 72 additions and 126 deletions

View File

@ -1,56 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using NAPS2.Images.Storage;
using NAPS2.Images.Transforms;
namespace NAPS2.Images
{
// TODO: Delete this in favour of IScannedImageRenderer and implementors
public class ScannedImageRenderer
{
public async Task<IImage> Render(ScannedImage image, int outputSize = 0)
{
using (var snapshot = image.Preserve())
{
return await Render(snapshot, outputSize);
}
}
public async Task<IImage> Render(ScannedImage.Snapshot snapshot, int outputSize = 0)
{
return await Task.Factory.StartNew(() =>
{
var storage = StorageManager.ConvertToImage(snapshot.Source.BackingStorage, new StorageConvertParams());
if (outputSize > 0)
{
double scaleFactor = Math.Min(outputSize / (double)storage.Height, outputSize / (double)storage.Width);
storage = Transform.Perform(storage, new ScaleTransform(scaleFactor));
}
return Transform.PerformAll(storage, snapshot.TransformList);
});
}
public async Task<Stream> RenderToStream(ScannedImage image)
{
using (var snapshot = image.Preserve())
{
return await RenderToStream(snapshot);
}
}
public async Task<Stream> RenderToStream(ScannedImage.Snapshot snapshot)
{
using (var transformed = await Render(snapshot))
{
return StorageManager.Convert<MemoryStreamStorage>(transformed, new StorageConvertParams
{
// TODO: Is this right?
Lossless = snapshot.Source.Metadata.Lossless
}).Stream;
}
}
}
}

View File

@ -14,11 +14,11 @@ namespace NAPS2.ImportExport
{ {
public class DirectImportOperation : OperationBase public class DirectImportOperation : OperationBase
{ {
private readonly ScannedImageRenderer scannedImageRenderer; private readonly ImageRenderer imageRenderer;
public DirectImportOperation(ScannedImageRenderer scannedImageRenderer) public DirectImportOperation(ImageRenderer imageRenderer)
{ {
this.scannedImageRenderer = scannedImageRenderer; this.imageRenderer = imageRenderer;
AllowCancel = true; AllowCancel = true;
AllowBackground = true; AllowBackground = true;
@ -50,7 +50,7 @@ namespace NAPS2.ImportExport
img.AddTransform(transform); img.AddTransform(transform);
} }
// TODO: Don't bother, here, in recovery, etc. // TODO: Don't bother, here, in recovery, etc.
img.SetThumbnail(Transform.Perform(await scannedImageRenderer.Render(img), new ThumbnailTransform())); img.SetThumbnail(Transform.Perform(await imageRenderer.Render(img), new ThumbnailTransform()));
imageCallback(img); imageCallback(img);
Status.CurrentProgress++; Status.CurrentProgress++;

View File

@ -12,23 +12,23 @@ using NAPS2.Lang.Resources;
using NAPS2.Logging; using NAPS2.Logging;
using NAPS2.Operation; using NAPS2.Operation;
using NAPS2.Images; using NAPS2.Images;
using NAPS2.Images.Storage;
using NAPS2.Util; using NAPS2.Util;
namespace NAPS2.ImportExport.Images namespace NAPS2.ImportExport.Images
{ {
// TODO: Avoid GDI dependency
public class SaveImagesOperation : OperationBase public class SaveImagesOperation : OperationBase
{ {
private readonly ImageSettingsContainer imageSettingsContainer; private readonly ImageSettingsContainer imageSettingsContainer;
private readonly IOverwritePrompt overwritePrompt; private readonly IOverwritePrompt overwritePrompt;
private readonly ScannedImageRenderer scannedImageRenderer; private readonly BitmapRenderer bitmapRenderer;
private readonly TiffHelper tiffHelper; private readonly TiffHelper tiffHelper;
public SaveImagesOperation(ImageSettingsContainer imageSettingsContainer, IOverwritePrompt overwritePrompt, ScannedImageRenderer scannedImageRenderer, TiffHelper tiffHelper) public SaveImagesOperation(ImageSettingsContainer imageSettingsContainer, IOverwritePrompt overwritePrompt, BitmapRenderer bitmapRenderer, TiffHelper tiffHelper)
{ {
this.imageSettingsContainer = imageSettingsContainer; this.imageSettingsContainer = imageSettingsContainer;
this.overwritePrompt = overwritePrompt; this.overwritePrompt = overwritePrompt;
this.scannedImageRenderer = scannedImageRenderer; this.bitmapRenderer = bitmapRenderer;
this.tiffHelper = tiffHelper; this.tiffHelper = tiffHelper;
ProgressTitle = MiscResources.SaveImagesProgress; ProgressTitle = MiscResources.SaveImagesProgress;
@ -175,14 +175,14 @@ namespace NAPS2.ImportExport.Images
var encoderParams = new EncoderParameters(1); var encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality); encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality);
// TODO: Something more generic // TODO: Something more generic
using (Bitmap bitmap = ((GdiImage) await scannedImageRenderer.Render(snapshot)).Bitmap) using (Bitmap bitmap = await bitmapRenderer.Render(snapshot))
{ {
bitmap.Save(path, encoder, encoderParams); bitmap.Save(path, encoder, encoderParams);
} }
} }
else else
{ {
using (Bitmap bitmap = ((GdiImage)await scannedImageRenderer.Render(snapshot)).Bitmap) using (Bitmap bitmap = await bitmapRenderer.Render(snapshot))
{ {
bitmap.Save(path, format); bitmap.Save(path, format);
} }

View File

@ -8,18 +8,17 @@ using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using NAPS2.Images; using NAPS2.Images;
using NAPS2.Images.Storage;
using NAPS2.Util; using NAPS2.Util;
namespace NAPS2.ImportExport.Images namespace NAPS2.ImportExport.Images
{ {
public class TiffHelper public class TiffHelper
{ {
private readonly ScannedImageRenderer scannedImageRenderer; private readonly BitmapRenderer bitmapRenderer;
public TiffHelper(ScannedImageRenderer scannedImageRenderer) public TiffHelper(BitmapRenderer bitmapRenderer)
{ {
this.scannedImageRenderer = scannedImageRenderer; this.bitmapRenderer = bitmapRenderer;
} }
public async Task<bool> SaveMultipage(List<ScannedImage.Snapshot> snapshots, string location, TiffCompression compression, ProgressHandler progressCallback, CancellationToken cancelToken) public async Task<bool> SaveMultipage(List<ScannedImage.Snapshot> snapshots, string location, TiffCompression compression, ProgressHandler progressCallback, CancellationToken cancelToken)
@ -41,7 +40,7 @@ namespace NAPS2.ImportExport.Images
var iparams = new EncoderParameters(1); var iparams = new EncoderParameters(1);
Encoder iparam = Encoder.Compression; Encoder iparam = Encoder.Compression;
// TODO: More generic (?) // TODO: More generic (?)
using (var bitmap = ((GdiImage)await scannedImageRenderer.Render(snapshots[0])).Bitmap) using (var bitmap = await bitmapRenderer.Render(snapshots[0]))
{ {
ValidateBitmap(bitmap); ValidateBitmap(bitmap);
var iparamPara = new EncoderParameter(iparam, (long)GetEncoderValue(compression, bitmap)); var iparamPara = new EncoderParameter(iparam, (long)GetEncoderValue(compression, bitmap));
@ -56,7 +55,7 @@ namespace NAPS2.ImportExport.Images
var compressionEncoder = Encoder.Compression; var compressionEncoder = Encoder.Compression;
File.Delete(location); File.Delete(location);
using (var bitmap0 = ((GdiImage)await scannedImageRenderer.Render(snapshots[0])).Bitmap) using (var bitmap0 = await bitmapRenderer.Render(snapshots[0]))
{ {
ValidateBitmap(bitmap0); ValidateBitmap(bitmap0);
encoderParams.Param[0] = new EncoderParameter(compressionEncoder, (long)GetEncoderValue(compression, bitmap0)); encoderParams.Param[0] = new EncoderParameter(compressionEncoder, (long)GetEncoderValue(compression, bitmap0));
@ -76,7 +75,7 @@ namespace NAPS2.ImportExport.Images
return false; return false;
} }
using (var bitmap = ((GdiImage)await scannedImageRenderer.Render(snapshots[i])).Bitmap) using (var bitmap = await bitmapRenderer.Render(snapshots[i]))
{ {
ValidateBitmap(bitmap); ValidateBitmap(bitmap);
encoderParams.Param[0] = new EncoderParameter(compressionEncoder, (long)GetEncoderValue(compression, bitmap)); encoderParams.Param[0] = new EncoderParameter(compressionEncoder, (long)GetEncoderValue(compression, bitmap));

View File

@ -23,6 +23,7 @@ using PdfSharp.Pdf.Security;
namespace NAPS2.ImportExport.Pdf namespace NAPS2.ImportExport.Pdf
{ {
// TODO: Avoid Task.Result use here (and elsewhere)
public class PdfSharpExporter : IPdfExporter public class PdfSharpExporter : IPdfExporter
{ {
static PdfSharpExporter() static PdfSharpExporter()
@ -33,12 +34,18 @@ namespace NAPS2.ImportExport.Pdf
} }
} }
private readonly ScannedImageRenderer scannedImageRenderer; private readonly MemoryStreamRenderer memoryStreamRenderer;
private readonly OcrRequestQueue ocrRequestQueue; private readonly OcrRequestQueue ocrRequestQueue;
public PdfSharpExporter(ScannedImageRenderer scannedImageRenderer, OcrRequestQueue ocrRequestQueue) public PdfSharpExporter()
{ {
this.scannedImageRenderer = scannedImageRenderer; memoryStreamRenderer = new MemoryStreamRenderer();
ocrRequestQueue = OcrRequestQueue.Default;
}
public PdfSharpExporter(MemoryStreamRenderer memoryStreamRenderer, OcrRequestQueue ocrRequestQueue)
{
this.memoryStreamRenderer = memoryStreamRenderer;
this.ocrRequestQueue = ocrRequestQueue; this.ocrRequestQueue = ocrRequestQueue;
} }
@ -142,7 +149,7 @@ namespace NAPS2.ImportExport.Pdf
} }
else else
{ {
using (Stream stream = scannedImageRenderer.RenderToStream(snapshot).Result) using (Stream stream = memoryStreamRenderer.Render(snapshot).Result)
using (var img = XImage.FromStream(stream)) using (var img = XImage.FromStream(stream))
{ {
if (cancelToken.IsCancellationRequested) if (cancelToken.IsCancellationRequested)
@ -195,7 +202,7 @@ namespace NAPS2.ImportExport.Pdf
string tempImageFilePath = Path.Combine(Paths.Temp, Path.GetRandomFileName()); string tempImageFilePath = Path.Combine(Paths.Temp, Path.GetRandomFileName());
using (Stream stream = scannedImageRenderer.RenderToStream(snapshot).Result) using (Stream stream = memoryStreamRenderer.Render(snapshot).Result)
using (var img = XImage.FromStream(stream)) using (var img = XImage.FromStream(stream))
{ {
if (cancelToken.IsCancellationRequested) if (cancelToken.IsCancellationRequested)

View File

@ -27,17 +27,15 @@ namespace NAPS2.ImportExport.Pdf
{ {
private readonly IErrorOutput errorOutput; private readonly IErrorOutput errorOutput;
private readonly IPdfPasswordProvider pdfPasswordProvider; private readonly IPdfPasswordProvider pdfPasswordProvider;
private readonly ThumbnailRenderer thumbnailRenderer; private readonly ImageRenderer imageRenderer;
private readonly ScannedImageRenderer scannedImageRenderer;
private readonly IPdfRenderer pdfRenderer; private readonly IPdfRenderer pdfRenderer;
private readonly IComponentInstallPrompt componentInstallPrompt; private readonly IComponentInstallPrompt componentInstallPrompt;
public PdfSharpImporter(IErrorOutput errorOutput, IPdfPasswordProvider pdfPasswordProvider, ThumbnailRenderer thumbnailRenderer, ScannedImageRenderer scannedImageRenderer, IPdfRenderer pdfRenderer, IComponentInstallPrompt componentInstallPrompt) public PdfSharpImporter(IErrorOutput errorOutput, IPdfPasswordProvider pdfPasswordProvider, ImageRenderer imageRenderer, IPdfRenderer pdfRenderer, IComponentInstallPrompt componentInstallPrompt)
{ {
this.errorOutput = errorOutput; this.errorOutput = errorOutput;
this.pdfPasswordProvider = pdfPasswordProvider; this.pdfPasswordProvider = pdfPasswordProvider;
this.thumbnailRenderer = thumbnailRenderer; this.imageRenderer = imageRenderer;
this.scannedImageRenderer = scannedImageRenderer;
this.pdfRenderer = pdfRenderer; this.pdfRenderer = pdfRenderer;
this.componentInstallPrompt = componentInstallPrompt; this.componentInstallPrompt = componentInstallPrompt;
} }
@ -192,7 +190,7 @@ namespace NAPS2.ImportExport.Pdf
var image = new ScannedImage(new PdfFileStorage(pdfPath)); var image = new ScannedImage(new PdfFileStorage(pdfPath));
if (!importParams.NoThumbnails || importParams.DetectPatchCodes) if (!importParams.NoThumbnails || importParams.DetectPatchCodes)
{ {
using (var bitmap = await scannedImageRenderer.Render(image)) using (var bitmap = await imageRenderer.Render(image))
{ {
if (!importParams.NoThumbnails) if (!importParams.NoThumbnails)
{ {

View File

@ -16,11 +16,11 @@ namespace NAPS2.ImportExport
{ {
public class PrintDocumentPrinter : IScannedImagePrinter public class PrintDocumentPrinter : IScannedImagePrinter
{ {
private readonly ScannedImageRenderer scannedImageRenderer; private readonly ImageRenderer imageRenderer;
public PrintDocumentPrinter(ScannedImageRenderer scannedImageRenderer) public PrintDocumentPrinter(ImageRenderer imageRenderer)
{ {
this.scannedImageRenderer = scannedImageRenderer; this.imageRenderer = imageRenderer;
} }
public async Task<bool> PromptToPrint(List<ScannedImage> images, List<ScannedImage> selectedImages) public async Task<bool> PromptToPrint(List<ScannedImage> images, List<ScannedImage> selectedImages)
@ -82,7 +82,7 @@ namespace NAPS2.ImportExport
int i = 0; int i = 0;
printDocument.PrintPage += (sender, e) => printDocument.PrintPage += (sender, e) =>
{ {
var image = Task.Factory.StartNew(() => scannedImageRenderer.Render(imagesToPrint[i])).Unwrap().Result; var image = Task.Factory.StartNew(() => imageRenderer.Render(imagesToPrint[i])).Unwrap().Result;
try try
{ {
var pb = e.PageBounds; var pb = e.PageBounds;

View File

@ -350,7 +350,6 @@
<Compile Include="Dependencies\PlatformSupport.cs" /> <Compile Include="Dependencies\PlatformSupport.cs" />
<Compile Include="Images\AutoDeskew.cs" /> <Compile Include="Images\AutoDeskew.cs" />
<Compile Include="Operation\OperationProgress.cs" /> <Compile Include="Operation\OperationProgress.cs" />
<Compile Include="Images\ScannedImageRenderer.cs" />
<Compile Include="Dependencies\DownloadFormat.cs" /> <Compile Include="Dependencies\DownloadFormat.cs" />
<Compile Include="Dependencies\DownloadInfo.cs" /> <Compile Include="Dependencies\DownloadInfo.cs" />
<Compile Include="Ocr\Language.cs" /> <Compile Include="Ocr\Language.cs" />

View File

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -11,7 +10,6 @@ using NAPS2.Operation;
using NAPS2.Images; using NAPS2.Images;
using NAPS2.Images.Storage; using NAPS2.Images.Storage;
using NAPS2.Images.Transforms; using NAPS2.Images.Transforms;
using NAPS2.Util;
using NAPS2.WinForms; using NAPS2.WinForms;
namespace NAPS2.Recovery namespace NAPS2.Recovery
@ -19,19 +17,19 @@ namespace NAPS2.Recovery
public class RecoveryManager public class RecoveryManager
{ {
private readonly IFormFactory formFactory; private readonly IFormFactory formFactory;
private readonly ScannedImageRenderer scannedImageRenderer; private readonly ImageRenderer imageRenderer;
private readonly OperationProgress operationProgress; private readonly OperationProgress operationProgress;
public RecoveryManager(IFormFactory formFactory, ScannedImageRenderer scannedImageRenderer, OperationProgress operationProgress) public RecoveryManager(IFormFactory formFactory, ImageRenderer imageRenderer, OperationProgress operationProgress)
{ {
this.formFactory = formFactory; this.formFactory = formFactory;
this.scannedImageRenderer = scannedImageRenderer; this.imageRenderer = imageRenderer;
this.operationProgress = operationProgress; this.operationProgress = operationProgress;
} }
public void RecoverScannedImages(Action<ScannedImage> imageCallback) public void RecoverScannedImages(Action<ScannedImage> imageCallback)
{ {
var op = new RecoveryOperation(formFactory, scannedImageRenderer); var op = new RecoveryOperation(formFactory, imageRenderer);
if (op.Start(imageCallback)) if (op.Start(imageCallback))
{ {
operationProgress.ShowProgress(op); operationProgress.ShowProgress(op);
@ -41,7 +39,7 @@ namespace NAPS2.Recovery
private class RecoveryOperation : OperationBase private class RecoveryOperation : OperationBase
{ {
private readonly IFormFactory formFactory; private readonly IFormFactory formFactory;
private readonly ScannedImageRenderer scannedImageRenderer; private readonly ImageRenderer imageRenderer;
private FileStream lockFile; private FileStream lockFile;
private DirectoryInfo folderToRecoverFrom; private DirectoryInfo folderToRecoverFrom;
@ -49,10 +47,10 @@ namespace NAPS2.Recovery
private int imageCount; private int imageCount;
private DateTime scannedDateTime; private DateTime scannedDateTime;
public RecoveryOperation(IFormFactory formFactory, ScannedImageRenderer scannedImageRenderer) public RecoveryOperation(IFormFactory formFactory, ImageRenderer imageRenderer)
{ {
this.formFactory = formFactory; this.formFactory = formFactory;
this.scannedImageRenderer = scannedImageRenderer; this.imageRenderer = imageRenderer;
ProgressTitle = MiscResources.ImportProgress; ProgressTitle = MiscResources.ImportProgress;
AllowCancel = true; AllowCancel = true;
@ -152,7 +150,7 @@ namespace NAPS2.Recovery
{ {
scannedImage.AddTransform(transform); scannedImage.AddTransform(transform);
} }
scannedImage.SetThumbnail(Transform.Perform(await scannedImageRenderer.Render(scannedImage), new ThumbnailTransform())); scannedImage.SetThumbnail(Transform.Perform(await imageRenderer.Render(scannedImage), new ThumbnailTransform()));
imageCallback(scannedImage); imageCallback(scannedImage);
Status.CurrentProgress++; Status.CurrentProgress++;

View File

@ -10,8 +10,8 @@ namespace NAPS2.WinForms
{ {
partial class FBlackWhite : ImageForm partial class FBlackWhite : ImageForm
{ {
public FBlackWhite(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) public FBlackWhite(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
: base(changeTracker, scannedImageRenderer) : base(changeTracker, bitmapRenderer)
{ {
InitializeComponent(); InitializeComponent();
ActiveControl = txtThreshold; ActiveControl = txtThreshold;

View File

@ -10,8 +10,8 @@ namespace NAPS2.WinForms
{ {
partial class FBrightnessContrast : ImageForm partial class FBrightnessContrast : ImageForm
{ {
public FBrightnessContrast(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) public FBrightnessContrast(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
: base(changeTracker, scannedImageRenderer) : base(changeTracker, bitmapRenderer)
{ {
InitializeComponent(); InitializeComponent();
ActiveControl = txtBrightness; ActiveControl = txtBrightness;

View File

@ -20,8 +20,8 @@ namespace NAPS2.WinForms
private int originalWidth, originalHeight; private int originalWidth, originalHeight;
public FCrop(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) public FCrop(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
: base(changeTracker, scannedImageRenderer) : base(changeTracker, bitmapRenderer)
{ {
InitializeComponent(); InitializeComponent();

View File

@ -53,7 +53,8 @@ namespace NAPS2.WinForms
private readonly KeyboardShortcutManager ksm; private readonly KeyboardShortcutManager ksm;
private readonly ThumbnailRenderer thumbnailRenderer; private readonly ThumbnailRenderer thumbnailRenderer;
private readonly WinFormsExportHelper exportHelper; private readonly WinFormsExportHelper exportHelper;
private readonly ScannedImageRenderer scannedImageRenderer; private readonly BitmapRenderer bitmapRenderer;
private readonly ImageRenderer imageRenderer;
private readonly NotificationManager notify; private readonly NotificationManager notify;
private readonly CultureInitializer cultureInitializer; private readonly CultureInitializer cultureInitializer;
private readonly IWorkerServiceFactory workerServiceFactory; private readonly IWorkerServiceFactory workerServiceFactory;
@ -74,7 +75,7 @@ namespace NAPS2.WinForms
#region Initialization and Culture #region Initialization and Culture
public FDesktop(StringWrapper stringWrapper, RecoveryManager recoveryManager, OcrManager ocrManager, IProfileManager profileManager, IScanPerformer scanPerformer, IScannedImagePrinter scannedImagePrinter, ChangeTracker changeTracker, StillImage stillImage, IOperationFactory operationFactory, KeyboardShortcutManager ksm, ThumbnailRenderer thumbnailRenderer, WinFormsExportHelper exportHelper, ScannedImageRenderer scannedImageRenderer, NotificationManager notify, CultureInitializer cultureInitializer, IWorkerServiceFactory workerServiceFactory, OperationProgress operationProgress, UpdateChecker updateChecker) public FDesktop(StringWrapper stringWrapper, RecoveryManager recoveryManager, OcrManager ocrManager, IProfileManager profileManager, IScanPerformer scanPerformer, IScannedImagePrinter scannedImagePrinter, ChangeTracker changeTracker, StillImage stillImage, IOperationFactory operationFactory, KeyboardShortcutManager ksm, ThumbnailRenderer thumbnailRenderer, WinFormsExportHelper exportHelper, BitmapRenderer bitmapRenderer, ImageRenderer imageRenderer, NotificationManager notify, CultureInitializer cultureInitializer, IWorkerServiceFactory workerServiceFactory, OperationProgress operationProgress, UpdateChecker updateChecker)
{ {
this.stringWrapper = stringWrapper; this.stringWrapper = stringWrapper;
this.recoveryManager = recoveryManager; this.recoveryManager = recoveryManager;
@ -88,7 +89,8 @@ namespace NAPS2.WinForms
this.ksm = ksm; this.ksm = ksm;
this.thumbnailRenderer = thumbnailRenderer; this.thumbnailRenderer = thumbnailRenderer;
this.exportHelper = exportHelper; this.exportHelper = exportHelper;
this.scannedImageRenderer = scannedImageRenderer; this.bitmapRenderer = bitmapRenderer;
this.imageRenderer = imageRenderer;
this.notify = notify; this.notify = notify;
this.cultureInitializer = cultureInitializer; this.cultureInitializer = cultureInitializer;
this.workerServiceFactory = workerServiceFactory; this.workerServiceFactory = workerServiceFactory;
@ -1703,7 +1705,7 @@ namespace NAPS2.WinForms
} }
if (includeBitmap) if (includeBitmap)
{ {
using (var firstBitmap = ((GdiImage)await scannedImageRenderer.Render(imageList[0])).Bitmap) using (var firstBitmap = await bitmapRenderer.Render(imageList[0]))
{ {
ido.SetData(DataFormats.Bitmap, true, new Bitmap(firstBitmap)); ido.SetData(DataFormats.Bitmap, true, new Bitmap(firstBitmap));
ido.SetData(DataFormats.Rtf, true, await RtfEncodeImages(firstBitmap, imageList)); ido.SetData(DataFormats.Rtf, true, await RtfEncodeImages(firstBitmap, imageList));
@ -1724,7 +1726,7 @@ namespace NAPS2.WinForms
} }
foreach (var img in images.Skip(1)) foreach (var img in images.Skip(1))
{ {
using (var bitmap = ((GdiImage)await scannedImageRenderer.Render(img)).Bitmap) using (var bitmap = await bitmapRenderer.Render(img))
{ {
// TODO: Is this the right format? // TODO: Is this the right format?
if (!AppendRtfEncodedImage(bitmap, bitmap.RawFormat, sb, true)) if (!AppendRtfEncodedImage(bitmap, bitmap.RawFormat, sb, true))
@ -1861,7 +1863,7 @@ namespace NAPS2.WinForms
{ {
var thumb = worker != null var thumb = worker != null
? StorageManager.ImageFactory.Decode(new MemoryStream(worker.Service.RenderThumbnail(snapshot, thumbnailList1.ThumbnailSize.Height)), ".jpg") ? StorageManager.ImageFactory.Decode(new MemoryStream(worker.Service.RenderThumbnail(snapshot, thumbnailList1.ThumbnailSize.Height)), ".jpg")
: scannedImageRenderer.Render(snapshot, thumbnailList1.ThumbnailSize.Height).Result; : imageRenderer.Render(snapshot, thumbnailList1.ThumbnailSize.Height).Result;
if (!ThumbnailStillNeedsRendering(next)) if (!ThumbnailStillNeedsRendering(next))
{ {

View File

@ -10,8 +10,8 @@ namespace NAPS2.WinForms
{ {
partial class FHueSaturation : ImageForm partial class FHueSaturation : ImageForm
{ {
public FHueSaturation(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) public FHueSaturation(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
: base(changeTracker, scannedImageRenderer) : base(changeTracker, bitmapRenderer)
{ {
InitializeComponent(); InitializeComponent();
ActiveControl = txtHue; ActiveControl = txtHue;

View File

@ -20,8 +20,8 @@ namespace NAPS2.WinForms
private bool guideExists; private bool guideExists;
private Point guideStart, guideEnd; private Point guideStart, guideEnd;
public FRotate(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) public FRotate(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
: base(changeTracker, scannedImageRenderer) : base(changeTracker, bitmapRenderer)
{ {
InitializeComponent(); InitializeComponent();
txtAngle.Text += '\u00B0'; txtAngle.Text += '\u00B0';

View File

@ -10,8 +10,8 @@ namespace NAPS2.WinForms
{ {
partial class FSharpen : ImageForm partial class FSharpen : ImageForm
{ {
public FSharpen(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) public FSharpen(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
: base(changeTracker, scannedImageRenderer) : base(changeTracker, bitmapRenderer)
{ {
InitializeComponent(); InitializeComponent();
ActiveControl = txtSharpen; ActiveControl = txtSharpen;

View File

@ -46,16 +46,16 @@ namespace NAPS2.WinForms
private ToolStripButton tsHueSaturation; private ToolStripButton tsHueSaturation;
private ToolStripButton tsBlackWhite; private ToolStripButton tsBlackWhite;
private ToolStripButton tsSharpen; private ToolStripButton tsSharpen;
private readonly ScannedImageRenderer scannedImageRenderer; private readonly BitmapRenderer bitmapRenderer;
private readonly KeyboardShortcutManager ksm; private readonly KeyboardShortcutManager ksm;
private readonly OperationProgress operationProgress; private readonly OperationProgress operationProgress;
public FViewer(ChangeTracker changeTracker, IOperationFactory operationFactory, WinFormsExportHelper exportHelper, ScannedImageRenderer scannedImageRenderer, KeyboardShortcutManager ksm, OperationProgress operationProgress) public FViewer(ChangeTracker changeTracker, IOperationFactory operationFactory, WinFormsExportHelper exportHelper, BitmapRenderer scannedImageRenderer, KeyboardShortcutManager ksm, OperationProgress operationProgress)
{ {
this.changeTracker = changeTracker; this.changeTracker = changeTracker;
this.operationFactory = operationFactory; this.operationFactory = operationFactory;
this.exportHelper = exportHelper; this.exportHelper = exportHelper;
this.scannedImageRenderer = scannedImageRenderer; this.bitmapRenderer = bitmapRenderer;
this.ksm = ksm; this.ksm = ksm;
this.operationProgress = operationProgress; this.operationProgress = operationProgress;
InitializeComponent(); InitializeComponent();
@ -109,8 +109,7 @@ namespace NAPS2.WinForms
{ {
tiffViewer1.Image?.Dispose(); tiffViewer1.Image?.Dispose();
tiffViewer1.Image = null; tiffViewer1.Image = null;
var newImage = await scannedImageRenderer.Render(ImageList.Images[ImageIndex]); tiffViewer1.Image = await bitmapRenderer.Render(ImageList.Images[ImageIndex]);
tiffViewer1.Image = ((GdiImage)newImage).Bitmap;
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)

View File

@ -14,7 +14,7 @@ namespace NAPS2.WinForms
partial class ImageForm : FormBase partial class ImageForm : FormBase
{ {
private readonly ChangeTracker changeTracker; private readonly ChangeTracker changeTracker;
private readonly ScannedImageRenderer scannedImageRenderer; private readonly BitmapRenderer bitmapRenderer;
protected Bitmap workingImage, workingImage2; protected Bitmap workingImage, workingImage2;
private bool initComplete; private bool initComplete;
@ -29,10 +29,10 @@ namespace NAPS2.WinForms
InitializeComponent(); InitializeComponent();
} }
protected ImageForm(ChangeTracker changeTracker, ScannedImageRenderer scannedImageRenderer) protected ImageForm(ChangeTracker changeTracker, BitmapRenderer bitmapRenderer)
{ {
this.changeTracker = changeTracker; this.changeTracker = changeTracker;
this.scannedImageRenderer = scannedImageRenderer; this.bitmapRenderer = bitmapRenderer;
InitializeComponent(); InitializeComponent();
} }
@ -92,7 +92,7 @@ namespace NAPS2.WinForms
Size = new Size(600, 600); Size = new Size(600, 600);
var maxDimen = Screen.AllScreens.Max(s => Math.Max(s.WorkingArea.Height, s.WorkingArea.Width)); var maxDimen = Screen.AllScreens.Max(s => Math.Max(s.WorkingArea.Height, s.WorkingArea.Width));
workingImage = ((GdiImage)await scannedImageRenderer.Render(Image, maxDimen * 2)).Bitmap; workingImage = await bitmapRenderer.Render(Image, maxDimen * 2);
if (closed) if (closed)
{ {
workingImage?.Dispose(); workingImage?.Dispose();