root/drivers/video/fbdev/core/fbcon_rotate.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. pattern_test_bit
  2. pattern_set_bit
  3. rotate_ud
  4. rotate_cw
  5. rotate_ccw

   1 /*
   2  *  linux/drivers/video/console/fbcon_rotate.h -- Software Display Rotation
   3  *
   4  *      Copyright (C) 2005 Antonino Daplas <adaplas@pol.net>
   5  *
   6  *  This file is subject to the terms and conditions of the GNU General Public
   7  *  License.  See the file COPYING in the main directory of this archive
   8  *  for more details.
   9  */
  10 
  11 #ifndef _FBCON_ROTATE_H
  12 #define _FBCON_ROTATE_H
  13 
  14 #define GETVYRES(s,i) ({                           \
  15         (s == SCROLL_REDRAW || s == SCROLL_MOVE) ? \
  16         (i)->var.yres : (i)->var.yres_virtual; })
  17 
  18 #define GETVXRES(s,i) ({                           \
  19         (s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \
  20         (i)->var.xres : (i)->var.xres_virtual; })
  21 
  22 
  23 static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat)
  24 {
  25         u32 tmp = (y * pitch) + x, index = tmp / 8,  bit = tmp % 8;
  26 
  27         pat +=index;
  28         return (*pat) & (0x80 >> bit);
  29 }
  30 
  31 static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)
  32 {
  33         u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;
  34 
  35         pat += index;
  36 
  37         (*pat) |= 0x80 >> bit;
  38 }
  39 
  40 static inline void rotate_ud(const char *in, char *out, u32 width, u32 height)
  41 {
  42         int i, j;
  43         int shift = (8 - (width % 8)) & 7;
  44 
  45         width = (width + 7) & ~7;
  46 
  47         for (i = 0; i < height; i++) {
  48                 for (j = 0; j < width - shift; j++) {
  49                         if (pattern_test_bit(j, i, width, in))
  50                                 pattern_set_bit(width - (1 + j + shift),
  51                                                 height - (1 + i),
  52                                                 width, out);
  53                 }
  54 
  55         }
  56 }
  57 
  58 static inline void rotate_cw(const char *in, char *out, u32 width, u32 height)
  59 {
  60         int i, j, h = height, w = width;
  61         int shift = (8 - (height % 8)) & 7;
  62 
  63         width = (width + 7) & ~7;
  64         height = (height + 7) & ~7;
  65 
  66         for (i = 0; i < h; i++) {
  67                 for (j = 0; j < w; j++) {
  68                         if (pattern_test_bit(j, i, width, in))
  69                                 pattern_set_bit(height - 1 - i - shift, j,
  70                                                 height, out);
  71 
  72                 }
  73         }
  74 }
  75 
  76 static inline void rotate_ccw(const char *in, char *out, u32 width, u32 height)
  77 {
  78         int i, j, h = height, w = width;
  79         int shift = (8 - (width % 8)) & 7;
  80 
  81         width = (width + 7) & ~7;
  82         height = (height + 7) & ~7;
  83 
  84         for (i = 0; i < h; i++) {
  85                 for (j = 0; j < w; j++) {
  86                         if (pattern_test_bit(j, i, width, in))
  87                                 pattern_set_bit(i, width - 1 - j - shift,
  88                                                 height, out);
  89                 }
  90         }
  91 }
  92 
  93 extern void fbcon_rotate_cw(struct fbcon_ops *ops);
  94 extern void fbcon_rotate_ud(struct fbcon_ops *ops);
  95 extern void fbcon_rotate_ccw(struct fbcon_ops *ops);
  96 #endif

/* [<][>][^][v][top][bottom][index][help] */