1 | /*␊ |
2 | * libeg/text.c␊ |
3 | * Text drawing functions␊ |
4 | *␊ |
5 | * Copyright (c) 2006 Christoph Pfisterer␊ |
6 | * All rights reserved.␊ |
7 | *␊ |
8 | * Redistribution and use in source and binary forms, with or without␊ |
9 | * modification, are permitted provided that the following conditions are␊ |
10 | * met:␊ |
11 | *␊ |
12 | * * Redistributions of source code must retain the above copyright␊ |
13 | * notice, this list of conditions and the following disclaimer.␊ |
14 | *␊ |
15 | * * Redistributions in binary form must reproduce the above copyright␊ |
16 | * notice, this list of conditions and the following disclaimer in the␊ |
17 | * documentation and/or other materials provided with the␊ |
18 | * distribution.␊ |
19 | *␊ |
20 | * * Neither the name of Christoph Pfisterer nor the names of the␊ |
21 | * contributors may be used to endorse or promote products derived␊ |
22 | * from this software without specific prior written permission.␊ |
23 | *␊ |
24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS␊ |
25 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT␊ |
26 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR␊ |
27 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT␊ |
28 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,␊ |
29 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT␊ |
30 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,␊ |
31 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY␊ |
32 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT␊ |
33 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE␊ |
34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.␊ |
35 | */␊ |
36 | ␊ |
37 | #include <utarray.h>␊ |
38 | #include "libegint.h"␊ |
39 | ␊ |
40 | #include "egemb_font.h"␊ |
41 | #define FONT_CELL_WIDTH (7)␊ |
42 | #define FONT_CELL_HEIGHT (12)␊ |
43 | ␊ |
44 | static EG_IMAGE *FontImage = NULL;␊ |
45 | ␊ |
46 | ␊ |
47 | //␊ |
48 | // Text rendering␊ |
49 | //␊ |
50 | ␊ |
51 | VOID egMeasureText(IN CHAR16 *Text, OUT UINTN *Width, OUT UINTN *Height)␊ |
52 | {␊ |
53 | if (Width != NULL)␊ |
54 | *Width = StrLen(Text) * FONT_CELL_WIDTH;␊ |
55 | if (Height != NULL)␊ |
56 | *Height = FONT_CELL_HEIGHT;␊ |
57 | }␊ |
58 | ␊ |
59 | VOID egRenderText(IN CHAR16 *Text, IN OUT EG_IMAGE *CompImage, IN UINTN PosX, IN UINTN PosY)␊ |
60 | {␊ |
61 | EG_PIXEL *BufferPtr;␊ |
62 | EG_PIXEL *FontPixelData;␊ |
63 | UINTN BufferLineOffset, FontLineOffset;␊ |
64 | UINTN TextLength;␊ |
65 | UINTN i, c;␊ |
66 | ␊ |
67 | // clip the text␊ |
68 | TextLength = StrLen(Text);␊ |
69 | if (TextLength * FONT_CELL_WIDTH + PosX > CompImage->Width)␊ |
70 | TextLength = (CompImage->Width - PosX) / FONT_CELL_WIDTH;␊ |
71 | ␊ |
72 | // load the font␊ |
73 | if (FontImage == NULL)␊ |
74 | FontImage = egPrepareEmbeddedImage(&egemb_font, TRUE);␊ |
75 | ␊ |
76 | // render it␊ |
77 | BufferPtr = CompImage->PixelData;␊ |
78 | BufferLineOffset = CompImage->Width;␊ |
79 | BufferPtr += PosX + PosY * BufferLineOffset;␊ |
80 | FontPixelData = FontImage->PixelData;␊ |
81 | FontLineOffset = FontImage->Width;␊ |
82 | for (i = 0; i < TextLength; i++) {␊ |
83 | c = Text[i];␊ |
84 | if (c < 32 || c >= 127)␊ |
85 | c = 95;␊ |
86 | else␊ |
87 | c -= 32;␊ |
88 | egRawCompose(BufferPtr, FontPixelData + c * FONT_CELL_WIDTH,␊ |
89 | FONT_CELL_WIDTH, FONT_CELL_HEIGHT,␊ |
90 | BufferLineOffset, FontLineOffset);␊ |
91 | BufferPtr += FONT_CELL_WIDTH;␊ |
92 | }␊ |
93 | }␊ |
94 | ␊ |
95 | /* EOF */␊ |
96 | |