OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [mw/] [src/] [nanox/] [nxutil.c] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 673 markom
/*
2
 * Copyright (c) 2000 Greg Haerr <greg@censoft.com>
3
 *
4
 * Nano-X Client utility routines
5
 *
6
 * These routines are Gr* functionality without requiring new API entry points.
7
 */
8
#include <stdio.h>
9
#include <stdlib.h>
10
#define MWINCLUDECOLORS
11
#include "nano-X.h"
12
 
13
/*
14
 * Create new window with passed style, title and location.
15
 */
16
GR_WINDOW_ID
17
GrNewWindowEx(GR_WM_PROPS props, GR_CHAR *title, GR_WINDOW_ID parent,
18
        GR_COORD x, GR_COORD y, GR_SIZE width, GR_SIZE height,
19
        GR_COLOR background)
20
{
21
        GR_WINDOW_ID            wid;
22
        GR_WM_PROPERTIES        wmprops;
23
 
24
        /* create window with no borders*/
25
        wid = GrNewWindow(parent, x, y, width, height, 0, background, BLACK);
26
        if (wid) {
27
                /* set properties and title*/
28
                wmprops.flags = GR_WM_FLAGS_PROPS | GR_WM_FLAGS_TITLE;
29
                wmprops.props = props;
30
                wmprops.title = title;
31
                GrSetWMProperties(wid, &wmprops);
32
        }
33
        return wid;
34
}
35
 
36
/* draw an array of lines*/
37
void
38
GrDrawLines(GR_DRAW_ID w, GR_GC_ID gc, GR_POINT *points, GR_COUNT count)
39
{
40
        GR_POINT        beg, end;
41
 
42
        if (count < 1)
43
                return;
44
        if (count == 1) {
45
                GrPoint(w, gc, points->x, points->y);
46
                return;
47
        }
48
 
49
        beg = *points++;
50
        while (--count > 0) {
51
                end = *points++;
52
                GrLine(w, gc, beg.x, beg.y, end.x, end.y);
53
                beg = end;
54
        }
55
}
56
 
57
/*
58
 * Retrofit routine.  Use GrNewCursor and GrSetWindowCursor for new code.
59
 */
60
GR_CURSOR_ID
61
GrSetCursor(GR_WINDOW_ID wid, GR_SIZE width, GR_SIZE height, GR_COORD hotx,
62
        GR_COORD hoty, GR_COLOR foreground, GR_COLOR background,
63
        GR_BITMAP *fgbitmap, GR_BITMAP *bgbitmap)
64
{
65
        GR_CURSOR_ID    cid;
66
 
67
        cid = GrNewCursor(width, height, hotx, hoty, foreground,
68
                background, fgbitmap, bgbitmap);
69
        if (cid)
70
                GrSetWindowCursor(wid, cid);
71
        return cid;
72
}
73
 
74
/* byte-reversing table for reversing X bitmaps*/
75
static unsigned char revbyte[256] = {
76
  0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
77
  0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
78
  0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
79
  0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
80
  0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
81
  0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
82
  0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
83
  0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
84
  0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
85
  0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
86
  0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
87
  0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
88
  0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
89
  0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
90
  0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
91
  0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
92
  0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
93
  0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
94
  0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
95
  0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
96
  0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
97
  0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
98
  0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
99
  0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
100
  0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
101
  0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
102
  0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
103
  0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
104
  0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
105
  0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
106
  0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
107
  0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
108
};
109
 
110
/*
111
 * Create a GdBitmap-compatible bitmap (16-bit short array) from data bits
112
 *      flags specify input format
113
 *      caller must free return buffer
114
 *
115
 * Currently only works if width/height < bits_width/bits_height
116
 */
117
GR_BITMAP *
118
GrNewBitmapFromData(GR_SIZE width, GR_SIZE height, GR_SIZE bits_width, GR_SIZE bits_height,
119
        void *bits, int flags)
120
{
121
        int             x, y;
122
        int             xb;
123
        int             brev = flags & GR_BMDATA_BYTEREVERSE;
124
        int             bswap = flags & GR_BMDATA_BYTESWAP;
125
        unsigned char * inbuf = bits;
126
        unsigned char * p;
127
        GR_BITMAP *     buf;
128
        /*int           size;*/
129
 
130
        /*
131
         * bit reverse or byte-swap short words in image
132
         * and pad to 16 bits for GrBitmap()
133
         */
134
        xb = (width+7)/8;       /* FIXME: may not be in packed-8bit format*/
135
        /*size  = ((xb+1)&~01) * height;*/
136
        /*buf = (GR_BITMAP *)malloc(size);*/
137
        buf = (GR_BITMAP *)malloc(((xb+1)&~01) * height);
138
        if (!buf)
139
                return NULL;
140
 
141
        p = (unsigned char *)buf;
142
        for(y=0; y<height; ++y) {
143
                for(x=0; x<xb; ) {
144
                    if (bswap) {
145
                        /* byte-swap short words*/
146
                        unsigned char c = *inbuf++;
147
                        p[1] = brev? revbyte[c]: c;
148
                        if (x < xb-1) {
149
                                c = *inbuf++;
150
                                p[0] = brev? revbyte[c]: c;
151
                        } else p[0] = 0;
152
                    } else {
153
                        /* no byte swapping*/
154
                        unsigned char c = *inbuf++;
155
                        p[1] = brev? revbyte[c]: c;
156
                        if (x < xb-1) {
157
                                c = *inbuf++;
158
                                p[0] = brev? revbyte[c]: c;
159
                        } else p[0] = 0;
160
                    }
161
                    x += 2;
162
                    p += 2;
163
                }
164
                inbuf += (bits_width+7)/8 - (width+7)/8;        /* FIXME*/
165
 
166
                /* pad to 16 bits*/
167
                if (xb & 1)
168
                        *p++ = 0;
169
        }
170
        return buf;
171
}
172
 
173
/*
174
 * Create a new pixmap and initialize from bitmap data and fg/bg colors
175
 */
176
GR_WINDOW_ID
177
GrNewPixmapFromData(GR_SIZE width, GR_SIZE height, GR_COLOR foreground,
178
        GR_COLOR background, void * bits, int flags)
179
{
180
        GR_WINDOW_ID    pid;
181
        GR_GC_ID        gc;
182
        GR_BITMAP *     buf;
183
 
184
        pid = GrNewPixmap(width, height, NULL);
185
        if (pid) {
186
                gc = GrNewGC();
187
                GrSetGCForeground(gc, foreground);
188
                GrSetGCBackground(gc, background);
189
 
190
                buf = GrNewBitmapFromData(width, height, width, height, bits, flags);
191
                if (buf) {
192
                        GrBitmap(pid, gc, 0, 0, width, height, buf);
193
                        free(buf);
194
                }
195
                GrDestroyGC(gc);
196
        }
197
        return pid;
198
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.