col32cb16blend.S revision f9e8ab03bd93d98567e96822535090a877594aba
1f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell/* libs/pixelflinger/col32cb16blend.S 2f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** 3f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** (C) COPYRIGHT 2009 ARM Limited. 4f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** 5f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** Licensed under the Apache License, Version 2.0 (the "License"); 6f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** you may not use this file except in compliance with the License. 7f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** You may obtain a copy of the License at 8f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** 9f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** http://www.apache.org/licenses/LICENSE-2.0 10f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** 11f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** Unless required by applicable law or agreed to in writing, software 12f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** distributed under the License is distributed on an "AS IS" BASIS, 13f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** See the License for the specific language governing permissions and 15f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** limitations under the License. 16f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell** 17f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell*/ 18f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 19f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell .text 20f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell .align 21f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 22f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell .global scanline_col32cb16blend_arm 23f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 24f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// 25f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// This function alpha blends a fixed color into a destination scanline, using 26f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// the formula: 27f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// 28f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// d = s + (((a + (a >> 7)) * d) >> 8) 29f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// 30f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// where d is the destination pixel, 31f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// s is the source color, 32f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// a is the alpha channel of the source color. 33f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// 34f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 35f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// r0 = destination buffer pointer 36f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// r1 = color value 37f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell// r2 = count 38f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 39f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 40f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewellscanline_col32cb16blend_arm: 41f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell push {r4-r10, lr} // stack ARM regs 42f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 43f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r5, r1, lsr #24 // shift down alpha 44f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r9, #0xff // create mask 45f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell add r5, r5, r5, lsr #7 // add in top bit 46f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell rsb r5, r5, #256 // invert alpha 47f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell and r10, r1, #0xff // extract red 48f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell and r12, r9, r1, lsr #8 // extract green 49f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell and r4, r9, r1, lsr #16 // extract blue 50f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r10, r10, lsl #5 // prescale red 51f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r12, r12, lsl #6 // prescale green 52f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r4, r4, lsl #5 // prescale blue 53f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r9, r9, lsr #2 // create dest green mask 54f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 55f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell1: 56f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell ldrh r8, [r0] // load dest pixel 57f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell subs r2, r2, #1 // decrement loop counter 58f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r6, r8, lsr #11 // extract dest red 59f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell and r7, r9, r8, lsr #5 // extract dest green 60f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell and r8, r8, #0x1f // extract dest blue 61f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 62f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell smlabb r6, r6, r5, r10 // dest red * alpha + src red 63f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell smlabb r7, r7, r5, r12 // dest green * alpha + src green 64f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell smlabb r8, r8, r5, r4 // dest blue * alpha + src blue 65f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 66f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r6, r6, lsr #8 // shift down red 67f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r7, r7, lsr #8 // shift down green 68f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell mov r6, r6, lsl #11 // shift red into 565 69f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell orr r6, r7, lsl #5 // shift green into 565 70f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell orr r6, r8, lsr #8 // shift blue into 565 71f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 72f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell strh r6, [r0], #2 // store pixel to dest, update ptr 73f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell bne 1b // if count != 0, loop 74f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 75f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell pop {r4-r10, pc} // return 76f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 77f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 78f9e8ab03bd93d98567e96822535090a877594abaMartyn Capewell 79