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