UP | HOME

Change Log

Author: Mitch Richling
Updated: 2024-10-31 15:51:44
Generated: 2024-10-31 15:51:46

Copyright © 2024 Mitch Richling. All rights reserved.

Table of Contents

1. Changes On HEAD Since Last Release TEMPLATE

  • Fixed Bugs
    • N/A
  • Known Issues
    • N/A
  • API breaking Changes
    • N/A
  • Deprecated functionality
    • N/A
  • New functionality
    • N/A
  • Documentation
    • N/A
  • Examples
    • New
      • N/A
    • Updated
      • N/A
  • Miscellaneous
    • Better check.rb

2. Feature & Refactor Release

  • Fixed Bugs
    • clampAll, clampBot, clampTop: now limited to channel arithmetic types
    • Problem with enabling 128-bit integers on GCC resolved
    • Integer wrap for color schemes better for negative arguments.
  • Known Issues
    • N/A
  • API breaking Changes
    • Header removed: mjrmath.hpp
    • This project now depends on the MRMathCPP project.
    • Deprecated headers removed: colorTpl.hpp, color.hpp, & point2d.hpp
  • Deprecated functionality
    • N/A
  • New functionality
    • N/A
  • Documentation
    • ColorSchemes.html now has images for all CB schemes
    • Updated mathjax configuration for better security
  • Examples
    • New
      • newton_min_angle_starfish: Min angle newton with poles.
      • LevyCurve: Levy Curve via chaos game
      • phoenix: Classic phoenix fractal (escape time)
      • phoenixD: Classic phoenix fractal (distance estimator outside)
      • phoenixI: Classic phoenix fractal (distance estimator inside)
      • phoenixM: A movie of the classic phoenix fractal
      • phoenixM2: Another movie of the classic phoenix fractal
    • Updated
      • color_lut_docs: Now generates images for all CB schemes
      • Several: Updated doxygen markup to use @ instead of backslash
  • Miscellaneous
    • N/A

3. v20.15.0.0: Feature Release

  • Fixed Bugs
    • N/A
  • Known Issues
    • N/A
  • API breaking Changes
    • WARNING: Eventually the deprecated headers will be removed.
    • The "all" target has been removed. Use the "examples" target instead.
    • New release process with 4 component version numbers
  • Deprecated functionality
    • Several people reported conflicts with other packages using the same header names
      • Deprecated header color.hpp – USE MRcolor.hpp instead
      • Deprecated header point2d.hpp – USE MRpoint2d.hpp instead
      • Deprecated header colorTpl.hpp – USE MRcolorTpl.hpp instead
  • New functionality
    • Library exported via build/MRasterLib.cmake
    • Package exported via build/MRasterConfig.cmake & build/MRasterConfigVersion.cmake
    • Install target created that installs:
      • MRasterLib.cmake
      • MRasterConfig.cmake & MRasterConfigVersion.cmake
      • Non-deprecated headers
    • New include file: mraster_config.hpp
      • Defines for cmake configuration information
      • Functions returning version information Note this change limits future version numbers to numeric components.
  • Documentation
    • The color scheme org-mode document has been cleaned up
    • Added change log (this very file!)
    • Updated README.org to reflect change log and remove comments about very old versions
  • Examples
    • New
      • kalisetJ.cpp – Julia style kaliset
      • kalisetM1.cpp – Mandelbrot style kaliset
      • kalisetM2.cpp – Mandelbrot style kaliset
      • butterfly.cpp – A kaliset inspired butterfly
      • barrymartin.cpp – Barry Martin attractors
      • tinkerbell.cpp – Tinkerbell attractors
      • tinkerbell_search.cpp – Search for interesting Tinkerbell parameters
    • Updated
      • N/A
  • Miscellaneous
    • N/A

4. v20.12.3: Feature Release

  • Examples
    • New
      • newton_roter
      • newton_3updown
      • newton_min_angle
      • mandelbrot_count_movie
      • laguerre_3updown.cpp
      • laguerre_simple.cpp
    • Updated
      • mandelbrot_simple: Now uses OpenMP
  • API breaking Changes
    • The ramCanvas constructors now throw. The cases where they throw would have likely caused a runtime issue later anyhow, so I don't expect very many people to notice this one…
    • The configure.sh script must now be run from the build directory. It is also much smarter about finding a good compiler.
  • New functionality
    • Numerous documentation updates & fixes
    • unitTooIntLinMap: template version now handles large integers
    • 2D color maps
      • csSet(): Added two argument version
      • cs2dIdxPalArg: Create an argument color scheme from an indexed color scheme
      • cs2dFltPalArg: Create an argument color scheme from a continuous color scheme
      • cs2dRichardson: Richardson's 2D complex number coloring scheme.
      • cs2dThaller_tpl: Meta class for Bernd Thaller's 2D complex number color methods
        • cs2dThallerHSL: Thaller method using HSL
        • cs2dThallerHSVm: Thaller method using HSV with maximal V value
        • cs2dThallerHSV: Thaller method using HSV with dynamic V value

5. v20.12.0: Feature Release

  • Examples
    • Many examples have been improved
    • New:
      • newton_max_back.cpp'
      • newton_min_root.cpp
      • mandelbrot_ltrap.cpp
      • mandelbrot_pickover.cpp
      • biomorphMorph.cpp
      • mandelbrot_precomp.cpp
      • julia.cpp
      • juliaM2.cpp
      • juliaM.cpp
      • newton_modified.cpp
    • Renamed:
      • mandelbrot_cycles.cpp -> mandelbrot_1n2cycles.cpp
    • New/updated web pages:
    • Removed:
      • newton_bm_*.cpp
      • mandelbrot_distance_old.cpp
      • mandelbrot_bm_real_eqop.cpp
      • mandelbrot_1n2cycles.cpp
  • Bugs
    • mjr::ramCanvasTpl::expandCanvas. Fixed a bug with monochrome images. Changed the behavior when x1 or y1 is off the canvas. Fixed a bug with non-zero x1 argument.
    • Swapped mjr::ramCanvasTpl::rotate90CW & mjr::ramCanvasTpl::rotate90CW
    • mjr::ramCanvasTpl::autoMaxHistStrech(). Fixed bug when RGB were not on default channels.
  • New functionality
    • ramCanvasTpl::getCanvasWidD()
    • New canvas converter: rcConverterMonoIntensity
    • ramCanvasTpl::adjoinCanvasRight()
    • ramCanvasTpl::adjoinCanvasLeft()
    • ramCanvasTpl::adjoinCanvasBottom()
    • ramCanvasTpl::adjoinCanvasTop()
    • ramCanvasTpl::insertCanvas() – insert a canvas into another canvas
    • mjr::sgn() – the sign function
    • mjr::point2d now has a conversion operator for complex numbers
    • ramCanvasTpl now has coordinate conversion methods that work with point2d allowing code like this: std::complex<double> c = theRamCanvas.int2real(x, y);
      • mjr::ramCanvasTpl::int2real
      • mjr::ramCanvasTpl::real2int
    • mjr::fmtInt(int inInt, int width, char fill) – Strings with formatted integers in them. Someday when compilers support the C++20 formatting features, we won't need this…
    • colorTpl::distDeltaE1976(colorArgType aColor) – The LAB Delta E*(1976) distance
    • colorTpl::distDeltaE1994(colorArgType aColor) – The LAB Delta E*(1994) distance
    • Real coordinate overloads for:
      • ramCanvasTpl::drawHersheyGlyph
      • ramCanvasTpl::drawString
      • ramCanvasTpl::drawStringBox
    • Polynomial routines
      • mjr::evalBiPoly – bivariate polynomial evaluation
      • mjr::maxExpBiPoly – figure out maximum theoretical exponent of a bivariate polynomial
      • mjr::evalUniPoly – univariate polynomial evaluation
    • New log transformation function colorTpl::tfrmLn(double scale) – note new name for the old version of this function: tfrmLn1()
  • API Change
    • colorTpl::tfrmLn() renamed to tfrmLn1()
    • ramCanvasTpl::autoMaxHistStrech renamed to autoMaxHistStrechRGB
  • Updated/New experimental geometric transformations functionality (geomTfrmRev* methods) These feel like they are approaching a final state, but I'm going to keep them classified as "experimental" for now.
    • Fixed a clipping bug for existing geomTfrmRef functions:
      • ramCanvasTpl::geomTfrmRevRPoly
      • ramCanvasTpl::geomTfrmRevAff
      • ramCanvasTpl::geomTfrmRevArb
    • Transform methods now take a uniform set of shift & scale arguments:
      • Xo – X coordinate for the offset from image center.
      • Yo – Y coordinate for the offset from image center.
      • oScale – Scale to apply after transform but before reverse translation
  • Started making some unit tests for mjrmath.hpp. Coverage right now is just for the new polynomial routines.

6. v20.11.0: Feature Release

  • Removed recently introduced GCC'isms. The code now compiles cleanly with clang and msvc.
  • New examples:
    • pickoverPopcorn.cpp
    • mandelbrot_biomorph.cpp
    • mandelbrot_simple.cpp
    • invertedMandelbrot.cpp
    • tippets.cpp
    • multibrotSnaps.cpp
    • multibrotMovie.cpp
    • tricornMovie.cpp
    • tricorn.cpp
    • collatz.cpp
  • New web pages for examples:
  • Updated examples:
    • sic.cpp – Updated the comment on the colorizer object to reference another way to do the same thing illustrated in the pickoverPopcorn.cpp example.
    • biomorph2.cpp & biomorph1.cpp – Cleaned up the way colors were set.
    • mandelbrot_bm_real.cpp & mandelbrot_bm_real_eqop.cpp – Fixed typos in header.
  • New feature:
    • ramCanvasTpl::rcConverterColorScheme – Colorize a ramCanvasTpl with integer channels using a color scheme. This gives one the ability to produce a ramCanvasTpl with some data in it, and then colorize it when the image files are written out. For example, we could store the L function for a Mandelbrot render in a grayscale image, and then write out any number of RGB images with different color schemes.
    • New class of color schemes: common fractal schemes
      • colorTpl::csCCfractal0RYBCW
      • colorTpl::csCCfractalYR
      • colorTpl::csCCfractalYB
    • New class of color schemes: Ramp from black to corner
      • colorTpl::csCCu0W – Ramp from black to white
      • colorTpl::csCCu0R – Ramp from black to red
      • colorTpl::csCCu0B – Ramp from black to blue
      • colorTpl::csCCu0G – Ramp from black to green
      • colorTpl::csCCu0C – Ramp from black to cyan
      • colorTpl::csCCu0M – Ramp from black to magenta
      • colorTpl::csCCu0Y – Ramp from black to yellow

7. v20.10.5: Public Release

I'm done with major changes, and the code feels solid.

8. v20.10.0rc3: Unit tests. New features.

Release Candidate #3

  • Last time I removed the filter option from the file write APIs, and that annoyed some people. ;) So I have added filters back, but the new filters are more capable in that they can be used for not just homogeneous transforms but geometric ones too.
    • Removed: pixelFormatEnum
    • New converter classes inside ramCanvasTpl:
      • ramCanvasTpl::rcConverterIdentity
      • ramCanvasTpl::rcConverterRGBbyte
      • ramCanvasTpl::rcConverterRGBAbyte
      • ramCanvasTpl::rcConverterRGBdbl
      • ramCanvasTpl::rcConverterRGBAdbl
    • convertRawToTIFF.cpp illustrates the new API
  • New: "Canonical Color Types" – color types with unsigned byte and floating point channels in RGB, RGBA, and numChan. These provide a handy interface for conversions with the two most common channel types people use, and are useful for working with external interfaces.
    • Set color from a canonical color type
      • colorTpl& colorTpl::setChans_dbl(colConALLdbl dblColor)
      • colorTpl& colorTpl::setChans_byte(colConALLbyte byteColor)
      • colorTpl& colorTpl::setChansRGBA_dbl(colConRGBAdbl dblColor)
      • colorTpl& colorTpl::setChansRGB_dbl(colConRGBdbl dblColor)
      • colorTpl& colorTpl::setChansRGBA_byte(colConRGBAbyte byteColor)
      • colorTpl& colorTpl::setChansRGB_byte(colConRGBbyte byteColor)
    • convert color to a canonical color type
      • colConALLdbl colorTpl::getColCon_dbl()
      • colConALLbyte colorTpl::getColCon_byte()
      • colConRGBAdbl colorTpl::getColConRGBA_dbl()
      • colConRGBdbl colorTpl::getColConRGB_dbl()
      • colConRGBAbyte colorTpl::getColConRGBA_byte()
      • colConRGBbyte colorTpl::getColConRGB_byte()
    • typedefs for canonical color types
      • colorTpl::colConRGBdbl
      • colorTpl::colConRGBAdbl
      • colorTpl::colConRGBbyte
      • colorTpl::colConRGBAbyte
      • colorTpl::colConALLdbl
      • colorTpl::colConALLbyte
  • New integer axis orientation predicates
    • ramCanvasTpl::isIntAxOrientationNaturalX()
    • ramCanvasTpl::isIntAxOrientationNaturalY()
  • New helpers to guess named channel. These are helpful when we have a color with unknown structure, and want to get the best option for a named color channel.
    • colorTpl::bestRedChan()
    • colorTpl::bestGreenChan()
    • colorTpl::bestBlueChan()
    • colorTpl::bestAlphaChan()
  • Unit tests
    • colorTpl::colCon*
    • colorTpl::best*Chan
  • sic.cpp now uses the filter instead of making a new ramCanvasTpl object – like it did in the past.
  • Added DO_CIRCLE to bmark.cpp
  • Doxygen tag files & links into doxygen docs.
  • Unit tests for ramCanvasTpl simple geom transforms

9. v20.9.0rc2: Bug fixes. Unit tests. New features. Better platform support.

Release Candidate #2

  • Bugs:
    • ramCanvasTpl::writeFile
      • Failed to pass return code from stream write helper function.
      • Potential beyond buffer access
  • New features:
    • ramCanvasTpl::readRAWfile
  • Breaking Changes
    • Replaced the toTRU & filter arguments with an enum to convert to 8-bit RGB/RGBA. In addition, writeTIFF* no longer has an alpha argument – the enum takes care of that too.
  • Unit tests for ramCanvasTpl now use isEqual and readRAWfile instead of comparing file content.
  • Platform Support
    • Tested with several OS/compiler combinations
      • Windows with MSVC, MSYS2 MSVC, MSYS2 clang, and MSYS2 GCC
      • Debian 11 with GCC-10, and GCC-11
      • MacOS with Apple clang and homebrew GCC
    • Made several little code changes for better platform support.
    • The big change is a couple of macros controlling conditional compilation of code. This allows the code to be compiled, with some reduced functionality, using some older compilers.
      • Added a couple of conditional compiles:
        • MISSING_P0476R2 – Omits code using bit_cast
        • MISSING_P1907R1 – Omits code using floating point template parameters
      • Added cmake rules for conditional code:
        • Detect GCC version and set MISSING_P0476R2 & MISSING_P1907R1 as required.
        • Set MISSING_P1907R1 for clang (both regular and Apple)
        • Set MISSING_P0476R2 for Apple clang

10. v20.8.1b: Unit tests for ramCanvasTpl. Bugs. New stuff.

I'm still calling it a beta, but it's pretty solid right now.

Please test and report back!

  • New predefined ramCanvas types:
    • ramCanvas4c64b
    • ramCanvas3c64b
    • ramCanvasRGBA64b
    • ramCanvasRGB64b
    • ramCanvas1c32F
    • ramCanvas1c64F
  • Added const:
    • colorTpl::rgb2GreyDotProd
    • colorTpl::luminanceRGB
    • colorTpl::intensityRGB
    • colorTpl::intensity
    • colorTpl::intensityScaledRGB
    • colorTpl::intensityScaled
    • colorTpl::getMaxC
    • colorTpl::getMinC
    • colorTpl::getMaxRGB
    • colorTpl::getMinRGB
    • colorTpl::dotProd
    • colorTpl::distHypot
    • colorTpl::distSumAbs
    • colorTpl::distMaxAbs
    • colorTpl::isClose
    • colorTpl::isCloseRGB
    • colorTpl::isEqual
    • colorTpl::isEqualRGB
    • colorTpl::isNotEqual
    • colorTpl::isBlack
    • colorTpl::isBlackRGB
  • ramCanvasTpl::drawFillTriangleUtl
    • Better comment for cases & code
    • Much better organization of code for each case
    • Much faster for degenerate triangles using barycentric coloring
    • Much more accurate barycentric coloring, but a slight performance hit.
    • More accurate edges.
  • ramCanvasTpl::triangleEdger
    • Added code to find min/max for each y value…
    • I plan on updating this to support cropped triangles at some point.

11. v20.8.2rc1: Unit tests for ramCanvasTpl.

This is release candidate #1! Please test and report back!

12. v20.8.0b: ramCanvasTpl refactor. clang support. Cleanup.

Still beta, but approaching production.

Please test and report back!

  • ramCanvasTpl refactor
    • Data member naming consistency
    • Fixed get/set methods to use uniform naming
    • Added requires
    • Comment cleanup
  • Clang support
    • Duplicated requires clauses as necessary
    • Added conditional compile around floating point template parameters
    • Added defines to CMakeLists.txt
    • Added warnings about missing examples to CMakeLists.txt
    • Propagated requires outside of class definition
  • Bugs
    • colorTpl::distHypot
    • colorTpl::rgb2GreyDotProd
  • Upgrades
    • colorTpl::cmpRGBcornerDGradiant – Faster & safer.
  • Removed FLTK from CMakeLists.txt – it was not used.

13. v20.7.0b: New Features. Bug Fixes. Unit Tests.

Still beta, but approaching production.

Please test and report back!

  • Many more unit tests
  • Bug Fixes (mostly related to getC# refactor)
    • setRGBfromUnitHSL
    • cmpRGBcornerDGradiant
    • isBlackRGB
    • isEqualRGB
    • cmpGradiant
    • rgb2colorSpace
    • tfrmStdPowRGB
    • rgb2GreyDotProd
    • luminanceRGB
    • getMaxRGB
    • getMinRGB
  • New
    • isClose
    • isCloseRGB
    • linearInterpolateRGB
    • csCCdivBWR
    • csCCdivCWM
    • setChansToMean()
  • The color space colorTpl<double, 3> typedef is colSpaceDbl3
  • Fixed color swatch names for web safe pallets in documentation.
  • Fixed bug with csWSprotanopia class name
  • Fixed class names for binary schemes.
  • SDL2 support
    • Added SDL2 to CMakeLists.txt so it's easy to add SDL code.
    • Added a new example: displayImageSDL2.cpp
  • Better support for msys2 on windows: Added options in CMakeLists.txt to make GLUT, FLTK, & SDL2 code be compiled as a "GUI" application instead of a "console" application as before. The console applications would fail to open a window when run within some contexts. I may need to do something for MSVC too, but I don't know as much about that environment…
  • Color documentation (ColorSchemes.org)
    • Added binary pallets
    • Added three segment CC diverging color schemes
    • Added continuous swatches to fixed pallets
    • Added cross reference
  • Various documentation updates.

14. v20.6.0b: Refactor, Bug Fixs, Unit Tests

Still beta. Still a few API changes, but things are stabilizing.

Please test and report back!

  • Tons of unit tests
  • Rearranged some code in colorTpl for better Doxygen results.
  • colorTpl::csFP_tpl now provides both discreet and continuous color schemes via overloads to the c member. Much like csCB_tpl.
  • New:
    • colorTpl::csWS_tpl – A color scheme template for web safe colors
    • colorTpl::setRGBAfromLogPackIntBGRA
    • colorTpl::setRGBfromLogPackIntBGRA
  • Fixed bugs
    • colorTpl::tfrmDiracTot
    • colorTpl::tfrmStdPowRGB
    • colorTpl::tfrmLn
    • colorTpl::tfrmLinearGreyLevelScaleRGB
    • colorTpl::tfrmWebSafeRGB
      • When clrChanT wasn't uint8_t, this function would scale the components incorrectly. Not sure this is really a bug as "web safe" doesn't really apply to such images. Still, it's fixed.
      • Now only operates on the red, blue, and green channels.
    • colorTpl::intensityScaledRGB Scaling was incorrect for images with more than 3 channels.
      • RGBA Bugs Fixed (using getC instead of getRed/Blue/Green/Alpha)
        • colorTpl::tfrmGreyScaleRGB
        • colorTpl::tfrmWebSafePro216
        • colorTpl::tfrmWebSafeDeu216
        • colorTpl::tfrmWebSafeTri216
  • Renamed
    • tfrmWebSafe216 -> tfrmWebSafeRGB
    • interplColors(dbl, c1, c2) -> linearInterpolate
    • interplColors(dbl, col) -> tfrmMix
  • Removed:
    • colorTpl::tfrmGmeanClamp
    • colorTpl::colorComp2CloseColorComp
    • colorTpl::tfrmWebSafePro216
    • colorTpl::tfrmWebSafeDeu216
    • colorTpl::tfrmWebSafeTri216
    • colorTpl::tfrmLinearGreyLevelScale taking colorTpl
  • Web safe color schemes
    • Now use csWS_tpl instead of csFP_tpl.
    • Provide a setter that takes a color object
    • Renamed:
      • csFPwebSafeNormalVision -> csWSnormalVision
      • csFPwXebSafeProtanopia -> csWSnrotanopia
      • csFPwXebSafeDeutanopia -> csWSdeutanopia
      • csFPwXebSafeTritanoptia -> csWStritanoptia
      • csFPwXebSafeProtanopiaAlt -> csWSprotanopiaAlt
      • csFPwXebSafeDeutanopiaAlt -> csWSdeutanopiaAlt
      • csFPwXebSafeTritanoptiaAlt -> csWStritanoptiaAlt

15. v20.5.0b: Unit tests, bug fixes, refactoring, & cleanup

Moving it from alpha to beta. I hope this is the last of the API changes for a while.

Please test and report back!

The API changes are mostly member name changes in colorTpl. These will impact some users, but the refactor should be a simple search-n-replace. Unit tests are fleshing out, and I've fixed a few bugs.

  • Fixed a bugs:
    • colorTpl::isBlack()
    • colorTpl::rgbSumIntensity()
  • Removed loop from cmpRGBcornerCGradiant()
  • Tons of unit tests – up to about 40% coverage for colorTpl
  • Removed methods
    • colorTpl::distP2sq – this one wasn't very useful because the sum of the squares was frequently too large to fit into an Sums/Products integer type.
  • Renamed methods
    • colorTpl::distAbs -> distSumAbs
    • colorTpl::rgbSumIntensity -> intensitySum
    • colorTpl::rgbLuminance -> luminanceRGB
    • colorTpl::sumIntensity -> intensity
    • colorTpl::rgbScaledIntensity -> IntensityScaledRGB
    • colorTpl::sumScaledIntensity -> intensityScaled
  • Changed methods
    • colorTpl::rgb2GreyDotProd & colorTpl::dotProd now return a channelArithFltType and use floating point arithmetic for all intermediate computations.
  • New methods
    • colorTpl::distMaxAbs
    • colorTpl::distHypot – Like distP2sq, but the square root so it is much smaller. All arithmetic is done with doubles.
    • colorTpl::cmpGradiant(csFltType csX, csIntType numColors, const packed4Cint* colors).
  • colorTpl::cmpGradiant() now uses csFltType for inputs and anchors. Not really an API change as csFltType is double. Just makes things more consistent and readable.
  • Added some typedefs for clarity
    • Packed integers
    • color type for color space computations
  • Continuous gradient colorbrewer2
    • Added continuous gradients to colorbrewer2 color schemes
    • Added swatches to documentation

16. v20.4.0a: Refactor, unit tests, doxygen docs

Still alpha. Still changing the API. :)

Please test and report back!

The API changes are mostly member name changes in colorTpl. These will impact some users, but the refactor should be a simple search-n-replace. Unit tests are fleshing out, and I've cleaned up the doxygen output.

  • Renamed "clp" tfrm methods to "clamp" to better align with C++ use.
    • colorTpl::tfrmMultClp -> tfrmMultClamp
    • colorTpl::tfrmDiffClp -> tfrmDiffClamp
    • colorTpl::tfrmNegDiffClp -> tfrmNegDiffClamp
    • colorTpl::tfrmAddClp -> tfrmAddClamp
    • colorTpl::tfrmAddDivClp -> tfrmAddDivClamp
    • colorTpl::tfrmGmeanClp -> tfrmGmeanClamp
  • Renamed "clip" methods to "clamp" to better align with C++ use.
    • colorTpl::clipTop -> clampTop
    • colorTpl::clipAll -> clampAll
    • colorTpl::clipBot -> clampBot
  • Renamed "CLIP" drawModeType values to "CLAMP" to better align with C++ use.
    • ramCanvasTpl::drawModeType::ADDCLAMP
    • ramCanvasTpl::drawModeType::AND
    • ramCanvasTpl::drawModeType::OR
    • ramCanvasTpl::drawModeType::DIFFCLAMP
    • ramCanvasTpl::drawModeType::MULTCLAMP
  • Many many many more unit tests. Coverage for colorTpl is now at about 25%.
  • Published doxygen documentation on web
  • Added links to published doxygen documentation to github documentation
  • Made some updates to doxygen config changes
    • Including the comments in the published source
    • Excluded some problematic bits of code that was confusing Doxygen.

17. v20.3.0a: ramConfig Refactor

Still alpha. Still changing the API. :)

The big API change is the addition of an argument to ramCanvasTpl, and the removal of ramConfig.hpp. That will all be transparent to people using the color.hpp & ramCanvas.hpp typedefs…

  • Added color types for common 8-bit channel RGBA orderings:
    • colorBGR8b -> ramCanvasBGR8b
    • colorARGB8b -> ramCanvasARGB8b
    • colorBGRA8b -> ramCanvasBGRA8b
    • colorABGR8b -> ramCanvasABGR8b
  • ramCanvasTpl::writeTGAstream now uses the R, G, & B channels when writing a file if they are available. If not it reverts to the old behavior of using the first three channels.
  • ramCanvasTpl::colorizeFltCanvas & ramCanvasTpl::colorizeIntCanvas.
    • color an entire canvas based upon a function that takes pixel coordinates and returns a color.
    • mandelbrot_bm_real_cfun.cpp – Demonstrates colorizeFltCanvas.
  • ramCanvasTpl
    • Cleaned up some casts making things a bit safer, and eliminating compiler warnings for edge cases.
    • Moved a few small functions into the class. I hope to move more eventually so as to avoid all the extra requires clauses for externally defined methods.
    • Cleaned up the doxygen overload tags – they just make the document harder to read.
    • New: isOnCanvas – logical inverse of isCliped.
  • Removed ramConfig.hpp include
    • The SUPPORT_DRAWING_MODE macro has been replaced with a template parameter (enableDrawModes) to ramCanvasTpl.
    • The REAL_CORD & INT_CORD macros have been replaced with typedefs rcSimpleFltCrdT & rcSimpleIntCrdT in ramCanvas.hpp.
    • The ramConfig class is simply gone.
    • All the 128 bit stuff is now at the top of colorTpl.hpp:
      • macros: MJR_LOOK_FOR_128_BIT_TYPES & MJR_HAVE_128_BIT_TYPES
      • typedefs: mjr_uint128_t & mjr_int128_t
      • Note this stuff is not inside the mjr name space – it's outside just like before.
  • Fixed a bug in bmark.cpp – used wrong set_chans function.

18. v20.2.0a: Refactor of hershey fonts & RGBA

Several serious bugs, and two API changing refactors in this update.

This release is BETA quality!!! Please test it, and report bugs.

  • Fixed bug with set/clear_byte funcs with clrChanT integer
  • Added "color scheme" classes to colorTpl
    • They know how many colors they support
    • Much better encapsulation.
    • The csSet method of colorTpl can be used to set the current color object's color from a color scheme class aColor.csSet<mjr:color3c8b::webSafeNormalVision>(25);
    • Color scheme classes may be used as a factory for colorTpl objects aColor = mjr:color3c8b::webSafeNormalVision.c(25);
    • Color scheme classes may also set the color of a colorTpl object passed in mjr:color3c8b::webSafeNormalVision.c(aColor, 25);
    • Quite a few new color schemes.
    • Some of the old U of O schemes are gone.
    • Many methods are gone replaced by color scheme classes
      • setRGBtoWebSafe216 -> webSafeNormalVision
      • setRGBfromICP -> csCb* & webSafe* classes
      • setRGBcmpBinaryColorRampRG -> csBinRG
      • setRGBcmpBinaryColorRampRB -> csBinRB
      • setRGBcmpBinaryColorRampGR -> csBinRG
      • setRGBcmpBinaryColorRampGB -> csBinGB
      • setRGBcmpBinaryColorRampBR -> csBinRB
      • setRGBcmpBinaryColorRampBG -> csBinGB
      • NEW -> csBin01
      • NEW -> csBinCM
      • NEW -> csBinMY
      • NEW -> csBinYM
      • setRGBcmpUpDownRampRg -> csCCudRg
      • setRGBcmpUpDownRampRb -> csCCudRb
      • setRGBcmpUpDownRampGr -> csCCudGr
      • setRGBcmpUpDownRampGb -> csCCudGb
      • setRGBcmpUpDownRampBr -> csCCudBr
      • setRGBcmpUpDownRampBg -> csCCudBg
      • setRGBcmpGrey -> csCCdiag01
      • setRGBcmpDiagRampCR -> csCCdiagCR
      • setRGBcmpDiagRampMG -> csCCdiagMG
      • setRGBcmpDiagRampYB -> csCCdiagYB
      • setRGBcmpConstTwoRamp -> csCCconsTwo
      • setRGBcmpConstOneRamp -> csCCconsOne
      • setRGBcmpFireRamp -> csCColdeFireRamp
      • setRGBcmpColdToHot -> csCColdeColdToHot
      • setRGBcmpIceToWaterToHot -> csCColdeIceToWaterToHot
      • setRGBcmpSumRampRGB -> csCCsumRGB
      • setRGBcmpSumRampBGR -> csCCsumBGR
      • setRGBcmpSumRampGRB -> csCCsumGRB
      • setRGBcmpSumRampBRG -> csCCsumBRG
      • setRGBcmpSumRampGBR -> csCCsumGBR
      • setRGBcmpSumRampRBG -> csCCsumRBG
      • setRGBcmpGreyRGB -> csCCdiag01
      • setRGBcmpGrey3x -> csPGrey3x
      • setRGBcmpGrey4x -> csPGrey4x
      • setRGBcmpRampGrey2R -> csHSLhR
      • setRGBcmpRampGrey2G -> csHSLhG
      • setRGBcmpRampGrey2B -> csHSLhB
      • setRGBcmpRampGrey2C -> csHSLhC
      • setRGBcmpRampGrey2M -> csHSLhM
      • setRGBcmpRampGrey2Y -> csHSLhY
      • setRGBcmpClrCubeRainbow -> csCColdeRainbow
      • setRGBcmpRainbowHSV -> csCColdeRainbow
      • colorTpl& setRGBcmpRainbowLA -> csRainbowLA
      • colorTpl& setRGBcmpRainbowCM -> csRainbowCM
  • Colorbrewer
    • Updated to colorbrewer2
    • Everything is now implemented as color schemes in the colorTpl class
    • Some of the old schemes are gone now.
  • Removed colorData.cpp & colorData.hpp
  • Added RGBA specific set & get methods
    • The R, G, B, & A channel indexes are specified as colorTpl arguments
    • Allows one to specify the RAM layout for colors. For example we can make frame buffers in GL_RGBA or GL_BGRA layout.
  • Reduced some of the Doxygen comment duplication, and regrouped some members. This makes the code much easier to read.
  • Added heart2022.cpp
  • hershey refactor
    • The old hershey data include and source are gone.
    • The library is 100% header only now!
    • The old hershey stuff is now in a hershey class.
  • Several doc & bug fixes

19. v20.0.0a: Complete Refactor Of colorTpl & ramCanvasTpl

One might consider this a brand new library; however, I expect most users will need to make few changes – and the changes made will be pretty simple search-n-replace type changes.

  • This release ie PRE-ALPHA!!! Please test it, and report bugs.
  • C++20 is now the language
  • Much of the krazy code required for performance – with zero performance impact with gcc 11.2.0, clang 14.0.0, and MSVC 2022. In many cases this was achievable simply due to better compilers, but much of it is a direct result of new C++20 features.
  • Template parameters are simplified
    • Many former parameters are now derived from remaining parameters.
    • Concepts are used to constrain types and specialize
  • Removed non-RGB references where not really related to RGB – partly related to removing the optimizing "name" struct.
  • Floating point channels are back!
  • Many performance improvements.

20. v6.0.0: Feature & Bugfix Release

  • Bugs
    • Fixed bug with << operator for colorTpl
    • Fixed a few edge case casts with very deep images
    • Tighter constraints in colorTpl static_assert block
  • Performance improvements
    • ramCanvasTpl::convolution is roughly 2x faster
    • Added performance notes to ramCanvasTpl::clrCanvasToBlack()
  • Compiler support
    • A few code & CMakeLists.txt updates for clang
    • More testing on MSVC++
  • Improved colorspace support
    • More spaces: HSL, HSV, LAB, RGB, LCH, & XYZ
    • Added a new enum to specify color space: colorSpaceEnum
      • Removed the old enum: colorInterpMethEnum
    • Specific color space functions replaced with general ones taking a colorspace argument.
      • setColorFromColorSpace replaces setColorFromNaturalHSV & setColorFromNaturalHSL
      • rgb2colorSpace replaces rgb2hsv & rgb2hsl
      • interplColorSpace replaces interplColorsHSL
  • mapclamp.hpp is now mjrmath.hpp
    • Has a constant for PI.
    • Added several new functions
      • interpolateLinear
      • interpolateLinearAnglesDeg
      • realWrap
    • Corrected/changed negative wrap behavior in intWrap
  • Examples
    • Added high resolution timers to most examples
    • bmark.cpp has more tests (including one for convolution)
    • Examples use types from ramCanvasTpl not colorTpl
    • Reworked circles example
    • Uniform formatting in examples
    • Fleshed out cplxColor
      • Expanded code demoing how to make nice colors
      • Added a few Eisenstein series examples to cplxColor.cpp
    • color_interp_hsl_vs_rgb.cpp
      • Demos all the new interpolation methods
      • Labels the methods in the resulting image which is why it moved in CMakeLists.txt
      • Illustrates the color space conversion functions as well
    • color_interp_hsl_vs_rgb is improved
      • Demonstrates the various interpolation methods
      • Labels the image with which method is used for each strip
  • Documentation
    • Updated to newer Doxygen
    • Changed flowerbox comments take advantage of Doxygen's new JAVADOC_BANNER option
    • Lots of little fixes (spelling, grammar, whitespace cleanup)
    • Better docs for colorChanArithT
  • Code reformatting
    • Put member return type separate line
    • Made sure multi-line argument lists are lined up

21. v5.0.0: Refactor Release

  • Removed floating point argument from color template (API breaking change)
    • I expect most people probably use the pre-defined types in color.hpp and ramCanvas.hpp, so they may not even have exposure to this change – Other than fewer compiler complaints about implicit type casts.
    • I looked through my code and didn't find a single place where I took advantage of the floating pint arithmetic type. It was useful back when the library could have floating point channels, but now it's just sort of a vestigial toe.
    • All floating point color computations are now done with doubles
    • This simplifies the code, and makes it easier to use
    • I have included some compatibility typedefs to mask the change:
      • clrChanIArthT
      • channelIntArithType
      • clrChanFArthT
      • channelFltArithType
    • In general one should avoid the compatibility typedefs and use
      • double instead of clrChanFArthT or channelFltArithType
      • channelArithType instead of clrChanIArthT or channelIntArithType
  • Several typedef changes in ramCanvasTpl. I have attempted to make the typedef names more uniform, and simplify access to contained types. All the examples have been updated to use the new names.
    • New typedefs
      • pointFltType …….. Real coordinate pair type
      • pointIntType …….. Integer coordinate pair type
      • coordIntType …….. Integer type for coordinates
      • coordFltType …….. Real type for coordinates
      • colorType ……….. Color type for pixels
      • colorChanType ……. Channel type for color type for pixels
      • colorChanArithType .. Type for integer channel arithmetic
    • Deprecated typedefs
      • rcPointFlt
      • rcPointInt
      • rcCordInt
      • rcCordFlt
      • rcColor

22. v4.5.0: Feature & Bugfix Release

  • New/Improved interpolation methods
    • getPxColorInterpBLin
    • getPxColorInterpTrunc
    • getPxColorInterpNear
    • getPxColorInterpAvg4
    • getPxColorInterpAvg9
  • Example test_gtfrm_scale.cpp illistrates all interpolation methods by scaleing an image
  • Example bmark.cpp has benchmarks for getPxColorInterpAvg9

23. v4.0.0: Feature & Bugfix Release

  • The string drawing functions now take std::string instead of c-style strings
  • Added static_cast in several places we had automatic conversions to document that we really do want that cast.
  • More careful about using types from the classes instead of integers in the examples for things like image coordinates and color channels. It's still a bit uneven – even sloppy in some of the examples.
  • Experimental support for MSVC++ (tested with MSVS CC 2022). I may well have introduced some bugs or different behavior – especially in the examples. So be on the lookout for oddness.
  • I have recently become interested in arbitrary geometric transformations, and just added a bilinear interpolation method. I expect to adding several interpolation methods along with a generic interface to them later. I also plan on adding a canvas transformation method. Lastly, the example test_gtfrm_scale.cpp will eventually be used to demonstrate that transformation method – right now it just demonstrates the interpolation bits…
    • White space cleanup across the code base. So if you do diffs, make sure to tell them to ignore white space changes.
    • Removed all the extra template arg bits in the colorTpl template. Not sure how they got in there – probably a fit of cut-n-paste at some point? They were not errors, just unnecessary.
    • Hard coded the C++ version to 2011 just to make sure the compiler was using something at least that new.

24. v3.0.0: Major cleanup of old code. Added cycles examples

25. v2.0.0: Feature & Bugfix Release

  • New version numbersk
  • Several new examples:
    • examples/brownianDiffusion.cpp
    • examples/dlaDriver.sh
    • examples/lorenz_fuz.cpp
    • examples/lorenz_multi.cpp
    • examples/sprott2d.cpp
  • Added some aux files:
    • examples/mandelbrot_potential_a_0.pov
    • examples/mandelbrot_potential_a_1.pov
    • examples/mandelbrot_potential_a_1t.pov
    • examples/mandelbrot_potential_a_2.pov
    • examples/mandelbrot_potential_b_0.bov
    • examples/mandelbrot_potential_b_0.pov
    • examples/mandelbrot_potential_b_1.pov
    • examples/mandelbrot_potential_b_2.pov
  • Updated a few examples:
    • examples/circles.cpp
    • examples/dlaSeed.cpp
    • examples/peterdejong.cpp
    • examples/sic_search.cpp
  • A few cmake & build changes
  • A couple updates to the base library