uifw/AvKon/AknExtendedFader/src/AknExtendedFaderGfx_ARM11.s
changeset 0 2f259fa3e83a
--- /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
+