1204009b9114b33f184d7178838861d2fa9c9f88cJason Sams/* 2204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * Copyright (C) 2013 The Android Open Source Project 3204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * 4204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * you may not use this file except in compliance with the License. 6204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * You may obtain a copy of the License at 7204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * 8204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * 10204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * Unless required by applicable law or agreed to in writing, software 11204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * See the License for the specific language governing permissions and 14204009b9114b33f184d7178838861d2fa9c9f88cJason Sams * limitations under the License. 15204009b9114b33f184d7178838861d2fa9c9f88cJason Sams */ 16204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 17204009b9114b33f184d7178838861d2fa9c9f88cJason Sams#include "ip.rsh" 18204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 19204009b9114b33f184d7178838861d2fa9c9f88cJason Samsrs_allocation gSrc; 20204009b9114b33f184d7178838861d2fa9c9f88cJason Samsrs_allocation gDest; 21204009b9114b33f184d7178838861d2fa9c9f88cJason Samsrs_allocation gSums; 22204009b9114b33f184d7178838861d2fa9c9f88cJason Samsrs_allocation gSum; 23204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 24204009b9114b33f184d7178838861d2fa9c9f88cJason Samsint gWidth; 25204009b9114b33f184d7178838861d2fa9c9f88cJason Samsint gHeight; 26204009b9114b33f184d7178838861d2fa9c9f88cJason Samsint gStep; 27204009b9114b33f184d7178838861d2fa9c9f88cJason Samsint gSteps; 28204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 29025b5f82971c431eb22df3c9d0f00b3cbe426bdbChris Wailesvoid RS_KERNEL pass1(int in, uint x, uint y) { 30204009b9114b33f184d7178838861d2fa9c9f88cJason Sams for (int i=0; i < (256); i++) { 31204009b9114b33f184d7178838861d2fa9c9f88cJason Sams rsSetElementAt_int(gSums, 0, i, y); 32204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 33204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 34204009b9114b33f184d7178838861d2fa9c9f88cJason Sams for (int i = 0; i < gStep; i++) { 35204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int py = y*gStep + i; 36204009b9114b33f184d7178838861d2fa9c9f88cJason Sams if (py >= gHeight) return; 37204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 38204009b9114b33f184d7178838861d2fa9c9f88cJason Sams for (int px=0; px < gWidth; px++) { 39204009b9114b33f184d7178838861d2fa9c9f88cJason Sams uchar4 c = rsGetElementAt_uchar4(gSrc, px, py); 40204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int lum = (77 * c.r + 150 * c.g + 29 * c.b) >> 8; 41204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 42204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int old = rsGetElementAt_int(gSums, lum, y); 43204009b9114b33f184d7178838861d2fa9c9f88cJason Sams rsSetElementAt_int(gSums, old+1, lum, y); 44204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 45204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 46204009b9114b33f184d7178838861d2fa9c9f88cJason Sams} 47204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 48025b5f82971c431eb22df3c9d0f00b3cbe426bdbChris Wailesint RS_KERNEL pass2(uint x) { 49204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int sum = 0; 50204009b9114b33f184d7178838861d2fa9c9f88cJason Sams for (int i=0; i < gSteps; i++) { 51204009b9114b33f184d7178838861d2fa9c9f88cJason Sams sum += rsGetElementAt_int(gSums, x, i); 52204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 53204009b9114b33f184d7178838861d2fa9c9f88cJason Sams return sum; 54204009b9114b33f184d7178838861d2fa9c9f88cJason Sams} 55204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 56204009b9114b33f184d7178838861d2fa9c9f88cJason Samsvoid rescale() { 57204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int maxv = 0; 58204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 59204009b9114b33f184d7178838861d2fa9c9f88cJason Sams for (int i=0; i < 256; i++) { 60204009b9114b33f184d7178838861d2fa9c9f88cJason Sams maxv = max(maxv, rsGetElementAt_int(gSum, i)); 61204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 62204009b9114b33f184d7178838861d2fa9c9f88cJason Sams float overMax = (1.f / maxv) * gHeight; 63204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 64204009b9114b33f184d7178838861d2fa9c9f88cJason Sams for (int i=0; i < 256; i++) { 65204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int t = rsGetElementAt_int(gSum, i); 66204009b9114b33f184d7178838861d2fa9c9f88cJason Sams t = gHeight - (overMax * rsGetElementAt_int(gSum, i)); 67204009b9114b33f184d7178838861d2fa9c9f88cJason Sams t = max(0, t); 68204009b9114b33f184d7178838861d2fa9c9f88cJason Sams rsSetElementAt_int(gSum, t, i); 69204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 70204009b9114b33f184d7178838861d2fa9c9f88cJason Sams} 71204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 72204009b9114b33f184d7178838861d2fa9c9f88cJason Samsstatic const uchar4 gClear = {0, 0, 0, 0xff}; 73204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 74025b5f82971c431eb22df3c9d0f00b3cbe426bdbChris Wailesuchar4 RS_KERNEL clear() { 75204009b9114b33f184d7178838861d2fa9c9f88cJason Sams return gClear; 76204009b9114b33f184d7178838861d2fa9c9f88cJason Sams} 77204009b9114b33f184d7178838861d2fa9c9f88cJason Sams 78025b5f82971c431eb22df3c9d0f00b3cbe426bdbChris Wailesuchar4 RS_KERNEL draw(uint x, uint y) { 79204009b9114b33f184d7178838861d2fa9c9f88cJason Sams int l = rsGetElementAt_int(gSum, x >> 2); 80204009b9114b33f184d7178838861d2fa9c9f88cJason Sams if (y > l) { 81204009b9114b33f184d7178838861d2fa9c9f88cJason Sams return 0xff; 82204009b9114b33f184d7178838861d2fa9c9f88cJason Sams } 83204009b9114b33f184d7178838861d2fa9c9f88cJason Sams return gClear; 84204009b9114b33f184d7178838861d2fa9c9f88cJason Sams} 85