From 2137a784c0843f1d413d97178dc4d4ae33b6caef Mon Sep 17 00:00:00 2001 From: Robert Sprowson <rsprowson@gitlab.riscosopen.org> Date: Sat, 1 Jun 2013 17:06:27 +0000 Subject: [PATCH] Add flexible scheme to allow non-grey/opaque toolsprites The Wimp can now accept toolsprite sets which have precalculated (non default) colour translation tables supplied by the designer. This allows the link between window template colour and displayed tool colour to be reestablished when the tools aren't grey (previously, the Ursula Wimp would only tint greys). For full design details see Doc/ToolTables. An example test set, TestO/TTTTest is provided. This is the 'Newlook' set but with a splotch in the corner of each sprite which is then replaced by the hex of the Wimp colour being requested. Detail: Wimp01.s: New workspace requirements Wimp04.s: Pull out the RGB to greyscale function so it can be used elsewhere Wimp10.s: New tool table support code Fixes ticket #323. Also introduces a disc variant (with the extra EX0 EY0 resolution) of the 'Steel' theme, thus making it generally available. Version 5.30. Tagged as 'Wimp-5_30' --- Doc/ToolTables | 88 +++++ Options/s/!Default | 1 + Resources/UK/Raspberry/DiscSprites/Tools,ff9 | Bin 0 -> 140660 bytes Resources/UK/Raspberry/Tools,ff9 | Bin 77652 -> 47916 bytes TestO/TTTTest,ff9 | Bin 0 -> 46456 bytes VersionASM | 14 +- VersionNum | 22 +- s/Wimp01 | 13 +- s/Wimp04 | 46 +-- s/Wimp10 | 354 ++++++++++++++++++- 10 files changed, 492 insertions(+), 46 deletions(-) create mode 100644 Doc/ToolTables create mode 100644 Resources/UK/Raspberry/DiscSprites/Tools,ff9 create mode 100644 TestO/TTTTest,ff9 diff --git a/Doc/ToolTables b/Doc/ToolTables new file mode 100644 index 0000000..e09cecf --- /dev/null +++ b/Doc/ToolTables @@ -0,0 +1,88 @@ +Tool translation tables +======================= +Design +------ +Tools sprite designers can optionally provide a set of precalculated translation tables to map the toolsprites onto the standard 16 Wimp colours. + +Historically toolsprites have relied on one of two methods to adapt the sprite designs to match the application programmer's template colour choices: +a) Scatter some transparent pixels through the toolsprites so that the + underlying Wimp solid fill leaks through. +b) From Ursula onwards, if the toolsprite is 256 colours or less and solid, + then the Wimp will tint grey (R=G=B) portions of the titlebar sprites + with the underlying Wimp solid fill colour. The 'colourmoreborder' switch + applied tinting to the other highlighted elements (back, close, iconise, + toggle, adjust, arrows) but the code is disabled on aesthetic grounds. + +These schemes have some drawbacks: + - designers don't want to have transparency because it is binary and + therefore gives tools a spotty dithered look + - solid tools may not be tinted in the designer's desired style + - solid tools may by default themselves be tinted, and therefore not grey, + and therefore the tinting doesn't apply anyway + - resulting in the solid tool obliterating the template's colour choice, for + example writable menus are grey 2 by default, rather than the cream 12 + that might be inferred if only considering input focus status + +Though alpha blending may appear to be one solution, the situation where alpha blending is also used to make the window itself translucent would result in two computationally expensive operations - blending the template colour choice with the tool sprite, then blending the result with the underlying desktop. + +To mitigate these drawbacks the template designer can supply precalculated custom colour translation tables alongside the toolsprites. + +It is generally assumed that within a tool set the variants will infact all be the same basic design and that the variations are mainly in their colouring. One way to think of this is the sprites provide a clay mould and the translation tables supply details of which paints to use - a more space efficient solution than providing 16 complete paletted sprite sets. + +As a guide, there are about 35000 pixels in a 90x90 set, so providing EX1 EY1 +and EX1 EY2 sets would be approximately: + + Colour space 90x45 + 90x90 Total + 4bpp+individual palette 15.7k + 24.9k 40.6k + 8bpp+desktop palette 18.5k + 37k 55.5k + 8bpp+individual palette 118.5k + 137k 255.5k + 16bpp 37k + 74k 111k + 32bpp 74k + 148k 222k + A typical 2 table scheme (2k) 18.5k + 37+2k 57.5k + A fully tabled scheme (17k) 18.5k + 37+17k 72.5k + +While 32K and 16M colour tables could in future be supported, their large table size is likely to make them of limited use. Therefore this scheme will use 256 entry tables - note that that's 256 colours from a 16M colour palette for each of the toolsprite elements that can be coloured + 1. Title bar and gadgets + 2. Scroll bar inner + 3. Scroll bar outer + 4. Elements with input focus + +which is up to 1024 colours on screen in total (for 8bpp and lower obviously the hardware is the limiting factor). This is likely to deal even the most complex of design arrangements. + +Details +------- +Each table is containerised as a sprite, a 16x16 in 16M colours is suggested since that can then be viewed in !Paint, but not required - any 256 word sized sprite will do. + +The 'extension area' of the sprite file format was considered, but this is often stripped by editors, making it difficult to visualise. Sprites can be designed using !Paint and the palettes removed at the final step (which will make them appear in "false colour" usually - remember to keep the originals!). + +Encoding the table in a palette of a (eg.) 1x1 sprite was also considered, but the inclusion of flashing colours in sprite palettes made this method wasteful. + +The table(s) are named + table_<wimpcolour> + +following the same naming scheme as the optional window background textures. A simple set might contain + table_2 (for sc_lightgrey) + table_12 (for sc_cream) + +A fully specified set would be 16k in total, one for each of the 16 Wimp colours. + +Where no tables are provided, behaviour described in (a) and (b) above will prevail, using a default translation table from ColourTrans_GenerateTable. + +Where a need to plot a tinted border occurs (see 'colourmoreborder') if the tint colour matches one of the standard Wimp colours that will be used, where no specific table has been supplied table_2 will be used. First, the colours will be forcefully greyscaled, then the tinting algorithm from (b) applied. +If this jars particularly with the designers aim, a full set of tables should be provided instead so the tinting is then only needed for the rare situation of a non standard true colour being chosen (using the 'C' validation string). + +Where a need to plot a non tinted border occurs if the colour required matches one of the standard Wimp colours that will be used, where no specific table has been supplied table_2 will be used. + +Plotting +-------- +As stated earlier, 256 translation table entries each of 32b are provided for. Plotting these into + 1bpp => table reduced into 256B form at 1bpp via ColourTrans + 2bpp => table reduced into 256B form at 2bpp via ColourTrans + 4bpp => table reduced into 256B form at 4bpp via ColourTrans + 8bpp => table reduced into 256B form at 8bpp via ColourTrans + 16bpp => table reduced into 512B form at 16bpp via ColourTrans + 32bpp => uses table provided directly + +Calibration +----------- +Translation tables are not currently (re)calibrated. diff --git a/Options/s/!Default b/Options/s/!Default index e2ffcb3..3a3aa19 100644 --- a/Options/s/!Default +++ b/Options/s/!Default @@ -85,6 +85,7 @@ Option RO4, false ; RISC OS 4 extensions Option Sprites11, true ; sprite selection scheme that allows use of Sprites11 files + Option ToolTables, true ; look for precalculated tool translation tables Option RegisterMessages, false Option RegisterTools2D, false diff --git a/Resources/UK/Raspberry/DiscSprites/Tools,ff9 b/Resources/UK/Raspberry/DiscSprites/Tools,ff9 new file mode 100644 index 0000000000000000000000000000000000000000..b718d3f8643ba2ce1ef97cea7cfab1a31d3f2771 GIT binary patch literal 140660 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 literal 0 HcmV?d00001 diff --git a/Resources/UK/Raspberry/Tools,ff9 b/Resources/UK/Raspberry/Tools,ff9 index 3e5886f5b82f3fbe727e86362b954602a08857e4..4c8d863749feb4c9760dc30b368416aef02b7247 100644 GIT binary patch literal 47916 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 literal 77652 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 diff --git a/TestO/TTTTest,ff9 b/TestO/TTTTest,ff9 new file mode 100644 index 0000000000000000000000000000000000000000..b72371ff0d6cf649b22aadf53b5113031ca12fa5 GIT binary patch literal 46456 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 Jm2p`={y!0+3B~{b literal 0 HcmV?d00001 diff --git a/VersionASM b/VersionASM index 028c085..4076d61 100644 --- a/VersionASM +++ b/VersionASM @@ -1,7 +1,7 @@ ; ; This file is automatically maintained by srccommit, do not edit manually. ; Last processed by srccommit version: 1.1. -; +; GBLS Module_MajorVersion GBLA Module_Version GBLS Module_MinorVersion @@ -11,13 +11,13 @@ GBLS Module_HelpVersion GBLS Module_ComponentName GBLS Module_ComponentPath -Module_MajorVersion SETS "5.29" -Module_Version SETA 529 +Module_MajorVersion SETS "5.30" +Module_Version SETA 530 Module_MinorVersion SETS "" -Module_Date SETS "21 May 2013" -Module_ApplicationDate SETS "21-May-13" +Module_Date SETS "01 Jun 2013" +Module_ApplicationDate SETS "01-Jun-13" Module_ComponentName SETS "Wimp" Module_ComponentPath SETS "castle/RiscOS/Sources/Desktop/Wimp" -Module_FullVersion SETS "5.29" -Module_HelpVersion SETS "5.29 (21 May 2013)" +Module_FullVersion SETS "5.30" +Module_HelpVersion SETS "5.30 (01 Jun 2013)" END diff --git a/VersionNum b/VersionNum index e9cdf70..aacf86b 100644 --- a/VersionNum +++ b/VersionNum @@ -1,23 +1,23 @@ -/* (5.29) +/* (5.30) * * This file is automatically maintained by srccommit, do not edit manually. * Last processed by srccommit version: 1.1. * - */ -#define Module_MajorVersion_CMHG 5.29 + */ +#define Module_MajorVersion_CMHG 5.30 #define Module_MinorVersion_CMHG -#define Module_Date_CMHG 21 May 2013 +#define Module_Date_CMHG 01 Jun 2013 -#define Module_MajorVersion "5.29" -#define Module_Version 529 +#define Module_MajorVersion "5.30" +#define Module_Version 530 #define Module_MinorVersion "" -#define Module_Date "21 May 2013" +#define Module_Date "01 Jun 2013" -#define Module_ApplicationDate "21-May-13" +#define Module_ApplicationDate "01-Jun-13" #define Module_ComponentName "Wimp" #define Module_ComponentPath "castle/RiscOS/Sources/Desktop/Wimp" -#define Module_FullVersion "5.29" -#define Module_HelpVersion "5.29 (21 May 2013)" -#define Module_LibraryVersionInfo "5:29" +#define Module_FullVersion "5.30" +#define Module_HelpVersion "5.30 (01 Jun 2013)" +#define Module_LibraryVersionInfo "5:30" diff --git a/s/Wimp01 b/s/Wimp01 index 6c88243..c20100c 100644 --- a/s/Wimp01 +++ b/s/Wimp01 @@ -1305,6 +1305,14 @@ tool_plotop # 4 ; sprite op to plot sprites with tool_maskop # 4 tool_scaling # 4 ; -> scaling block (may not be used) tool_transtable # 4 ; -> translation table (may not be used) + [ ToolTables +ttt_masterset # 16*4 ; -> user supplied tool translation tables (one per wimp colour) +ttt_activeset # 16*4 ; -> reprocessed for this mode +ttt_activeset_at # 4 +ttt_activeset_size # 4 +ttt_lastlookup # 4 ; most recent colour match +ttt_table2 * 2*4 + ] tool_scrollclip # 4*4 ; clip region used for plotting scroll bars tool_scalingblk # 4*4 ; scaling block used for painting glyphs @@ -3666,7 +3674,10 @@ gotwork STR R0,tpixtable_at ; no tool pixel translation table STR R0,tpixtable_size - + [ ToolTables + STR R0,ttt_activeset_at ; no custom translation tables + STR R0,ttt_activeset_size + ] STR R0,list_at STR R0,list_size ; mark to indicate now list present STR R0,filehandle diff --git a/s/Wimp04 b/s/Wimp04 index 1784d44..6c51fe0 100644 --- a/s/Wimp04 +++ b/s/Wimp04 @@ -958,20 +958,12 @@ mungetruecolours ROUT LTORG -fadetruecolour ROUT - ; In: R0 -> palette entry to fade - ; R2 = window background palette entry, or -1 to turn off special case - ; Out: [R0] updated: grey, and half the distance from white (cf sprites, which are 1/4 the distance from white) - Push "R1, R2, R4, R14" - LDR R4, [R0] - - TEQ R4, R2 - Pull "R1, R2, R4, PC", EQ ; leave icon background alone if it matches the work area background - +bgr0_to_y ROUT + Push "R1-R3,LR" MOV R14, #&FF - AND R1, R14, R4, LSR #8 ; extract red - AND R2, R14, R4, LSR #16 ; extract green - AND R3, R14, R4, LSR #24 ; extract blue + AND R1, R14, R0, LSR #8 ; extract red + AND R2, R14, R0, LSR #16 ; extract green + AND R3, R14, R0, LSR #24 ; extract blue MOV R14,#77 MUL R14,R1,R14 ; red *77 @@ -983,19 +975,33 @@ fadetruecolour ROUT ADD R14,R14,#&7F ; Rounding ADD R14,R14,R14,LSL #8 ; Make 16 bit fractional ADD R14,R14,#&100 ; Rounding - MOV R14,R14,LSR #16 ; Convert to 8bit luma + MOV R0,R14,LSR #16 ; Convert to 8 bit luma + Pull "R1-R3,PC" + +fadetruecolour ROUT + ; In: R0 -> palette entry to fade + ; R2 = window background palette entry, or -1 to turn off special case + ; Out: [R0] updated: grey, and half the distance from white (cf sprites, which are 1/4 the distance from white) + Push "R0, R4, R14" + MOV R4, R0 + LDR R0, [R4] + + TEQ R14, R2 + Pull "R0, R4, PC", EQ ; leave icon background alone if it matches the work area background + + BL bgr0_to_y - RSBS R14, R14, #&FF ; get distance from white + RSBS R14, R0, #&FF ; get distance from white MOVMI R14, #0 ; just in case MOV R14, R14, LSR #1 ; divide by 2 RSB R14, R14, #&FF ; invert back - MOV R4, R14, LSL #8 - ORR R4, R4, R14, LSL #16 - ORR R4, R4, R14, LSL #24 ; recombine to make &BBGGRR00 + MOV R0, R14, LSL #8 + ORR R0, R0, R14, LSL #16 + ORR R0, R0, R14, LSL #24 ; recombine to make &BBGGRR00 - STR R4, [R0] - Pull "R1, R2, R4, PC" + STR R0, [R4] + Pull "R0, R4, PC" ] diff --git a/s/Wimp10 b/s/Wimp10 index 6afb49c..cc45000 100644 --- a/s/Wimp10 +++ b/s/Wimp10 @@ -421,8 +421,15 @@ ct_grey = sc_verylightgrey, sc_verylightgrey, sc_verylightgrey, sc_veryl ;; All gadgets must be defined with the same palette and same mode, mixing is not ;; allowed. Sprites are allowed to have mode suffix to allow different ;; EX EY factors to be supported. +;; +;; Tools sprite designers can optionally provide a set of precalculated translation +;; tables to map the toolsprites onto the standard 16 Wimp colours. Each table is +;; containerised as a sprite, but really it's just a translation table in disguise. ;;----------------------------------------------------------------------------- +tablebasename + DCB "table_1?", 0 ; Like background tiles, table_<wimpcolour> + ALIGN ;;----------------------------------------------------------------------------- ;; Define the list of sprites and its workspace for the caching block. @@ -529,6 +536,51 @@ maketoollist EntryS "R1-R11" TEQ R2,#0 BEQ %FT45 ; No then jump + [ ToolTables + +; look for any custom translation tables + + SUB R13,R13,#12 ; space for "table_99"+0 + MOV R4,#0 ; bitmap of found wimp colours + MOV R5,#15 ; wimp colour loop counter + ADRL R6,ttt_masterset +02 + ADR R0,tablebasename + MOV R1,R13 + BL copy0 + CMP R5,#10 ; numbery bit + ADDCS R0,R5,#'0' - 10 + STRCSB R0,[R1,#-1]! + ADDCC R0,R5,#'0' + STRCCB R0,[R1,#-2]! + MOV R0,#0 + STRB R0,[R1,#1] ; terminate + + LDR R0,=&100+SpriteReason_SelectSprite + ADRL R1,tool_areaCB + MOV R2,R13 + SWI XOS_SpriteOp + MOVVC R0,#1 ; hit + ORRVC R4,R4,R0,LSL R5 + LDRVC R1,[R2,#spImage] + ADDVC R2,R2,R1 + MOVVS R2,#0 ; miss + STR R2,[R6,R5,LSL #2] ; start of containerised 256x4 translation table + + SUBS R5,R5,#1 + BPL %BT02 + +; consider the results + + ADD R13,R13,#12 + MOVS R0,R4,LSL #16 + BEQ %FT05 ; we aint got naffin + + TST R4,#1:SHL:2 + BLEQ freetoolarea + BEQ %FT45 ; need 'table_2' for tinting, can't use these tools +05 + ] ;.............................................................................. ; ; attempt to work out the sizes of the various sprites and their modifications to @@ -999,6 +1051,204 @@ default_params MOV PC,LR + [ ToolTables +;;----------------------------------------------------------------------------- +;; make an active set of translation tables from the master set for this mode +;; +;; in [ttt_masterset] have master tables, at least 'table_2' must exist +;; out [ttt_activeset] updated +;; V set R0 -> error, else corrupt +;;------------------------------------------------------------------------------ + +mastertoactive ROUT + Push "R1-R8,LR" + ADRL R6,ttt_masterset + MOV R1,#0 + MOV R0,#15 +05 + LDR R14,[R6,R0,LSL #2] + TEQ R14,#0 + ADDNE R1,R1,#1 + SUBS R0,R0,#1 + BPL %BT05 + + LDR R5,log2bpp ; bpp 0,1,2,3,4,5 + CMP R5,#4 + MOVCC R7,#256 + MOVEQ R7,#512 + MOVHI R7,#1024 ; => bytes per table entry + MUL R3,R1,R7 ; => bytes for all the tables present + + LDR R2,ttt_activeset_at + TEQ R2,#0 + BEQ %FT15 ; none claimed yet + + CMP R5,#5 + LDRNE R14,ttt_activeset_size + MOVEQ R14,#0 ; 32bpp, no copies needed, force a free + CMP R14,R3 + BCS %FT20 ; big enough +10 + MOV R14,#0 + STR R14,ttt_activeset_at + MOV R0,#ModHandReason_Free + BL XROS_Module ; too small, free old one +15 + CMP R5,#5 + BEQ %FT20 ; 32bpp, no copies needed, skip the claim + MOV R0,#ModHandReason_Claim + STR R3,ttt_activeset_size + BL XROS_Module + Pull "R1-R8,PC",VS + STR R2,ttt_activeset_at +20 + ADRL R4,ttt_activeset + MOV R3,#15 ; for each master table present, generate user table +25 + ; R1=colour number to convert (0-255) + ; R2->base of storage for user tables + ; R3=wimp colour (0-15) + ; R4->table of user pointers + ; R5=log2bpp + ; R6->table of master pointers + ; R7=size of 1 user table in bytes + ; R8->base of master table for this wimp colour + LDR R8,[R6,R3,LSL #2] + CMP R8,#0 ; master table absent? + CMPNE R5,#5 ; or 32bpp mode? + STREQ R8,[R4,R3,LSL #2] + BEQ %FT35 + + MOV R1, #255 +30 + LDR R0,[R8,R1,LSL #2] + MOV R0,R0,ROR #24 ; xBGR->BGRx + SWI XColourTrans_ReturnColourNumber + CMP R5,#4 ; 16bpp is 2B/entry, others are 1 + STRCCB R0,[R2,R1] + ADDEQ R14,R2,R1,LSL #1 + STREQB R0,[R14,#0] + MOVEQ R0,R0,LSR #8 + STREQB R0,[R14,#1] + SUBS R1,R1,#1 + BPL %BT30 + + STR R2,[R4,R3,LSL #2] ; point at the table just made + ADD R2,R2,R7 ; move storage along +35 + SUBS R3,R3,#1 ; next wimp colour + BPL %BT25 + + CLRV + Pull "R1-R8,PC" + +;;----------------------------------------------------------------------------- +;; colour match the tool to a standard colour +;; +;; in R1 = &BBGGRR00 true colour (or 4 bit wimp colour when not TrueIcon3) +;; out R7 -> translation table to use +;;------------------------------------------------------------------------------ + +colourmatchtool + Push "R2-R3,LR" + ADRL R3,ttt_activeset + LDR R7,[R3,#ttt_table2] ; Presence of 'table_2' implies custom translations + TEQ R7,#0 + LDREQ R7,tool_transtable ; Use generic translation table + Pull "R2-R3,PC",EQ + + STR R1,ttt_lastlookup ; remember last request incase ColourTrans invalidates everything + [ TrueIcon3 + BL getpalpointer ; R14 -> active 16 entry palette + MOV R2,#15 +10 + LDR R7,[R14,R2,LSL #2] + TEQ R1,R7 + BNE %FT15 + LDR R7,[R3,R2,LSL #2] + TEQ R7,#0 + Pull "R2-R3,PC",NE ; Is a standard colour & have a custom translation +15 + SUBS R2,R2,#1 + BPL %BT10 + + LDRB R2,tinted_tool ; Non standard, or no table, maybe tint it? + TEQ R2,#0 + LDREQ R7,[R3,#ttt_table2] ; Not a tinting candidate, use 'table_2' + Pull "R2-R3,PC",EQ + + Push "R0-R1" ; Make a temporary tinting table + + [ Medusa + LDR R1,log2bpp ; bpp 0,1,2,3,4,5 + CMP R1,#4 + MOVCC R1,#256 + MOVEQ R1,#512 + MOVHI R1,#1024 ; => bytes per table entry + | + MOV R1,#256 + ] + LDR R2,tpixtable_at + LDR R3,tpixtable_size + TEQ R2,#0 + BEQ %FT20 + CMP R3,R1 ; Is what's there already big enough? + BCS %FT25 + MOV R0,#0 + STR R0,tpixtable_at + MOV R0,#ModHandReason_Free + BL XROS_Module +20 + MOV R3,R1 + MOV R0,#ModHandReason_Claim + BL XROS_Module + MOVVS R7,#0 ; Out of memory, and no tpixtable! Use nothing + Pull "R0-R3,PC",VS +25 + STR R2,tpixtable_at + STR R2,tool_transtable + STR R3,tpixtable_size + + ADRL R3,ttt_masterset + LDR R7,[R3,#ttt_table2] ; Use master 'table_2' as basis + + MOV R1,#255 + LDR R3,log2bpp + ; R1=colour number to convert (0-255) + ; R2->base of tinted translation table + ; R3=log2bpp + ; R7->base of master table 2 +30 + LDR R0,[R7,R1,LSL #2] ; solid (0) -> transparent (255) + MOV R0,R0,ROR #24 ; &AABBGGRR -> &BBGGRRAA + BL bgr0_to_y + ORR R0,R0,R0,LSL #8 ; &0000YYYY + ORR R0,R0,R0,LSL #16 ; &YYYYYYYY + BL tintfunc + SWI XColourTrans_ReturnColourNumber + [ Medusa + CMP R3,#4 ; 32bpp is 4B/entry, 16bpp is 2B/entry, others are 1 + STRCCB R0,[R2,R1] + ADDEQ R14,R2,R1,LSL #1 + STREQB R0,[R14,#0] + MOVEQ R0,R0,LSR #8 + STREQB R0,[R14,#1] + STRHI R0,[R2,R1,LSL #2] + | + STRB R0,[R1,R1] ; No wide translation tables + ] + SUBS R1,R1,#1 + BPL %BT30 + + MOV R7,R2 ; Use table just made + Pull "R0-R3,PC" + | + LDR R7,[R3,R1,LSL #2] ; Direct lookup wimp colour + TEQ R7,#0 + LDREQ R7,[R3,#ttt_table2] ; No specific table, use 'table_2' + Pull "R2-R3,PC" + ] + ] ;;----------------------------------------------------------------------------- ;; free the tool sprites list (if defined) @@ -1043,6 +1293,13 @@ freetooltrans ROUT MOV R0,#0 STR R0,tpixtable_at STR R0,tool_transtable + [ ToolTables + LDR R2,ttt_activeset_at + STR R0,ttt_activeset_at + CMP R2,#0 ; have translation tables been supplied in the tool sprites? + MOVNE R0,#ModHandReason_Free + BLNE XROS_Module + ] ; CLRV MOV PC,R1 @@ -1121,7 +1378,7 @@ ToolSprites_Code Entry "R0" int_toolsprites Entry "R1-R6" MOVS R1,R0 ; if null then use default tools - ADREQL R1,default_tools + ADREQ R1,default_tools ; DebugS tools,"ToolSprites =",R1 ; @@ -1606,6 +1863,14 @@ plot_windowglyph Entry "R0-R9" ; ADRL R0,tool_plotparams LDMIA R0,{R0,R5,R6,R7} ; parameters to plot using + [ ToolTables + [ TrueIcon3 + LDR R1,truetitlecolour + | + LDRB R1,titlecolour + ] + BL colourmatchtool + ] Debug tools2,"SpriteOp =",R0,R1,R2,R3,R4,R5 BL Tool_SpriteOp @@ -1832,6 +2097,14 @@ draw_spriteglyph EntryS "R0-R7" ; ADRL R0,tool_plotparams LDMIA R0,{R0,R5,R6,R7} ; get the tool information + [ ToolTables + [ TrueIcon3 + LDR R1,truetitlecolour + | + LDRB R1,titlecolour + ] + BL colourmatchtool + ] BL Tool_SpriteOp ; EXITS @@ -1919,6 +2192,14 @@ dofunkytitlebar EntryS "R0-R11" ; ADRL R0,tool_plotparams LDMIA R0,{R0,R5,R6,R7} ; R0,R5-R7 => sprite op information + [ ToolTables + [ TrueIcon3 + LDR R1,truetitlecolour + | + LDRB R1,titlecolour + ] + BL colourmatchtool + ] LDR R1,tool_list ; -> list of the glyphs Push "R10,R11" ; preserve these - they are important ; @@ -2074,6 +2355,14 @@ dofunkyvscroll EntryS "R0-R11" ; ADRL R0,tool_plotparams LDMIA R0,{R0,R5,R6,R7} ; get the plotting parameters + [ ToolTables + [ TrueIcon3 + LDR R1,truescoutcolour + | + LDRB R1,[handle,#w_scouter] + ] + BL colourmatchtool + ] ; LDR R1,dy ; single pixel at screen resolution LDR R3,[sp,#Proc_RegOffset+sp_x0] @@ -2135,6 +2424,16 @@ dofunkyvscroll EntryS "R0-R11" ; now decide which routine to call to plot the sausage bits ; LDR R2,[sp,#Proc_RegOffset+sp_hand] + [ ToolTables + Push "R1" + [ TrueIcon3 + LDR R1,truescincolour + | + LDRB R1,[R2,#w_scinner] + ] + BL colourmatchtool + Pull "R1" + ] [ PushBothBars LDR R14, border_iconselected CMP R14, #windowicon_verticalbar @@ -2274,6 +2573,15 @@ dofunkyhscroll EntryS "R0-R11" ; ADRL R0,tool_plotparams LDMIA R0,{R0,R5,R6,R7} ; get the plotting parameters + [ ToolTables + [ TrueIcon3 + LDR R1,truescoutcolour + | + LDRB R1,[handle,#w_scouter] + ] + BL colourmatchtool + ] +; LDR R1,dx ; single pixel at screen resolution LDR R4,[sp,#Proc_RegOffset+sp_y0] LDR R10,tool_list ; -> tool sprite list @@ -2333,6 +2641,16 @@ dofunkyhscroll EntryS "R0-R11" ; first attempt to decide if the block is selected or not? ; LDR R2,[sp,#Proc_RegOffset+sp_hand] + [ ToolTables + Push "R1" + [ TrueIcon3 + LDR R1,truescincolour + | + LDRB R1,[R2,#w_scinner] + ] + BL colourmatchtool + Pull "R1" + ] [ PushBothBars LDR R14, border_iconselected CMP R14, #windowicon_horizbar @@ -2884,8 +3202,8 @@ cachetoolspritedata CMP R7,R14 ; min(image,trans) MOVHI R7,R14 - LDR R14,tpixtable_at - CMP R14,#0 ; is a pixtable defined? + LDR R1,tpixtable_at + CMP R1,#0 ; is a pixtable defined? BEQ %FT10 [ TrueIcon3 @@ -2893,10 +3211,17 @@ cachetoolspritedata TEQ R14, #0 ; if it's tinted, we must recalculate the table BNE %FT10 ] + [ ToolTables + ADRL R14,ttt_masterset + LDR R14,[R14,#ttt_table2] ; if it's a custom set, we must recalculate the table + TEQ R14,#0 + BNE %FT10 + ] TEQ R7,#spPalette ; does it have a palette? LDREQ R14,tsprite_lastmode TEQEQ R6,R14 ; no, so have we already cached this information? + STREQ R1,tool_transtable ; repoint at the pixtable BEQ %FT92 10 MOV R0,R6 ; R0 = mode of sprite @@ -2923,6 +3248,9 @@ cachetoolspritedata MOVVC R1,#VduExt_YEigFactor SWIVC XOS_ReadModeVariable STRVC R2,tsprite_log2py ; get the Y scaling factor (pixels => OS units) + [ ToolTables + BLVC mastertoactive ; remap any custom translation tables + ] Pull "R2,R3-R4",VS BVS %FT92 @@ -3000,8 +3328,20 @@ cachetoolspritedata BPL %BT05 ; loop back copying the data Pull "R0-R3,R5" +10 + [ ToolTables + ADRL R14,ttt_masterset + LDR R14,[R14,#ttt_table2] ; are these sprites using custom translations? + TEQ R14,#0 + BEQ %FT15 -10 MOV R4,#0 ; R4 =0 read table size + LDR R1,ttt_lastlookup + BL colourmatchtool ; redo the last lookup + MOV R14,R7 + B %FT45 ; skip the generic table generation +15 + ] + MOV R4,#0 ; R4 =0 read table size [ TrueIcon3 SWI XColourTrans_GenerateTable ; ensure wide table flag is obeyed | @@ -3064,6 +3404,9 @@ cachetoolspritedata TEQ R14,R6 ; colour number = index? (1:1 mapped) BEQ %BT35 40 + LDR R14,tpixtable_at ; use that now +45 + STR R14,tool_transtable MOV R14,#-1 STRB R14,tsprite_needsfactors; mark as needing translation 90 @@ -3203,9 +3546,6 @@ recache_tools_trans BL cachetoolspritedata ; this sets up the tool pixtable area - LDRVC R0,tpixtable_at - STRVC R0,tool_transtable ; update the new table location - CLRV ; clear errors Pull "R0-R4,PC" ] -- GitLab