--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/AknExtendedFader/src/AknExtendedFaderGfx_ARM11.s Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,194 @@
+;
+; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of "Eclipse Public License v1.0"
+; which accompanies this distribution, and is available
+; at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;
+; Initial Contributors:
+; Nokia Corporation - initial contribution.
+;
+; Contributors:
+;
+; Description:
+;
+
+; A macro for transparently defining ARM functions with THUMB calling conventions.
+ MACRO
+$func Entry
+ AREA Entry_$func, CODE
+ GLOBAL $func
+ ALIGN 2
+ CODE16
+$func
+ bx pc ; go to ARM mode
+ nop
+ CODE32
+ MEND
+
+
+ ; Trashes $temp, result is in $pixel
+ MACRO
+$label Pixel_GrayColorize_16MX $pixel, $rbCoef, $gCoef, $fadeMapFactor, $fadeMapOffset, $rbOverlay, $gOverlay, $temp
+$label
+ ; Separate RB (temp = pixel & 0x00FF00FF)
+ bic $temp, $pixel, #0xFF000000 ; temp = pixel & 0x00FFFFFF
+ bic $temp, $temp, #0x0000FF00 ; temp = pixel & 0x00FF00FF
+
+ ; Separate G
+ uxtb $pixel, $pixel, ror #8 ; pixel = (pixel & 0x0000FF00) >> 8);
+
+ ; Calculate unadjusted grayscale intensity
+ smuad $temp, $temp, $rbCoef ; temp = r*rCoef + b*bCoef;
+ smlabb $pixel, $pixel, $gCoef, $temp ; pixel = g*gCoef + temp
+
+ ; Do fading and adjustment (aFadeMapOffset is already shifted left 18 bits so we can do single accumulating mul)
+ mla $pixel, $pixel, $fadeMapFactor, $fadeMapOffset ; pixel = pixel * fadeMapFactor + fadeMapOffset
+ mov $pixel, $pixel, lsr #18 ; pixel = pixel >> 18
+ and $pixel, $pixel, #0x000000ff ; pixel &= 0x000000ff
+
+ ; Calculate final AXGX
+ mul $temp, $pixel, $gOverlay ; g = pixel * gOverlay
+ and $temp, $temp, #0x0000FF00 ; g &= 0x0000FF00
+ orr $temp, $temp, #0xFF000000 ; g |= 0xFF000000
+
+ ; Calculate final RXBX
+ mul $pixel, $rbOverlay, $pixel ; pixel = r*rOverlay | b*bOverlay
+ bic $pixel, $pixel, #0x00FF0000 ; pixel &= 0xFF00FF00
+ bic $pixel, $pixel, #0x000000FF
+
+ ; Combine A,G with R,B
+ orr $pixel, $temp, $pixel, LSR #8 ; pixel = ag | (rb>>8);
+
+ MEND
+
+;----------------------
+; FadeAlignedRect_GrayColorize_16MX
+;
+; Param: address Scanline start address (r0)
+; Param: height Number of scanlines (r1)
+; Param: rbCoef R&B coefficients as a 16x16 (r2)
+; Param: gCoef G coefficient (r3)
+; Param: fadeMapFactor Fade map factor (s0 -> r4)
+; Param: fadeMapOffset Fade map offset (s1 -> r5)
+; Param: rbOverlay R&B overlay as 0x00RR00BB (s2 -> r6)
+; Param: gOverlay G overlay as 0x000000GG (s3 -> r7)
+; Param: leftwidth Number of unaligned pixels on left (s4)
+; Param: middlewidth Number of aligned sections (s5)
+; Param: rightwidth Number of unaligned pixels on right (s6)
+; Param: padding Extra pixels on scanline (s7)
+;----------------------
+
+FadeAlignedRect_GrayColorize_16MX Entry
+ ARM
+ ; Push registers to stack
+ PUSH { r4-r12, r14 }
+
+ ; Read the commonly needed values from stack
+ add r8, sp, #10 * 4
+ ldmia r8, {r4-r7}
+
+ mov r14, r1
+
+yloop_start
+ ;while(--height>=0)
+ subs r14, r14, #1
+ bmi yloop_end
+
+ ; x = leftwidth
+ add r1, sp, #14 * 4
+ ldr r1, [r1]
+
+ ; Left unaligned section processing
+xloop_left_start
+ subs r1, r1, #1
+ bmi xloop_left_end
+
+ ; Load pixel
+ ldr r8, [r0]
+
+ ; Process pixel
+ Pixel_GrayColorize_16MX r8, r2, r3, r4, r5, r6, r7, r12
+
+ ; Write pixel
+ str r8, [r0], #4
+
+ ; Loop
+ b xloop_left_start
+xloop_left_end
+
+
+ ; x = middlewidth
+ add r1, sp, #15 * 4
+ ldr r1, [r1]
+
+ ; Aligned section processing
+xloop_middle_start
+ subs r1, r1, #1
+ bmi xloop_middle_end
+
+ ; Load 4 pixels straight-away
+ ldmia r0, {r8-r11}
+
+ ; Hint cache about preloading next 8 pixels
+ pld [r0, #32]
+
+ ; Process the first four pixels
+ Pixel_GrayColorize_16MX r8, r2, r3, r4, r5, r6, r7, r12
+ Pixel_GrayColorize_16MX r9, r2, r3, r4, r5, r6, r7, r12
+ Pixel_GrayColorize_16MX r10, r2, r3, r4, r5, r6, r7, r12
+ Pixel_GrayColorize_16MX r11, r2, r3, r4, r5, r6, r7, r12
+
+ ; Store four pixels
+ stmia r0!, {r8-r11}
+
+ ; Load next four
+ ldmia r0, {r8-r11}
+
+ ; Process the next four pixels
+ Pixel_GrayColorize_16MX r8, r2, r3, r4, r5, r6, r7, r12
+ Pixel_GrayColorize_16MX r9, r2, r3, r4, r5, r6, r7, r12
+ Pixel_GrayColorize_16MX r10, r2, r3, r4, r5, r6, r7, r12
+ Pixel_GrayColorize_16MX r11, r2, r3, r4, r5, r6, r7, r12
+
+ ; Store four pixels
+ stmia r0!, {r8-r11}
+
+ ; Loop
+ b xloop_middle_start
+xloop_middle_end
+
+ ; x = rightwidth
+ add r1, sp, #16 * 4
+ ldr r1, [r1]
+
+xloop_right_start
+ subs r1, r1, #1
+ bmi xloop_right_end
+
+ ; Load pixel
+ ldr r8, [r0]
+
+ ; Process pixel
+ Pixel_GrayColorize_16MX r8, r2, r3, r4, r5, r6, r7, r12
+
+ ; Write pixel
+ str r8, [r0], #4
+
+ b xloop_right_start
+xloop_right_end
+
+ ; data += padding
+ add r1, sp, #17 * 4
+ ldr r1, [r1]
+ add r0, r0, r1
+
+ b yloop_start
+yloop_end
+
+ POP { r4-r12, r14 }
+
+ bx lr
+ END
+