From 6e3eb1c146a844a02ad58e93cc3c176955c0fc8e Mon Sep 17 00:00:00 2001
From: ROOL <code@riscosopen.org>
Date: Sat, 23 Sep 2017 08:29:25 +0000
Subject: [PATCH] Add 4k and 64k new sprite selector

Detail:
  Put in minimal support to create 4k and 64k sprites (currently, TBGR only) so that the User Guide chapter makes sense.
  Previously it was only possible to create such sprites by switching to that mode and doing a screen capture.
Admin:
  Tested on RISC OS 4.02 (ie. without 4k & 64k support) and RISC OS 5.23 (ie. with).

Version 2.22. Tagged as 'Paint-2_22'
---
 Resources/UK/Templates,fec | Bin 11574 -> 11681 bytes
 VersionASM                 |  12 ++++-----
 VersionNum                 |  20 +++++++--------
 c/PSprite                  |  50 +++++++++++++++++++++++++++++++------
 h/MenuD                    |   2 ++
 5 files changed, 61 insertions(+), 23 deletions(-)

diff --git a/Resources/UK/Templates,fec b/Resources/UK/Templates,fec
index b919e99d4b05693c2c819e421790bb13b2f25235..94af96acd4d06ceb68f7b4cf03329bce9b0a0f4a 100644
GIT binary patch
delta 1630
zcmZvcNoW&s6vp2qZBwh!)@aApDpm_p38J{*78SK>R8U$eYF&snX-9Mtlek_YA~`6Q
zmOxPyTo4t(LK^VkL1`#NdMIuO5nK?DBCU!C(T?9Y`49Bqz~fEc?|aLCnLOTiyRF;b
zRO%7YMC3?397=}0coSJvA<~Z^;}PRnIA}(qB%ddW+*R@8p$^lC7~wcTy61!*teq@U
zQBq9W6*tVJVRkU7VXDY=l@yCdJDg(Ad?N3`+2q7YBUx-Ma--*^9vrI{+2Ja}gc*t@
zI-|B=TMedANeR;qCynD_ufJ9#q~a~HxZ$kiN@lU92fu>ubgODMEe^4IwutU@vEvEj
z9QL4jj>wwQqCOdo9y@KA?HsQw)1&D%U*?Mpsa~Xqj-0e->&py)o@o?Wsg`TgL@XXU
z>y>O~RMTCn{J9EOqn4_}G;7hBPdUuOGgV41dR!jOtrfw@U(0%dSMmUN2@f4(SFzE>
z9Fe(*l_B;A`g`!}$1E#=Wj}=G5o{7T&On9`_oKkrn3b}8SxxT;9Dq$xf?fzJA)t`_
zHP|N@m(Bu*5&r~F9r<^#zcAbiLC6|{ol);qZYfN`7IH}D=TUbu-cMn`Ui7zSg`_Y|
z2{_?J2%1r49|UQ57MQL$Zk9X;KZ*iB;d|j{){AEzcms_2b%=BDZg{K^1G@AjV9Q`A
zDQU%jlc$tm3t&(c7*T?DsGS0BU<YA1E#Y8nFg%XOz>+X*g597CoDK4J{SA5=?2_Wl
zCue@WBe(&0O9?7bq!}ygWU<VyQa#nhUn~dj%Zc6(<sb|nhrJ)%2kr+s_v01VYZ&)~
z)vB2fzYV_1C563n+GB>-vJjH37^4;OB>V-H{{gulRX*}k_BewOry=lV-TF7cQ5e^o
zhjHB57{KA~GF(L%IS+)K8}INLV0DUfFb>H29MG37(HDX(Ry>dXwtx*B!A8K%O27sz
zzy=QA1GZmrUNx@p&bSqtU{M%%XcOXd!THTl7x*Eb^I&Pk@1+2ECG+t1mDHqg4G>z3
zS2BXeCE&l{SHSb5yAFOw72vlp1TBvc*b0n_=RVj27{3YL2-fEStRHZT{sio)%0Ixf
zJ%_|r2>Mik0l<P1@XGQ^@ya?k>K)hz82;AnBj^U_H!%qB%Wlv|z<!YD&U>0%3zje4
z?rn*O+Kp&567d&bOz;1KxxopSD>650%QEY{<+%gXcDw8!JKg2EXVqoy32)Gl2mdxV
IT+`|M2eZ!QH2?qr

delta 1517
zcmYk6T}V@57{{NpsmtX|U3vUSvl7CJKA?*N7h)+agoM1X52~eeJE7Y;TT~J)K}x*R
z4ull+0bN^jAa+soErei2LP1ef&|M_bU3L2Z&)z{VJUnO5@Be(f?|IK|AD%umwz=(E
zk%%TDJ!UwR3j6RR^1N7N3PHyEjQ(&i))yx^vs~nkiVuV$F{952n*g=rr}W@mJa`Lo
zNu8z<OBt~UlkS&`Tvtg6Gakto>+*|y1ZR^|r;QY~T-(QA>p`nhq{Eei$yg|njK&?o
zrz(*z5HTqkbHXWOAnbcwEfP}k0}0c}?_`~|UDJa@H6r`nD$Aj{Azsyq==m;AJZTK#
z48E@sX)es^Q}KBJ86(!q@zz`8nqGZwgUCzOi}YB}X=k=Q)?-j#lgKW$U56$UX6T$x
z+O0)Rcg=6gdR<Lg`VG47hH))}*;o}K!ycDMb89*9^N(#`!XtTr8^%&jx^d7dM;Z`+
z2=E*FqtLhfwe0}5eG-}hSP3|4%N*i0EMVJd+n>>N6L1K&LJ1}yD1(4PatrJhj9X`c
zUc^7cQ%61p_5g-kAqd%Xu(NpPDtF85JQ#;${ut_(;dw6xoIroOE+n&Wm4FjAL(qjP
z6%dTTv%rGlrQlb=`%&Nt`~-aMTJd}Z{{~}zCE^@>6rNrE8JE5U_6vrR!Z`U~a`blu
z9=zmY7z+?kU{bAkEm%DacgJZkrW!nhXM=5EJ7DPHG$3c49B<Xz!S*T6I63RD%?pkI
z9#;a?kS;Xth99vy3-$CEennZ1<77oQp&W+c<8aP{=fLwI=XqQKvtZl~R~6!{)&XDc
zlG%d|y$Qo-+hmm(qZ{#7_+gcQ1GzU<{vn)_GtM-`BM|sAZhaCk1LJ;YU>tWP2FUZL
zU@sKs3n9PwAAbk-L2)#224sB>=+6}BKfo3hpFw{|zy^7N8~;{CFb=>5+#ws}c@@}d
z#d+1Z!^D3(+yb^0#uMUAYXnazU0_K(Enw}6A58=BN)Ez1S5m_f0wTxem8?hO0`N)r
zo$&nV4uhXi1^6w@LCaUj6<8Ec1S|@3zA06oA1&(#+@cSHT~PUTe7EOOpb>(5@GLL{
vc$tFiBTt(vyUjc5)fz0VWL5Un$_|$mbeCo~>P7D21$M+Sz0dBdiTeKm-*u?8

diff --git a/VersionASM b/VersionASM
index 12b1037..9e695a3 100644
--- a/VersionASM
+++ b/VersionASM
@@ -11,13 +11,13 @@
                         GBLS    Module_HelpVersion
                         GBLS    Module_ComponentName
                         GBLS    Module_ComponentPath
-Module_MajorVersion     SETS    "2.21"
-Module_Version          SETA    221
+Module_MajorVersion     SETS    "2.22"
+Module_Version          SETA    222
 Module_MinorVersion     SETS    ""
-Module_Date             SETS    "20 May 2017"
-Module_ApplicationDate  SETS    "20-May-17"
+Module_Date             SETS    "23 Sep 2017"
+Module_ApplicationDate  SETS    "23-Sep-17"
 Module_ComponentName    SETS    "Paint"
 Module_ComponentPath    SETS    "castle/RiscOS/Sources/Apps/Paint"
-Module_FullVersion      SETS    "2.21"
-Module_HelpVersion      SETS    "2.21 (20 May 2017)"
+Module_FullVersion      SETS    "2.22"
+Module_HelpVersion      SETS    "2.22 (23 Sep 2017)"
                         END
diff --git a/VersionNum b/VersionNum
index 4e9463b..07b0ec7 100644
--- a/VersionNum
+++ b/VersionNum
@@ -1,23 +1,23 @@
-/* (2.21)
+/* (2.22)
  *
  * This file is automatically maintained by srccommit, do not edit manually.
  * Last processed by srccommit version: 1.1.
  *
  */
-#define Module_MajorVersion_CMHG        2.21
+#define Module_MajorVersion_CMHG        2.22
 #define Module_MinorVersion_CMHG        
-#define Module_Date_CMHG                20 May 2017
+#define Module_Date_CMHG                23 Sep 2017
 
-#define Module_MajorVersion             "2.21"
-#define Module_Version                  221
+#define Module_MajorVersion             "2.22"
+#define Module_Version                  222
 #define Module_MinorVersion             ""
-#define Module_Date                     "20 May 2017"
+#define Module_Date                     "23 Sep 2017"
 
-#define Module_ApplicationDate          "20-May-17"
+#define Module_ApplicationDate          "23-Sep-17"
 
 #define Module_ComponentName            "Paint"
 #define Module_ComponentPath            "castle/RiscOS/Sources/Apps/Paint"
 
-#define Module_FullVersion              "2.21"
-#define Module_HelpVersion              "2.21 (20 May 2017)"
-#define Module_LibraryVersionInfo       "2:21"
+#define Module_FullVersion              "2.22"
+#define Module_HelpVersion              "2.22 (23 Sep 2017)"
+#define Module_LibraryVersionInfo       "2:22"
diff --git a/c/PSprite b/c/PSprite
index 9cccd70..e270a81 100644
--- a/c/PSprite
+++ b/c/PSprite
@@ -2497,7 +2497,7 @@ static void Decode (int *lb_bpp_out, unsigned int *mode_out)
 { wimp_which_block which_block;
   wimp_i results [7]; /*only 2 would be needed if function keys couldn't
       wierdly set multiple icons in the same E S G*/
-  int x_eig = 0, y_eig = 0, lb_bpp = 0;
+  int x_eig = 0, y_eig = 0, lb_bpp = 0, cols = 0;
   unsigned int mode;
 
   ftracef0 ("Decode\n");
@@ -2512,7 +2512,9 @@ static void Decode (int *lb_bpp_out, unsigned int *mode_out)
     case d_Create_Colours_4:   lb_bpp = 1; break;
     case d_Create_Colours_16:  lb_bpp = 2; break;
     case d_Create_Colours_256: lb_bpp = 3; break;
-    case d_Create_Colours_32k: lb_bpp = 4; break;
+    case d_Create_Colours_4k:  lb_bpp = 4, cols = 1<<12; break;
+    case d_Create_Colours_32k: lb_bpp = 4; cols = 1<<15; break;
+    case d_Create_Colours_64k: lb_bpp = 4; cols = 1<<16; break;
     case d_Create_Colours_16M: lb_bpp = 5; break;
   }
   ftracef1 ("lb_bpp %d\n", lb_bpp);
@@ -2548,6 +2550,15 @@ static void Decode (int *lb_bpp_out, unsigned int *mode_out)
       mode = modes_2x2 [lb_bpp];
   }
 
+  if ((mode == ~0u) && (lb_bpp == 4) && (cols != 1<<15))
+  { /*Special handling of 16bpp.Always create TBGR for now.*/
+    if (cols == 1<<12)
+      mode = (15 << 27) | (16 << 20) | 0 | y_eig << 6 | x_eig << 4 | 1u;
+    else
+      mode = (10 << 27) | 180u >> y_eig << 14 | 180u >> x_eig << 1 | 1u;
+    ftracef1 ("mode 0x%X\n", mode);
+  }
+
   if (mode == ~0u)
   { mode = lb_bpp + 1 << 27 | 180u >> y_eig << 14 | 180u >> x_eig << 1 | 1u;
     ftracef1 ("mode 0x%X\n", mode);
@@ -2885,10 +2896,22 @@ static BOOL Grey_Scale (int lb_bpp)
   return TRUE;
 }
 
+static BOOL Have4k64k (void)
+
+{
+  /*True if the OS can plot 4k and 64k TBGR, else false*/
+  /*The fallback for unknown sprite types in the kernel is 32bpp, so if
+    asking about 4k & 64k we get back 32bpp as the answer, the kernel
+    has used the fallback since it should be 16bpp*/
+  return (bbc_modevar (0x79004051u /*  4k TBGR */, bbc_Log2BPP) != 5 &&
+          bbc_modevar (0x501680B5u /* 64k TBGR */, bbc_Log2BPP) != 5);
+}
+
 static void Create_Handler (wimp_eventstr *e, void *handle)
 
 { int lb_bpp;
   unsigned mode;
+  BOOL extd_16bpp = Have4k64k();
 
   handle = handle;
 
@@ -2905,11 +2928,15 @@ static void Create_Handler (wimp_eventstr *e, void *handle)
 
     if (dbox_getnumeric (Create, d_Create_Palette_Colour) ||
         dbox_getnumeric (Create, d_Create_Palette_Mono))
-    { dbox_fadefield (Create, d_Create_Colours_32k);
+    { dbox_fadefield (Create, d_Create_Colours_4k);
+      dbox_fadefield (Create, d_Create_Colours_32k);
+      dbox_fadefield (Create, d_Create_Colours_64k);
       dbox_fadefield (Create, d_Create_Colours_16M);
     }
     else
-    { dbox_unfadefield (Create, d_Create_Colours_32k);
+    { if (extd_16bpp) dbox_unfadefield (Create, d_Create_Colours_4k);
+      dbox_unfadefield (Create, d_Create_Colours_32k);
+      if (extd_16bpp) dbox_unfadefield (Create, d_Create_Colours_64k);
       dbox_unfadefield (Create, d_Create_Colours_16M);
     }
 
@@ -2944,8 +2971,8 @@ static void Create_Handler (wimp_eventstr *e, void *handle)
 void psprite_create_show (main_window *window, BOOL auto_open,
     char *sprite_name)
 
-{ int width, height, x_eig, y_eig, lb_bpp;
-  BOOL grey_scale;
+{ int width, height, x_eig, y_eig, lb_bpp, ncolour;
+  BOOL grey_scale, full_palette, extd_16bpp = Have4k64k();
   wimp_w d_w;
 
   ftracef0 ("psprite_create_show\n");
@@ -2976,6 +3003,8 @@ void psprite_create_show (main_window *window, BOOL auto_open,
   x_eig  = bbc_modevar (-1, bbc_XEigFactor);
   y_eig  = bbc_modevar (-1, bbc_YEigFactor);
   lb_bpp = bbc_modevar (-1, bbc_Log2BPP);
+  ncolour = bbc_modevar (-1, bbc_NColour);
+  full_palette = (bbc_modevar (-1, bbc_ModeFlags) & 0x80) != 0;
   grey_scale = lb_bpp <= 3 && Grey_Scale (lb_bpp);
 
   ftracef4 ("x_eig %d, y_eig %d, lb_bpp %d, grey_scale %s\n",
@@ -3001,7 +3030,9 @@ void psprite_create_show (main_window *window, BOOL auto_open,
   dbox_setnumeric (Create, d_Create_Colours_4,   lb_bpp == 1);
   dbox_setnumeric (Create, d_Create_Colours_16,  lb_bpp == 2);
   dbox_setnumeric (Create, d_Create_Colours_256, lb_bpp == 3);
-  dbox_setnumeric (Create, d_Create_Colours_32k, lb_bpp == 4);
+  dbox_setnumeric (Create, d_Create_Colours_4k,  lb_bpp == 4 && (ncolour == 4095));
+  dbox_setnumeric (Create, d_Create_Colours_32k, lb_bpp == 4 && !full_palette);
+  dbox_setnumeric (Create, d_Create_Colours_64k, lb_bpp == 4 && full_palette);
   dbox_setnumeric (Create, d_Create_Colours_16M, lb_bpp == 5);
 
   ftracef1 ("bbc_modevar (6 << 27 | 1, bbc_Log2BPP) %d\n",
@@ -3011,6 +3042,11 @@ void psprite_create_show (main_window *window, BOOL auto_open,
     dbox_fadefield (Create, d_Create_Colours_32k);
     dbox_fadefield (Create, d_Create_Colours_16M);
   }
+  if (!extd_16bpp)
+  { /*This OS can't do 4k and 64k.*/
+    dbox_fadefield (Create, d_Create_Colours_4k);
+    dbox_fadefield (Create, d_Create_Colours_64k);
+  }
 
   Decode (&lb_bpp, &Mode);
 
diff --git a/h/MenuD b/h/MenuD
index 4c5c191..9474ba6 100644
--- a/h/MenuD
+++ b/h/MenuD
@@ -175,7 +175,9 @@
 #define d_Create_Colours_4       9
 #define d_Create_Colours_16     10
 #define d_Create_Colours_256    11
+#define d_Create_Colours_4k     33
 #define d_Create_Colours_32k    12
+#define d_Create_Colours_64k    32
 #define d_Create_Colours_16M    13
 #define d_Create_Mode_LabelL    6
 #define d_Create_Mode           30
-- 
GitLab