1
2/* Copyright (c) Mark J. Kilgard, 1994. */
3
4/* This program is freely distributable without licensing fees
5   and is provided without guarantee or warrantee expressed or
6   implied. This program is -not- in the public domain. */
7
8#include "glutint.h"
9#include "glutbitmap.h"
10
11void APIENTRY
12glutBitmapCharacter(GLUTbitmapFont font, int c)
13{
14  const BitmapCharRec *ch;
15  BitmapFontPtr fontinfo;
16  GLint swapbytes, lsbfirst, rowlength;
17  GLint skiprows, skippixels, alignment;
18
19#if defined(_WIN32)
20  fontinfo = (BitmapFontPtr) __glutFont(font);
21#else
22  fontinfo = (BitmapFontPtr) font;
23#endif
24
25  if (c < fontinfo->first ||
26    c >= fontinfo->first + fontinfo->num_chars)
27    return;
28  ch = fontinfo->ch[c - fontinfo->first];
29  if (ch) {
30    /* Save current modes. */
31    glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes);
32    glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst);
33    glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength);
34    glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows);
35    glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels);
36    glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
37    /* Little endian machines (DEC Alpha for example) could
38       benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
39       instead of GL_FALSE, but this would require changing the
40       generated bitmaps too. */
41    glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
42    glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
43    glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
44    glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
45    glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
46    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
47    glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
48      ch->advance, 0, ch->bitmap);
49    /* Restore saved modes. */
50    glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes);
51    glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst);
52    glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength);
53    glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows);
54    glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels);
55    glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
56  }
57}
58