+int find_video_mode_idx(int xsz, int ysz, int bpp)
+{
+ int i, best = -1, best_bpp = 0;
+ struct vbe_mode_info *inf;
+
+ if(init_once() == -1) return -1;
+
+ for(i=0; i<mode_count; i++) {
+ inf = vbe_get_mode_info(modes[i] | VBE_MODE_LFB);
+ if(!inf || inf->xres != xsz || inf->yres != ysz) {
+ continue;
+ }
+ if((bpp <= 0 && inf->bpp > best_bpp) || SAME_BPP(inf->bpp, bpp)) {
+ best = i;
+ best_bpp = inf->bpp;
+ }
+ }
+
+ if(best == -1) {
+ printf("Requested video mode (%dx%d %dbpp) is unavailable\n", xsz, ysz, bpp);
+ return -1;
+ }
+ return best;
+}
+
+int video_mode_count(void)
+{
+ if(init_once() == -1) return 0;
+ return mode_count;
+}
+
+int video_mode_info(int n, struct video_mode *vid)
+{
+ struct vbe_mode_info *inf;
+
+ if(init_once() == -1) return -1;
+
+ if(!(inf = vbe_get_mode_info(modes[n] | VBE_MODE_LFB))) {
+ return -1;
+ }
+ vid->mode = modes[n];
+ vid->width = inf->xres;
+ vid->height = inf->yres;
+ vid->bpp = inf->bpp;
+ vid->rbits = inf->rmask_size;
+ vid->gbits = inf->gmask_size;
+ vid->bbits = inf->bmask_size;
+ vid->rshift = inf->rpos;
+ vid->gshift = inf->gpos;
+ vid->bshift = inf->bpos;
+ vid->rmask = color_mask(inf->rmask_size, inf->rpos);
+ vid->gmask = color_mask(inf->gmask_size, inf->gpos);
+ vid->bmask = color_mask(inf->bmask_size, inf->bpos);
+ return 0;
+}
+