svgtopt/gfx2d/src/GfxRenderer/GfxDrawHLine.s
author hgs
Wed, 03 Nov 2010 18:56:10 +0200
changeset 46 88edb906c587
permissions -rw-r--r--
201044

/*
* Copyright (c) 2003 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:  Graphics Extension Library source file
 *
*/

@
@   DrawHLine - Draw a horizontal line Fast!
@
@       Draws a horizontal line using a very fast inner loop which writes pixels
@   in pairs.  If either the first and/or last pixels are not aligned to a
@   4 byte boundary, they are masked into the frame buffer appropriately.
@
@       Entry Parameters:
@
@       r0 = pBuffer.
@       r1 = Color (High 16 bits must be zero).
@       r2 = LeftX.
@       r3 = Width (Can be zero).

        .align  2
        .globl  DrawHLine__20TGfxPolygonRendererPPUsUlii
        .thumb_func
        .code   16

DrawHLine__20TGfxPolygonRendererPPUsUlii:

        push    {r4}
        mov     r4, #3          @ Round pointer to 4 byte boundary.
        bic     r0, r0, r4
        lsl     r4, r1, #16
        lsr     r2, r2, #1      @ First pixel aligned to 4 byte boundary?
        bcc     skip                    @ Yes, skip to loop.

        sub     r3, r3, #1              @ No, decrement count.
        bcc     exit            @ Width was 0!

        ldrh    r2, [r0]        @ Draw first pixel with masking.
        orr     r2, r2, r4
        stmia   r0!, {r2}
skip:   sub     r3, r3, #1      @ Two or more pixels remaining?
        bls     last                    @ No, skip to last pixel.

        orr     r4, r4, r1              @ Yes, combine two pixel patterns.
loop:   stmia   r0!, {r4}       @ Loop to draw aligned pixel pairs.
        sub     r3, r3, #2
        bhi     loop                    @ Two or more pixels remain.

last:   bcc     exit            @ Last pixel remaining?

        ldrh    r4, [r0, #2]            @ Yes, draw last pixel with masking.
        lsl     r4, r4, #16
        orr     r4, r4, r1
        str     r4, [r0]
exit:   pop     {r4}
        bx      lr