From 56f4e46f6ff1466d9452ad79331b240e68193000 Mon Sep 17 00:00:00 2001 Message-Id: <56f4e46f6ff1466d9452ad79331b240e68193000.1714642701.git.mdw@distorted.org.uk> From: Mark Wooding Date: Wed, 17 Jun 1998 19:16:39 +0000 Subject: [PATCH] JPEG support and other fixes from Nick Clark Organization: Straylight/Edgeware From: mdw --- StraySrc/Libraries/Sapphire/s/draw | 104 ++++++++++++++++++------ StraySrc/Libraries/Sapphire/s/roVersion | 4 +- 2 files changed, 80 insertions(+), 28 deletions(-) diff --git a/StraySrc/Libraries/Sapphire/s/draw b/StraySrc/Libraries/Sapphire/s/draw index 05cf507..8e9cc08 100644 --- a/StraySrc/Libraries/Sapphire/s/draw +++ b/StraySrc/Libraries/Sapphire/s/draw @@ -265,6 +265,9 @@ draw__renderObject ROUT B %10draw__renderObject ;Options are not renderable B draw__renderTransformedText ;Render rotated text B draw__renderTransformedSprite ;Render rotated sprite + B %10draw__renderObject ;Type 14 is not defined + B %10draw__renderObject ;Type 15 is not defined + B draw__renderJPEG ;Render a JPEG 10 B draw__next ;Ignore unknown objects @@ -410,10 +413,10 @@ draw__renderText ROUT ; --- Make sure the text isn't invisible --- - ADD R6,R7,#24 ;Point to the object data - LDR R0,[R6,#0] ;Load the foreground colour + LDR R0,[R7,#24] ;Load the foreground colour CMP R0,#-1 ;Is it transparent? MOVEQS PC,R14 ;Yes -- do nothing then + ADD R6,R7,#24 ;Point to the object data ; --- Find the font name --- @@ -428,8 +431,8 @@ draw__renderText ROUT STMFD R13!,{R14} ;Save the link again ADD R2,R6,#12 ;Point to the text sizes - LDMIA R2,{R2,R3} ;Load x and y sizes LDR R4,[R10,#0] ;Load the scale factor + LDMIA R2,{R2,R3} ;Load x and y sizes MOV R4,R4,LSR #8 ;Scale it down a little MUL R2,R4,R2 ;Scale up the x size MUL R3,R4,R3 ;And scale up the y size @@ -462,8 +465,8 @@ draw__renderText ROUT ; --- Work out where to paint the text --- ADD R3,R6,#20 ;Point to the coordinates - LDMIA R3,{R3,R4} ;Load the coordinates out LDR R5,[R10,#0] ;Load the scale factor out + LDMIA R3,{R3,R4} ;Load the coordinates out MOV R5,R5,LSR #8 ;Scale it down a little MUL R3,R5,R3 ;Multiply up the x position MUL R4,R5,R4 ;Multiply up the y position @@ -508,8 +511,8 @@ draw__renderSystemText ROUT BL screen_getInfo ;Get things about the screen LDMIA R0,{R2,R3} ;Load the eigen factors ADD R14,R6,#12 ;Point to the size arguments - LDMIA R14,{R0,R1} ;Load the text sizes out LDR R4,[R10,#0] ;Load the scale factor + LDMIA R14,{R0,R1} ;Load the text sizes out MOV R4,R4,LSR #8 ;Shift it down a little MUL R0,R4,R0 ;Multiply x size up MUL R1,R4,R1 ;Multiply y size up too @@ -665,8 +668,8 @@ draw__renderSprite ROUT ; --- Work out the correct scaling --- - MOV R0,#40 ;Read sprite info - ADD R0,R0,#512 ;Sprite is pointed at + MOV R0,#40+512 ;Read sprite info + ;Sprite is pointed at MOV R1,#&1000 ;Don't care about sprite area ADD R2,R7,#24 ;Point to sprite block SWI OS_SpriteOp ;Read the sprite info @@ -679,14 +682,15 @@ draw__renderSprite ROUT LDMIA R0,{R0-R3} ;Load the values out SUB R2,R2,R0 ;Get sprite width in R2 SUB R3,R3,R1 ;Get sprite height in R3 + LDR R14,[R10,#0] ;Load the scale factor MOV R2,R2,LSR #8 ;Scale the dimensions down MOV R3,R3,LSR #8 ;In both directions - LDR R14,[R10,#0] ;Load the scale factor MUL R2,R14,R2 ;Scale the x size MUL R3,R14,R3 ;And the y size MOV R2,R2,LSR #16 ;And scale the value down MOV R3,R3,LSR #16 ;Both directions again - STMFD R13!,{R2-R5} ;Save the resulting zoom blk + STMFD R13!,{R2-R5,R7} ;Save the resulting zoom blk + ;Save R7 -- we need to use it MOV R14,R14,LSR #8 ;Shift scale factor down MUL R3,R14,R0 ;Scale the x position @@ -700,18 +704,15 @@ draw__renderSprite ROUT ; --- Now plot the sprite in the right place --- - STMFD R13!,{R7} ;Save R7 -- we need to use it - MOV R0,#52 ;Plot sprite scaled, please - ADD R0,R0,#512 ;Tell it I have a sprite ptr + MOV R0,#52+512 ;Plot sprite scaled, please MOV R1,#&1000 ;A dummy sprite area ADD R2,R7,#24 ;Point to the sprite def MOV R5,#8 ;Plot with mask, please - ADD R6,R13,#4 ;Point to my zoom block + MOV R6,R13 ;Point to my zoom block MOV R7,R11 ;Point to my translate table SWI OS_SpriteOp ;Plot the sprite - LDMFD R13!,{R7} ;Unstack R7 again ADD R13,R13,#16 ;Recover the zoom block - LDMFD R13!,{R14} ;Unstack the link register + LDMFD R13!,{R7, R14} ;Unstack R7 and link register B draw__next ;And render the next object LTORG @@ -740,8 +741,9 @@ draw__renderTagged ROUT BCC draw__next ;No -- then return STMFD R13!,{R7,R8} ;Save the object pointer + ;SA optimised, looks crazy: + LDR R8,[R7,#32] ;Get the object size ADD R7,R7,#28 ;Point to the enclosed object - LDR R8,[R7,#4] ;Get the object size ADD R8,R7,R8 ;Point past the object BL draw__doRender ;Render the object LDMFD R13!,{R7,R8,R14} ;Restore registers @@ -762,10 +764,10 @@ draw__renderTransformedText ROUT ; --- Make sure the text isn't invisible --- - ADD R6,R7,#24 ;Point to the object data - LDR R0,[R6,#0] ;Load the foreground colour + LDR R0,[R7,#24] ;Load the foreground colour CMP R0,#-1 ;Is it transparent? MOVEQS PC,R14 ;Yes -- do nothing then + ADD R6,R7,#24 ;Point to the object data ; --- Find the font name --- @@ -780,8 +782,8 @@ draw__renderTransformedText ROUT STMFD R13!,{R14} ;Save the link again ADD R2,R6,#40 ;Point to the text sizes - LDMIA R2,{R2,R3} ;Load x and y sizes LDR R4,[R10,#0] ;Load the scale factor + LDMIA R2,{R2,R3} ;Load x and y sizes MOV R4,R4,LSR #8 ;Scale it down a little MUL R2,R4,R2 ;Scale up the x size MUL R3,R4,R3 ;And scale up the y size @@ -814,8 +816,8 @@ draw__renderTransformedText ROUT ; --- Work out where to paint the text --- ADD R3,R6,#48 ;Point to the coordinates - LDMIA R3,{R3,R4} ;Load the coordinates out LDR R5,[R10,#0] ;Load the scale factor out + LDMIA R3,{R3,R4} ;Load the coordinates out MOV R5,R5,LSR #8 ;Scale it down a little MUL R3,R5,R3 ;Multiply up the x position MUL R4,R5,R4 ;Multiply up the y position @@ -840,8 +842,8 @@ draw__renderTransformedText ROUT ; --- Paint the actual text then --- - ADD R1,R6,#56 ;Point to the text string LDR R2,[R6,#24] ;Load the special magic flags + ADD R1,R6,#56 ;Point to the text string MOV R2,R2,LSL #9 ;Shift flags into position ORR R2,R2,#&40 ;Specify transform matrix STMFD R13!,{R0} ;Save the font handle @@ -877,8 +879,8 @@ draw__renderTransformedSprite ROUT ; --- Build the transformation matrix --- ADD R14,R7,#24 ;Find the transform matrix - LDMIA R14,{R0-R5} ;Load all the bits I need LDR R6,[R10,#0] ;Load the scale factor + LDMIA R14,{R0-R5} ;Load all the bits I need MOV R6,R6,LSR #8 ;Shift scale factor down MOV R0,R0,ASR #8 ;Also shift down sprite scale MOV R1,R1,ASR #8 ;Also shift down sprite scale @@ -888,6 +890,7 @@ draw__renderTransformedSprite ROUT MUL R1,R6,R1 ;Apply scale to sprite matrix MUL R2,R6,R2 ;Apply scale to sprite matrix MUL R3,R6,R3 ;Apply scale to sprite matrix + STMFD R13!,{R7} ;Save R7 -- we need to use it SUB R13,R13,#24 ;Make space for matrix STMIA R13,{R0-R3} ;Save transform on stack ADD R14,R10,#16 ;Point to my offsets @@ -901,18 +904,65 @@ draw__renderTransformedSprite ROUT ; --- Now plot the sprite in the right place --- - STMFD R13!,{R7} ;Save R7 -- we need to use it - MOV R0,#56 ;Plot sprite scaled, please - ADD R0,R0,#512 ;Tell it I have a sprite ptr + MOV R0,#512+56 ;Plot sprite scaled, please + ;Tell it I have a sprite ptr MOV R1,#&1000 ;A dummy sprite area ADD R2,R7,#48 ;Point to the sprite def MOV R3,#0 ;R6 points to a matrix MOV R4,#0 ;No source rectangle thing MOV R5,#8 ;Plot with mask, please - ADD R6,R13,#4 ;Point to my matrix + MOV R6,R13 ;Point to my matrix MOV R7,R11 ;Point to my translate table SWI OS_SpriteOp ;Plot the sprite - LDMFD R13!,{R7} ;Unstack R7 again + ADD R13,R13,#24 ;Recover the matrix block + LDMFD R13!,{R7,R14} ;Unstack R7 and link register + B draw__next ;And render the next object + +; --- draw__renderJPEG ---- + +draw__renderJPEG ROUT + + ; --- Make sure I have to render it --- + + STMFD R13!,{R14} ;Save the link temporarily + BL draw__clip ;Do we have to render it? + BLCS rov_version ;Get the current OS version + CMPCS R0,#360 ;Is it RISC OS 3.60 yet? + LDMCCFD R13!,{R14} ;Restore the link again + BCC draw__next ;No -- then return + + ; --- Build the transformation matrix --- + + ADD R14,R7,#40 ;Find the transform matrix + LDR R6,[R10,#0] ;Load the scale factor + LDMIA R14,{R0-R5} ;Load all the bits I need + MOV R6,R6,LSR #8 ;Shift scale factor down + MOV R0,R0,ASR #8 ;Also shift down JPEG scale + MOV R1,R1,ASR #8 ;Also shift down JPEG scale + MOV R2,R2,ASR #8 ;Also shift down JPEG scale + MOV R3,R3,ASR #8 ;Also shift down JPEG scale + MUL R0,R6,R0 ;Apply scale to JPEG matrix + MUL R1,R6,R1 ;Apply scale to JPEG matrix + MUL R2,R6,R2 ;Apply scale to JPEG matrix + MUL R3,R6,R3 ;Apply scale to JPEG matrix + SUB R13,R13,#24 ;Make space for matrix + STMIA R13,{R0-R3} ;Save transform on stack + ADD R14,R10,#16 ;Point to my offsets + LDMIA R14,{R0,R1} ;Load the offsets out + MUL R4,R6,R4 ;Scale the JPEG x offset + MUL R5,R6,R5 ;Scale the JPEG y offset + ADD R4,R0,R4,ASR #8 ;Add on to original offset + ADD R5,R1,R5,ASR #8 ;Add on to original offset + ADD R14,R13,#16 ;Point to bit of matrix + STMIA R14,{R4,R5} ;Save these in the matrix + + ; --- Now plot the JPEG in the right place --- + + ADD R0,R7,#68 ;Point to the JPEG def + MOV R1,#2 ;R2 points to a matrix, dither + MOV R2,R13 ;Point to my matrix + LDR R3,[R0,#-4] ;Load length of JPEG + SWI JPEG_PlotTransformed ;Plot the JPEG ADD R13,R13,#24 ;Recover the matrix block LDMFD R13!,{R14} ;Unstack the link register B draw__next ;And render the next object diff --git a/StraySrc/Libraries/Sapphire/s/roVersion b/StraySrc/Libraries/Sapphire/s/roVersion index e55ae35..5d6833a 100644 --- a/StraySrc/Libraries/Sapphire/s/roVersion +++ b/StraySrc/Libraries/Sapphire/s/roVersion @@ -71,7 +71,9 @@ rov_init ROUT STR R0,rov__version ;Save this version away LDMFD R13!,{R0-R4,R12,PC}^ ;Return to caller -rov__verTable DCD &A5,350 +rov__verTable DCD &A7,370 + DCD &A6,360 + DCD &A5,350 DCD &A4,310 DCD &A3,300 DCD &A2,201 -- [mdw]