fb_test.c revision 365aff4dc3f21d14b03633f3629f69d71b39c74e
1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/*
2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License.
6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at
7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *
10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and
14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License.
15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */
16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h>
18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h>
19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <fcntl.h>
21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h>
22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/ioctl.h>
24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/mman.h>
25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h>
26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h>
27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <linux/fb.h>
29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <linux/kd.h>
30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <pixelflinger/pixelflinger.h>
32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include "minui.h"
34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef struct {
36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    GGLSurface texture;
37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned cwidth;
38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned cheight;
39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    unsigned ascent;
40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} GRFont;
41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic GGLContext *gr_context = 0;
43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic GGLSurface gr_framebuffer[2];
44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic unsigned gr_active_fb = 0;
45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int gr_fb_fd = -1;
47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int gr_vt_fd = -1;
48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic struct fb_var_screeninfo vi;
50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct fb_fix_screeninfo fi;
51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct timespec tv, tv2;
52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void dumpinfo(struct fb_fix_screeninfo *fi,
54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project                     struct fb_var_screeninfo *vi);
55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int get_framebuffer(GGLSurface *fb)
57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int fd;
59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    void *bits;
60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fd = open("/dev/graphics/fb0", O_RDWR);
62acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    if (fd < 0) {
63acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        printf("cannot open /dev/graphics/fb0, retrying with /dev/fb0\n");
64acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if ((fd = open("/dev/fb0", O_RDWR)) < 0) {
65acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            perror("cannot open /dev/fb0");
66acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            return -1;
67acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        }
68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) {
71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        perror("failed to get fb0 info");
72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) {
76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        perror("failed to get fb0 info");
77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    dumpinfo(&fi, &vi);
81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(bits == MAP_FAILED) {
84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        perror("failed to mmap framebuffer");
85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->version = sizeof(*fb);
89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->width = vi.xres;
90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->height = vi.yres;
91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->stride = fi.line_length / (vi.bits_per_pixel >> 3);
92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->data = bits;
93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->format = GGL_PIXEL_FORMAT_RGB_565;
94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb++;
96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->version = sizeof(*fb);
98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->width = vi.xres;
99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->height = vi.yres;
100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->stride = fi.line_length / (vi.bits_per_pixel >> 3);
101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->data = (void*) (((unsigned) bits) + vi.yres * vi.xres * 2);
102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fb->format = GGL_PIXEL_FORMAT_RGB_565;
103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return fd;
105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void set_active_framebuffer(unsigned n)
108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(n > 1) return;
110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    vi.yres_virtual = vi.yres * 2;
111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    vi.yoffset = n * vi.yres;
112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) {
113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        fprintf(stderr,"active fb swap failed!\n");
114365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin    } else
115365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin        printf("active buffer: %d\n", n);
116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void dumpinfo(struct fb_fix_screeninfo *fi, struct fb_var_screeninfo *vi)
119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.xres = %d\n", vi->xres);
121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.yres = %d\n", vi->yres);
122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.xresv = %d\n", vi->xres_virtual);
123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.yresv = %d\n", vi->yres_virtual);
124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.xoff = %d\n", vi->xoffset);
125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr,"vi.yoff = %d\n", vi->yoffset);
126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr, "vi.bits_per_pixel = %d\n", vi->bits_per_pixel);
127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    fprintf(stderr, "fi.line_length = %d\n", fi->line_length);
129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_init(void)
133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
134acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    int fd = -1;
135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
136acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    if (!access("/dev/tty0", F_OK)) {
137acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        fd = open("/dev/tty0", O_RDWR | O_SYNC);
138acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if(fd < 0)
139acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            return -1;
140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
141acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if(ioctl(fd, KDSETMODE, (void*) KD_GRAPHICS)) {
142acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            close(fd);
143acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            return -1;
144acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        }
145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gr_fb_fd = get_framebuffer(gr_framebuffer);
148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    if(gr_fb_fd < 0) {
150acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        if (fd >= 0) {
151acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            ioctl(fd, KDSETMODE, (void*) KD_TEXT);
152acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin            close(fd);
153acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        }
154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        return -1;
155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    }
156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gr_vt_fd = fd;
158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project        /* start with 0 as front (displayed) and 1 as back (drawing) */
160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gr_active_fb = 0;
161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    set_active_framebuffer(0);
162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return 0;
164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid gr_exit(void)
167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    close(gr_fb_fd);
169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    gr_fb_fd = -1;
170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
171acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    if (gr_vt_fd >= 0) {
172acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT);
173acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        close(gr_vt_fd);
174acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin        gr_vt_fd = -1;
175acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin    }
176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
178e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_fb_width(void)
179e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
180e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return gr_framebuffer[0].width;
181e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
182e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_fb_height(void)
184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    return gr_framebuffer[0].height;
186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
187e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t red = 0xf800;
189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t green = 0x07e0;
190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t blue = 0x001f;
191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
192e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid draw_grid(int w, int h, uint16_t* loc) {
193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int i, j;
194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int v;
195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int stride = fi.line_length / (vi.bits_per_pixel >> 3);
196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  for (j = 0; j < h/2; j++) {
198e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (i = 0; i < w/2; i++)
199e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project      loc[i + j*(stride)] = red;
200e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (; i < w; i++)
201e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project      loc[i + j*(stride)] = green;
202e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  }
203e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  for (; j < h; j++) {
204e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (i = 0; i < w/2; i++)
205e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project      loc[i + j*(stride)] = blue;
206e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (; i < w; i++)
207e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project      loc[i + j*(stride)] = 0xffff;
208e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  }
209e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
210e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
211e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
212e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid clear_screen(int w, int h, uint16_t* loc)
213e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{
214e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int i,j;
215e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    int stride = fi.line_length / (vi.bits_per_pixel >> 3);
216e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
217e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  for (j = 0; j < h; j++)
218e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    for (i = 0; i < w; i++)
219e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project      loc[i + j*(stride)] = 0x0000;
220e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
221e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
222e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char **argv) {
223e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int w;
224e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  int h;
225365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  int id = 0;
226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  gr_init();
227e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  w = vi.xres;
228e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  h = vi.yres;
229e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  clear_screen(w, h, (uint16_t *)gr_framebuffer[0].data);
230365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  clear_screen(w, h, (uint16_t *)gr_framebuffer[1].data);
231e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
232e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  if (argc > 2) {
233e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    w = atoi(argv[1]);
234e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project    h = atoi(argv[2]);
235e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  }
236e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
237365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  if (argc > 3)
238365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin      id = !!atoi(argv[3]);
239365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin
240365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  draw_grid(w, h, (uint16_t *)gr_framebuffer[id].data);
241365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  set_active_framebuffer(!id);
242365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin  set_active_framebuffer(id);
243e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project
244e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project  return 0;
245e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project}
246