-------------------- AmigaOS 3.1.4.(1) project ----------------------- Changes for release 42.1 (24.12.2017) - Fixed the line draw FRST_dot bug, this flag was not respected for layered line drawing operations. - Fixed a bug in VideoControl() which used the wrong calling protocol to install changed colors via pokecolors(). - Fixed BltMaskBitMapRastPort() which did not work properly on interleaved bitmaps. - Fixed wrong or at least confusing prototypes for the monitor VecTable. - Removed confusing blitplane "fiddle my rectangle on the stack" calling method that confused the compiler a heck (hack?), and which would have worked only for stack based calling methods anyhow. - Manually generated missing prototypes for C type functions such that the code compiles now cleanly. - Streamlined the superbitmap line drawer, and also the regular line drawer. - Streamlined bltplate/bltplate2. - Cleaned up a lot (but not yet all) pre-ANSI code. - Changed the arithmetic helper calls to regargs, avoiding a lot of stack ping-pong. - scrollrectangle uses now the graphics library LVOs for damage list management. Changes for release 42.2 (26.12.2017) - Converted ABS, getmaxbytesperrow and getTempA to assembly. - Flood fill could not handle fills larger than 1024x1024 pixels as it kept coordinates only in 10-bit precision (outch!). Increased the stack precision to 16 bit. - Flood uses now regargs and no longer requires an assembly trampoline. - Retired a lot of obsolete files. - gfxnode->xln_Init was, depending on the node type either a stackbased or a register based call (which #$@!?$!! designed this?). I assume that the calling convention should be that of the only GfxNode that actually has a non-trivial initializer, and this is the monitor, which is register-based, so let's take the register-based call for now. It seems that this function pointer is not used anyhow either... - Removed a couple of trampoline functions, gfx takes now assembly registerized parameters. - Reworked region handling. Regions are now handled in a scratch list such that they can be recycled, avoiding memory fragmentation. After layers, this removes the fragmentation bomb #2 from the system. Changes for release 42.3 (27.12.2017) - Removed a lot of needless casting in the display database "ROM unpacking" function. - Made all references to the custom chips "volatile". - Recompiled with SAS/C giving slightly better code. - Removed even more stdargs code and converted it to regargs. - Changed absolute branches to relative branches. - Fixed a strange issue that depended on a Lattice V5 compiler bug not taking addresses of structure components correctly and fixed the questionable code to use the proper ANSI-C offsetof function instead. - ReleasePen and ObtainPen with a NULL argument is now a NOP instead of a crash. Changes for release 42.4 (30.12.2017) - Replaced the WriteChunkyPixel functions by somewhat faster code. This is not yet ideal, but better than before. - The WriteChunkyPixel functions could have temporarily overwritten memory past the end of the supplied source array. While the code attempted to restore the original data, it might have been too late in case interrupt code was located directly behind the supplied buffer. - Even though never documented, WriteChunkyPixels & friends required word-alignment for the source pixel array or the functions would have crashed on the 68000. This restriction no longer holds true. Changes for release 42.5 (1.1.2018) - Removed the 68020-only version of the WriteChunkyPixels functions because the improvement was close to nothing. - Reworked the chunky to planar conversion yet again to speed it up a bit. - In a low-memory situation, graphics will now release its region scratch list. Changes for release 42.6 (2.1.2018) - Apparently, region management was broken as it did not provide proper arguments to its sub-functions. This was fixed. - Fixed region management error handling. As it seemed, almost none of the region management code checked for errors, and could have left regions in inconsistent states without informing the caller about this situation. Currently, the following interface applies: All XXXRectRegion() calls return a boolean success indicator and either leave the region untouched, or return with success. "Untouched region" does not mean that the region is exactly identical, though the semantics are identical (i.e. offsets may differ). All XXXRegionRegion() calls return a success/failure indicator, and in case of failure, the destination region may be in an inconsistent state, i.e. it may not reflect the full result of the operation, but only a partial result. It is always syntactically correct, though (i.e. all pointers are set correctly, etc...). Future versions might provide stronger guarantees, though this might come at a price, i.e. may require more temporary memory. All this mess should probably be redesigned (and replaced by the cliprect code of layers, which is designed in a somewhat better way) Changes for release 42.7 (2.1.2018) - ClearRectRegion() was highly inefficient, and was the only XXXRectRegion() function that could leave the region in an inconsistent state. The function was replaced by a much simpler function. Changes for release 45.8 (3.1.2018) - Reworked parts of the animation system to use registerized parameters rather than stack-based parameters. - Ensured that memory allocations request memory with the MEMF_PUBLIC flag set. Changes for release 45.9 (5.1.2018) - BltMaskBitMapRastPort() ignored the minterms, and hence broke the graphics. - ScrollRaster() did not WaitBlit() before returning the LastChanceMemory. - Text() did not allocate its buffers with MEMF_PUBLIC. Changes for release 45.12 (20.4.2018) - Also added null-pointer check for GetRGB32(). Changes for release 45.13 (27.4.2018) - Rolled back the include checks from 45.12, everything else unchanged, including that ObtainBestPen() and GetRGB32() fail in the absence of a ColorMap. Changes for release 45.14 (30.4.2018) - Due to a signed/unsigned mixup, FloodFill() was broken in all previous releases and only filled downwards, not upwards. Fixed. Changes for release 45.15 (11.5.2018) - graphics/EraseRect() on an unlayered rastport trashed registers d2 and d3. Fixed. Changes for release 45.16 (14.5.2018) - A potential arithmetic overflow limited the number of points in AreaInfo to 8191. - AreaMove did not properly check whether the previous command was an ellipse and hence could have forgotten to close a region. - AreaDraw accepted an empty AreaInfo and would have then accessed memory outside of the Area buffer. It now fails instead. - AreaEllipse and AreaMove assumed that AreaDraw returned with the N bit set on error. While correct for this implementation, it may be wrong if something patched into it, and it is not guaranteed by the autodocs. - AreaEnd did not check for an empty area list. It now does nothing if no points are in the list. - Removed the obsolete AreaCircle instruction in the draw list since the corresponding graphics call was obsoleted years ago. Changes for release 45.19 (22.7.2018) - SetRGBCM32() now also checks for a NULL color map and does nothing in case NULL has been passed in. - SetRGB32CM() extracted the low-order 4 bits of the blue component from the wrong bits. - Because we are no longer short on ROM space, the AA version also includes the ECS Denise color scrambler. We now have a single unified graphics.library. Changes for release 45.20 (13.8.2018) - In case a CopIns structure is re-initialized by a previously invisible ViewPort, the allocator forgot to initialize the hardware copper list pointers and thus erroneously might have poked into a no-longer existing copper list on a VideoControl() call that reaches graphics before MrgCop() is called. This fixes a long- standing ROM bug that may have even trashed memory on screen switching. Changes for release 45.21 (16.8.2018) - Still, re-initialization of some fields of the copper list was missing if the CopIns instruction is recycled. Changes for release 45.22 (25.8.2018) - Apparently, the ECS Denise cannot work fully without an ECS Agnus, and graphics tests for an ECS Denise are in so far insufficient. To avoid any trouble with an ECS-Denise only, the graphics.library now falls back to OCS-mode only in case either the Agnus or the Denise is an OCS model. Changes for release 45.23 (10.9.2018) - Even though the internal loadview is stackbased, the external interface call sometimes prepared the view argument on register a1 as well. For consistency reasons, this guarantee holds now true always. Changes for release 45.24 (10.9.2018) - I found the most horrible hack in graphics. Apparently, graphics want to make the LoadRGB..() family interrupt-callable, probably for some color-cycling demos of the old age. However, a semaphore is in the way. Now, it cannot lock the semaphore in superuser mode, so the code checks whether the stack is in the exec supervisor mode and then bypasses the semaphore lock... Multiple things broken here: a) what happens if the super stack moved? Actually, tools are out in the wild that do that... b) what happens if another program is just holding the semaphore while the interrupt is coming? So, the following new rules apply: - Graphics checks the supervisor bit via _LVOSupervisor(), which is a tad slower, but at least correct, - if in super state, and the semaphore is locked, then the color change is bypassed. This gives false colors, but at least not a crash. Changes for release 45.25 (15.9.2018) - Reverted parts of the changes for copinit() because they were too aggressive and broke programs that dependent that the Viewport cache pointers remain constant even over a MakeVPort. Changes for release 45.26 (17.9.2018) - The GetBitMapAttr() BMF_DISPLAYABLE flag now also checks whether the bitplanes are actually in chip memory as some patches such as the P96 PlanesToFast setting may have moved them elsewhere. They are then still accessible by the CPU-based blitter, but are not available for the display hardware. Changes for release 45.27 (20.9.2018) - MrgCop(NULL) is now a NO-OP. It previously did check for NULL, but then simply called the default mrgcop() from the vectable, which - clearly - crashed upon the attempt. Changes for release 45.28 (2.11.2018) - Graphics/AllocBitMap() handles now tags in the Os-4 way. While this is not strictly necessary (intuition can do without), it is certainly nice to have it supported. ----------------------------- AmigaOS 3.2 project -------------------- Changes for release 46.2: - Gels draw synchronization without an ActiView no longer creates a hit. Changes for release 46.3: - TextExtend() had an off-by-one error which manifests itself only if the input font is not fixed-width, or maybe is fixed but does not indicate as such, and a right-alignment of the text is requested. Changes for release 46.4: - WaitTOF() modified the sigmask of the calling task inappropriately by also setting signal bit 2 in addition to SIGF_SINGLE. Changes for release 46.5: - ScalerDiv() no longer crashes if the denominator is 0, but returns 0. Changes for release 46.6: - UCopperListInit() allocates now a new UCopperList structure if its ucl argument is NULL. Changes for release 47.1: - Bumped to 47.1 for consistency. Changes for release 47.2 (15.4.2020): - ClearRectRegion() would mangle the contents of the target region if it contained more than one RegionRectangle before the call; now fixed. Changes for release 47.3 (14.03.2021): - Separated ciaa.ciatodlow = ciaa.ciatodmid = ciaa.ciatodhi = 0; due to possible compiler conflict. Changes for release 47.4 (3.4.2021): - Integrated fixes and optimizations kindly provided by Thomas Richter, which as an added bonus also make the binary 716 bytes shorter: 1) The GetDisplayInfo() and SetDisplayInfo() functions now allow for retrieval and adjustment of private and/or extended display info elements. 2) Optimized the DimensionInfo "cook" function which was needlessly convoluted and inefficient. 3) Fixed a minor bug in VideoControl() which did not cast the sprite default resolution to the proper data type and hence mis-detected some non-changes of the sprite resolutions. 4) Fixed a bug in BestModeID() which also did not cast a tag to the proper type and might thus have failed to detect a request from Intuition to coerce screen modes properly. Instead, the lower 16 bits of the tag address were used, which may have caused false negatives in case the tag was (by coincidence) at a 64K boundary. This is unlikely, but possible. 5) CoerceMode() now accesses the mode tags more efficiently and uses pointers instead of array indices.