165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Copyright 2008, The Android Open Source Project
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Licensed under the Apache License, Version 2.0 (the "License");
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** you may not use this file except in compliance with the License.
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** You may obtain a copy of the License at
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**     http://www.apache.org/licenses/LICENSE-2.0
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** Unless required by applicable law or agreed to in writing, software
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** distributed under the License is distributed on an "AS IS" BASIS,
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** See the License for the specific language governing permissions and
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian** limitations under the License.
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*/
1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define LOG_TAG "FakeCamera"
1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/Log.h>
2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <string.h>
2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdlib.h>
2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <utils/String8.h>
2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "FakeCamera.h"
2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// TODO: All this rgb to yuv should probably be in a util class.
3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// TODO: I think something is wrong in this class because the shadow is kBlue
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// and the square color should alternate between kRed and kGreen. However on the
3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// emulator screen these are all shades of gray. Y seems ok but the U and V are
3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// probably not.
3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic int tables_initialized = 0;
3865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianuint8_t *gYTable, *gCbTable, *gCrTable;
3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic int
4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclamp(int  x)
4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (x > 255) return 255;
4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (x < 0)   return 0;
4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return x;
4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* the equation used by the video code to translate YUV to RGB looks like this
4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    Y  = (Y0 - 16)*k0
5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    Cb = Cb0 - 128
5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    Cr = Cr0 - 128
5365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    G = ( Y - k1*Cr - k2*Cb )
5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    R = ( Y + k3*Cr )
5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    B = ( Y + k4*Cb )
5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
5865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
5965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  k0 = 1.164;
6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  k1 = 0.813;
6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  k2 = 0.391;
6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  k3 = 1.596;
6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  k4 = 2.018;
6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* let's try to extract the value of Y
6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
6865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   G + k1/k3*R + k2/k4*B = Y*( 1 + k1/k3 + k2/k4 )
6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   Y  = ( G + k1/k3*R + k2/k4*B ) / (1 + k1/k3 + k2/k4)
7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   Y0 = ( G0 + k1/k3*R0 + k2/k4*B0 ) / ((1 + k1/k3 + k2/k4)*k0) + 16
7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * let define:
7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   kYr = k1/k3
7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   kYb = k2/k4
7665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   kYy = k0 * ( 1 + kYr + kYb )
7765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
7865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * we have:
7965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    Y  = ( G + kYr*R + kYb*B )
8065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    Y0 = clamp[ Y/kYy + 16 ]
8165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
8265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
8365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kYr = k1/k3;
8465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kYb = k2/k4;
8565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double kYy = k0*( 1. + kYr + kYb );
8665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
8765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void
8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianinitYtab( void )
8965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
9065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    const  int imax = (int)( (kYr + kYb)*(31 << 2) + (61 << 3) + 0.1 );
9165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int    i;
9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
9365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    gYTable = (uint8_t *)malloc(imax);
9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for(i=0; i<imax; i++) {
9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int  x = (int)(i/kYy + 16.5);
9765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (x < 16) x = 16;
9865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        else if (x > 235) x = 235;
9965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        gYTable[i] = (uint8_t) x;
10065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
10165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
10265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
10365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
10465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   the source is RGB565, so adjust for 8-bit range of input values:
10565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
10665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   G = (pixels >> 3) & 0xFC;
10765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   R = (pixels >> 8) & 0xF8;
10865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   B = (pixels & 0x1f) << 3;
10965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
11065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   R2 = (pixels >> 11)      R = R2*8
11165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   B2 = (pixels & 0x1f)     B = B2*8
11265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
11365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   kYr*R = kYr2*R2 =>  kYr2 = kYr*8
11465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   kYb*B = kYb2*B2 =>  kYb2 = kYb*8
11565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
11665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   we want to use integer multiplications:
11765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
11865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   SHIFT1 = 9
11965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
12065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   (ALPHA*R2) >> SHIFT1 == R*kYr  =>  ALPHA = kYr*8*(1 << SHIFT1)
12165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
12265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   ALPHA = kYr*(1 << (SHIFT1+3))
12365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   BETA  = kYb*(1 << (SHIFT1+3))
12465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int  SHIFT1  = 9;
12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int  ALPHA   = (int)( kYr*(1 << (SHIFT1+3)) + 0.5 );
12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int  BETA    = (int)( kYb*(1 << (SHIFT1+3)) + 0.5 );
12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  now let's try to get the values of Cb and Cr
13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  R-B = (k3*Cr - k4*Cb)
13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    k3*Cr = k4*Cb + (R-B)
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *    k4*Cb = k3*Cr - (R-B)
13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  R-G = (k1+k3)*Cr + k2*Cb
13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      = (k1+k3)*Cr + k2/k4*(k3*Cr - (R-B)/k0)
14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      = (k1 + k3 + k2*k3/k4)*Cr - k2/k4*(R-B)
14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  kRr*Cr = (R-G) + kYb*(R-B)
14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  Cr  = ((R-G) + kYb*(R-B))/kRr
14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  Cr0 = clamp(Cr + 128)
14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  kRr = (k1 + k3 + k2*k3/k4);
14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void
15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianinitCrtab( void )
15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *pTable;
15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int i;
15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    gCrTable = (uint8_t *)malloc(768*2);
15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    pTable = gCrTable + 384;
15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for(i=-384; i<384; i++)
16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        pTable[i] = (uint8_t) clamp( i/kRr + 128.5 );
16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  B-G = (k2 + k4)*Cb + k1*Cr
16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      = (k2 + k4)*Cb + k1/k3*(k4*Cb + (R-B))
16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      = (k2 + k4 + k1*k4/k3)*Cb + k1/k3*(R-B)
16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  kBb*Cb = (B-G) - kYr*(R-B)
16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  Cb   = ((B-G) - kYr*(R-B))/kBb
17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *  Cb0  = clamp(Cb + 128)
17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
17465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const double  kBb = (k2 + k4 + k1*k4/k3);
17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void
17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianinitCbtab( void )
17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *pTable;
18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int i;
18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    gCbTable = (uint8_t *)malloc(768*2);
18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    pTable = gCbTable + 384;
18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for(i=-384; i<384; i++)
18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        pTable[i] = (uint8_t) clamp( i/kBb + 128.5 );
18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   SHIFT2 = 16
19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   DELTA = kYb*(1 << SHIFT2)
19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *   GAMMA = kYr*(1 << SHIFT2)
19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int  SHIFT2 = 16;
19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int  DELTA  = kYb*(1 << SHIFT2);
19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic const int  GAMMA  = kYr*(1 << SHIFT2);
20065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
20165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint32_t ccrgb16toyuv_wo_colorkey(uint8_t *rgb16, uint8_t *yuv420,
20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        uint32_t *param, uint8_t *table[])
20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint16_t *inputRGB = (uint16_t*)rgb16;
20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *outYUV = yuv420;
20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t width_dst = param[0];
20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t height_dst = param[1];
20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t pitch_dst = param[2];
20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t mheight_dst = param[3];
21065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t pitch_src = param[4];
21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *y_tab = table[0];
21265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *cb_tab = table[1];
21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *cr_tab = table[2];
21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t size16 = pitch_dst*mheight_dst;
21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t i,j,count;
21765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t ilimit,jlimit;
21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *tempY,*tempU,*tempV;
21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint16_t pixels;
22065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int   tmp;
22165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianuint32_t temp;
22265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    tempY = outYUV;
22465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    tempU = outYUV + (height_dst * pitch_dst);
22565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    tempV = tempU + 1;
22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    jlimit = height_dst;
22865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ilimit = width_dst;
22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for(j=0; j<jlimit; j+=1)
23165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    {
23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        for (i=0; i<ilimit; i+=2)
23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        {
23465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            int32_t   G_ds = 0, B_ds = 0, R_ds = 0;
23565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            uint8_t   y0, y1, u, v;
23665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
23765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            pixels =  inputRGB[i];
23865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            temp = (BETA*(pixels & 0x001F) + ALPHA*(pixels>>11) );
23965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            y0   = y_tab[(temp>>SHIFT1) + ((pixels>>3) & 0x00FC)];
24065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
24165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            G_ds    += (pixels>>1) & 0x03E0;
24265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            B_ds    += (pixels<<5) & 0x03E0;
24365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            R_ds    += (pixels>>6) & 0x03E0;
24465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
24565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            pixels =  inputRGB[i+1];
24665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            temp = (BETA*(pixels & 0x001F) + ALPHA*(pixels>>11) );
24765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            y1   = y_tab[(temp>>SHIFT1) + ((pixels>>3) & 0x00FC)];
24865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
24965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            G_ds    += (pixels>>1) & 0x03E0;
25065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            B_ds    += (pixels<<5) & 0x03E0;
25165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            R_ds    += (pixels>>6) & 0x03E0;
25265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
25365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            R_ds >>= 1;
25465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            B_ds >>= 1;
25565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            G_ds >>= 1;
25665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
25765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            tmp = R_ds - B_ds;
25865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
25965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            u = cb_tab[(((B_ds-G_ds)<<SHIFT2) - GAMMA*tmp)>>(SHIFT2+2)];
26065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            v = cr_tab[(((R_ds-G_ds)<<SHIFT2) + DELTA*tmp)>>(SHIFT2+2)];
26165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
26265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            tempY[0] = y0;
26365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            tempY[1] = y1;
26465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            tempY += 2;
26565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
26665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            if ((j&1) == 0) {
26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                tempU[0] = u;
26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                tempV[0] = v;
26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                tempU += 2;
27065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                tempV += 2;
27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            }
27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        inputRGB += pitch_src;
27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return 1;
27865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
27965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
28065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define min(a,b) ((a)<(b)?(a):(b))
28165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define max(a,b) ((a)>(b)?(a):(b))
28265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
28365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic void convert_rgb16_to_yuv420(uint8_t *rgb, uint8_t *yuv, int width, int height)
28465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (!tables_initialized) {
28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        initYtab();
28765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        initCrtab();
28865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        initCbtab();
28965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        tables_initialized = 1;
29065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
29165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
29265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint32_t param[6];
29365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    param[0] = (uint32_t) width;
29465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    param[1] = (uint32_t) height;
29565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    param[2] = (uint32_t) width;
29665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    param[3] = (uint32_t) height;
29765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    param[4] = (uint32_t) width;
29865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    param[5] = (uint32_t) 0;
29965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
30065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint8_t *table[3];
30165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    table[0] = gYTable;
30265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    table[1] = gCbTable + 384;
30365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    table[2] = gCrTable + 384;
30465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
30565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ccrgb16toyuv_wo_colorkey(rgb, yuv, param, table);
30665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
30765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int FakeCamera::kRed;
30965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int FakeCamera::kGreen;
31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int FakeCamera::kBlue;
31165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
31265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianFakeCamera::FakeCamera(int width, int height)
31365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian          : mTmpRgb16Buffer(0)
31465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    setSize(width, height);
31665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
31765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
31865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianFakeCamera::~FakeCamera()
31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    delete[] mTmpRgb16Buffer;
32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::setSize(int width, int height)
32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
32565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mWidth = width;
32665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mHeight = height;
32765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCounter = 0;
32865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCheckX = 0;
32965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCheckY = 0;
33065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
33165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // This will cause it to be reallocated on the next call
33265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // to getNextFrameAsYuv420().
33365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    delete[] mTmpRgb16Buffer;
33465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mTmpRgb16Buffer = 0;
33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
33665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
33765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::getNextFrameAsRgb565(uint16_t *buffer)
33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
33965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int size = mWidth / 10;
34065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
34165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    drawCheckerboard(buffer, size);
34265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
34365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int x = ((mCounter*3)&255);
34465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if(x>128) x = 255 - x;
34565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int y = ((mCounter*5)&255);
34665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if(y>128) y = 255 - y;
34765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
34865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    drawSquare(buffer, x*size/32, y*size/32, (size*5)>>1, (mCounter&0x100)?kRed:kGreen, kBlue);
34965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
35065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCounter++;
35165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
35265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
35365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::getNextFrameAsYuv420(uint8_t *buffer)
35465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
35565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (mTmpRgb16Buffer == 0)
35665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        mTmpRgb16Buffer = new uint16_t[mWidth * mHeight];
35765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
35865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    getNextFrameAsRgb565(mTmpRgb16Buffer);
35965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    convert_rgb16_to_yuv420((uint8_t*)mTmpRgb16Buffer, buffer, mWidth, mHeight);
36065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
36165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
36265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::drawSquare(uint16_t *dst, int x, int y, int size, int color, int shadow)
36365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
36465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int square_xstop, square_ystop, shadow_xstop, shadow_ystop;
36565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
36665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    square_xstop = min(mWidth, x+size);
36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    square_ystop = min(mHeight, y+size);
36865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    shadow_xstop = min(mWidth, x+size+(size/4));
36965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    shadow_ystop = min(mHeight, y+size+(size/4));
37065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
37165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Do the shadow.
37265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint16_t *sh = &dst[(y+(size/4))*mWidth];
37365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for (int j = y + (size/4); j < shadow_ystop; j++) {
37465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        for (int i = x + (size/4); i < shadow_xstop; i++) {
37565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            sh[i] &= shadow;
37665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
37765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sh += mWidth;
37865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
37965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
38065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // Draw the square.
38165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint16_t *sq = &dst[y*mWidth];
38265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for (int j = y; j < square_ystop; j++) {
38365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        for (int i = x; i < square_xstop; i++) {
38465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            sq[i] = color;
38565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
38665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        sq += mWidth;
38765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
38865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
38965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
39065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::drawCheckerboard(uint16_t *dst, int size)
39165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
39265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    bool black = true;
39365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
39465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if((mCheckX/size)&1)
39565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        black = false;
39665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if((mCheckY/size)&1)
39765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        black = !black;
39865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
39965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int county = mCheckY%size;
40065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int checkxremainder = mCheckX%size;
40165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
40265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    for(int y=0;y<mHeight;y++) {
40365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int countx = checkxremainder;
40465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        bool current = black;
40565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        for(int x=0;x<mWidth;x++) {
40665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            dst[y*mWidth+x] = current?0:0xffff;
40765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            if(countx++ >= size) {
40865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                countx=0;
40965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                current = !current;
41065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            }
41165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
41265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if(county++ >= size) {
41365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            county=0;
41465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            black = !black;
41565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
41665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
41765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCheckX += 3;
41865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mCheckY++;
41965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
42065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
42165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
42265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid FakeCamera::dump(int fd) const
42365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
42465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    const size_t SIZE = 256;
42565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    char buffer[SIZE];
42665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    String8 result;
42765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    snprintf(buffer, 255, " width x height (%d x %d), counter (%d), check x-y coordinate(%d, %d)\n", mWidth, mHeight, mCounter, mCheckX, mCheckY);
42865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    result.append(buffer);
42965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    ::write(fd, result.string(), result.size());
43065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
43165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
43265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
43365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android
434