ImageEn

What's New

Version 15.2.0

New Features

Added: Much wider support for SVG files: including uses and CSS improvements, clip path support when rendering, and support for tags: symbols, linear gradients, display, visibility, text-anchor, text-decoration, dominant-baseline, stroke-*, etc.
Added: Can specify minimum zoom for TImageEnView
Added: Merged duplicate code of TImageEnMView.CopyToIEBitmap/GetTIEBitmap/GetBitmap
Added: The password the user supplied when auto-prompted when opening a PDF is available via: ImageEnView1.PdfViewer.Document.LastPassword
Added: Support TIFF 12-bit (avoid unpack then invert WhiteIsZero in Decompress1)
Added: TileBitmapOntoCanvas and tiled wallpaper in IEDrawBackground supports offset X,Y drawing
Added: TIEBitmap.MergeAlphaRectTo() no longer creates alpha channel unless needed
Added: Support for DICOM files with fragmented Lossless JPEG
Added: Updated list of Slippy Map providers
Added: Improved MMF support, particularly when rendering with audio
Added: Performance improvements with 90 deg. rotations
Added: Scaling of histogram display in TIEColorCurve
Added: High quality anti-aliasing for TIEEquirectangularRenderer rendering
Added: Layers can be created on selectable layers if they are selected and locked
Added: TIEMultiBitmap supports alpha when assigning 32bit RGBA bitmaps
Added: More implementation of safer coder practices (e.g. for low memory or resources)
Added: If -1 is specified for DICOM_J2000Rate, it inherits the value from J2000_Rate
Added: Expanded support for TIFF formats using YCbCr

AI Analysis

Comprehensive AI review of entire code base was performed, which returned 1670 items requiring investigation: Each item was reviewed by a human, fixed and tested:
Crash guards against invalid bitmaps: 53
Crash guards against invalid objects: 48
Crash guards against invalid parameters: 87
Crash guards against numeric edge cases: 29
Out of Bounds guards: 48
Resilience against malformed/corrupt file streams: 49
Protection against potential memory leaks: 57
Improved management of object lifecycle: 20
Other guards against unexpected results: 76
Other bugs and logic errors: 101

Code Safety

Added: Crash safety in TIEDirectShow.SaveGraph/TIESlippyMap.Render
Added: Crash safety in WindowsSelectDirectory
Added: Crash guards in TImageEnView.PaintGuideLines
Added: Check for removed layer when showing text editor
Added: Valdated parameters in TImageEnView.SetScale
Added: Validate dest bitmaps in THistogramBox.GetIEBitmap, TIEDirectShow.GetSample, TIEMediaReader.GetSample, TImageEnMView.GetImageToStream/GetTIEBitmap
Added: Validate dest bitmaps in TIEAnimation.drawImage/PaintBorder/PaintText/PaintScrollBar, TIEHorizontalFlow.Display, TIEWia.GetItemThumbnail
Added: Validate dest bitmaps in TImageEnView.DrawTo, TImageEnView.CopyToPolygon, TImageEnView.CopySelectionToBitmap, TImageEnView.AssignSelTo, TIEImagingAnnot.DrawToBitmap, TIEImageEnAnnot.DrawToBitmap
Added: Crash guards in TIEDirectShow.ConvertTimeFormat, TIEMask.CopyIEBitmapAlpha, TIEVirtualImageList.PrepareSpaceFor
Added: Validate source stream in TImageEnMView.InsertImage/AppendSplit/GetResampledImage/SetImageRect/SetImageFromStream
Added: Validate source stream in TIEWICReader.DecoderInfo, TIEWICReader.Open, TIEWICWriter.Open, TIEWICWriter.PutFrame, TImageEnView.LoadSelectionFromStream/MergeSelectionFromStream
Added: Validate dest stream in TImageEnView.SaveSelectionToStream, TIEBitmap.SaveToFile
Added: Validate source bitmaps in TImageEnMView.CreateMorphingSequence, TIEPDFBuilder.AddPageWithImage, TImageEnView.CopyFromPolygon, TImageEnView.ApplyBitmapToSelection
Added: Validate dest stringlist in TImageEnMView.SelectedFilenames, TIETwainParams.IterateParams
Added: Validate source stringlist in TImageEnMView.FillFromList, TIEMultiBitmap.FillFromList, TImageEnFolderMView.CopyFilesToFolderEx
Added: Crash guards in TImageEnMView.CheckSelectedImageIsVisible, TIEPDFBuilder.AddPageWithLayers, TIEPDFBuilder.AddText
Added: Validate Twain object in TIEAcquireParams.IsPixelTypeSupported
Added: Validate selection in TImageEnViewInpaint.ExecuteTarget
Added: Validate dest stream in TIOParams.SaveToStream, TIEMultiBitmap.GetImageToStream, TIEMultiBitmap.SaveToFile
Added: Validate source stream in TIEBitmap.LoadFromFile, TIEMultiBitmap.LoadFromFile, TIEGoogleVision.ProcessImage
Added: Validate source bitmaps in TIEBitmap.CopyFromTBitmap, TIEMultiBitmap.AppendSplit, TIEColorCurve.AssignSource, TIEDBMultiBitmap.InsertImage, TIEGoogleVision.ProcessImage
Added: Validate dest bitmaps in TIEMultiBitmap.CopyToIEBitmap, TIEColorCurve.ApplyCurve
Added: Validate blob fields in TIEDBBitmap.Read/Write, TIEDBMultiBitmap.Read/Write
Added: Validate streams for all TImageEnIO and TImageEnMIO Load and Save methods
Added: Validate buffer in TImageEnIO.LoadFromBuffer/ParamsFromBuffer and TImageEnMIO.LoadFromBuffer/ParamsFromBuffer
Added: Resilience to TIEVirtualImageList.GetImageWidth/Height/BitCount
Added: Negative parameter guards in TIEMask.CombineWithAlpha
Added: Exception on nil bits in TIEDibBitmap.CopyToTBitmap
Added: Exception on invalid pixel format bits in TIEBitmap.EncapsulateTBitmap
Added: Many more crash guards in TIEMediaFoundation/TIEGlobalSettings/TIEWia
Added: Check for invalid rect with TImageEnVectCropImageToObjects action
Added: Crash guards in HEIF encoder
Added: Crash guards in SevenZip decoder
Added: TIEColorCurve.AddCurvePoint ignores out of range values
Added: Error if pass null width to ImageEnView1.VisibleBitmapRect
Added: Safer loading of malformed Color Curve files
Added: TIECustomMView.CenterFrame() doesn't check bounds
Added: Histogram drawing does not check for invalid draw values
Added: Exception if set DICOM FrameTime to 0
Added: Exception if call TIEMultiBitmap.DeleteImage() or TIEMultiBitmap.SwapImages() with invalid indexes
Added: If null name was passed to TIEDcimAcquire.SourceNameToIndex() it always defaulted to unselected
Added: TIEVSoftShadow.GetAngleAndDist(): negative X gave negative Distance
Added: TPdfFormField.GetName fails with Nil FormHandle
Added: Crash-safety guard in TPdfObjectList.AddText
Added: Safer freeing of meta files in TIERichEdit
Added: TIERichEdit.GetTextRange safety checking
Added: Error if null size layer in TIEUserInteraction.ScreenToBitmapX/ScreenToBitmapY/BitmapToScreenX/BitmapToScreenY
Added: Error if null size layer in TIECropToolInteraction.Enact/MouseDownExclusive
Added: TIEButtonInteraction does not check for invalid button size
Added: Unchecked load in TImageEnIO.SyncLoadFromStreamPCX
Added: Crash guard in TImageEnMIO.DuplicateCompressionInfo
Added: Div0 guard in TImageEnMIO.LoadFromStreamCUR
Added: Index validation in TImageEnMIO.PrintImagePos/PrintImage
Added: Crash safety in TImageEnMIO print methods
Added: Potential crash for files without images in TImageEnMIO.ParamsFromFileOrStream
Added: Guards against invalid buffers in MMF decode methods
Added: Crash guards in TIEMediaFoundationVideoProcessor.PushSample
Added: Potential heap overwrite in TIEMediaFoundationVideoProcessor.GetSample
Added: Check for underflow in when reading JPEG from CRW file
Added: Div0 guards in IEGetAverageValues
Added: Improved memory safety in TImageEnProc.CopyToClipboard_Layer
Added: Possible div0 when rotating 1bit image
Added: Parameter validation in TImageEnProc.GammaCorrect
Added: Empty dest causes divides by zero in TImageEnProcResample
Added: Empty lap could cause OOB in _sh_estimate_thresh (TImageEnProc.EdgeDetect_ShenCastan)
Added: Guard against empty image and other risks in TImageEnProc.MedianFilter
Added: Guard against empty image in TImageEnProc.RadialStretch/TImageEnProc.ConvertToBW_FloydSteinberg/IEAutoCrop2/IEGetLuminosityDiff/IEApplyCoefficients/IEColorize/IEAutoSharp/IEVectorize
Added: Check for valid point count in IEPerspectiveCrop
Added: Zero count/OOB channel in IEHistogramSpecification
Added: Crash safety guards in IEAdjustGainOffset/IESwirlEffect/TIEPencilSketch.CalcStandardDeviation
Added: Validate radius in IESymmetricNearestNeighbourOpt
Added: Safer free of objects in TImageEnIO.CloseAVIFile
Added: Validation of layer index in TImageEnView.CalcLayerGripCoords
Added: Div0 in TImageEnView.LayersFixBorders if bitmap is nil sized
Added: Empty drop of files causes OOB (TImageEnView.DropFiles)
Added: No checking for invalid interval in TIEPostFramesTarget.Create
Added: Theoretical possibility of AV in TImageEnMView.GetImageBitCount/GetImageY/GetImageX/DeleteImage/SetIEBitmapEx
Added: Check parameter validity in TImageEnMView.AppendSplit/SetImageRect
Added: Crash safety in TImageEnMView.ImageAtPos/InsertingPoint
Added: Potential hang with null sized borders in TImageEnMView.SelectAtPos
Added: Crash safety in TImageEnMView.PaintToEx
Added: Error if empty selection in TImageEnMView.MoveSelectedImagesTo
Added: Empty string could cause issue on PNG load
Added: Crash safety in TImageEnMViewAction.SetImageEnMView
Added: Failed call to GetTIEBitmap could cause AV with TImageEnMViewProcAction.DoAutoSaveChanges
Added: Parameter validity checking in PerformSHFileOperation2/ShowWindowsPrintWizard
Added: Better error checking in CutFilesToClipboard
Added: Potential file skipped in IETouchFile
Added: Parameter validity checking in TIEWICBitmapWrapper.CopyPalette/CopyPixels
Added: Cope with zero image selections in TfiePrnForm1/TfiePrnForm2/TfiePrnForm3/TfiePrnForm4.PrintPreview
Added: Overread when bypass Layers in ReadLayerAndMaskInfo
Added: Cope with empty rowBuf in ReadImageData
Added: Cope with invalid ChannelCount in MakeAllLayersPSDCompatible/IEWritePSD
Added: Empty mask causes error in TIEMask.CreateResampledMask/DrawHorizontalLine
Added: Crash safety in TIEMask.ApplyFeathering
Added: Parameter validity checking in TIEMask.AllocateBits
Added: Parameter validity checking in TIEBitmap.MoveRegion/MergeFromTDibBitmap/FillRect/GradientFillRect/StretchRectTo
Added: Aborting failed to close AVI file in TImageEnMIO.SaveToFileAVI
Added: Some read issues in TIETIFFHandler
Added: TImageEnView creates TImageEnIO.DShowParams unnecessarily
Added: Early exit leaked TIEDirectShow in TImageEnIO.OpenMediaFile
Added: Used full image rather than mask for TImageEnProc.CalcStdDev
Added: Nil ParentShellFolder could cause AV in ShellTreeSortProc
Added: Nil child could cause AV in MakeAbsoluteIDL
Added: Check validity of parameters in TImageEnView.SelectChromaKey
Added: Guard again zero images sizes in IEGetFitResampleSize/AutoCalcScale
Added: Guard against Rgb()/rgba() with <3 numbers when parsing SVG
Added: Potential arc radius/chord div0 in IEConvertSVGArcToCurve
Added: Potential div0 error if loading from AVI fails
Added: Print progress incorrect in TImageEnMIO print methods
Added: DestPopup nil when EnableDLLMode in AddActionsToControl
Added: Invalid index checking in TImageEnMIO.DoPreviews
Added: Memory leak on failure in TImageEnMIO.DoPreviews
Added: On exception freed bmp continues to be used in TImageEnMIO.LoadFromStreamPDF
Added: Early exit left DirectShow connected in TImageEnMIO.LoadFromMediaFile
Added: Inadequate parameter test in TImageEnProc.Lens()
Added: Guard against div0 in TIEColorCurve.SetPandU
Added: Various guards when loading ACV files in TIEColorCurve.LoadCurveFromFile
Added: Null size image guard in TIEWarper.EndWarp
Added: Check for Nil Stream in IEZipTryStream and all T7zStream methods
Added: Guard against nil DPU with TIERuler
Added: Guard against invalid tick frequency values with TIERuler
Added: Crash safety guards in TIERuler.PaintRulerGuides
Added: Check for nil dest stream in TIEPortableDevices.CopyStreamFromDevice
Added: Crash guards in TIECommonDialog.ExtractFilter
Added: Better PAnsiChar handling in TOpenImageEnDialog.GetFilenames
Added: Guard against maformatted stream in TIETIFFIFDReader.ReadIFD
Added: Guard against maformatted stream in TIETagsHandler.ReadFromStream
Added: Guard against Nil buffer in TIETIFFHandler.GetIntegerEx
Added: Risk of OOB in TIETIFFHandler.CopyTagEx
Added: Crash guards in TIERFBMessageThread.msg_FrameBufferUpdate/TIERFBMessageThread.CopyRawRow
Added: Guard against nil source in TIEImageEffect.AssignEx/Insert
Added: Guard against invalid Enum/userfilter in TIEImageEffect.LoadFromStream/SetProperty
Added: Guard against nil source in TIEImageEffectsList.Assign
Added: Div0 guard when converting absolute resize in TIEEditControls.ResetParams
Added: Crash-safety guard in TIEEditControls.OriginalImageEnViewMouseUp
Added: Height/Width=0 guard in TIEEditControls.edtNewHeightChange
Added: Crash-safety guard in TIEEditControls.ApplyTo
Added: Width/Height aspect when Height=0 in CreateSVGShapeTag
Added: Crash safety guard in TIESVGParser.ParseSVGEx for null sized viewbox
Added: Missing hobj causes error in TImageEnVect.RemoveVObject
Added: Guard against malformed stream in TImageEnVect.ReadObj
Added: Memory safety in TImageEnVect.ObjCopyToClipboard/ObjPasteFromClipboard
Added: Other code safety in TImageEnVect.ObjPasteFromClipboard
Added: Guard against infinite ellipse/arc/cosine curve in TImageEnVect.SetObjTextCurveShape
Added: Crash guards in TIELayer.PointOverLayer/CalcPaintPos/RenderLayerWithAdornments/PointInShape
Added: Validate parameters in TIEPolylineLayer.SetPoints
Added: Check PointCount in TIEPolylineLayer.SmoothJaggedEdges
Added: Error if draw TIELineLayer with no owner
Added: Validate Owner in TIEPolylineLayer.AddPoint/CalculateLength/CalculateArea
Added: Protect against leakage when loading legacy layer file
Added: Validate source bitmap in TIELayer.RenderLayerWithAdornments
Added: Validate layer size in TIEShapeLayer.PointInShape
Added: Crash guards in TIEPolylineLayer.SmoothJaggedEdges/TIETextLayer.CopyToBitmapEx_Rich
Added: Protect against memory leak when failure occurs when setting a marker with TIEMarker
Added: Check count in TIEIPTCInfoList.LoadFromStream
Added: Code safety in TIEMask.DrawOuter
Added: Crash guard in TIEMask.DrawSinglePolygon
Added: Offset write in TIEMask.Intersect
Added: Unchecked counts in TIEVirtualImageList.LoadFromStream
Added: Bounds checking in TIEDibBitmap.GetScanline and TIEWorkBitmap.GetScanline
Added: Crash guard in TIEBitmap.GetScanline/GetRow
Added: Short palette causes OOB in TIEBitmap.CopyToTBitmap
Added: Validate parameters in TIEBitmap.CopyToEx/MergeFromTDibBitmap
Added: Validate palette in TIEBitmap.GetPaletteBuffer
Added: Palette index OOB when Length<256 in TIEBitmap.GetPixels
Added: Palette>256 causes OOB in TIEBitmap.UpdateTBitmapPalette
Added: Crash guards in TIEBitmap.DIBDrawTo
Added: Memory guard in TIEBitmap.RenderToCanvasWithAlpha
Added: Leak on memory allocation failure in TIEBitmap.RenderToTIEBitmap
Added: Palette index OOB in TIEBitmap.Render_ie8p/Render_ie8p_Alpha
Added: Safety guards in IEPDFPageCount
Added: Code safety in TIENeurNet.GenerateNetwork
Added: Guard against stream garbage in TIEDicomTags.LoadFromStream
Added: Capped TIOParams ColorMap at 65536 to prevent potentially huge memory usage
Added: Limit loading of oversized Color Maps in TIOParams.LoadFromStream
Added: Validate thumbnail size parameters in TIEMultiBitmap.DrawToBitmap
Added: Validate parameters in TIEMultiBitmap.SetImageRect
Added: Handle ICOpen fail in IEAVIGetCodecsDescription
Added: Guard against erroneous buffers in TIEResourceExtractor.GetGroupCountFrames
Added: Guard against erroneous buffers and OOB in GetIconFrameInfo
Added: Crash safety guards in TIEResourceExtractor.GetGroupFrameWidth/GetGroupFrameHeight/GetGroupFrameDepth/GetGroupFrameName
Added: Validate parameters in TIEResourceExtractor.GetNames/GetString
Added: Potential OOB when not IgnoreRangeErrors in TIEStringSplitter.GetString
Added: Potential OOB in TIEStringSplitter.Update
Added: OOB if pointer not found in TIEFileBuffer.UnMap
Added: Fallback to 0 IE_ELFHash/IE_RSHash/IE_JSHash
Added: Empty string causes OOB in IEHashString
Added: Validate against negative Idx in TIEList.InsertItem/BaseGetItem/BaseSetItem
Added: Neg/OOB Idx could cause fData overrun in TIEList.BaseGetItem
Added: Neg Idx passed Idx<fCount and wrote before fData in TIEList.BaseSetItem
Added: Guard against invalid dir IEGPSConvertDegDecToDMS
Added: Crash guards in IESnapValue and IEChordLenOnEllipse
Added: Validate point count in IEAngle3
Added: Crash guards in _IEASCII85Decode5/IEASCII85DecodeBlock/IEASCII85DecodeBlock
Added: Accept empty palette in TImageEnPaletteDialog.SetPalette, and validate length
Added: Crash guard in TImageEnPaletteDialog.FormMouseMove/FormClick
Added: Code safety in IELoadStringFromStreamA/IESaveStringToStream/IELoadStringFromStream/IESaveStringToStreamW/IELoadStringFromStreamW
Added: Guard against empty encode/decode in IEEncode64/IEDecode64
Added: Crash guards in IERectifiedRectangleAspectRatio/IEAdjustRectToAspectRatio/IECopyTextToClipboard/IEPasteTextFromClipboardEx
Added: Validate rect array in IECalcRectLineFirstIntersectionPointNI
Added: Empty bitmap causesAV in IERotateBits
Added: Validate parameters in IEDistParallelLines
Added: Crash guard in IEDistParallelLines/IESimplifyPolygon/IECalcCLineRectIntersect/IESetStringA/IEGetCubicBezierPoints
Added: Support Count <=0 in TIEByteArray.AppendFromStream
Added: Unbounded GIF_ImageIndex in TImageEnIO.LoadFromFileGIF
Added: Crash safety in TImageEnIO.UpdateAPP138BimResolution
Added: Unmanaged write error when failing in TImageEnIO.SaveToText
Added: Crash safety in IEMetafileCalcDestSize
Added: Manage failed memory allocation in TImageEnIO.ImportMetafile/MergeMetafile
Added: Crash guards in TImageEnIO.MergeMetafile
Added: Crash guards in TImageEnIO.PrintImagePosEx/PrintImageEx/PreviewPrintImageEx/CaptureFromScreen
Added: Validate print size in TImageEnIO.PrintImageEx
Added: Manage failed load of icon in TImageEnIO.CaptureFromScreen
Added: Crash safety in TImageEnIO.CreateAVIFile
Added: Validate bitmap in TImageEnIO.SaveToAVI
Added: Validate initialization in TImageEnIO.SaveToPS/SaveToPDF
Added: Crash safety in TImageEnIO.LoadZIP_SevenZip/ExtractZIP_SevenZip
Added: Validate FrameIndex in TImageEnIO.LoadFromMediaFile
Added: Validate ImageCount TImageEnIO.Seek
Added: Safer Mask vs AlphaChannel size comparison in TImageEnView.SetSelectedAreaAlpha
Added: Crash guards in TImageEnView.LayersInsertEx/FindLayerPointAt/SetNavigatorRect
Added: Code safety in IEDrawBackground
Added: Unexpected result guard in TImageEnView.LayersInsertEx
Added: Crash guard in TIEView.UpdateRect/MouseWheelParams/MouseWheelParamsAlt
Added: Parameter validity checking in TIEView.SetChessboardStyle
Added: Code safety around gesture loading code
Added: Crash guards in TIEList/TIEIntegerList/TIEDoubleList/TIEByteArray/TIEPen
Added: Crash guards in IELoadStringFromStream
Added: Code safety in TIEDPointsList.Assign
Added: Guard against div0 in TIESVGParser.CreateSVGRenderingBitmap
Added: Code safety in TImageEnIO.OpenAVIFile/CloseAVIFile
Added: Validate index in TImageEnView.LayersInsert
Added: Guard against invalid kernel in TImageEnProc.Convolve
Added: Guard against very large SVG files
Added: Guard against DICOM files that report invalid bit depth (J2K format)
Added: Exception if invalid Canvas passed when creating TIECanvas

Bug Fixes

Fixed: Soft shadow not drawn in TImageEnMView or layers if Pixel Format not ie1g, ie24RGB
Fixed: Improved workaround for BCB wingdi.h clash with TextOut/DrawText
Fixed: Polyline layers may scale points even if use iepbBitmap if size was set previously
Fixed: Layers with partially opaque fills may blend colors with shadow
Added: 24bit ICC profiles can be applied to 32bit images
Fixed: Some loop range issues
Fixed: Cannot set EXIF_GPSDestLongitudeRef
Fixed: IEMask.Full may be true even when not truly full
Fixed: TIEImageLayer.Clear() may move layer to unexpected position
Fixed: TIERichEdit.SaveSelectedImage() does not allow a nil destination
Fixed: TIEPdfViewer.ScrToPage() does not correctly check bounds
Fixed: TImageEnProc.CalcAverageRGB() may not sample correctly
Fixed: Various errors in documentation examples
Fixed: TImageEnProc.ConvertTo() may overrun width if color count between 256 and 1024
Fixed: Minor alpha issue with TImageEnProc.RoundImage()
Fixed: When setting EXIF Longitude without setting Latitude, changes are not saved
Fixed: When printing thumbnails, vertical offset parameter is ignored
Fixed: Resolved some unneeded parsing when reading SVG files
Fixed: Potential memory loss when previewing thumbnail printing
Fixed: Toolbar status update could raise exception if not connected to TImageEnView
Fixed: Spray brush may not paint to first column/row
Fixed: Some issues painting non-page areas with PDF viewer
Fixed: Ensure Close clipboard even after clipboard failure
Fixed: IEGetFileFromDevice() returned true when empty path was passed
Fixed: In rare situation TIEQuantizer.GetRGBIndex() may return out of bounds result
Fixed: Prevent possible overrun when writing TIFF with Old Jpeg compression
Fixed: TIECanvas.Pie() Falls back to drawing Arc if GDI+ is disabled
Fixed: TIECanvas.DrawRects() may use invalid height value
Fixed: TIEDPointsList.ShiftPoints() does not adequately detect points break
Fixed: If TImageEnMIO released a bitmap when attached to a TIEMultiBitmap, it is not updated
Fixed: TImageEnMIO.DuplicateCompressionInfo() raises exception if not attached
Fixed: IEDrawLineEx() does not check for invalid line points
Fixed: Invalid memory calculation in TImageEnMView.CreateMorphingSequence()
Fixed: Small memory leak if saving JPEG2000 and encoding fails
Fixed: TIEWia.GetAcquireFrame() fails to return bottom
Fixed: TIEWia.SetAcquireFrame() doesn't consider different x/y resolutions
Fixed: Memory leak if using TImageEnMView actions to perform proc functions
Fixed: IEDrawComboListBoxItem() does not consider irregular sized glyphs
Fixed: IEDrawColorPalette() does not consider irregular sized palette squares
Fixed: TIEColorPalette does not consider irregular sized margins
Fixed: Google API: may default to incorrect regions
Fixed: Wrong thumbnail index passed by ImageEnLayerMView.OnGetLayerImage
Fixed: Memory leak if fails to read user data buffer from a layer file
Fixed: TStringGridHelper fails to fill grid correctly if there are FixedRows > 1
Fixed: Did not check validity of data when getting an IO Params color map item as a string
Fixed: Issues reading/writing B/W GIF files when outside final 8bit alignment
Fixed: TIEDPointsList.ScalePoints() ignored MaintainAR parameter
Fixed: TIEDPointsList.PointInPolygon() doesn't check for point validity
Fixed: Some issues reading dicom palettes correctly
Fixed: TPdfDocument.LoadFromStream does not consider stream position
Fixed: TPdfDocument.ImportPageRange issue because ranges are 1-based
Fixed: TPdfDocument.MovePages does not check for empty array
Fixed: TPdfDocument.GetPageLabel format issue
Fixed: ImpTextPosIsValid does not consider very left/top
Fixed: TPdfAnnotation.GetLinkGotoDestination fails with remote document
Fixed: TPdfObjectList.ArrangeObject always returns False
Fixed: TPdfObjectList.LoadFromStream fails with legacy files (< 14200)
Fixed: Y shift incorrect in TPdfObjectList.LoadFromStream
Fixed: TPdfObjectList.AddText/AddPath/LineTo/BezierTo/GetPath could leak memory on failure
Fixed: Fm/stroke uninit on failure in TPdfObject.GetPathDrawMode
Fixed: Page Width of 0 causes Div0 error in TPdfDocumentPrinter.InternPrintPage
Fixed: Not considering max tab stops in TIEParaAttributes.GetTab
Fixed: TIEParaAttributes.GetTab*/SetTab* rejected last valid tab
Fixed: TIERichEdit.SetSelectionAsLink failed
Fixed: Progress value may be invalid in TImageEnIO.LoadFromStreamGIF/LoadFromStreamJPEG
Fixed: TImageEnIO.MergeMetafile may fail
Fixed: Bad safety check for TImageEnView.GetPolySel index
Fixed: Wrong layer checked in TImageEnView.FindGripOfAnySelLayer
Fixed: Possible OOB when setting current layer index
Fixed: FilteredCount not valid after in TImageEnMView.DeleteImage
Fixed: If ieixRemoveCorrupted is enabled, wrong image may be removed
Fixed: CF_TEXT locked as PWideChar in TIEFileDragDrop.GetFilenamesURL
Fixed: Overflow not honored in TIEFolderWatchThread.Execute
Fixed: Incorrect define for HEIF support in TIEGlobalSettings.ActiveImagingEngineEx
Fixed: Width/height<=0 not adequately checked in ReadLayerAndMaskInfo
Fixed: Potential memory leak in TImageEnMIO.DoPrintPreviewDialog/DoSavePreviewDialog
Fixed: Memory leak on error in TIEDibBitmap.AllocateBits
Fixed: Columns=0 was not treated as single strip in IEDrawImageListToBitmap
Fixed: Check for invalid Params TImageEnMIO save methods
Fixed: Empty bitmap check in TIEBitmap.GetHash
Fixed: TBitmap scanline validity in TIEBitmap.GetMemory
Fixed: Clip past edge could cause negative size CopyMemory in CopyBuffer
Fixed: Byte offset not pixel index in TIEBitmap.GetHash
Fixed: FreeRow must match GetRow index in TIEBitmap.GetHash
Fixed: May not read string values correctly when getting Twain capabilities
Fixed: Unmatched bpp left pixel format uninitialized in Twain transfer
Fixed: Ignored buffer allocation failure in Twain transfer
Fixed: Double dispose Twain Acquire Open failure
Fixed: Recompute pb per-x (read before scanline on left edge) in TImageEnProc.ConvertToBWLocalThreshold
Fixed: TImageEnProc.CropSel may not use fill color
Fixed: Dest leaked on refresh/update in CopyPidl
Fixed: Truncated PIDL left corrupt on early exit in TIEFolderTree.GetNodeFromPidl
Fixed: ReWideChar issue in TIEFolderTree.GetPidlFromPath
Fixed: Rewrite of TIEFolderTree.GetPidlFromPath
Fixed: Uppercase scale in SVG GenerateTransform
Fixed: OnProgress can fire with invalid progress value
Fixed: Various improvements to TGA and PCX reading and writing
Fixed: Integer div collapsed table in TIEEquirectangularRenderer.Init
Fixed: Unselected compression could cause OOB in TfIOPreviews.TiffControlChange
Fixed: Zero size could cause float div0 in GetPanZoomEffectStartEndRects iexMetaHelpers unit:
Fixed: Risk of read / Seek underflow on bad atoms in IEReadEXIFFromMOV
Fixed: Clamp Scanline indices at poles/edges in TIEEquirectangularRenderer.RenderHighQuality
Fixed: Clamp arccos table index and Scanline coords in TIEEquirectangularRenderer.RenderLowQuality
Fixed: Risk of Inf/NaN in TIESlippyMap.GetFileURL
Fixed: Crash safety in TIFF CCITT code
Fixed: BitsPerSample>8 could cause huge ColorMap in ReadColorMap
Fixed: BitsPerSample>8 could cause huge TransferFunction in ReadTransferFunction
Fixed: Tile alloc could cuase overflow in TilesToBitmap
Fixed: PageIndex OOB in TIEPDFBuilder.GetPageContentStream
Fixed: Zero size image check in TIEPDFBuilder.AddImage
Fixed: Crash-safety guard in TIEPDFBuilder.AddShape
Fixed: Guards in TIEGlobalSettings.GetFileFormat
Fixed: Validate index in TIETwainParams.GetSourceName
Fixed: Crash-safety guard in J2KReadStream_Native
Fixed: Check for Nil buffer before free in TIENativeJpeg.Decomp_CleanupReadStream
Fixed: Crash safety in TIEWia.Transfer
Fixed: Unvalidated DCIM index in TIEAcquireParams.SetSource
Fixed: Safer dispose in TIEDcimAcquire.Clear
Fixed: Warn against Non-blob field usage for TIEDBMultiBitmap/TIEDBBitmap.ImageBlobField
Fixed: Crash-safety guard in TIEDBBitmap/TIEDBMultiBitmap.UpdateDatabaseImage
Fixed: Bad tile size/offset (+ StreamBase abs pos) in TilesToBitmap
Fixed: Continue without Inc(q) could cause infinite loop in TilesToBitmap
Fixed: PackBits literal past strip in GetNextLine
Fixed: PackBits repeat sample past strip in GetNextLine
Fixed: Inc(buf2) only when writing (cw<brow) in GetNextLine
Fixed: Trunc undercount row bytes (SPP-aware) in Decompress1 brow calc
Fixed: Word peek past JPEG buffer end in WriteOldJpeg SOS scan
Fixed: Keep valid 1-bit photometric in TIFF write defaults
Fixed: Offsets count > ByteCounts count could cause OOB in TIFF clone/fixup
Fixed: Empty databuf[0] AV in TIEPDFStreamObject.Write
Fixed: Progress.Aborting may be nil in TIEPDFBuilder.AddImage
Fixed: AdjustCoords before page check could cause pagesSizes OOB in TIEPDFBuilder.AddText/AddLinePath/AddEllipse
Fixed: SM_CYHSCROLL and SM_CXVSCROLL swapped in TIEGlobalSettings
Fixed: MsgLanguage may not resolve to language in TIEGlobalSettings
Fixed: BufSize left 0 after failed probe in TIEGlobalSettings.GetCurrentMonitorProfile
Fixed: Incorrect define for Heif in TIEGlobalSettings.ActiveImagingEngineEx
Fixed: TIEGlobalSettings tries to free toolbars
Fixed: Leak in TIETwainParams.Assign
Fixed: Valid flag was not copied in TIETwainParams.Assign
Fixed: Unvalidated SelectedSource in TIETwainParams.SetSelectedSource
Fixed: Invalid values for YCbCr fallback was 0 (same as Y) in J2KReadStream_Native
Fixed: Cmp[] clamp >255 still OOB vs mt[0..numcmpts-1] in J2KReadStream_Native
Fixed: Mt[0..10] OOB when numcmpts>11 in J2KReadStream_Native
Fixed: Used cmp[0] for all components in J2KReadStream_Native
Fixed: 4-comp non-linear had no arx/ary maps in J2KReadStream_Native
Fixed: Non-linear 4-comp fell through with no pixels in J2KReadStream_Native
Fixed: Write failure returned True in empty_output_buffer
Fixed: Buffer uninitialized in TIENativeJpeg.Decomp_SetupReadStream
Fixed: API set even if failed in TIEAcquireParams.SetSource
Fixed: Uninitialized Params before OnGetImage in TIEDcimAcquire.AcquireEx
Fixed: Leak of sources in TIEDcimAcquire.Refresh
Fixed: Restoring ActiveRecord after Delete can be past EOF in TIEDBMultiBitmap.DeleteImage
Fixed: DeleteObject while bitmap still selected in IEColorBlend
Fixed: Every row wrote to topBound in TIEWarper.EndWarp
Fixed: May not properly flip Explorer thumbnails in WindowsGetExplorerThumbnail
Fixed: WindowsGetFileIcon did not return false on failure
Fixed: IImageList from SHGetImageList not released in WindowsGetFileIcon
Fixed: Freeing imagelist destroyed shared shell in WindowsGetSystemImageList
Fixed: SHGetImageList not released in WindowsGetSystemImageList
Fixed: Failure not handled in WindowsGetFileIcon/WindowsGetMyPCIcon
Fixed: Fallback to lower quality icon incorrect in WindowsGetMyPCIcon
Fixed: pOleStr never freed in GetShellItemName
Fixed: Vert ruler selection may not reset in TIEViewRulerParams.HandleMouseDown
Fixed: Vertical grid may not paint to bottom correctly in TIEViewRulerParams.PaintRulerGuides
Fixed: Leak if failure in TIEPortableDevices.CopyFileFromDevice
Fixed: ObjectID not freed in TIEPortableDevices.GetFirstStorageID/_EnumerateFolder/_LocateFolderPath/DeviceContainsObjects
Fixed: Close not called in TIEPortableDevices.GetDeviceProperties
Fixed: CoTaskMemFree device strings in TIEPortableDevices.RefreshDevices
Fixed: Pointer not freed in TIEPortableDevices.CopyFileToDevice
Fixed: Stable storage for DefaultExt on non-Unicode OS
Fixed: Incorrect result returned by TIETagsHandler.GetDataType
Fixed: Offset read in TIETIFFHandler.ReadIFD
Fixed: Incorrect memory free of buffer in TIETIFFHandler.WriteIFD
Fixed: Leak only failure in TIERFBClient.Connect
Fixed: Not all color entries processed in TIERFBMessageThread.msg_SetColorMapEntries
Fixed: Dec below 0 corrupts DLL refcount in IEFinalizeSocketLib
Fixed: Cartoonify states not copied in TIEImageEffect.AssignEx
Fixed: Incorrect stream check in TIEImageEffect.LoadFromStream
Fixed: Feathering/chroma properties not processed correctly in TIEImageEffect.SetAsString
Fixed: Transparency_SourceColor not output as color string in TIEImageEffect.GetProperty
Fixed: Leak if failure in TIEImageEffectsList.Insert
Fixed: Swallowed load error in TIEImageEffectsList.LoadFromStream
Fixed: Invalid graph if GammaValue <= 0 in TIEEditControls.DrawGammaGraph
Fixed: Leak on failure in TIEEditControls.ApplyPreviews
Fixed: Selection was 1 pixel off in TIEEditControls.ApplyTo
Fixed: Invalid path tag in SVG creation
Fixed: Invalid transform created by GenerateTransform
Fixed: SVG shape render +1 on IECanvas rect/ellipse/roundrect
Fixed: Destroyed icon in TImageEnVect.SetObjBitmapICO
Fixed: HFONT leak when estimateSizeOnly in TImageEnVect.DrawObjectLineLabel
Fixed: Possible over-read in TIEIPTCInfoList.LoadFromStandardBuffer
Fixed: Potential draw errors in TIEMask.DrawOuter
Fixed: Potential leak when free TIEBitmap row if Origin = ieboTopLeft
Fixed: pf24bit➔ie1g conversion fail when converting PixelFormat if location is ieTBitmap
Fixed: Referencing of virtual bitmap segment in TIEBitmap.GetPixels_ie8/GetPixels_ie16g
Fixed: Risky string reads in TIEICC.ExtractInfo
Fixed: Sample byte offset wrong for <8 bpp in TIEBitmap.GetHash
Fixed: Div0 on null length line in _IEDistPointToLine
Fixed: SoftLight used R for G/B channels in IEBlend
Fixed: Rotated AR div0 in IECalcRotatedAR
Fixed: Invalid result for IEAdjustRectToAspectRatio when FitMethod = _fmFillRect_WithOverlap
Fixed: Does not return last point in TImageEnView.GetPolySel
Fixed: Does not paint with iedoPaintWhenOffScreen
Fixed: Insufficient check of y in TImageEnView.SelectMagicWand
Fixed: Adjusted position not used in TImageEnView.LayersInsert
Fixed: OnNewLayer could output incorrect position after TImageEnView.LayersInsert
Fixed: On failure image overload of TImageEnView.LayersInsert could leak memory
Fixed: Possible null size metafile in TImageEnIO.MergeMetafile
Fixed: Possible leak on failure in TImageEnMIO.SaveToStreamPS/SaveToStreamDCX/SaveToStreamPDF
Fixed: TImageEnMIO.LoadFromStreamDICOM updates DPI even if GetImage fails
Fixed: TIFF StreamHead Dim seek past EOF
Fixed: TIEBitmap.GetSegment fails on ie1g images
Fixed: Corrupt stream detection checks in TDicomReadContext.GetImage/ReadTag
Fixed: TImageEnProc.CalcAverageRGB may not use adequate elliptical sampling
Fixed: Leak in TImageEnProc.CalcOrientation/SkewDetectionFine on memory allocation failure
Fixed: Inadequate size validation in TIETransition.Run
Fixed: TIEHashStream.Encrypt could potentially return truncated stream due to PKCS padding
Fixed: TPdfObject.GetImageRaw may fail to load some supported image types
Fixed: In some cases EXIF tags are not all read
Fixed: Ambiguous parameters for TImageEnProc.TextOutEx overload
Fixed: TIEVSoftShadow.Assign discarded fractional part of Offset properties
Fixed: TIEMediaFoundationSourceReader.SetMediaTypeAudio would set video type
Fixed: TIEMediaFoundationAudioRenderer create would ignore passed role
Fixed: TIEBitmap.MergeRectTo failed when used with non ie8g
Fixed: Values not nulled before calculation in TImageEnProc.CalcStdDev
Fixed: Polyline breaks are ignored when exporting to SVG and PDF
Fixed: When exporting to PDF with PDFium shapes are always filled
Fixed: If TIECanvas.IEPen is set to Clear then Solid, it may leave a transparent GDI+ pen
Fixed: HTML encoded strings are not normalized when importing from SVG
Fixed: Risk of A/V if Rulers are active during form initialization

Changes to Classes

Changed: TImageEnMView.Zoom/ZoomX/ZoomY will always return a valid value
Changed: TImageEnMView.LayersCurrent/CurrentLayer will always return a valid layer
Changed: TIEGlobalSettings.SystemDpiX/SystemDpiY will always return a DPI value
Changed: TIEGlobalSettings.MaxImageEMFSize/MaxImageEMFMatrixSize will always return a valid value
Changed: IEVisionRectToTRect now uses exclusive Right/Bottom
Added: TIEMediaFoundationSourceReader.DelayFramePost
Changed: Published THistogramBox.Scale property
Added: Exposed TIEBitmap.CheckFormat
Added: TIECanvas.ResetClip
Added: TIECanvas.Font is a writable property

Changes to Method Parameters

None

Demo Changes

New: ImageEn + VCL TImage demo (Demos\Other\ImageEnWithTImage\VCL_TImage.dpr)
Added: Many improvements to Soft Shadow demo (Demos\ImageEditing\SoftShadow\SoftShadow.dpr)
Added: C++ Barcode demo now uses TImageEnView (Demos\IEVision\BarCode_C++\BarCodeCPP.cbproj)
Added: C++ GetPeople demo now uses TImageEnView (Demos\IEVision\GetPeople_C++\GetPeople.cbproj)
Added: Various improvements to the Mouse Wheel demo (Demos\Other\MouseWheel\MouseWheelParams.dpr)
Added: Updated list of providers in GeoMaps demo (Demos\_Demos_Analyze\InputOutput\GeoMaps\geomaps.dpr)
Added: Fixes to the RichEdit demo (Demos\Other\RichEdit\RichEdit.dpr)
Added: Improvements to MMF Video demo (Demos\VideoCapture\MediaFoundationFile\MediaFoundationFile.dpr)
Added: Improvements to MMF Web demo (Demos\VideoCapture\MediaFoundationURL\MediaFoundationURL.dpr)
Added: Support for ScaleHist in Color Curve demo (Demos\ImageEditing\ColorCurve\ColorCurve.dpr)
Added: New methods added to Every Method demo (Demos\ImageEditing\EveryMethod\EveryMethod.dpr)
Added: Masks for all layer types in All Layers demo (Demos\LayerEditing\Layers_AllTypes\Layers.dpr)

Compatibility Issues

Changed: TIEBitmap.GetHash() may return different hash to previous ImageEn versions when only samples are checked (i.e. when not hash of full image)
Changed: TImageEnProc.ConvertToBWLocalThreshold() may give slightly different result to previous ImageEn versions
Removed: Legacy Slippy Map providers were removed: iesmpCloudMadeWebStyle, iesmpCloudMadeFineLineStyle, iesmpCloudMadeNoNamesStyle and iesmpMigurskisTerrain. Also, iesmpOSM_Mapnik was renamed iesmpOpenStreetMap
Changed Behavior: When auto-converting a bitmap to a layer mask, any transparency becomes black (i.e. mask transparency)
Removed: MMX functionality (only used for Negative) is now undefined by default
Changed: DICOM_J2000Rate now defaults to 0.95

See Also

Complete History
Updating and Compatibility