Subversion Repositories HelenOS

Rev

Rev 4153 | Rev 4327 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4153 Rev 4263
Line 76... Line 76...
76
/* Allow only 1 connection */
76
/* Allow only 1 connection */
77
static int client_connected = 0;
77
static int client_connected = 0;
78
 
78
 
79
static unsigned int scr_width;
79
static unsigned int scr_width;
80
static unsigned int scr_height;
80
static unsigned int scr_height;
81
static char *scr_addr;
81
static uint8_t *scr_addr;
82
 
82
 
83
static unsigned int style;
83
static unsigned int style;
84
 
84
 
85
static unsigned attr_to_ega_style(const attrs_t *a);
85
static unsigned attr_to_ega_style(const attrs_t *a);
-
 
86
static uint8_t ega_glyph(wchar_t ch);
86
 
87
 
87
static void clrscr(void)
88
static void clrscr(void)
88
{
89
{
89
    int i;
90
    int i;
90
   
91
   
Line 141... Line 142...
141
        for (i = 0; i < -rows * scr_width; i++)
142
        for (i = 0; i < -rows * scr_width; i++)
142
            ((short *)scr_addr)[i] = ((style << 8 ) + ' ');
143
            ((short *)scr_addr)[i] = ((style << 8 ) + ' ');
143
    }
144
    }
144
}
145
}
145
 
146
 
146
static void printchar(char c, unsigned int row, unsigned int col)
147
static void printchar(wchar_t c, unsigned int row, unsigned int col)
147
{
148
{
148
    scr_addr[(row * scr_width + col) * 2] = c;
149
    scr_addr[(row * scr_width + col) * 2] = ega_glyph(c);
149
    scr_addr[(row * scr_width + col) * 2 + 1] = style;
150
    scr_addr[(row * scr_width + col) * 2 + 1] = style;
150
   
151
   
151
    cursor_goto(row, col + 1);
152
    cursor_goto(row, col + 1);
152
}
153
}
153
 
154
 
-
 
155
/** Draw text data to viewport.
-
 
156
 *
-
 
157
 * @param vport Viewport id
-
 
158
 * @param data  Text data.
-
 
159
 * @param x Leftmost column of the area.
-
 
160
 * @param y Topmost row of the area.
-
 
161
 * @param w Number of rows.
-
 
162
 * @param h Number of columns.
-
 
163
 */
154
static void draw_text_data(keyfield_t *data)
164
static void draw_text_data(keyfield_t *data, unsigned int x,
-
 
165
    unsigned int y, unsigned int w, unsigned int h)
155
{
166
{
-
 
167
    unsigned int i, j;
-
 
168
    keyfield_t *field;
156
    int i;
169
    uint8_t *dp;
-
 
170
 
-
 
171
    for (j = 0; j < h; j++) {
-
 
172
        for (i = 0; i < w; i++) {
-
 
173
            field = &data[j * w + i];
-
 
174
            dp = &scr_addr[2 * ((y + j) * scr_width + (x + i))];
157
 
175
 
158
    for (i = 0; i < scr_width * scr_height; i++) {
-
 
159
        scr_addr[i * 2] = data[i].character;
176
            dp[0] = ega_glyph(field->character);
160
        scr_addr[i * 2 + 1] = attr_to_ega_style(&data[i].attrs);
177
            dp[1] = attr_to_ega_style(&field->attrs);
-
 
178
        }
161
    }
179
    }
162
}
180
}
163
 
181
 
164
static int save_screen(void)
182
static int save_screen(void)
165
{
183
{
Line 229... Line 247...
229
        a->a.i.bg_color, a->a.i.flags);
247
        a->a.i.bg_color, a->a.i.flags);
230
    default: return INVERTED_COLOR;
248
    default: return INVERTED_COLOR;
231
    }
249
    }
232
}
250
}
233
 
251
 
-
 
252
static uint8_t ega_glyph(wchar_t ch)
-
 
253
{
-
 
254
    if (ch >= 0 && ch < 128)
-
 
255
        return ch;
-
 
256
 
-
 
257
    return '?';
-
 
258
}
-
 
259
 
234
static void ega_client_connection(ipc_callid_t iid, ipc_call_t *icall)
260
static void ega_client_connection(ipc_callid_t iid, ipc_call_t *icall)
235
{
261
{
236
    int retval;
262
    int retval;
237
    ipc_callid_t callid;
263
    ipc_callid_t callid;
238
    ipc_call_t call;
264
    ipc_call_t call;
239
    char c;
265
    wchar_t c;
240
    unsigned int row, col;
266
    unsigned int row, col, w, h;
241
    int bg_color, fg_color, attr;
267
    int bg_color, fg_color, attr;
242
    uint32_t bg_rgb, fg_rgb;
268
    uint32_t bg_rgb, fg_rgb;
243
    keyfield_t *interbuf = NULL;
269
    keyfield_t *interbuf = NULL;
244
    size_t intersize = 0;
270
    size_t intersize = 0;
245
    int i;
271
    int i;
Line 268... Line 294...
268
                continue;
294
                continue;
269
            }
295
            }
270
            retval = EINVAL;
296
            retval = EINVAL;
271
            break;
297
            break;
272
        case FB_DRAW_TEXT_DATA:
298
        case FB_DRAW_TEXT_DATA:
-
 
299
            col = IPC_GET_ARG1(call);
-
 
300
            row = IPC_GET_ARG2(call);
-
 
301
            w = IPC_GET_ARG3(call);
-
 
302
            h = IPC_GET_ARG4(call);
273
            if (!interbuf) {
303
            if (!interbuf) {
274
                retval = EINVAL;
304
                retval = EINVAL;
275
                break;
305
                break;
276
            }
306
            }
-
 
307
            if (col + w > scr_width || row + h > scr_height) {
-
 
308
                retval = EINVAL;
-
 
309
                break;
-
 
310
            }
277
            draw_text_data(interbuf);
311
            draw_text_data(interbuf, col, row, w, h);
278
            retval = 0;
312
            retval = 0;
279
            break;
313
            break;
280
        case FB_GET_CSIZE:
314
        case FB_GET_CSIZE:
281
            ipc_answer_2(callid, EOK, scr_height, scr_width);
315
            ipc_answer_2(callid, EOK, scr_height, scr_width);
282
            continue;
316
            continue;
Line 357... Line 391...
357
            }
391
            }
358
            retval = 0;
392
            retval = 0;
359
            break;
393
            break;
360
 
394
 
361
        default:
395
        default:
362
            retval = ENOENT;
396
            retval = EINVAL;
363
        }
397
        }
364
        ipc_answer_0(callid, retval);
398
        ipc_answer_0(callid, retval);
365
    }
399
    }
366
}
400
}
367
 
401