Commit 0ca1c4b3 authored by Neil Turton's avatar Neil Turton
Browse files

Import from cleaned 360 CD

parents
hdr/** gitlab-language=armasm linguist-language=armasm linguist-detectable=true
s/** gitlab-language=armasm linguist-language=armasm linguist-detectable=true
*,ffb gitlab-language=bbcbasic linguist-language=bbcbasic linguist-detectable=true
c/** gitlab-language=c linguist-language=c linguist-detectable=true
**/c/** gitlab-language=c linguist-language=c linguist-detectable=true
h/** gitlab-language=c linguist-language=c linguist-detectable=true
Accuracy of PutSpriteTransformed:
Consider a destination screen area of 5000 by 5000 pixels. This has to be stored internally
as 1/256ths of pixels, i.e. the width is 5000*256=&138800. Next stage is to evaluate the
determinant (area) of the destination:
Consider a destination rectangle of 0,0 to 5000,5000 pixels.
Input destination coords use an 8 bit mantissa.
Destination size of 5000 by 5000 pixels gives:
Determinant of matrix (=area) = 5000*256 * 5000*256 = &17D78400000 (16 bit mantissa)
(Store as 18.14, which loses 2 bits off the bottom. It could also lose 10 more...)
Inverting gives &ABCC706 / (1<<52).
(Store as 16.48, which loses 22 bits off the bottom)
Multiplying by xchange or ychange (5000*256) gives &D1B70F2/(1<<32)
(Store as 32.32, which loses 24 bits off the bottom)
Multiplying by sprite size gives: size * &D1B70F2 / (1<<24) = increment
(Store as 16.16, which is pretty accurate, as specified below)
Xsize Ysize Sprite x size Sprite Y size Inc Xx Inc Yy
5 5000 4 4 4/5 4/5000
50 5000 4 4 4/50 4/5000
500 5000 4 4 4/500 4/5000
5000 5000 4 4 4/5000 4/5000
Obviously sprite_x_size/Xsize goes between 4000/5=800 to 4/5000=0.0008
These values are stored to 16 bit mantissa accuracy. The table below gives
percentage errors for a range of values:
Scale factor Increment Percentage error (optimal)
0.00001 100000 0.00000005 %
0.0001 10000 0.00000014 %
0.001 1000 0.00000154 %
0.01 100 0.00001527 %
0.1 10 0.0001526 %
1 1 0.00152588 %
10 0.1 0.01525879 %
100 0.01 0.15258789 %
1000 0.001 1.52587891 %
10000 0.0001 15.2587891 %
100000 0.00001 152.587891 %
1000000 0.000001 1525.87891 %
[Calculated with the formula ((value*65536+1)/(value*65536)-1)*100]
These errors will be produce bad results if the number of pixels to plot (X or Y), multiplied
by the percentage error, gives a value of a pixel on the source sprite (for large sprites)
e.g. Error at edge of sprite (sprite pixels) = error in increment * number of display pixels
As it happens, the source size seems to drop out of the equation here. The error turns out
at <destination size>/65536 pixels in the source by the time it reaches the end
Read the following table for more information on the maximum errors attainable:
Destination size Worst possible error in source pixels
5 0.0000763
10 0.0001526
50 0.0007629
100 0.0015259
500 0.0076294
1000 0.0152588
5000 0.0762939
10000 0.1525879
[ The largest output possible is 32767 pixels ]
> net#arf:$.a500.RiscOS+.doc.SprExtend
Author: Neil Raine
Status: Description of new interfaces provided by SpriteExtend in RISC OS+
History:
20-Sep-89 0.01 First draft released.
21-Sep-89 0.02 Updated to show list of possible errors
21-Sep-89 0.03 Put in non-linear transformations error
22-Sep-89 0.04 Specify exactly which points are mapped to which
GStark 29-Sep-89 0.05 Updated with information on accuracy and source rectangle clipping
GStark 28-Nov-89 0.06 Updated with specification for InsertDeleteRows, and
InsertDeleteColumns.
GStark 03-Jan-90 0.07 Updated the text referring to the possible errors for transformation
Transformed sprite SWIs
-----------------------
SWI OS_SpriteOp
In: R0 = 55 (SpriteReason_PlotMaskTransformed) (+ 0, 256 or 512)
R0 = 56 (SpriteReason_PutSpriteTransformed) (+ 0, 256 or 512)
R1 -> sprite area (if R0 > 255)
R2 -> sprite name or header (depends on R0)
R3 = flag word:
bit 0 set => R6 -> destination coords, else matrix
bit 1 set => R4 -> source rectangle inside sprite
bits 2..31 reserved (must be 0)
R4 -> source rectangle coordinate block (if R3 bit 1 set):
R4!0,4 = x0, y0 one corner in sprite (pixels)
R4!8,12 = x1,y1 second corner in sprite (pixels)
R5 = GCOL action (for PutSpriteTransformed)
+8 if mask is to be used
R6 -> matrix (if R3 bit 0 clear):
R6!0,4,8,12,16,20 = matrix (as for Draw module)
R6 -> destination coordinate block (if R3 bit 0 set):
R6!0,4 = X0,Y0 on screen (1/256th OS unit)
R6!8,12 = X1,Y1 on screen (1/256th OS unit)
R6!16,20 = X2,Y2 on screen (1/256th OS unit)
R6!24,28 = X3,Y3 on screen (1/256th OS unit)
R7 -> translation table ( <= 0 => none)
The source coordinates are inclusive at the bottom-left, and exclusive at the
top-right.
When specifying a destination parallelogram, the source rectangle is mapped
onto the destination as follows:
x0,y0 -> X0,Y0
x1,y0 -> X1,Y1
x1,y1 -> X2,Y2
x0,y1 -> X3,Y3
In future it may be possible to set the destination to an arbitrary
quadrilateral, rather than a parallelogram. In order to reserve this
possibility, the current version returns a user-intelligible (-ish) error if
the destination is not a parallelogram.
For PutSpriteTransformed, the sprite is plotted through its mask only
if (a) it has one, and (b) R5 bit 3 is set. R5 is ignored for
PlotMaskTransformed.
The SWI returns an error if any of R3 bits 2..31 are set, to ensure
that these are left clear by software developers.
The SWI covers exactly those pixels on the screen that a call to
Draw_Fill would produce for a rectangle of the same size with the same
transformation matrix, where it is filling to half-way through the boundary.
When plotting using a destination parallelogram, the source rectangle must
be entirely within the sprite. For plotting with a matrix, the source rectangle
will be clipped to the sprite boundaries prior to transformation.
If the source rectangle (after clipping, if using a matrix) has no area, i.e.
x0=x1 OR y0=y1 then an error will be generated, as it is not possible to choose
a colour in which to fill the destination.
Note that the SWI does allow x0>x1 or y0>y1 or both. When plotting with a matrix
there is no difference between x0 and x1 swapped, or y0 and y1 swapped, but when
specifying a destination parallelogram the image will be reflected.
Due to the mechanism of the routine the accuracy is not absolute. The SWI will always
cover the same area as a Draw filled path, but not necessarily with the right source
pixel data from the sprite. The worst possible error (in a fraction of a source pixel)
at one end of the plotted area is given by <destination width or height>/65536.
The table beloe gives more information on the maximum errors attainable:
Destination size Worst possible error in source pixels
5 0.0000763
10 0.0001526
50 0.0007629
100 0.0015259
500 0.0076294
1000 0.0152588
5000 0.0762939
10000 0.1525879
[ The largest output possible is 32767 pixels ]
i.e. When plotting a sprite to a destination width of 5000 pixels, the worst error possible
in the position in the source rectangle of the final pixel plotted is about 1/13 of a source
pixel.
Note that if these errors (usually too small to notice) must be avoided then the sprite should
be plotted in parts - perhaps by dividing the plotting into four areas.
Errors:
Attempt to set reserved flags
Bits 2 to 31 of R0 must be zero in the current specification
Source rectangle area zero
The area of the source rectangle must be non-zero, so the sprite routines will
have some valid colour(s) to plot the output rectangle in. If the area is zero,
there would be no valid colour(s) with which to plot the output.
Source rectangle not inside sprite
The source rectangle must be totally inside the sprite
SpriteExtend can only do linear transformations
The current version of the transformation routines can only perform linear
transformations, and not any arbitrary rotation.
InsertDeleteColumns - InsertDeleteRows
------------------------------------------------
SWI OS_SpriteOp
In: R0 = 57 (SpriteReason_InsertDeleteRows) (+ 0, 256 or 512)
R0 = 58 (SpriteReason_InsertDeleteColumns) (+ 0, 256 or 512)
R1 -> sprite area (if R0 > 255)
R2 -> sprite name or header (depends on R0)
R3 = row/column to start deletion at or insert before
R4 = number of rows/columns to insert (if +ve) or delete (if -ve).
Out:
All registers preserved
For insertion R4>0, and R3 specifies the row or column to insert before. Rows are
numbered from 0 at the bottom, and columns from 0 at the left. Thus inserting before
the first column, i.e. at the left-hand edge, is performed with R3=0. If there are
N rows and M columns in the sprite then R3 can be equal to N if inserting rows, in which
case the rows will be inserted at the top of the sprite. If inserting columns then
R3 can equal M at most, in which case columns will be inserted at the right-hand edge of
the sprite.
The inserted rows/columns will be set to colour 0. If the sprite has a mask then rows/columns
will be inserted into that as well, and the inserted area will be transparent.
For deletion R4<0, and R3 specifies the first row or column to be deleted. The rows/columns
from R3 to R3-R4-1 will be deleted, i.e. R4 = -number of rows to delete. An error will be given
if R3 or R4 are out of range for the sprite.
Subject: SprExtend2
Author: David De Vorchik
History:
30-Jan-91 DDeVorchik Created.
05-Feb-91 DDeVorchik Extended exit params on read size.
This document covers changes made to SpriteExtend after v0.28, these include
the following:
* Adding, removing and checking sprite palettes.
SpriteReason_CreateRemovePalette
--------------------------------
in: r0 = 37, SpriteReason_CreateRemovePalette (+0 / +256 / +512)
r1 -> sprite control block
r2 -> sprite name / -> sprite
r3 = reason code
= -1 : read current palette size
= 0 : remove palette from sprite
<> 0 : add palette to sprite
out: V=1 => r0 -> error block
if r3 =-1 on entry then; r3 = size palette (=0 if none), else all preserved.
r4 -> palette (=0 if none)
r5 = mode
This call simply adds, removes or returns the size of a palette associated
with a given sprite.
It should be noted then when output is switched to a sprite and the palette
is added or removed from it the current display pointers will become invalid
so you should switch output away, modify the palete and switch output back
to the sprite.
> Doc
Title; Sprite Extend
Author; David De Vorchik
Distribution; *Acorn only*
History;
24-Jul-92 DDV Created
4-Aug-92 DDV Added some notes
INTRODUCTION
------------
This document oultines the changes made to Sprite Extend between the Green
and Blue releases. The changes are documented at programmer level, along
with important information about coding changes and bug fixes.
The main changes to the module since the green release is support for the
new sprite format and the ability to render into and from 16 or 32 bit per
pixel depth tiles. Some sprite operations were recoded to be more optimal
and reliable.
SpriteReason_PutSpriteScaled / Transformed
------------------------------------------
in: as before
out: as before
These calls are designed for the old-style sprite format, and will only
work with it. They support input depths upto eight bit per pixel, anything
above will be faulted.
They will render into higher depth modes, ones with 16 or 32 bit per pixel.
ColourTrans and Sprite Extend conspire by using a backwards compatibility
hack, this is when rendering to a mode that has a depth > 8 bit per pixel,
ColourTrans generates an VIDC 1 8 bit per pixel translation table the format
is "bgrt" with two bits per gun and tint.
SpriteExtend then notices that the depth is > 8 and has code optimised to
expand these values out to represent the sprite correctly on the display
device, although the quality is limited in effect to a VIDC 1 mode.
To do
-----
+ Fix the put sprite transformed bug (offset by lh margin)
+ Sort out so handles new header format correctly
Subject: SprExtend2
Author: David De Vorchik
History:
30-Jan-91 DDeVorchik Created.
05-Feb-91 DDeVorchik Extended exit params on read size.
This document covers changes made to SpriteExtend after v0.28, these include
the following:
* Adding, removing and checking sprite palettes.
SpriteReason_CreateRemovePalette
--------------------------------
in: r0 = 37, SpriteReason_CreateRemovePalette (+0 / +256 / +512)
r1 -> sprite control block
r2 -> sprite name / -> sprite
r3 = reason code
= -1 : read current palette size
= 0 : remove palette from sprite
<> 0 : add palette to sprite
out: V=1 => r0 -> error block
if r3 =-1 on entry then; r3 = size palette (=0 if none), else all preserved.
r4 -> palette (=0 if none)
r5 = mode
This call simply adds, removes or returns the size of a palette associated
with a given sprite.
It should be noted then when output is switched to a sprite and the palette
is added or removed from it the current display pointers will become invalid
so you should switch output away, modify the palete and switch output back
to the sprite.
Some source files are distributed under the Independent JPEG Group License:
The authors make NO WARRANTY or representation, either express or implied,
with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy.
This software is copyright (C) 1991, 1992, 1993, 1994, Thomas G. Lane.
All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this
software (or portions thereof) for any purpose, without fee, subject to these
conditions:
(1) If any part of the source code for this software is distributed, then this
README file must be included, with this copyright and no-warranty notice
unaltered; and any additions, deletions, or changes to the original files
must be clearly indicated in accompanying documentation.
(2) If only executable code is distributed, then the accompanying
documentation must state that "this software is based in part on the work of
the Independent JPEG Group".
(3) Permission for use of this software is granted only if the user accepts
full responsibility for any undesirable consequences; the authors accept
NO LIABILITY for damages of any kind.
These conditions apply to any software derived from or based on the IJG code,
not just to the unmodified library. If you use our work, you ought to
acknowledge us.
Permission is NOT granted for the use of any IJG author's name or company name
in advertising or publicity relating to this software or products derived from
it. This software may be referred to only as "the Independent JPEG Group's
software".
We specifically permit and encourage the use of this software as the basis of
commercial products, provided that all warranty or liability claims are
assumed by the product vendor.
Some source code is distributed under the New BSD License:
Copyright (c) 2015, RISC OS Open Ltd
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of RISC OS Open Ltd nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Some source code is distributed under the Apache License:
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
cc -s -depend !Depend -IC: -DRISCOS -DASMHUFF -ff -zps1 -DEMBED c.putscaled
Norcroft RISC OS ARM C vsn 5.06 (Acorn Computers Ltd) [Feb 16 1995]
"c.putscaled", line 3970: Warning: <cast>: cast between function pointer and non-function object
"c.putscaled", line 3987: Warning: <cast>: cast between function pointer and non-function object
"c.putscaled", line 4416: Warning: static 'putscaled_compiler' declared but not used