Subversion Repositories HelenOS

Rev

Rev 1365 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1363 vana 1
/*
2
 * Copyright (C) 2006 Jakub Vana
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
28
 
29
#include <stdio.h>
30
#include <ddi.h>
31
#include <task.h>
32
#include <stdlib.h>
33
#include <ddi.h>
34
#include <sysinfo.h>
35
#include <align.h>
36
#include <as.h>
37
#include <ipc/fb.h>
38
 
39
 
40
#include <ipc/ipc.h>
41
#include <ipc/services.h>
42
#include <unistd.h>
43
#include <stdlib.h>
44
#include <ipc/ns.h>
45
 
46
#include <kernel/errno.h>
47
 
48
 
49
#include "fb.h"
50
 
51
 
52
 
53
#define pl /*printf("FB:L:%d\n",(int)__LINE__);*/
54
 
55
#define EFB (-1)
56
 
57
extern int __DONT_OPEN_STDIO__=1;
58
 
59
#define DEFAULT_BGCOLOR		0x000080
60
#define DEFAULT_FGCOLOR		0xffff00
61
#define DEFAULT_LOGOCOLOR	0x0000ff
62
 
63
#define MAIN_BGCOLOR		0x404000
64
#define MAIN_FGCOLOR		0x000000
65
#define MAIN_LOGOCOLOR	0x404000
66
 
67
#define SPACING (2)
68
 
69
#define H_NO_VFBS 3
70
#define V_NO_VFBS 3
71
 
72
 
73
static void fb_putchar(int item,char ch);
74
int create_window(int item,unsigned int x, unsigned int y,unsigned int x_size, unsigned int y_size,
75
	unsigned int BGCOLOR,unsigned int FGCOLOR,unsigned int LOGOCOLOR);
76
void fb_init(int item,__address addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan,
77
	unsigned int BGCOLOR,unsigned int FGCOLOR,unsigned int LOGOCOLOR);
78
 
79
 
80
unsigned int mod_col(unsigned int col,int mod);
81
 
82
 
83
 
84
 
85
 
86
int main(int argc, char *argv[])
87
{
88
 
89
	__address fb_ph_addr;
90
	unsigned int fb_width;
91
	unsigned int fb_height;
92
	unsigned int fb_bpp;
93
	unsigned int fb_scanline;
94
	__address fb_addr;
95
	int a=0;
96
 
97
 
98
	if(!sysinfo_value("fb")) return -1;
99
 
100
	fb_ph_addr=sysinfo_value("fb.address.physical");
101
	fb_width=sysinfo_value("fb.width");
102
	fb_height=sysinfo_value("fb.height");
103
	fb_bpp=sysinfo_value("fb.bpp");
104
	fb_scanline=sysinfo_value("fb.scanline");
105
 
106
	fb_addr=ALIGN_UP(((__address)set_maxheapsize(USER_ADDRESS_SPACE_SIZE_ARCH>>1)),PAGE_SIZE);
107
 
108
 
109
 
110
	map_physmem(task_get_id(),(void *)((__address)fb_ph_addr),(void *)fb_addr,
111
		(fb_scanline*fb_height+PAGE_SIZE-1)>>PAGE_WIDTH,1);
112
 
113
	fb_init(0,fb_addr, fb_width, fb_height, fb_bpp, fb_scanline,
114
		MAIN_BGCOLOR,MAIN_FGCOLOR,MAIN_LOGOCOLOR);
115
 
116
	fb_putchar(0,'\n');
117
	fb_putchar(0,' ');
118
 
119
 
120
	{
121
		int i,j;
122
 
123
		for(i=0;i<H_NO_VFBS;i++)
124
			for(j=0;j<V_NO_VFBS;j++)
125
			{
126
 
127
				int w=create_window(0,(fb_width/H_NO_VFBS)*i+SPACING,
128
					(fb_height/V_NO_VFBS)*j+SPACING,(fb_width/H_NO_VFBS)-2*SPACING ,
129
						(fb_height/V_NO_VFBS)-2*SPACING,mod_col(DEFAULT_BGCOLOR,/*i+j*H_NO_VFBS*/0),
130
							mod_col(DEFAULT_FGCOLOR,/*i+j*H_NO_VFBS*/0),
131
								mod_col(DEFAULT_LOGOCOLOR,/*i+j*H_NO_VFBS)*/0));
132
 
133
				if(w==EFB) return -1;
134
 
135
				{
136
					char text[]="Hello, World from\nHelenOS Framebuffer driver\non Virtual Framebuffer\nVFB ";
137
					int i;
138
					for(i=0;text[i];i++) fb_putchar(w,text[i]);
139
					fb_putchar(w,w+'0');
140
					fb_putchar(w,'\n');
141
				}
142
			}
143
	}
144
 
145
 
146
	ipc_call_t call;
147
	ipc_callid_t callid;
148
	char connected = 0;
149
	int res;
150
	int c;
151
	ipcarg_t phonead;
152
 
153
	ipcarg_t retval, arg1, arg2;
154
 
155
 
156
 
157
	if ((res = ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, &phonead)) != 0) 
158
	{
159
		return -1;
160
	};
161
 
162
 
163
	while (1) {
164
		static int vfb_no=1;
165
 
166
		callid = ipc_wait_for_call(&call, 0);
167
	//	printf("%s:Call phone=%lX..", NAME, call.in_phone_hash);
168
		switch (IPC_GET_METHOD(call)&((1<<METHOD_WIDTH)-1)) {
169
			case IPC_M_PHONE_HUNGUP:
170
//				fb_putchar(4,((a++)&15)+'A');
171
 
172
				retval = 0;
173
				break;
174
			case IPC_M_CONNECT_ME_TO:
175
					retval = 0;
176
//				fb_putchar(1,((a++)&15)+'A');
177
				break;
178
			case FB_GET_VFB:
179
				retval = 0;
180
				arg1 = vfb_no++;	
181
//				fb_putchar(2,((a++)&15)+'A');
182
 
183
				break;
184
 
185
			case FB_PUTCHAR:
186
				retval = 0;
187
				fb_putchar(IPC_GET_ARG1(call),IPC_GET_ARG2(call));
188
//				fb_putchar(2,((a++)&15)+'A');
189
				break;
190
 
191
			default:
192
				retval = ENOENT;
193
//				fb_putchar(3,((a++)&15)+'A');
194
				break;
195
		}
196
 
197
		if (! (callid & IPC_CALLID_NOTIFICATION)) {
198
			ipc_answer_fast(callid, retval, arg1, arg2);
199
		}
200
	}
201
 
202
	return 0;
203
}
204
/*
205
 * Copyright (C) 2006 Ondrej Palkovsky
206
 * All rights reserved.
207
 *
208
 * Redistribution and use in source and binary forms, with or without
209
 * modification, are permitted provided that the following conditions
210
 * are met:
211
 *
212
 * - Redistributions of source code must retain the above copyright
213
 *   notice, this list of conditions and the following disclaimer.
214
 * - Redistributions in binary form must reproduce the above copyright
215
 *   notice, this list of conditions and the following disclaimer in the
216
 *   documentation and/or other materials provided with the distribution.
217
 * - The name of the author may not be used to endorse or promote products
218
 *   derived from this software without specific prior written permission.
219
 *
220
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
221
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
222
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
223
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
224
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
225
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
226
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
227
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
228
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
229
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
230
 */
231
 
232
#include "font-8x16.h"
233
#include <string.h>
234
 
235
#include "helenos.xbm"
236
 
237
 
238
 
239
 
240
 
241
 
242
#define GRAPHICS_ITEMS 1024
243
 
244
 
245
/***************************************************************/
246
/* Pixel specific fuctions */
247
 
248
typedef void (*putpixel_fn_t)(int item,unsigned int x, unsigned int y, int color);
249
typedef int (*getpixel_fn_t)(int item,unsigned int x, unsigned int y);
250
 
251
typedef struct framebuffer_descriptor
252
{
253
	__u8 *fbaddress ;
254
 
255
	unsigned int xres ;
256
	unsigned int yres ;
257
	unsigned int scanline ;
258
	unsigned int pixelbytes ;
259
 
260
	unsigned int position ;
261
	unsigned int columns ;
262
	unsigned int rows ;
263
 
264
	unsigned int BGCOLOR;
265
	unsigned int FGCOLOR;
266
	unsigned int LOGOCOLOR;
267
 
268
	putpixel_fn_t putpixel;
269
	getpixel_fn_t getpixel;
270
 
271
}framebuffer_descriptor_t;
272
 
273
void * graphics_items[GRAPHICS_ITEMS+1]={NULL};
274
 
275
#define FB(__a__,__b__) (((framebuffer_descriptor_t*)(graphics_items[__a__]))->__b__)
276
 
277
#define COL_WIDTH	8
278
#define ROW_BYTES	(FB(item,scanline) * FONT_SCANLINES)
279
#define RED(x, bits)	((x >> (16 + 8 - bits)) & ((1 << bits) - 1))
280
#define GREEN(x, bits)	((x >> (8 + 8 - bits)) & ((1 << bits) - 1))
281
#define BLUE(x, bits)	((x >> (8 - bits)) & ((1 << bits) - 1))
282
 
283
#define POINTPOS(x, y)	(y * FB(item,scanline) + x * FB(item,pixelbytes))
284
 
285
 
286
 
287
 
288
/** Put pixel - 24-bit depth, 1 free byte */
289
static void putpixel_4byte(int item,unsigned int x, unsigned int y, int color)
290
{
291
	*((__u32 *)(FB(item,fbaddress) + POINTPOS(x, y))) = color;
292
}
293
 
294
/** Return pixel color - 24-bit depth, 1 free byte */
295
static int getpixel_4byte(int item,unsigned int x, unsigned int y)
296
{
297
	return *((__u32 *)(FB(item,fbaddress) + POINTPOS(x, y))) & 0xffffff;
298
}
299
 
300
/** Put pixel - 24-bit depth */
301
static void putpixel_3byte(int item,unsigned int x, unsigned int y, int color)
302
{
303
	unsigned int startbyte = POINTPOS(x, y);
304
 
305
#if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN))
306
	FB(item,fbaddress)[startbyte] = RED(color, 8);
307
	FB(item,fbaddress)[startbyte + 1] = GREEN(color, 8);
308
	FB(item,fbaddress)[startbyte + 2] = BLUE(color, 8);
309
#else
310
	FB(item,fbaddress)[startbyte + 2] = RED(color, 8);
311
	FB(item,fbaddress)[startbyte + 1] = GREEN(color, 8);
312
	FB(item,fbaddress)[startbyte + 0] = BLUE(color, 8);
313
#endif
314
 
315
 
316
}
317
 
318
/** Return pixel color - 24-bit depth */
319
static int getpixel_3byte(int item,unsigned int x, unsigned int y)
320
{
321
	unsigned int startbyte = POINTPOS(x, y);
322
 
323
 
324
 
325
#if (defined(BIG_ENDIAN) || defined(FB_BIG_ENDIAN))
326
	return FB(item,fbaddress)[startbyte] << 16 | FB(item,fbaddress)[startbyte + 1] << 8 | FB(item,fbaddress)[startbyte + 2];
327
#else
328
	return FB(item,fbaddress)[startbyte + 2] << 16 | FB(item,fbaddress)[startbyte + 1] << 8 | FB(item,fbaddress)[startbyte + 0];
329
#endif
330
 
331
 
332
}
333
 
334
/** Put pixel - 16-bit depth (5:6:5) */
335
static void putpixel_2byte(int item,unsigned int x, unsigned int y, int color)
336
{
337
	/* 5-bit, 6-bits, 5-bits */ 
338
	*((__u16 *)(FB(item,fbaddress) + POINTPOS(x, y))) = RED(color, 5) << 11 | GREEN(color, 6) << 5 | BLUE(color, 5);
339
}
340
 
341
/** Return pixel color - 16-bit depth (5:6:5) */
342
static int getpixel_2byte(int item,unsigned int x, unsigned int y)
343
{
344
	int color = *((__u16 *)(FB(item,fbaddress) + POINTPOS(x, y)));
345
	return (((color >> 11) & 0x1f) << (16 + 3)) | (((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3);
346
}
347
 
348
/** Put pixel - 8-bit depth (3:2:3) */
349
static void putpixel_1byte(int item,unsigned int x, unsigned int y, int color)
350
{
351
	FB(item,fbaddress)[POINTPOS(x, y)] = RED(color, 3) << 5 | GREEN(color, 2) << 3 | BLUE(color, 3);
352
}
353
 
354
/** Return pixel color - 8-bit depth (3:2:3) */
355
static int getpixel_1byte(int item,unsigned int x, unsigned int y)
356
{
357
	int color = FB(item,fbaddress)[POINTPOS(x, y)];
358
	return (((color >> 5) & 0x7) << (16 + 5)) | (((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5);
359
}
360
 
361
/** Fill line with color BGCOLOR */
362
static void clear_line(int item,unsigned int y)
363
{
364
	unsigned int x;
365
	for (x = 0; x < FB(item,xres); x++)
366
		FB(item,putpixel)(item,x, y, FB(item,BGCOLOR));
367
}
368
 
369
 
370
/** Fill screen with background color */
371
static void clear_screen(int item)
372
{
373
	unsigned int y;
374
	for (y = 0; y < FB(item,yres); y++)
375
	{
376
		clear_line(item,y); pl
377
	}	
378
}
379
 
380
 
381
/** Scroll screen one row up */
382
static void scroll_screen(int item)
383
{
384
	unsigned int i;
385
	unsigned int j;
386
 
387
	for(j=0;j<FB(item,yres)-FONT_SCANLINES;j++)
388
		memcpy((void *) FB(item,fbaddress)+j*FB(item,scanline), 
389
			(void *) &FB(item,fbaddress)[ROW_BYTES+j*FB(item,scanline)], FB(item,pixelbytes)*FB(item,xres));
390
 
391
	//memcpy((void *) FB(item,fbaddress), (void *) &FB(item,fbaddress)[ROW_BYTES], FB(item,scanline) * FB(item,yres) - ROW_BYTES);
392
 
393
	/* Clear last row */
394
	for (i = 0; i < FONT_SCANLINES; i++)
395
		clear_line(item,(FB(item,rows) - 1) * FONT_SCANLINES + i);
396
}
397
 
398
 
399
static void invert_pixel(int item,unsigned int x, unsigned int y)
400
{
401
	FB(item,putpixel)(item, x, y, ~FB(item,getpixel)(item, x, y));
402
}
403
 
404
 
405
/** Draw one line of glyph at a given position */
406
static void draw_glyph_line(int item,unsigned int glline, unsigned int x, unsigned int y)
407
{
408
	unsigned int i;
409
 
410
	for (i = 0; i < 8; i++)
411
		if (glline & (1 << (7 - i))) {
412
			FB(item,putpixel)(item,x + i, y, FB(item,FGCOLOR));
413
		} else
414
			FB(item,putpixel)(item,x + i, y, FB(item,BGCOLOR));
415
}
416
 
417
/***************************************************************/
418
/* Character-console functions */
419
 
420
/** Draw character at given position */
421
static void draw_glyph(int item,__u8 glyph, unsigned int col, unsigned int row)
422
{
423
	unsigned int y;
424
 
425
	for (y = 0; y < FONT_SCANLINES; y++)
426
		draw_glyph_line(item ,fb_font[glyph * FONT_SCANLINES + y], col * COL_WIDTH, row * FONT_SCANLINES + y);
427
}
428
 
429
/** Invert character at given position */
430
static void invert_char(int item,unsigned int col, unsigned int row)
431
{
432
	unsigned int x;
433
	unsigned int y;
434
 
435
	for (x = 0; x < COL_WIDTH; x++)
436
		for (y = 0; y < FONT_SCANLINES; y++)
437
			invert_pixel(item,col * COL_WIDTH + x, row * FONT_SCANLINES + y);
438
}
439
 
440
/** Draw character at default position */
441
static void draw_char(int item,char chr)
442
{
443
	draw_glyph(item ,chr, FB(item,position) % FB(item,columns), FB(item,position) / FB(item,columns));
444
}
445
 
446
static void draw_logo(int item,unsigned int startx, unsigned int starty)
447
{
448
	unsigned int x;
449
	unsigned int y;
450
	unsigned int byte;
451
	unsigned int rowbytes;
452
 
453
	rowbytes = (helenos_width - 1) / 8 + 1;
454
 
455
	for (y = 0; y < helenos_height; y++)
456
		for (x = 0; x < helenos_width; x++) {
457
			byte = helenos_bits[rowbytes * y + x / 8];
458
			byte >>= x % 8;
459
			if (byte & 1)
460
				FB(item,putpixel)(item,startx + x, starty + y, FB(item,LOGOCOLOR));
461
		}
462
}
463
 
464
/***************************************************************/
465
/* Stdout specific functions */
466
 
467
static void invert_cursor(int item)
468
{
469
	invert_char(item,FB(item,position) % FB(item,columns), FB(item,position) / FB(item,columns));
470
}
471
 
472
/** Print character to screen
473
 *
474
 *  Emulate basic terminal commands
475
 */
476
static void fb_putchar(int item,char ch)
477
{
478
 
479
	switch (ch) {
480
		case '\n':
481
			invert_cursor(item);
482
			FB(item,position) += FB(item,columns);
483
			FB(item,position) -= FB(item,position) % FB(item,columns);
484
			break;
485
		case '\r':
486
			invert_cursor(item);
487
			FB(item,position) -= FB(item,position) % FB(item,columns);
488
			break;
489
		case '\b':
490
			invert_cursor(item);
491
			if (FB(item,position) % FB(item,columns))
492
				FB(item,position)--;
493
			break;
494
		case '\t':
495
			invert_cursor(item);
496
			do {
497
				draw_char(item,' ');
498
				FB(item,position)++;
499
			} while (FB(item,position) % 8);
500
			break;
501
		default:
502
			draw_char(item,ch);
503
			FB(item,position)++;
504
	}
505
 
506
	if (FB(item,position) >= FB(item,columns) * FB(item,rows)) {
507
		FB(item,position) -= FB(item,columns);
508
		scroll_screen(item);
509
	}
510
 
511
	invert_cursor(item);
512
 
513
}
514
 
515
 
516
/** Initialize framebuffer as a chardev output device
517
 *
518
 * @param addr Address of theframebuffer
519
 * @param x    Screen width in pixels
520
 * @param y    Screen height in pixels
521
 * @param bpp  Bits per pixel (8, 16, 24, 32)
522
 * @param scan Bytes per one scanline
523
 *
524
 */
525
void fb_init(int item,__address addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan,
526
	unsigned int BGCOLOR,unsigned int FGCOLOR,unsigned int LOGOCOLOR)
527
{
528
 
529
	if( (graphics_items[item]=malloc(sizeof(framebuffer_descriptor_t))) ==NULL) 
530
	{
531
		return;
532
	}
533
 
534
	switch (bpp) {
535
		case 8:
536
			FB(item,putpixel) = putpixel_1byte;
537
			FB(item,getpixel) = getpixel_1byte;
538
			FB(item,pixelbytes) = 1;
539
			break;
540
		case 16:
541
			FB(item,putpixel) = putpixel_2byte;
542
			FB(item,getpixel) = getpixel_2byte;
543
			FB(item,pixelbytes) = 2;
544
			break;
545
		case 24:
546
			FB(item,putpixel) = putpixel_3byte;
547
			FB(item,getpixel) = getpixel_3byte;
548
			FB(item,pixelbytes) = 3;
549
			break;
550
		case 32:
551
			FB(item,putpixel) = putpixel_4byte;
552
			FB(item,getpixel) = getpixel_4byte;
553
			FB(item,pixelbytes) = 4;
554
			break;
555
	}
556
 
557
 
558
	FB(item,fbaddress) = (unsigned char *) addr; pl
559
	FB(item,xres) = x; pl
560
	FB(item,yres) = y; pl
561
	FB(item,scanline) = scan; pl
562
 
563
 
564
	FB(item,rows) = y / FONT_SCANLINES; pl
565
	FB(item,columns) = x / COL_WIDTH; pl
566
 
567
	FB(item,BGCOLOR)=BGCOLOR;
568
	FB(item,FGCOLOR)=FGCOLOR;
569
	FB(item,LOGOCOLOR)=LOGOCOLOR;
570
 
571
 
572
	clear_screen(item); pl
573
	draw_logo(item,FB(item,xres) - helenos_width, 0); pl
574
	invert_cursor(item); pl
575
 
576
}
577
 
578
 
579
static int get_free_item()
580
{
581
	int item;
582
	for(item=0;graphics_items[item]!=NULL;item++);
583
	return (item==GRAPHICS_ITEMS)?EFB:item;
584
}
585
 
586
unsigned int mod_col(unsigned int col,int mod)
587
{
588
	if(mod & 1) col^=0xff;
589
	if(mod & 2) col^=0xff00;
590
	if(mod & 4) col^=0xff0000;
591
	return col;
592
}
593
 
594
 
595
int create_window(int item,unsigned int x, unsigned int y,unsigned int x_size, unsigned int y_size,
596
	unsigned int BGCOLOR,unsigned int FGCOLOR,unsigned int LOGOCOLOR)
597
{
598
	int item_new;
599
 
600
	if(EFB==(item_new=get_free_item()))return EFB;
601
 
602
 
603
	if( (graphics_items[item_new]=malloc(sizeof(framebuffer_descriptor_t))) ==NULL) 
604
	{
605
		return EFB;
606
	}
607
 
608
 
609
 
610
	FB(item_new,putpixel) = FB(item,putpixel);
611
	FB(item_new,getpixel) = FB(item,getpixel);
612
	FB(item_new,pixelbytes) = FB(item,pixelbytes);
613
 
614
	FB(item_new,fbaddress) = FB(item,fbaddress) + POINTPOS(x, y) ; 
615
	FB(item_new,xres) = x_size; 
616
	FB(item_new,yres) = y_size; 
617
	FB(item_new,scanline) =  FB(item,scanline);
618
 
619
 
620
	FB(item_new,rows) = y_size / FONT_SCANLINES; 
621
	FB(item_new,columns) = x_size / COL_WIDTH; 
622
 
623
	FB(item_new,BGCOLOR)=BGCOLOR;
624
	FB(item_new,FGCOLOR)=FGCOLOR;
625
	FB(item_new,LOGOCOLOR)=LOGOCOLOR;
626
 
627
 
628
	clear_screen(item_new); 
629
	draw_logo(item_new,FB(item_new,xres) - helenos_width, 0); 
630
	invert_cursor(item_new); 
631
 
632
	return item_new;
633
}
634
 
635
 
636