~ilya-yanok/ubuntu/precise/grub2/fix-for-948716

« back to all changes in this revision

Viewing changes to video/fb/fbfill.c

  • Committer: Bazaar Package Importer
  • Author(s): Robert Millan
  • Date: 2009-07-25 19:00:53 UTC
  • mfrom: (1.6.3 upstream)
  • mto: (17.4.13 sid)
  • mto: This revision was merged to the branch mainline in revision 53.
  • Revision ID: james.westby@ubuntu.com-20090725190053-uv3lm6ya3zxs77ep
ImportĀ upstreamĀ versionĀ 1.96+20090725

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 *  GRUB  --  GRand Unified Bootloader
3
 
 *  Copyright (C) 2006,2007,2008  Free Software Foundation, Inc.
4
 
 *
5
 
 *  GRUB is free software: you can redistribute it and/or modify
6
 
 *  it under the terms of the GNU General Public License as published by
7
 
 *  the Free Software Foundation, either version 3 of the License, or
8
 
 *  (at your option) any later version.
9
 
 *
10
 
 *  GRUB is distributed in the hope that it will be useful,
11
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 
 *  GNU General Public License for more details.
14
 
 *
15
 
 *  You should have received a copy of the GNU General Public License
16
 
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
17
 
 */
18
 
 
19
 
/* SPECIAL NOTES!
20
 
 
21
 
   Please note following when reading the code below:
22
 
 
23
 
   - In this driver we assume that every memory can be accessed by same memory
24
 
     bus.  If there are different address spaces do not use this code as a base
25
 
     code for other archs.
26
 
 
27
 
   - Every function in this code assumes that bounds checking has been done in
28
 
     previous phase and they are opted out in here.  */
29
 
 
30
 
#include <grub/video_fb.h>
31
 
#include <grub/fbfill.h>
32
 
#include <grub/fbutil.h>
33
 
#include <grub/types.h>
34
 
#include <grub/video.h>
35
 
 
36
 
/* Generic filler that works for every supported mode.  */
37
 
void
38
 
grub_video_fbfill (struct grub_video_fbblit_info *dst,
39
 
                   grub_video_color_t color, int x, int y,
40
 
                   int width, int height)
41
 
{
42
 
  int i;
43
 
  int j;
44
 
 
45
 
  for (j = 0; j < height; j++)
46
 
    for (i = 0; i < width; i++)
47
 
      set_pixel (dst, x + i, y + j, color);
48
 
}
49
 
 
50
 
/* Optimized filler for direct color 32 bit modes.  It is assumed that color
51
 
   is already mapped to destination format.  */
52
 
void
53
 
grub_video_fbfill_direct32 (struct grub_video_fbblit_info *dst,
54
 
                            grub_video_color_t color, int x, int y,
55
 
                            int width, int height)
56
 
{
57
 
  int i;
58
 
  int j;
59
 
  grub_uint32_t *dstptr;
60
 
  grub_size_t rowskip;
61
 
 
62
 
  /* Calculate the number of bytes to advance from the end of one line
63
 
     to the beginning of the next line.  */
64
 
  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
65
 
 
66
 
  /* Get the start address.  */
67
 
  dstptr = (grub_uint32_t *) grub_video_fb_get_video_ptr (dst, x, y);
68
 
 
69
 
  for (j = 0; j < height; j++)
70
 
    {
71
 
      for (i = 0; i < width; i++)
72
 
        *dstptr++ = color;
73
 
 
74
 
      /* Advance the dest pointer to the right location on the next line.  */
75
 
      dstptr = (grub_uint32_t *) (((char *) dstptr) + rowskip);
76
 
    }
77
 
}
78
 
 
79
 
/* Optimized filler for direct color 24 bit modes.  It is assumed that color
80
 
   is already mapped to destination format.  */
81
 
void
82
 
grub_video_fbfill_direct24 (struct grub_video_fbblit_info *dst,
83
 
                            grub_video_color_t color, int x, int y,
84
 
                            int width, int height)
85
 
{
86
 
  int i;
87
 
  int j;
88
 
  grub_size_t rowskip;
89
 
  grub_uint8_t *dstptr;
90
 
  grub_uint8_t fill0 = (grub_uint8_t)((color >> 0) & 0xFF);
91
 
  grub_uint8_t fill1 = (grub_uint8_t)((color >> 8) & 0xFF);
92
 
  grub_uint8_t fill2 = (grub_uint8_t)((color >> 16) & 0xFF);
93
 
 
94
 
  /* Calculate the number of bytes to advance from the end of one line
95
 
     to the beginning of the next line.  */
96
 
  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
97
 
 
98
 
  /* Get the start address.  */
99
 
  dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y);
100
 
 
101
 
  for (j = 0; j < height; j++)
102
 
    {
103
 
      for (i = 0; i < width; i++)
104
 
        {
105
 
          *dstptr++ = fill0;
106
 
          *dstptr++ = fill1;
107
 
          *dstptr++ = fill2;
108
 
        }
109
 
 
110
 
      /* Advance the dest pointer to the right location on the next line.  */
111
 
      dstptr += rowskip;
112
 
    }
113
 
}
114
 
 
115
 
/* Optimized filler for direct color 16 bit modes.  It is assumed that color
116
 
   is already mapped to destination format.  */
117
 
void
118
 
grub_video_fbfill_direct16 (struct grub_video_fbblit_info *dst,
119
 
                            grub_video_color_t color, int x, int y,
120
 
                            int width, int height)
121
 
{
122
 
  int i;
123
 
  int j;
124
 
  grub_size_t rowskip;
125
 
  grub_uint8_t *dstptr;
126
 
  grub_uint8_t fill0 = (grub_uint8_t)((color >> 0) & 0xFF);
127
 
  grub_uint8_t fill1 = (grub_uint8_t)((color >> 8) & 0xFF);
128
 
 
129
 
  /* Calculate the number of bytes to advance from the end of one line
130
 
     to the beginning of the next line.  */
131
 
  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
132
 
 
133
 
  /* Get the start address.  */
134
 
  dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y);
135
 
 
136
 
  for (j = 0; j < height; j++)
137
 
    {
138
 
      for (i = 0; i < width; i++)
139
 
        {
140
 
          *dstptr++ = fill0;
141
 
          *dstptr++ = fill1;
142
 
        }
143
 
 
144
 
      /* Advance the dest pointer to the right location on the next line.  */
145
 
      dstptr += rowskip;
146
 
    }
147
 
}
148
 
 
149
 
/* Optimized filler for index color.  It is assumed that color
150
 
   is already mapped to destination format.  */
151
 
void
152
 
grub_video_fbfill_direct8 (struct grub_video_fbblit_info *dst,
153
 
                           grub_video_color_t color, int x, int y,
154
 
                           int width, int height)
155
 
{
156
 
  int i;
157
 
  int j;
158
 
  grub_size_t rowskip;
159
 
  grub_uint8_t *dstptr;
160
 
  grub_uint8_t fill = (grub_uint8_t)color & 0xFF;
161
 
 
162
 
  /* Calculate the number of bytes to advance from the end of one line
163
 
     to the beginning of the next line.  */
164
 
  rowskip = dst->mode_info->pitch - dst->mode_info->bytes_per_pixel * width;
165
 
 
166
 
  /* Get the start address.  */
167
 
  dstptr = (grub_uint8_t *) grub_video_fb_get_video_ptr (dst, x, y);
168
 
 
169
 
  for (j = 0; j < height; j++)
170
 
    {
171
 
      for (i = 0; i < width; i++)
172
 
        *dstptr++ = fill;
173
 
 
174
 
      /* Advance the dest pointer to the right location on the next line.  */
175
 
      dstptr += rowskip;
176
 
    }
177
 
}