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