1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
@ ScummVM - Graphic Adventure Engine
@
@ ScummVM is the legal property of its developers, whose names
@ are too numerous to list here. Please refer to the COPYRIGHT
@ file distributed with this source distribution.
@
@ This program is free software; you can redistribute it and/or
@ modify it under the terms of the GNU General Public License
@ as published by the Free Software Foundation; either version 2
@ of the License, or (at your option) any later version.
@
@ This program is distributed in the hope that it will be useful,
@ but WITHOUT ANY WARRANTY; without even the implied warranty of
@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@ GNU General Public License for more details.
@
@ You should have received a copy of the GNU General Public License
@ along with this program; if not, write to the Free Software
@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@
@ @author Robin Watts (robin@wss.co.uk)
@ For 16 source pixels 0123456789ABCDEF, we want to produce 11 output
@ pixels.
@0000000000011111111111222222222223333333333344444444444555555555
@<------||------><------||------><------||------><------||------>
@5566666666666777777777778888888888899999999999AAAAAAAAAAABBBBBBB
@<------||------><------||------><------||------><------||------>
@BBBBCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEEFFFFFFFFFFF
@<------||------><------||------><------||------>
@ So, use the following weights (approximately right)
@ d0 = (3*s0 + 1*s1)>>2 Every source pixel constitutes
@ d1 = (2*s1 + 2*s2)>>2 3/4 of a destination pixel,
@ d2 = (1*s2 + 3*s3)>>2 except for s4,s5,sA and sB which
@ d3 = (2*s4 + 2*s5)>>2 constitute 1/2 each.
@ d4 = (3*s6 + 1*s7)>>2
@ d5 = (2*s7 + 2*s8)>>2
@ d6 = (1*s8 + 3*s9)>>2
@ d7 = (2*sA + 2*sB)>>2
@ d8 = (3*sC + 1*sD)>>2
@ d9 = (2*sD + 2*sE)>>2
@ dA = (1*sE + 3*sF)>>2
.text
.global SmartphoneLandscapeARM
@ scales a width x height block of 16bpp pixels from srcPtr to dstPtr,
@ scaling each scanline down by 11/16ths. Every 8th scanline is dropped
@ srcPitch and dstPitch identify how to reach subsequent lines.
@ mask allows for one routine to do both 565 and 565 formats.
SmartphoneLandscapeARM:
@ r0 = srcPtr
@ r1 = srcSpan
@ r2 = dstPtr
@ r3 = dstSpan
@ <> = width
@ <> = height
@ <> = mask
MOV r12,r13
STMFD r13!,{r4-r11,r14}
LDMFD r12,{r4,r5,r11} @ r4 = width
@ r5 = height
@ r11= mask
MOV r7, #7 @ r7 = line
SUB r8, r1, r4, LSL #1 @ r8 = srcSpan - width*2
y_loop:
MOV r6, r4 @ r6 = i
MOV r9, r2 @ r9 = dstPtr
x_loop:
LDRH r14,[r0],#2 @ r14 = s0
LDRH r12,[r0],#2 @ r12 = s1
LDRH r10,[r0],#2 @ r10 = s2
ORR r14,r14,r14,LSL #16 @ r14 = s0s0
ORR r12,r12,r12,LSL #16 @ r12 = s1s1
AND r14,r14,r11 @ r14 = s0 as g_b_r
AND r12,r12,r11 @ r12 = s1 as g_b_r
ADD r14,r14,r14,LSL #1 @ r14 = s0*3 as g_b_r
ORR r10,r10,r10,LSL #16 @ r10 = s2s2
ADD r14,r14,r12 @ r14 = (s0*3 + s1) as g_b_r
AND r10,r10,r11 @ r10 = s2 as g_b_r
AND r14,r11,r14,LSR #2 @ r14 = d0 as g_b_r
ORR r14,r14,r14,LSR #16 @ r14 = d0
STRH r14,[r9],#2 @ store d0
ADD r12,r12,r10 @ r12 = (s1 + s2) as g_b_r
LDRH r14,[r0],#2 @ r14 = s3
AND r12,r11,r12,LSR #1 @ r12 = d1 as g_b_r
ORR r12,r12,r12,LSR #16 @ r12 = d1
STRH r12,[r9],#2 @ store d1
ORR r14,r14,r14,LSL #16 @ r14 = s3s3
AND r14,r14,r11 @ r14 = s3 as g_b_r
ADD r10,r10,r14 @ r10 = (s2 + s3) as g_b_r
ADD r10,r10,r14,LSL #1 @ r10 = (s2 + s3*3) as g_b_r
LDRH r14,[r0],#2 @ r14 = s4
LDRH r12,[r0],#2 @ r12 = s5
AND r10,r11,r10,LSR #2 @ r10 = d2 as g_b_r
ORR r10,r10,r10,LSR #16 @ r10 = d2
STRH r10,[r9],#2 @ store d2
ORR r14,r14,r14,LSL #16 @ r14 = s4s4
ORR r12,r12,r12,LSL #16 @ r12 = s5s5
AND r14,r14,r11 @ r14 = s4 as g_b_r
AND r12,r12,r11 @ r12 = s5 as g_b_r
ADD r14,r14,r12 @ r14 = (s4 + s5) as g_b_r
LDRH r12,[r0],#2 @ r12 = s6
LDRH r10,[r0],#2 @ r10 = s7
AND r14,r11,r14,LSR #1 @ r14 = d3 as g_b_r
ORR r14,r14,r14,LSR #16 @ r14 = d3
STRH r14,[r9],#2 @ store d3
ORR r12,r12,r12,LSL #16 @ r12 = s6s6
ORR r10,r10,r10,LSL #16 @ r10 = s7s7
LDRH r14,[r0],#2 @ r14 = s8
AND r12,r12,r11 @ r12 = s6 as g_b_r
AND r10,r10,r11 @ r10 = s7 as g_b_r
ORR r14,r14,r14,LSL #16 @ r14 = s8s8
ADD r12,r12,r12,LSL #1 @ r12 = 3*s6 as g_b_r
AND r14,r14,r11 @ r14 = s8 as g_b_r
ADD r12,r12,r10 @ r12 = (3*s6+s7) as g_b_r
AND r12,r11,r12,LSR #2 @ r12 = d4 as g_b_r
ORR r12,r12,r12,LSR #16 @ r12 = d4
STRH r12,[r9],#2 @ store d4
ADD r10,r10,r14 @ r10 = (s7+s8) as g_b_r
AND r10,r11,r10,LSR #1 @ r10 = d5 as g_b_r
LDRH r12,[r0],#2 @ r12 = s9
ORR r10,r10,r10,LSR #16 @ r10 = d5
STRH r10,[r9],#2 @ store d5
ORR r12,r12,r12,LSL #16 @ r12 = s9s9
AND r12,r12,r11 @ r12 = s9 as g_b_r
ADD r12,r12,r12,LSL #1 @ r12 = s9*3 as g_b_r
ADD r12,r12,r14 @ r12 = (s8+s9*3) as g_b_r
AND r12,r11,r12,LSR #2 @ r12 = d6 as g_b_r
LDRH r14,[r0],#2 @ r14 = sA
LDRH r10,[r0],#2 @ r10 = sB
ORR r12,r12,r12,LSR #16 @ r12 = d6
STRH r12,[r9],#2 @ store d6
ORR r14,r14,r14,LSL #16 @ r14 = sAsA
ORR r10,r10,r10,LSL #16 @ r10 = sBsB
LDRH r12,[r0],#2 @ r12 = sC
AND r14,r14,r11 @ r14 = sA as g_b_r
AND r10,r10,r11 @ r10 = sB as g_b_r
ORR r12,r12,r12,LSL #16 @ r12 = sCsC
ADD r14,r14,r10 @ r14 = (sA + sB) as g_b_r
LDRH r10,[r0],#2 @ r10 = sD
AND r14,r11,r14,LSR #1 @ r14 = d7 as g_b_r
AND r12,r12,r11 @ r12 = sC as g_b_r
ORR r14,r14,r14,LSR #16 @ r14 = d7
ORR r10,r10,r10,LSL #16 @ r10 = sDsD
STRH r14,[r9],#2 @ store d7
AND r10,r10,r11 @ r10 = sD as g_b_r
ADD r12,r12,r12,LSL #1 @ r12 = 3*sC as g_b_r
LDRH r14,[r0],#2 @ r14 = sE
ADD r12,r12,r10 @ r12 = (3*sC+sD) as g_b_r
AND r12,r11,r12,LSR #2 @ r12 = d8 as g_b_r
ORR r14,r14,r14,LSL #16 @ r14 = sEsE
ORR r12,r12,r12,LSR #16 @ r12 = d8
AND r14,r14,r11 @ r14 = sE as g_b_r
STRH r12,[r9],#2 @ store d8
ADD r10,r10,r14 @ r10 = (sD+sE) as g_b_r
LDRH r12,[r0],#2 @ r12 = sF
AND r10,r11,r10,LSR #1 @ r10 = d9 as g_b_r
ORR r10,r10,r10,LSR #16 @ r10 = d9
STRH r10,[r9],#2 @ store d9
ORR r12,r12,r12,LSL #16 @ r12 = sFsF
AND r12,r12,r11 @ r12 = sF as g_b_r
ADD r12,r12,r12,LSL #1 @ r12 = 3*sF as g_b_r
ADD r12,r12,r14 @ r12 = (sE+3*sF) as g_b_r
AND r12,r11,r12,LSR #2 @ r12 = dA as g_b_r
ORR r12,r12,r12,LSR #16 @ r12 = dA
SUBS r6,r6,#16 @ width -= 16
STRH r12,[r9],#2 @ store dA
BGT x_loop
ADD r0, r0, r8 @ srcPtr += srcSpan
ADD r2, r2, r3 @ dstPtr += dstSpan
SUBS r7, r7, #1
ADDEQ r0, r0, r1
MOVEQ r7, #7
SUBEQ r5, r5, #1
SUBS r5, r5, #1
BGT y_loop
LDMFD r13!,{r4-r11,PC}
|