changeset 32647:dfb9b770ae77

Increase default colormap size to 256 colors, add colormap BISTs (bug #65010) * autumn.m, bone.m, cool.m, copper.m, cubehelix.m, flag.m, gray.m, hot.m, hsv.m, jet.m, lines.m, ocean.m, prism.m, rainbow.m, spring.m, summer.m, turbo.m, viridis.m, white.m, winter.m: Change default return size from 64 to 256. Update docstring text about colormap size being either the size of the current colomap or the default of 256. Add function BISTs for calling forms and input validation. * colorcube.m: Update input validation to match other colormaps. Change default return size from 64 to 256. Update docstring text about colormap size being either the size of the current colomap or the default of 256. Add function BISTs for calling forms and input validation. * colormap.m: Update default colormap size to 256. Add docstring noting new colormap size and that colormap will create a new figure if one does not exist. Update BISTs for new size. * graphics.cc (viridis_colormap): Replace 64 color interpolated viridis map table with full 256 color map. Increase cmap container size to 256. * NEWS.10.md: Note increased size of default return from colormap functions.
author Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
date Mon, 25 Dec 2023 18:35:50 -0500
parents 60816c9cd277
children 6ec0b7516c5b
files etc/NEWS.10.md libinterp/corefcn/graphics.cc scripts/image/autumn.m scripts/image/bone.m scripts/image/colorcube.m scripts/image/colormap.m scripts/image/cool.m scripts/image/copper.m scripts/image/cubehelix.m scripts/image/flag.m scripts/image/gray.m scripts/image/hot.m scripts/image/hsv.m scripts/image/jet.m scripts/image/lines.m scripts/image/ocean.m scripts/image/pink.m scripts/image/prism.m scripts/image/rainbow.m scripts/image/spring.m scripts/image/summer.m scripts/image/turbo.m scripts/image/viridis.m scripts/image/white.m scripts/image/winter.m
diffstat 25 files changed, 886 insertions(+), 118 deletions(-) [+]
line wrap: on
line diff
--- a/etc/NEWS.10.md	Sat Dec 23 14:14:26 2023 +0100
+++ b/etc/NEWS.10.md	Mon Dec 25 18:35:50 2023 -0500
@@ -16,6 +16,9 @@
 
 - `height` and `width` are now aliases for the `rows` and `columns` functions.
 
+- All colormaps now default to a size of 256 colors. (The previous default
+size was 64.
+
 ### Alphabetical list of new functions added in Octave 10
 
 * `rticklabels`
--- a/libinterp/corefcn/graphics.cc	Sat Dec 23 14:14:26 2023 +0100
+++ b/libinterp/corefcn/graphics.cc	Mon Dec 25 18:35:50 2023 -0500
@@ -147,76 +147,268 @@
 
   const double cmapv[] =
   {
-    2.67004010000000e-01, 2.72651720952381e-01, 2.77106307619048e-01,
-    2.80356151428571e-01, 2.82390045238095e-01, 2.83204606666667e-01,
-    2.82809341428571e-01, 2.81230763333333e-01, 2.78516153333333e-01,
-    2.74735528571429e-01, 2.69981791904762e-01, 2.64368580952381e-01,
-    2.58026184285714e-01, 2.51098684761905e-01, 2.43732853333333e-01,
-    2.36073294285714e-01, 2.28263191428571e-01, 2.20424955714286e-01,
-    2.12666598571429e-01, 2.05079113809524e-01, 1.97721880952381e-01,
-    1.90631350000000e-01, 1.83819438571429e-01, 1.77272360952381e-01,
-    1.70957518571429e-01, 1.64832915714286e-01, 1.58845368095238e-01,
-    1.52951235714286e-01, 1.47131626666667e-01, 1.41402210952381e-01,
-    1.35832975714286e-01, 1.30582113809524e-01, 1.25898377619048e-01,
-    1.22163105714286e-01, 1.19872409523810e-01, 1.19626570000000e-01,
-    1.22045948571429e-01, 1.27667691904762e-01, 1.36834947142857e-01,
-    1.49643331428571e-01, 1.65967274285714e-01, 1.85538397142857e-01,
-    2.08030450000000e-01, 2.33127309523809e-01, 2.60531475238095e-01,
-    2.90000730000000e-01, 3.21329971428571e-01, 3.54355250000000e-01,
-    3.88930322857143e-01, 4.24933143333333e-01, 4.62246770476190e-01,
-    5.00753620000000e-01, 5.40336957142857e-01, 5.80861172380952e-01,
-    6.22170772857143e-01, 6.64087320476191e-01, 7.06403823333333e-01,
-    7.48885251428571e-01, 7.91273132857143e-01, 8.33302102380952e-01,
-    8.74717527142857e-01, 9.15296319047619e-01, 9.54839555238095e-01,
-    9.93247890000000e-01, 4.87433000000000e-03, 2.58456800000000e-02,
-    5.09139004761905e-02, 7.42014957142857e-02, 9.59536042857143e-02,
-    1.16893314761905e-01, 1.37350195714286e-01, 1.57479940000000e-01,
-    1.77347967619048e-01, 1.96969168571429e-01, 2.16330337619048e-01,
-    2.35404660952381e-01, 2.54161735714286e-01, 2.72573219047619e-01,
-    2.90619516666667e-01, 3.08291041428571e-01, 3.25586450952381e-01,
-    3.42517215238095e-01, 3.59102207142857e-01, 3.75366067142857e-01,
-    3.91340913333333e-01, 4.07061480000000e-01, 4.22563764285714e-01,
-    4.37885543809524e-01, 4.53062984285714e-01, 4.68129543809524e-01,
-    4.83117059523810e-01, 4.98052961428571e-01, 5.12959473333333e-01,
-    5.27854311428571e-01, 5.42750087142857e-01, 5.57652481904762e-01,
-    5.72563073333333e-01, 5.87476284285714e-01, 6.02382410952381e-01,
-    6.17265840000000e-01, 6.32106955714286e-01, 6.46881817142857e-01,
-    6.61562926190476e-01, 6.76119717142857e-01, 6.90518987142857e-01,
-    7.04725181904762e-01, 7.18700950000000e-01, 7.32406441904762e-01,
-    7.45802021904762e-01, 7.58846480000000e-01, 7.71497934761905e-01,
-    7.83714033809524e-01, 7.95453081428571e-01, 8.06673890000000e-01,
-    8.17337565714286e-01, 8.27409135714286e-01, 8.36858167619048e-01,
-    8.45663399523809e-01, 8.53815582857143e-01, 8.61321019047619e-01,
-    8.68206316666667e-01, 8.74522215714286e-01, 8.80346158571429e-01,
-    8.85780083333333e-01, 8.90945338571429e-01, 8.95973498571429e-01,
-    9.01005800000000e-01, 9.06156570000000e-01, 3.29415190000000e-01,
-    3.53367293333333e-01, 3.76236064761905e-01, 3.97901482857143e-01,
-    4.18250757142857e-01, 4.37178920000000e-01, 4.54595888571429e-01,
-    4.70433883333333e-01, 4.84653865714286e-01, 4.97250492857143e-01,
-    5.08254501428571e-01, 5.17731949047619e-01, 5.25780221428571e-01,
-    5.32522206190476e-01, 5.38097133333333e-01, 5.42651800000000e-01,
-    5.46335411904762e-01, 5.49287148571429e-01, 5.51635008571429e-01,
-    5.53493173333333e-01, 5.54953478571429e-01, 5.56089070000000e-01,
-    5.56952166666667e-01, 5.57576145714286e-01, 5.57974025714286e-01,
-    5.58142745238095e-01, 5.58058673809524e-01, 5.57684744285714e-01,
-    5.56973310000000e-01, 5.55864478571429e-01, 5.54288677142857e-01,
-    5.52175699047619e-01, 5.49445382857143e-01, 5.46023368571429e-01,
-    5.41830633809524e-01, 5.36795616666667e-01, 5.30847985714286e-01,
-    5.23924198571429e-01, 5.15966779523810e-01, 5.06924262857143e-01,
-    4.96751861428571e-01, 4.85412122857143e-01, 4.72873300000000e-01,
-    4.59105875238095e-01, 4.44095883333333e-01, 4.27825852857143e-01,
-    4.10292713809524e-01, 3.91487632857143e-01, 3.71420688571429e-01,
-    3.50098750000000e-01, 3.27544678571429e-01, 3.03798967142857e-01,
-    2.78916748571429e-01, 2.53000856190476e-01, 2.26223670000000e-01,
-    1.98879439523810e-01, 1.71494930000000e-01, 1.45037631428572e-01,
-    1.21291048571429e-01, 1.03326155238095e-01, 9.53507900000000e-02,
-    1.00469958095238e-01, 1.17876387142857e-01, 1.43936200000000e-01
+    0.26700401, 0.00487433, 0.32941519,
+    0.26851048, 0.00960483, 0.33542652,
+    0.26994384, 0.01462494, 0.34137895,
+    0.27130489, 0.01994186, 0.34726862,
+    0.27259384, 0.02556309, 0.35309303,
+    0.27380934, 0.03149748, 0.35885256,
+    0.27495242, 0.03775181, 0.36454323,
+    0.27602238, 0.04416723, 0.37016418,
+    0.27701840, 0.05034437, 0.37571452,
+    0.27794143, 0.05632444, 0.38119074,
+    0.27879067, 0.06214536, 0.38659204,
+    0.27956550, 0.06783587, 0.39191723,
+    0.28026658, 0.07341724, 0.39716349,
+    0.28089358, 0.07890703, 0.40232944,
+    0.28144581, 0.08431970, 0.40741404,
+    0.28192358, 0.08966622, 0.41241521,
+    0.28232739, 0.09495545, 0.41733086,
+    0.28265633, 0.10019576, 0.42216032,
+    0.28291049, 0.10539345, 0.42690202,
+    0.28309095, 0.11055307, 0.43155375,
+    0.28319704, 0.11567966, 0.43611482,
+    0.28322882, 0.12077701, 0.44058404,
+    0.28318684, 0.12584799, 0.44496000,
+    0.28307200, 0.13089477, 0.44924127,
+    0.28288389, 0.13592005, 0.45342734,
+    0.28262297, 0.14092556, 0.45751726,
+    0.28229037, 0.14591233, 0.46150995,
+    0.28188676, 0.15088147, 0.46540474,
+    0.28141228, 0.15583425, 0.46920128,
+    0.28086773, 0.16077132, 0.47289909,
+    0.28025468, 0.16569272, 0.47649762,
+    0.27957399, 0.17059884, 0.47999675,
+    0.27882618, 0.17549020, 0.48339654,
+    0.27801236, 0.18036684, 0.48669702,
+    0.27713437, 0.18522836, 0.48989831,
+    0.27619376, 0.19007447, 0.49300074,
+    0.27519116, 0.19490540, 0.49600488,
+    0.27412802, 0.19972086, 0.49891131,
+    0.27300596, 0.20452049, 0.50172076,
+    0.27182812, 0.20930306, 0.50443413,
+    0.27059473, 0.21406899, 0.50705243,
+    0.26930756, 0.21881782, 0.50957678,
+    0.26796846, 0.22354911, 0.51200840,
+    0.26657984, 0.22826210, 0.51434870,
+    0.26514450, 0.23295593, 0.51659930,
+    0.26366320, 0.23763078, 0.51876163,
+    0.26213801, 0.24228619, 0.52083736,
+    0.26057103, 0.24692170, 0.52282822,
+    0.25896451, 0.25153685, 0.52473609,
+    0.25732244, 0.25613040, 0.52656332,
+    0.25564519, 0.26070284, 0.52831152,
+    0.25393498, 0.26525384, 0.52998273,
+    0.25219404, 0.26978306, 0.53157905,
+    0.25042462, 0.27429024, 0.53310261,
+    0.24862899, 0.27877509, 0.53455561,
+    0.24681140, 0.28323662, 0.53594093,
+    0.24497208, 0.28767547, 0.53726018,
+    0.24311324, 0.29209154, 0.53851561,
+    0.24123708, 0.29648471, 0.53970946,
+    0.23934575, 0.30085494, 0.54084398,
+    0.23744138, 0.30520222, 0.54192140,
+    0.23552606, 0.30952657, 0.54294396,
+    0.23360277, 0.31382773, 0.54391424,
+    0.23167350, 0.31810580, 0.54483444,
+    0.22973926, 0.32236127, 0.54570633,
+    0.22780192, 0.32659432, 0.54653200,
+    0.22586330, 0.33080515, 0.54731353,
+    0.22392515, 0.33499400, 0.54805291,
+    0.22198915, 0.33916114, 0.54875211,
+    0.22005691, 0.34330688, 0.54941304,
+    0.21812995, 0.34743154, 0.55003755,
+    0.21620971, 0.35153548, 0.55062743,
+    0.21429757, 0.35561907, 0.55118440,
+    0.21239477, 0.35968273, 0.55171011,
+    0.21050310, 0.36372671, 0.55220646,
+    0.20862342, 0.36775151, 0.55267486,
+    0.20675628, 0.37175775, 0.55311653,
+    0.20490257, 0.37574589, 0.55353282,
+    0.20306309, 0.37971644, 0.55392505,
+    0.20123854, 0.38366989, 0.55429441,
+    0.19942950, 0.38760678, 0.55464205,
+    0.19763650, 0.39152762, 0.55496905,
+    0.19585993, 0.39543297, 0.55527637,
+    0.19410009, 0.39932336, 0.55556494,
+    0.19235719, 0.40319934, 0.55583559,
+    0.19063135, 0.40706148, 0.55608907,
+    0.18892259, 0.41091033, 0.55632606,
+    0.18723083, 0.41474645, 0.55654717,
+    0.18555593, 0.41857040, 0.55675292,
+    0.18389763, 0.42238275, 0.55694377,
+    0.18225561, 0.42618405, 0.55712010,
+    0.18062949, 0.42997486, 0.55728221,
+    0.17901879, 0.43375572, 0.55743035,
+    0.17742298, 0.43752720, 0.55756466,
+    0.17584148, 0.44128981, 0.55768526,
+    0.17427363, 0.44504410, 0.55779216,
+    0.17271876, 0.44879060, 0.55788532,
+    0.17117615, 0.45252980, 0.55796464,
+    0.16964573, 0.45626209, 0.55803034,
+    0.16812641, 0.45998802, 0.55808199,
+    0.16661710, 0.46370813, 0.55811913,
+    0.16511703, 0.46742290, 0.55814141,
+    0.16362543, 0.47113278, 0.55814842,
+    0.16214155, 0.47483821, 0.55813967,
+    0.16066467, 0.47853961, 0.55811466,
+    0.15919413, 0.48223740, 0.55807280,
+    0.15772933, 0.48593197, 0.55801347,
+    0.15626973, 0.48962370, 0.55793600,
+    0.15481488, 0.49331293, 0.55783967,
+    0.15336445, 0.49700003, 0.55772371,
+    0.15191820, 0.50068529, 0.55758733,
+    0.15047605, 0.50436904, 0.55742968,
+    0.14903918, 0.50805136, 0.55725050,
+    0.14760731, 0.51173263, 0.55704861,
+    0.14618026, 0.51541316, 0.55682271,
+    0.14475863, 0.51909319, 0.55657181,
+    0.14334327, 0.52277292, 0.55629491,
+    0.14193527, 0.52645254, 0.55599097,
+    0.14053599, 0.53013219, 0.55565893,
+    0.13914708, 0.53381201, 0.55529773,
+    0.13777048, 0.53749213, 0.55490625,
+    0.13640850, 0.54117264, 0.55448339,
+    0.13506561, 0.54485335, 0.55402906,
+    0.13374299, 0.54853458, 0.55354108,
+    0.13244401, 0.55221637, 0.55301828,
+    0.13117249, 0.55589872, 0.55245948,
+    0.12993270, 0.55958162, 0.55186354,
+    0.12872938, 0.56326503, 0.55122927,
+    0.12756771, 0.56694891, 0.55055551,
+    0.12645338, 0.57063316, 0.54984110,
+    0.12539383, 0.57431754, 0.54908564,
+    0.12439474, 0.57800205, 0.54828740,
+    0.12346281, 0.58168661, 0.54744498,
+    0.12260562, 0.58537105, 0.54655722,
+    0.12183122, 0.58905521, 0.54562298,
+    0.12114807, 0.59273889, 0.54464114,
+    0.12056501, 0.59642187, 0.54361058,
+    0.12009154, 0.60010387, 0.54253043,
+    0.11973756, 0.60378459, 0.54139999,
+    0.11951163, 0.60746388, 0.54021751,
+    0.11942341, 0.61114146, 0.53898192,
+    0.11948255, 0.61481702, 0.53769219,
+    0.11969858, 0.61849025, 0.53634733,
+    0.12008079, 0.62216081, 0.53494633,
+    0.12063824, 0.62582833, 0.53348834,
+    0.12137972, 0.62949242, 0.53197275,
+    0.12231244, 0.63315277, 0.53039808,
+    0.12344358, 0.63680899, 0.52876343,
+    0.12477953, 0.64046069, 0.52706792,
+    0.12632581, 0.64410744, 0.52531069,
+    0.12808703, 0.64774881, 0.52349092,
+    0.13006688, 0.65138436, 0.52160791,
+    0.13226797, 0.65501363, 0.51966086,
+    0.13469183, 0.65863619, 0.51764880,
+    0.13733921, 0.66225157, 0.51557101,
+    0.14020991, 0.66585927, 0.51342680,
+    0.14330291, 0.66945881, 0.51121549,
+    0.14661640, 0.67304968, 0.50893644,
+    0.15014782, 0.67663139, 0.50658890,
+    0.15389405, 0.68020343, 0.50417217,
+    0.15785146, 0.68376525, 0.50168574,
+    0.16201598, 0.68731632, 0.49912906,
+    0.16638320, 0.69085611, 0.49650163,
+    0.17094840, 0.69438405, 0.49380294,
+    0.17570671, 0.69789960, 0.49103252,
+    0.18065314, 0.70140222, 0.48818938,
+    0.18578266, 0.70489133, 0.48527326,
+    0.19109018, 0.70836635, 0.48228395,
+    0.19657063, 0.71182668, 0.47922108,
+    0.20221902, 0.71527175, 0.47608431,
+    0.20803045, 0.71870095, 0.47287330,
+    0.21400015, 0.72211371, 0.46958774,
+    0.22012381, 0.72550945, 0.46622638,
+    0.22639690, 0.72888753, 0.46278934,
+    0.23281498, 0.73224735, 0.45927675,
+    0.23937390, 0.73558828, 0.45568838,
+    0.24606968, 0.73890972, 0.45202405,
+    0.25289851, 0.74221104, 0.44828355,
+    0.25985676, 0.74549162, 0.44446673,
+    0.26694127, 0.74875084, 0.44057284,
+    0.27414922, 0.75198807, 0.43660090,
+    0.28147681, 0.75520266, 0.43255207,
+    0.28892102, 0.75839399, 0.42842626,
+    0.29647899, 0.76156142, 0.42422341,
+    0.30414796, 0.76470433, 0.41994346,
+    0.31192534, 0.76782207, 0.41558638,
+    0.31980860, 0.77091403, 0.41115215,
+    0.32779580, 0.77397953, 0.40664011,
+    0.33588539, 0.77701790, 0.40204917,
+    0.34407411, 0.78002855, 0.39738103,
+    0.35235985, 0.78301086, 0.39263579,
+    0.36074053, 0.78596419, 0.38781353,
+    0.36921420, 0.78888793, 0.38291438,
+    0.37777892, 0.79178146, 0.37793850,
+    0.38643282, 0.79464415, 0.37288606,
+    0.39517408, 0.79747541, 0.36775726,
+    0.40400101, 0.80027461, 0.36255223,
+    0.41291350, 0.80304099, 0.35726893,
+    0.42190813, 0.80577412, 0.35191009,
+    0.43098317, 0.80847343, 0.34647607,
+    0.44013691, 0.81113836, 0.34096730,
+    0.44936763, 0.81376835, 0.33538426,
+    0.45867362, 0.81636288, 0.32972749,
+    0.46805314, 0.81892143, 0.32399761,
+    0.47750446, 0.82144351, 0.31819529,
+    0.48702580, 0.82392862, 0.31232133,
+    0.49661536, 0.82637633, 0.30637661,
+    0.50627130, 0.82878621, 0.30036211,
+    0.51599182, 0.83115784, 0.29427888,
+    0.52577622, 0.83349064, 0.28812650,
+    0.53562110, 0.83578452, 0.28190832,
+    0.54552440, 0.83803918, 0.27562602,
+    0.55548397, 0.84025437, 0.26928147,
+    0.56549760, 0.84242990, 0.26287683,
+    0.57556297, 0.84456561, 0.25641457,
+    0.58567772, 0.84666139, 0.24989748,
+    0.59583934, 0.84871722, 0.24332878,
+    0.60604528, 0.85073310, 0.23671214,
+    0.61629283, 0.85270912, 0.23005179,
+    0.62657923, 0.85464543, 0.22335258,
+    0.63690157, 0.85654226, 0.21662012,
+    0.64725685, 0.85839991, 0.20986086,
+    0.65764197, 0.86021878, 0.20308229,
+    0.66805369, 0.86199932, 0.19629307,
+    0.67848868, 0.86374211, 0.18950326,
+    0.68894351, 0.86544779, 0.18272455,
+    0.69941463, 0.86711711, 0.17597055,
+    0.70989842, 0.86875092, 0.16925712,
+    0.72039115, 0.87035015, 0.16260273,
+    0.73088902, 0.87191584, 0.15602894,
+    0.74138803, 0.87344918, 0.14956101,
+    0.75188414, 0.87495143, 0.14322828,
+    0.76237342, 0.87642392, 0.13706449,
+    0.77285183, 0.87786808, 0.13110864,
+    0.78331535, 0.87928545, 0.12540538,
+    0.79375994, 0.88067763, 0.12000532,
+    0.80418159, 0.88204632, 0.11496505,
+    0.81457634, 0.88339329, 0.11034678,
+    0.82494028, 0.88472036, 0.10621724,
+    0.83526959, 0.88602943, 0.10264590,
+    0.84556056, 0.88732243, 0.09970219,
+    0.85580960, 0.88860134, 0.09745186,
+    0.86601325, 0.88986815, 0.09595277,
+    0.87616824, 0.89112487, 0.09525046,
+    0.88627146, 0.89237353, 0.09537439,
+    0.89632002, 0.89361614, 0.09633538,
+    0.90631121, 0.89485467, 0.09812496,
+    0.91624212, 0.89609127, 0.10071680,
+    0.92610579, 0.89732977, 0.10407067,
+    0.93590444, 0.89857040, 0.10813094,
+    0.94563626, 0.89981500, 0.11283773,
+    0.95529972, 0.90106534, 0.11812832,
+    0.96489353, 0.90232311, 0.12394051,
+    0.97441665, 0.90358991, 0.13021494,
+    0.98386829, 0.90486726, 0.13689671,
+    0.99324789, 0.90615657, 0.14393620
   };
 
   // It would be nice if Matrix had a ctor allowing to do the
   // following without a copy
-  Matrix cmap (64, 3, 0.0);
-  std::copy (cmapv, cmapv + (64*3), cmap.fortran_vec ());
+  Matrix cmap (256, 3, 0.0);
+  std::copy (cmapv, cmapv + (256*3), cmap.fortran_vec ());
   return cmap;
 }
 
--- a/scripts/image/autumn.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/autumn.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## This colormap ranges from red through orange to yellow.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -71,3 +72,23 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (autumn ()), [256, 3])
+%!assert (size (autumn (16)), [16, 3])
+
+%!assert (autumn (1), [1, 0, 0])
+%!assert (autumn (true), double ([1, 0, 0]))
+%!assert (autumn (char (1)), double ([1, 0, 0]))
+%!assert (autumn (int32 (1)), double ([1, 0, 0]))
+
+%!assert (autumn (0), zeros (0, 3))
+%!assert (autumn (-1), zeros (0, 3))
+
+%!assert (autumn (11), [ones(1,11); [0:0.1:1]; zeros(1,11)]', eps)
+
+## Input validation
+%!error <function called with too many inputs> autumn (1, 2)
+%!error <N must be a scalar> autumn ("foo")
+%!error <N must be a scalar> autumn ([1, 2, 3])
+%!error <N must be a scalar> autumn ({1, 2, 3})
--- a/scripts/image/bone.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/bone.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## gray-blue shades.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -98,3 +99,30 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (bone ()), [256, 3])
+%!assert (size (bone (16)), [16, 3])
+
+%!assert (bone (1), [1/8, 1/8, 1/8])
+%!assert (bone (true), double ([1/8, 1/8, 1/8]))
+%!assert (bone (char (1)), double ([1/8, 1/8, 1/8]))
+%!assert (bone (int32 (1)), double ([1/8, 1/8, 1/8]))
+%!assert (bone (2), [1/16, 1/8, 1/8; 1 ,1, 1])
+
+%!assert (bone (0), zeros (0, 3))
+%!assert (bone (-1), zeros (0, 3))
+
+%!test
+%! a = [    0,     0,   1/8;
+%!       7/32, 11/32, 11/32;
+%!      23/48,  9/16,  9/16;
+%!      71/96, 25/32, 25/32;
+%!          1,     1,     1];
+%! assert (bone (5), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> bone (1, 2)
+%!error <N must be a scalar> bone ("foo")
+%!error <N must be a scalar> bone ([1, 2, 3])
+%!error <N must be a scalar> bone ({1, 2, 3})
--- a/scripts/image/colorcube.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/colorcube.m	Mon Dec 25 18:35:50 2023 -0500
@@ -34,16 +34,25 @@
 ## blue, and gray.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
 function map = colorcube (n)
 
-  if (nargin == 0)
-    n = rows (colormap);
-  elseif (! isscalar (n))
-    error ("colorcube: N must be a scalar");
+  if (nargin == 1)
+    if (! isscalar (n))
+      error ("colorcube: N must be a scalar");
+    endif
+    n = double (n);
+  else
+    hf = get (0, "currentfigure");
+    if (! isempty (hf))
+      n = rows (get (hf, "colormap"));
+    else
+      n = 256;
+    endif
   endif
 
   if (n < 9)
@@ -99,3 +108,38 @@
 %! axis ([1, 64, 0, 1], "xy");
 %! set (gca, "xtick", []);
 %! colormap (colorcube (64));
+
+
+%!assert (size (colorcube ()), [256, 3])
+%!assert (size (colorcube (16)), [16, 3])
+
+%!assert (colorcube (1), [0, 0, 0])
+%!assert (colorcube (true), double ([0, 0, 0]))
+%!assert (colorcube (char (1)), double ([0, 0, 0]))
+%!assert (colorcube (int32 (1)), double ([0, 0, 0]))
+
+%!assert (colorcube (0), zeros (0, 3))
+%!assert (colorcube (-1), zeros (0, 3))
+
+%!assert (colorcube (8), gray (8))
+
+%!test
+%! a = [1,   1,   0;
+%!      0,   1,   1;
+%!      1,   0,   1;
+%!      0.5, 0,   0;
+%!      1,   0,   0;
+%!      0,   0.5, 0;
+%!      0,   1,   0;
+%!      0,   0,   0.5;
+%!      0,   0,   1;
+%!      0,   0,   0;
+%!      0.5, 0.5, 0.5;
+%!      1,   1,   1];
+%! assert (colorcube (12), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> colorcube (1, 2)
+%!error <N must be a scalar> colorcube ("foo")
+%!error <N must be a scalar> colorcube ([1, 2, 3])
+%!error <N must be a scalar> colorcube ({1, 2, 3})
--- a/scripts/image/colormap.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/colormap.m	Mon Dec 25 18:35:50 2023 -0500
@@ -32,7 +32,9 @@
 ## @deftypefnx {} {} colormap @var{map_name}
 ## Query or set the current colormap.
 ##
-## With no input arguments, @code{colormap} returns the current color map.
+## With no input arguments, @code{colormap} returns the current color map.  If
+## there is no current figure, a new figure will be opened and the default
+## color map will be returned.
 ##
 ## @code{colormap (@var{map})} sets the current colormap to @var{map}.  The
 ## colormap should be an @var{n} row by 3 column matrix.  The columns
@@ -40,7 +42,7 @@
 ## must be between 0 and 1 inclusive.  The new colormap is returned.
 ##
 ## @code{colormap (@qcode{"default"})} restores the default colormap (the
-## @code{viridis} map with 64 entries).  The default colormap is returned.
+## @code{viridis} map with 256 entries).  The default colormap is returned.
 ##
 ## The map may also be specified by a string, @var{map_name}, which
 ## is the name of a function that returns a colormap.
@@ -108,7 +110,7 @@
     if (ischar (map))
       map = lower (map);
       if (strcmp (map, "default"))
-        map = viridis (64);
+        map = viridis (256);
       else
         try
           map = feval (map);
@@ -169,9 +171,9 @@
 %!   cmap = (get (gcf, "colormap"));
 %!   assert (cmap, cmaptst);
 %!   colormap ("default");
-%!   assert (colormap (), viridis (64));
+%!   assert (colormap (), viridis (256));
 %!   colormap ("ocean");
-%!   assert (colormap, ocean (64));
+%!   assert (colormap, ocean (256));
 %! unwind_protect_cleanup
 %!   close (hf);
 %! end_unwind_protect
--- a/scripts/image/cool.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/cool.m	Mon Dec 25 18:35:50 2023 -0500
@@ -29,7 +29,8 @@
 ## Create color colormap.  The colormap varies from cyan to magenta.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -45,7 +46,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -70,3 +71,23 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (cool ()), [256, 3])
+%!assert (size (cool (16)), [16, 3])
+
+%!assert (cool (1), [0, 1, 1])
+%!assert (cool (true), double ([0, 1, 1]))
+%!assert (cool (char (1)), double ([0, 1, 1]))
+%!assert (cool (int32 (1)), double ([0, 1, 1]))
+
+%!assert (cool (0), zeros (0, 3))
+%!assert (cool (-1), zeros (0, 3))
+
+%!assert (cool (11), [[0:0.1:1]; [1:-0.1:0]; ones(1,11)]', eps)
+
+## Input validation
+%!error <function called with too many inputs> cool (1, 2)
+%!error <N must be a scalar> cool ("foo")
+%!error <N must be a scalar> cool ([1, 2, 3])
+%!error <N must be a scalar> cool ({1, 2, 3})
--- a/scripts/image/copper.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/copper.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## tone.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -73,3 +74,26 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (copper ()), [256, 3])
+%!assert (size (copper (16)), [16, 3])
+
+%!assert (copper (1), [0, 0, 0])
+%!assert (copper (true), double ([0, 0, 0]))
+%!assert (copper (char (1)), double ([0, 0, 0]))
+%!assert (copper (int32 (1)), double ([0, 0, 0]))
+
+%!assert (copper (0), zeros (0, 3))
+%!assert (copper (-1), zeros (0, 3))
+
+%!test
+%! a = [0.25, 0.15624, 0.0995] .* [0:5]';
+%! a(6) = 1;
+%! assert (copper (6), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> copper (1, 2)
+%!error <N must be a scalar> copper ("foo")
+%!error <N must be a scalar> copper ([1, 2, 3])
+%!error <N must be a scalar> copper ({1, 2, 3})
--- a/scripts/image/cubehelix.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/cubehelix.m	Mon Dec 25 18:35:50 2023 -0500
@@ -40,7 +40,8 @@
 ## @end example
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ##
 ## Reference: Green, D. A., 2011,
 ## @cite{A @nospell{colour} scheme for the display of astronomical intensity
@@ -61,7 +62,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -96,3 +97,34 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (cubehelix ()), [256, 3])
+%!assert (size (cubehelix (16)), [16, 3])
+
+%!assert (cubehelix (1), [0,0,0])
+%!assert (cubehelix (true), double ([0,0,0]))
+%!assert (cubehelix (char (1)), double ([0,0,0]))
+%!assert (cubehelix (int32 (1)), double ([0,0,0]))
+
+%!assert (cubehelix (0), zeros (0, 3))
+%!assert (cubehelix (-1), zeros (0, 3))
+
+%!assert (cubehelix (2), [0, 0, 0; 1, 1, 1])
+%!assert ([cubehelix]([1,end],:), [0, 0, 0; 1, 1, 1])
+
+%!shared a
+%! a = [0,                   0,                   0;
+%!      0.17004232121057959, 0.43679759647517287, 0.22372555555555556;
+%!      0.82995767878942041, 0.56320240352482713, 0.77627444444444445;
+%!      1,                   1,                   1];
+
+%!assert (cubehelix (4), a, eps)
+
+%!shared  # Clear shared varibles to avoid echo on unrelated test errors.
+
+## Input validation
+%!error <function called with too many inputs> cubehelix (1, 2, 3, 4 ,5 ,6)
+%!error <N must be a scalar> cubehelix ("foo")
+%!error <N must be a scalar> cubehelix ([1, 2, 3])
+%!error <N must be a scalar> cubehelix ({1, 2, 3})
--- a/scripts/image/flag.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/flag.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## black with each index change.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
   if (n == 1)
@@ -68,3 +69,37 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+
+%!assert (size (flag ()), [256, 3])
+%!assert (size (flag (16)), [16, 3])
+
+%!assert (flag (1), [1, 0, 0])
+%!assert (flag (true), double ([1, 0, 0]))
+%!assert (flag (char (1)), double ([1, 0, 0]))
+%!assert (flag (int32 (1)), double ([1, 0, 0]))
+
+%!assert (flag (0), zeros (0, 3))
+%!assert (flag (-1), zeros (0, 3))
+
+%!test
+%! a = [1,   0,   0;
+%!      1,   1,   1;
+%!      0,   0,   1;
+%!      0,   0,   0;
+%!      1,   0,   0;
+%!      1,   1,   1;
+%!      0,   0,   1;
+%!      0,   0,   0;
+%!      1,   0,   0;
+%!      1,   1,   1;
+%!      0,   0,   1;
+%!      0,   0,   0];
+%! assert (flag (12), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> flag (1, 2)
+%!error <N must be a scalar> flag ("foo")
+%!error <N must be a scalar> flag ([1, 2, 3])
+%!error <N must be a scalar> flag ({1, 2, 3})
--- a/scripts/image/gray.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/gray.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## of gray.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -69,3 +70,23 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (gray ()), [256, 3])
+%!assert (size (gray (16)), [16, 3])
+
+%!assert (gray (1), [0, 0, 0])
+%!assert (gray (true), double ([0, 0, 0]))
+%!assert (gray (char (1)), double ([0, 0, 0]))
+%!assert (gray (int32 (1)), double ([0, 0, 0]))
+
+%!assert (gray (0), zeros (0, 3))
+%!assert (gray (-1), zeros (0, 3))
+
+%!assert (gray (11), [0:.1:1]' .* [1, 1, 1], eps)
+
+## Input validation
+%!error <function called with too many inputs> gray (1, 2)
+%!error <N must be a scalar> gray ("foo")
+%!error <N must be a scalar> gray ([1, 2, 3])
+%!error <N must be a scalar> gray ({1, 2, 3})
--- a/scripts/image/hot.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/hot.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## red, orange, yellow, to white.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
   if (n == 1)
@@ -86,3 +87,36 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+%!assert (size (hot ()), [256, 3])
+%!assert (size (hot (16)), [16, 3])
+
+%!assert (hot (1), [1, 1, 1])
+%!assert (hot (true), double ([1, 1, 1]))
+%!assert (hot (char (1)), double ([1, 1, 1]))
+%!assert (hot (int32 (1)), double ([1, 1, 1]))
+%!assert (hot (2), [1, 1, 1/2; 1, 1, 1])
+%!assert (hot (3), [1, 0, 0; 1, 1, 0; 1 1 1])
+
+%!assert (hot (0), zeros (0, 3))
+%!assert (hot (-1), zeros (0, 3))
+
+%!test
+%! a = [0.25, 0,    0;
+%!      0.50, 0,    0;
+%!      0.75, 0,    0;
+%!      1,    0,    0;
+%!      1,    0.25, 0;
+%!      1,    0.50, 0;
+%!      1,    0.75, 0;
+%!      1,    1,    0;
+%!      1,    1,    1/3;
+%!      1,    1,    2/3;
+%!      1,    1,    1];
+%! assert (hot (11), a, eps);
+
+## Input validation
+%!error <function called with too many inputs> hot (1, 2)
+%!error <N must be a scalar> hot ("foo")
+%!error <N must be a scalar> hot ([1, 2, 3])
+%!error <N must be a scalar> hot ({1, 2, 3})
--- a/scripts/image/hsv.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/hsv.m	Mon Dec 25 18:35:50 2023 -0500
@@ -35,7 +35,8 @@
 ## @code{hsv2rgb ([(0:N-1)'/N, ones(N,2)])}.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -51,7 +52,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -75,3 +76,22 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+%!assert (size (hsv ()), [256, 3])
+%!assert (size (hsv (16)), [16, 3])
+
+%!assert (hsv (1), [1, 0, 0])
+%!assert (hsv (true), double ([1, 0, 0]))
+%!assert (hsv (char (1)), double ([1, 0, 0]))
+%!assert (hsv (int32 (1)), double ([1, 0, 0]))
+
+%!assert (hsv (0), zeros (0, 3))
+%!assert (hsv (-1), zeros (0, 3))
+
+%!assert (hsv (6)(:), [1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1]')
+
+## Input validation
+%!error <function called with too many inputs> hsv (1, 2)
+%!error <N must be a scalar> hsv ("foo")
+%!error <N must be a scalar> hsv ([1, 2, 3])
+%!error <N must be a scalar> hsv ({1, 2, 3})
--- a/scripts/image/jet.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/jet.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## cyan, green, yellow, red, to dark red.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ##
 ## Programming Note: The @code{jet} colormap is not perceptually uniform.
 ## Try the @code{viridis} colormap if that is important.  For a drop-in
@@ -51,7 +52,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
   if (n == 1)
@@ -110,3 +111,29 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (jet ()), [256, 3])
+%!assert (size (jet (16)), [16, 3])
+
+%!assert (jet (1), [0, 1, 1])
+%!assert (jet (true), double ([0, 1, 1]))
+%!assert (jet (char (1)), double ([0, 1, 1]))
+%!assert (jet (int32 (1)), double ([0, 1, 1]))
+%!assert (jet (2), [0, 0, 1; 0, 1, 1])
+
+%!assert (jet (0), zeros (0, 3))
+%!assert (jet (-1), zeros (0, 3))
+
+%!test
+%! a = zeros(15, 3);
+%! a([3:13],2) = [0.25, 0.5, 0.75, 1, 1, 1, 1, 1, 0.75, 0.5, 0.25];
+%! a([7:15], 1) = a([3:11], 2);
+%! a(:,3) = flipud (a(:,1));
+%! assert (jet (15), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> jet (1, 2)
+%!error <N must be a scalar> jet ("foo")
+%!error <N must be a scalar> jet ([1, 2, 3])
+%!error <N must be a scalar> jet ({1, 2, 3})
--- a/scripts/image/lines.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/lines.m	Mon Dec 25 18:35:50 2023 -0500
@@ -31,7 +31,8 @@
 ## orange, yellow, purple, green, light blue, and dark red.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -47,7 +48,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -76,3 +77,26 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (lines ()), [256, 3])
+%!assert (size (lines (16)), [16, 3])
+
+%!assert (lines (1), [0, 0, 1])
+%!assert (lines (true), double ([0, 0, 1]))
+%!assert (lines (char (1)), double ([0, 0, 1]))
+%!assert (lines (int32 (1)), double ([0, 0, 1]))
+
+%!assert (lines (0), zeros (0, 3))
+%!assert (lines (-1), zeros (0, 3))
+
+%!test
+%! a = get (groot, "defaultaxescolororder");
+%! nr = rows (a);
+%! assert (lines (3*nr), [a;a;a]);
+
+## Input validation
+%!error <function called with too many inputs> lines (1, 2)
+%!error <N must be a scalar> lines ("foo")
+%!error <N must be a scalar> lines ([1, 2, 3])
+%!error <N must be a scalar> lines ({1, 2, 3})
--- a/scripts/image/ocean.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/ocean.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## of blue.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -78,3 +79,31 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (ocean ()), [256, 3])
+%!assert (size (ocean (16)), [16, 3])
+
+%!assert (ocean (1), [0, 0, 0])
+%!assert (ocean (true), double ([0, 0, 0]))
+%!assert (ocean (char (1)), double ([0, 0, 0]))
+%!assert (ocean (int32 (1)), double ([0, 0, 0]))
+
+%!assert (ocean (0), zeros (0, 3))
+%!assert (ocean (-1), zeros (0, 3))
+
+%!assert (ocean()(1,:), [0, 0, 0])
+%!assert (ocean()(end,:), [1, 1, 1])
+
+%!test
+%! a = zeros (11, 3);
+%! a([9:11],1) = [1/3, 2/3, 1];
+%! a([6:11], 2) = 1/6:1/6:1;
+%! a(:, 3) = 0:.1:1;
+%! assert (ocean (11), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> ocean (1, 2)
+%!error <N must be a scalar> ocean ("foo")
+%!error <N must be a scalar> ocean ([1, 2, 3])
+%!error <N must be a scalar> ocean ({1, 2, 3})
--- a/scripts/image/pink.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/pink.m	Mon Dec 25 18:35:50 2023 -0500
@@ -32,7 +32,8 @@
 ## This colormap gives a sepia tone when used on grayscale images.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -48,11 +49,13 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
   if (n == 1)
     map = sqrt ([1/3, 1/3, 1/3]);
+%!assert (pink (-1), zeros (0, 3))
+
   elseif (n == 2)
     map = sqrt ([1/3, 1/3, 1/6
                   1    1    1 ]);
@@ -88,3 +91,29 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (pink ()), [256, 3])
+%!assert (size (pink (16)), [16, 3])
+
+%!assert (pink (1), sqrt ([1/3, 1/3, 1/3]), eps)
+%!assert (pink (true), double (sqrt ([1/3, 1/3, 1/3])), eps)
+%!assert (pink (char (1)), double (sqrt ([1/3, 1/3, 1/3])), eps)
+%!assert (pink (int32 (1)), double (sqrt ([1/3, 1/3, 1/3])), eps)
+%!assert (pink (2), sqrt ([1/3, 1/3, 1/6; 1, 1, 1]))
+
+%!assert (pink (0), zeros (0, 3))
+%!assert (pink()(end,:), [1 1 1], eps)
+
+%!test
+%! a = sqrt ([1/3, 0,   0;
+%!            5/9, 5/9, 2/9;
+%!            7/9, 7/9, 11/18;
+%!            1,   1,   1]);
+%! assert (pink (4), a, eps)
+
+## Input validation
+%!error <function called with too many inputs> pink (1, 2)
+%!error <N must be a scalar> pink ("foo")
+%!error <N must be a scalar> pink ([1, 2, 3])
+%!error <N must be a scalar> pink ({1, 2, 3})
--- a/scripts/image/prism.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/prism.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## green, blue and violet with each index change.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -46,7 +47,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
   if (n == 1)
@@ -68,3 +69,26 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (prism ()), [256, 3])
+%!assert (size (prism (16)), [16, 3])
+
+%!assert (prism (1), [1, 0, 0])
+%!assert (prism (true), double ([1, 0, 0]))
+%!assert (prism (char (1)), double ([1, 0, 0]))
+%!assert (prism (int32 (1)), double ([1, 0, 0]))
+
+%!assert (prism (0), zeros (0, 3))
+%!assert (prism (-1), zeros (0, 3))
+
+%!test
+%! a = [1, 0, 0; 1, 1/2, 0; 1, 1, 0; 0, 1, 0; 0, 0, 1; 2/3, 0, 1];
+%! nr = rows (a);
+%! assert (prism (3*nr), [a;a;a]);
+
+## Input validation
+%!error <function called with too many inputs> prism (1, 2)
+%!error <N must be a scalar> prism ("foo")
+%!error <N must be a scalar> prism ([1, 2, 3])
+%!error <N must be a scalar> prism ({1, 2, 3})
--- a/scripts/image/rainbow.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/rainbow.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## yellow, green, blue, to violet.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -49,7 +50,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -84,3 +85,22 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+%!assert (size (rainbow ()), [256, 3])
+%!assert (size (rainbow (16)), [16, 3])
+
+%!assert (rainbow (1), [1, 0, 0])
+%!assert (rainbow (true), double ([1, 0, 0]))
+%!assert (rainbow (char (1)), double ([1, 0, 0]))
+%!assert (rainbow (int32 (1)), double ([1, 0, 0]))
+
+%!assert (rainbow (0), zeros (0, 3))
+%!assert (rainbow (-1), zeros (0, 3))
+
+%!assert (rainbow (6)(:), [1, 1, 1, 0, 0, 2/3, 0, 0.5, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1]', 3*eps)
+
+## Input validation
+%!error <function called with too many inputs> rainbow (1, 2)
+%!error <N must be a scalar> rainbow ("foo")
+%!error <N must be a scalar> rainbow ([1, 2, 3])
+%!error <N must be a scalar> rainbow ({1, 2, 3})
--- a/scripts/image/spring.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/spring.m	Mon Dec 25 18:35:50 2023 -0500
@@ -29,7 +29,8 @@
 ## Create color colormap.  This colormap varies from magenta to yellow.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -45,7 +46,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -70,3 +71,23 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (spring ()), [256, 3])
+%!assert (size (spring (16)), [16, 3])
+%!assert (all ((spring ()(:, 1)) == 1), true)
+%!assert (spring (11)(:,2:3), [[0:0.1:1]; [1:-0.1:0]]', eps)
+
+%!assert (spring (1), [1, 0, 1])
+%!assert (spring (true), double ([1, 0, 1]))
+%!assert (spring (char (1)), double ([1, 0, 1]))
+%!assert (spring (int32 (1)), double ([1, 0, 1]))
+
+%!assert (spring (0), zeros (0, 3))
+%!assert (spring (-1), zeros (0, 3))
+
+## Input validation
+%!error <function called with too many inputs> spring (1, 2)
+%!error <N must be a scalar> spring ("foo")
+%!error <N must be a scalar> spring ([1, 2, 3])
+%!error <N must be a scalar> spring ({1, 2, 3})
--- a/scripts/image/summer.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/summer.m	Mon Dec 25 18:35:50 2023 -0500
@@ -29,7 +29,8 @@
 ## Create color colormap.  This colormap varies from green to yellow.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -45,7 +46,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -70,3 +71,23 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (summer ()), [256, 3])
+%!assert (size (summer (16)), [16, 3])
+
+%!assert (summer (1), [0, 0.5, 0.4])
+%!assert (summer (true), double ([0, 0.5, 0.4]))
+%!assert (summer (char (1)), double ([0, 0.5, 0.4]))
+%!assert (summer (int32 (1)), double ([0, 0.5, 0.4]))
+
+%!assert (summer (0), zeros (0, 3))
+%!assert (summer (-1), zeros (0, 3))
+
+%!assert (summer (11), [[0:0.1:1]; [0.5:0.05:1]; 0.4 * ones(1,11)]', eps)
+
+## Input validation
+%!error <function called with too many inputs> summer (1, 2)
+%!error <N must be a scalar> summer ("foo")
+%!error <N must be a scalar> summer ([1, 2, 3])
+%!error <N must be a scalar> summer ({1, 2, 3})
--- a/scripts/image/turbo.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/turbo.m	Mon Dec 25 18:35:50 2023 -0500
@@ -31,7 +31,8 @@
 ## uniform.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -51,7 +52,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -325,3 +326,30 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (turbo ()), [256, 3])
+%!assert (size (turbo (16)), [16, 3])
+
+%!assert (turbo(0), zeros (0, 3))
+%!assert (turbo(-1), zeros (0, 3))
+
+%!shared a
+%! a = [0.18995, 0.07176, 0.23217;
+%!      0.10342, 0.89600, 0.71500;
+%!      0.98000, 0.73000, 0.22161;
+%!      0.47960, 0.01583, 0.01055];
+
+%!assert (turbo (1), a(4,:))
+%!assert (turbo (true), double (a(4,:)))
+%!assert (turbo (char (1)), double (a(4,:)))
+%!assert (turbo (int32 (1)), double (a(4,:)))
+%!assert (turbo (4), a, eps)
+
+%!shared  # Clear shared varibles to avoid echo on unrelated test errors.
+
+## Input validation
+%!error <function called with too many inputs> turbo (1, 2)
+%!error <N must be a scalar> turbo ("foo")
+%!error <N must be a scalar> turbo ([1, 2, 3])
+%!error <N must be a scalar> turbo ({1, 2, 3})
--- a/scripts/image/viridis.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/viridis.m	Mon Dec 25 18:35:50 2023 -0500
@@ -30,7 +30,8 @@
 ## blue, green, to yellow.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -50,9 +51,10 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
+
   ## FIXME: Is there no algorithmic definition of the viridis colormap?
   persistent viridi = [0.26700401  0.00487433  0.32941519
                        0.26851048  0.00960483  0.33542652
@@ -325,3 +327,29 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+%!assert (size (viridis ()), [256, 3])
+%!assert (size (viridis (16)), [16, 3])
+
+%!assert (viridis (0), zeros (0, 3))
+%!assert (viridis (-1), zeros (0, 3))
+
+%!shared a
+%! a = [0.26700401, 0.00487433, 0.32941519;
+%!      0.19063135, 0.40706148, 0.55608907;
+%!      0.20803045, 0.71870095, 0.47287330;
+%!      0.99324789, 0.90615657, 0.14393620];
+
+%!assert (viridis (1), a(4,:))
+%!assert (viridis (true), double (a(4,:)))
+%!assert (viridis (char (1)), double (a(4,:)))
+%!assert (viridis (int32 (1)), double (a(4,:)))
+%!assert (viridis (4), a, eps)
+
+%!shared  # Clear shared varibles to avoid echo on unrelated test errors.
+
+## Input validation
+%!error <function called with too many inputs> viridis (1, 2)
+%!error <N must be a scalar> viridis ("foo")
+%!error <N must be a scalar> viridis ([1, 2, 3])
+%!error <N must be a scalar> viridis ({1, 2, 3})
--- a/scripts/image/white.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/white.m	Mon Dec 25 18:35:50 2023 -0500
@@ -29,7 +29,8 @@
 ## Create color colormap.  This colormap is completely white.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -45,7 +46,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
   map = ones (n, 3);
@@ -60,3 +61,21 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+%!assert (size (white ()), [256, 3])
+%!assert (size (white (16)), [16, 3])
+%!assert (all ((white ()(:)) == 1), true)
+
+%!assert (white (1), [1, 1, 1])
+%!assert (white (true), double ([1, 1, 1]))
+%!assert (white (char (1)), double ([1, 1, 1]))
+%!assert (white (int32 (1)), double ([1, 1, 1]))
+%!assert (white (0), zeros (0, 3))
+%!assert (white (-1), zeros (0, 3))
+
+
+## Input validation
+%!error <function called with too many inputs> white (1, 2)
+%!error <N must be a scalar> white ("foo")
+%!error <N must be a scalar> white ([1, 2, 3])
+%!error <N must be a scalar> white ({1, 2, 3})
--- a/scripts/image/winter.m	Sat Dec 23 14:14:26 2023 +0100
+++ b/scripts/image/winter.m	Mon Dec 25 18:35:50 2023 -0500
@@ -29,7 +29,8 @@
 ## Create color colormap.  This colormap varies from blue to green.
 ##
 ## The argument @var{n} must be a scalar.
-## If unspecified, the length of the current colormap, or 64, is used.
+## If @var{n} is not specified the length of the current colormap is used.  If
+## there is no current colormap the default value of 256 is used.
 ## @seealso{colormap}
 ## @end deftypefn
 
@@ -45,7 +46,7 @@
     if (! isempty (hf))
       n = rows (get (hf, "colormap"));
     else
-      n = 64;
+      n = 256;
     endif
   endif
 
@@ -70,3 +71,23 @@
 %!  rgbplot (cmap, "composite");
 %! subplot (2, 1, 2);
 %!  rgbplot (cmap);
+
+
+%!assert (size (winter ()), [256, 3])
+%!assert (size (winter (16)), [16, 3])
+
+%!assert (winter (1), [0, 0, 1])
+%!assert (winter (true), double ([0, 0, 1]))
+%!assert (winter (char (1)), double ([0, 0, 1]))
+%!assert (winter (int32 (1)), double ([0, 0, 1]))
+
+%!assert (winter (0), zeros (0, 3))
+%!assert (winter (-1), zeros (0, 3))
+
+%!assert (winter (11), [zeros(1,11); [0:0.1:1]; [1:-0.05:0.5]]', eps)
+
+## Input validation
+%!error <function called with too many inputs> winter (1, 2)
+%!error <N must be a scalar> winter ("foo")
+%!error <N must be a scalar> winter ([1, 2, 3])
+%!error <N must be a scalar> winter ({1, 2, 3})