Subversion Repositories HelenOS

Rev

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

Rev 3790 Rev 3844
Line 182... Line 182...
182
 
182
 
183
 
183
 
184
/** Hide logo and refresh screen
184
/** Hide logo and refresh screen
185
 *
185
 *
186
 */
186
 */
187
static void logo_hide(void)
187
static void logo_hide(bool silent)
188
{
188
{
189
    ylogo = 0;
189
    ylogo = 0;
190
    ytrim = yres;
190
    ytrim = yres;
191
    rowtrim = rows;
191
    rowtrim = rows;
-
 
192
    if (!silent)
192
    fb_redraw();
193
        fb_redraw();
193
}
194
}
194
 
195
 
195
 
196
 
196
/** Draw character at given position
197
/** Draw character at given position
197
 *
198
 *
198
 */
199
 */
199
static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row)
200
static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row, bool silent)
200
{
201
{
201
    unsigned int x = COL2X(col);
202
    unsigned int x = COL2X(col);
202
    unsigned int y = ROW2Y(row);
203
    unsigned int y = ROW2Y(row);
203
    unsigned int yd;
204
    unsigned int yd;
204
   
205
   
205
    if (y >= ytrim)
206
    if (y >= ytrim)
206
        logo_hide();
207
        logo_hide(silent);
207
   
208
   
208
    backbuf[BB_POS(col, row)] = glyph;
209
    backbuf[BB_POS(col, row)] = glyph;
209
   
210
   
-
 
211
    if (!silent) {
210
    for (yd = 0; yd < FONT_SCANLINES; yd++)
212
        for (yd = 0; yd < FONT_SCANLINES; yd++)
211
        memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
213
            memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
212
            &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
214
                &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
-
 
215
    }
213
}
216
}
214
 
217
 
215
 
218
 
216
/** Scroll screen down by one row
219
/** Scroll screen down by one row
217
 *
220
 *
218
 *
221
 *
219
 */
222
 */
220
static void screen_scroll(void)
223
static void screen_scroll(bool silent)
221
{
224
{
222
    if (ylogo > 0) {
225
    if (ylogo > 0) {
223
        logo_hide();
226
        logo_hide(silent);
224
        return;
227
        return;
225
    }
228
    }
226
   
229
   
227
    unsigned int row;
230
    if (!silent) {
228
   
-
 
229
    for (row = 0; row < rows; row++) {
-
 
230
        unsigned int y = ROW2Y(row);
-
 
231
        unsigned int yd;
231
        unsigned int row;
232
       
232
       
233
        for (yd = 0; yd < FONT_SCANLINES; yd++) {
233
        for (row = 0; row < rows; row++) {
234
            unsigned int x;
234
            unsigned int y = ROW2Y(row);
235
            unsigned int col;
235
            unsigned int yd;
236
           
236
           
237
            for (col = 0, x = 0; col < cols; col++,
237
            for (yd = 0; yd < FONT_SCANLINES; yd++) {
238
                x += FONT_WIDTH) {
238
                unsigned int x;
239
                uint8_t glyph;
239
                unsigned int col;
240
               
240
               
241
                if (row < rows - 1) {
-
 
242
                    if (backbuf[BB_POS(col, row)] ==
241
                for (col = 0, x = 0; col < cols; col++,
243
                        backbuf[BB_POS(col, row + 1)])
242
                    x += FONT_WIDTH) {
244
                        continue;
243
                    uint8_t glyph;
245
                   
244
                   
-
 
245
                    if (row < rows - 1) {
-
 
246
                        if (backbuf[BB_POS(col, row)] ==
-
 
247
                            backbuf[BB_POS(col, row + 1)])
-
 
248
                            continue;
-
 
249
                       
246
                    glyph = backbuf[BB_POS(col, row + 1)];
250
                        glyph = backbuf[BB_POS(col, row + 1)];
247
                } else
251
                    } else
248
                    glyph = 0;
252
                        glyph = 0;
249
               
253
                   
250
                memcpy(&fb_addr[FB_POS(x, y + yd)],
254
                    memcpy(&fb_addr[FB_POS(x, y + yd)],
251
                    &glyphs[GLYPH_POS(glyph, yd)],
255
                        &glyphs[GLYPH_POS(glyph, yd)],
252
                    glyphscanline);
256
                        glyphscanline);
-
 
257
                }
253
            }
258
            }
254
        }
259
        }
255
    }
260
    }
256
   
261
   
257
    memmove(backbuf, backbuf + cols, cols * (rows - 1));
262
    memmove(backbuf, backbuf + cols, cols * (rows - 1));
258
    memsetb(&backbuf[BB_POS(0, rows - 1)], cols, 0);
263
    memsetb(&backbuf[BB_POS(0, rows - 1)], cols, 0);
259
}
264
}
260
 
265
 
261
 
266
 
262
static void cursor_put(void)
267
static void cursor_put(bool silent)
263
{
268
{
264
    glyph_draw(CURSOR, position % cols, position / cols);
269
    glyph_draw(CURSOR, position % cols, position / cols, silent);
265
}
270
}
266
 
271
 
267
 
272
 
268
static void cursor_remove(void)
273
static void cursor_remove(bool silent)
269
{
274
{
270
    glyph_draw(0, position % cols, position / cols);
275
    glyph_draw(0, position % cols, position / cols, silent);
271
}
276
}
272
 
277
 
273
 
278
 
274
/** Print character to screen
279
/** Print character to screen
275
 *
280
 *
276
 * Emulate basic terminal commands.
281
 * Emulate basic terminal commands.
277
 *
282
 *
278
 */
283
 */
279
static void fb_putchar(chardev_t *dev, char ch)
284
static void fb_putchar(chardev_t *dev, char ch, bool silent)
280
{
285
{
281
    spinlock_lock(&fb_lock);
286
    spinlock_lock(&fb_lock);
282
   
287
   
283
    switch (ch) {
288
    switch (ch) {
284
    case '\n':
289
    case '\n':
285
        cursor_remove();
290
        cursor_remove(silent);
286
        position += cols;
291
        position += cols;
287
        position -= position % cols;
292
        position -= position % cols;
288
        break;
293
        break;
289
    case '\r':
294
    case '\r':
290
        cursor_remove();
295
        cursor_remove(silent);
291
        position -= position % cols;
296
        position -= position % cols;
292
        break;
297
        break;
293
    case '\b':
298
    case '\b':
294
        cursor_remove();
299
        cursor_remove(silent);
295
        if (position % cols)
300
        if (position % cols)
296
            position--;
301
            position--;
297
        break;
302
        break;
298
    case '\t':
303
    case '\t':
299
        cursor_remove();
304
        cursor_remove(silent);
300
        do {
305
        do {
301
            glyph_draw((uint8_t) ' ', position % cols,
306
            glyph_draw((uint8_t) ' ', position % cols,
302
                position / cols);
307
                position / cols, silent);
303
            position++;
308
            position++;
304
        } while ((position % 8) && (position < cols * rows));
309
        } while ((position % 8) && (position < cols * rows));
305
        break;
310
        break;
306
    default:
311
    default:
307
        glyph_draw((uint8_t) ch, position % cols, position / cols);
312
        glyph_draw((uint8_t) ch, position % cols,
-
 
313
            position / cols, silent);
308
        position++;
314
        position++;
309
    }
315
    }
310
   
316
   
311
    if (position >= cols * rows) {
317
    if (position >= cols * rows) {
312
        position -= cols;
318
        position -= cols;
313
        screen_scroll();
319
        screen_scroll(silent);
314
    }
320
    }
315
   
321
   
316
    cursor_put();
322
    cursor_put(silent);
317
   
323
   
318
    spinlock_unlock(&fb_lock);
324
    spinlock_unlock(&fb_lock);
319
}
325
}
320
 
326
 
321
static chardev_t framebuffer;
327
static chardev_t framebuffer;