iforce2d Chris / Mbed 2 deprecated ubxDistanceMeter

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers u8g_pbxh24.c Source File

u8g_pbxh24.c

00001 /*
00002 
00003   u8g_pbxh24.c
00004   
00005   x lines per page, horizontal, 24 bits per pixel (true color modes)
00006   
00007   Universal 8bit Graphics Library
00008   
00009   Copyright (c) 2013, olikraus@gmail.com
00010   All rights reserved.
00011 
00012   Redistribution and use in source and binary forms, with or without modification, 
00013   are permitted provided that the following conditions are met:
00014 
00015   * Redistributions of source code must retain the above copyright notice, this list 
00016     of conditions and the following disclaimer.
00017     
00018   * Redistributions in binary form must reproduce the above copyright notice, this 
00019     list of conditions and the following disclaimer in the documentation and/or other 
00020     materials provided with the distribution.
00021 
00022   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
00023   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
00024   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
00025   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00026   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
00027   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
00028   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
00029   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
00030   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
00031   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
00032   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
00033   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
00034   ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  
00035 
00036 
00037 struct _u8g_pb_t
00038 {
00039   u8g_page_t p;
00040   u8g_uint_t width;
00041   void *buf;
00042 };
00043 typedef struct _u8g_pb_t u8g_pb_t;
00044 
00045 
00046 uint8_t u8g_index_color_xh16_buf[2*WIDTH*PAGE_HEIGHT] U8G_NOCOMMON ; 
00047 u8g_pb_t u8g_index_color_xh16_pb = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0},  WIDTH, u8g_index_color_xh16_buf}; 
00048 u8g_dev_t name = { dev_fn, &u8g_index_color_xh16_pb , com_fn }
00049 
00050 */
00051 
00052 #include "u8g.h"
00053 
00054 /*
00055 #define WIDTH_BITS 7
00056 #define WIDTH (1<<WIDTH_BITS)
00057 #define PAGE_HEIGHT_BITS 3
00058 #define PAGE_HEIGHT (1<<PAGE_HEIGHT_BITS)
00059 */
00060 
00061 void u8g_pbxh24_Clear(u8g_pb_t *b)
00062 {
00063   uint8_t *ptr = (uint8_t *)b->buf;
00064   uint8_t *end_ptr = ptr;
00065   uint8_t cnt = b->p.page_height;
00066   do
00067   {
00068     end_ptr += b->width*3;
00069     cnt--;
00070   } while( cnt > 0 );
00071   do
00072   {
00073     *ptr++ = 0;
00074   } while( ptr != end_ptr );
00075 }
00076 
00077 
00078 void u8g_pbxh24_Init(u8g_pb_t *b, void *buf, u8g_uint_t width)
00079 {
00080   b->buf = buf;
00081   b->width = width;
00082   u8g_pbxh24_Clear(b);
00083 }
00084 
00085 #ifdef OBSOLETE
00086 static void u8g_pbxh24_set_pixel(u8g_pb_t *b, u8g_uint_t x, u8g_uint_t y, uint8_t r, uint8_t g, uint8_t b)
00087 {
00088   uint16_t tmp;
00089   uint8_t *ptr = b->buf;
00090   y -= b->p.page_y0;
00091   tmp = y;
00092   tmp *= b->width;
00093   tmp += x;
00094   tmp *= 3;
00095   ptr += tmp;
00096   *ptr = r;
00097   ptr++;
00098   *ptr = g;
00099   ptr++;
00100   *ptr = b;
00101 }
00102 #endif
00103 
00104 /*
00105   intensity
00106     0..3        intensity value
00107     4           replace color
00108 */
00109 static void u8g_pbxh24_set_tpixel(u8g_pb_t *b, u8g_uint_t x, u8g_uint_t y, uint8_t red, uint8_t green, uint8_t blue, uint8_t intensity)
00110 {
00111   uint16_t tmp;
00112   uint8_t *ptr = b->buf;
00113   
00114   if ( intensity == 0 )
00115     return;
00116   
00117   y -= b->p.page_y0;
00118   tmp = y;
00119   tmp *= b->width;
00120   tmp += x;
00121   tmp *= 3;
00122   ptr += tmp;
00123   
00124   if ( intensity == 4 )
00125   {
00126     *ptr = red;
00127     ptr++;
00128     *ptr = green;
00129     ptr++;
00130     *ptr = blue;
00131     return;
00132   }
00133 
00134   if ( intensity == 2 )
00135   {
00136     /*
00137     red = red/4 + red/2;
00138     green = green/4 + green/2;
00139     blue = blue/4 + blue/2;
00140     */
00141     red >>= 1;
00142     green >>= 1;
00143     blue >>= 1;
00144   }
00145   else if ( intensity == 1 )
00146   {
00147     red >>= 2;
00148     green >>= 2;
00149     blue >>= 2;
00150   }
00151 
00152   if ( *ptr >= 255-red ) *ptr = 255; 
00153   else *ptr += red;
00154   ptr++;
00155 
00156   if ( *ptr >= 255-green ) *ptr = 255; 
00157   else *ptr += green;
00158   ptr++;
00159 
00160   if ( *ptr >= 255-blue ) *ptr = 255; 
00161   else *ptr += blue;
00162   
00163   /*
00164   if ( *ptr < red ) *ptr = red;
00165   ptr++;
00166   if ( *ptr < green ) *ptr = green;
00167   ptr++;
00168   if ( *ptr < blue ) *ptr = blue;
00169   */
00170   
00171   
00172 }
00173 
00174 void u8g_pbxh24_SetTPixel(u8g_pb_t *b, const u8g_dev_arg_pixel_t * const arg_pixel, uint8_t intensity)
00175 {
00176   if ( arg_pixel->y < b->p.page_y0 )
00177     return;
00178   if ( arg_pixel->y > b->p.page_y1 )
00179     return;
00180   if ( arg_pixel->x >= b->width )
00181     return;
00182   u8g_pbxh24_set_tpixel(b, arg_pixel->x, arg_pixel->y, arg_pixel->color, arg_pixel->hi_color, arg_pixel->blue, intensity);
00183 }
00184 
00185 
00186 void u8g_pbxh24_Set8Pixel(u8g_pb_t *b, u8g_dev_arg_pixel_t *arg_pixel)
00187 {
00188   register uint8_t pixel = arg_pixel->pixel;
00189   u8g_uint_t dx = 0;
00190   u8g_uint_t dy = 0;
00191   
00192   switch( arg_pixel->dir )
00193   {
00194     case 0: dx++; break;
00195     case 1: dy++; break;
00196     case 2: dx--; break;
00197     case 3: dy--; break;
00198   }
00199   
00200   do
00201   {
00202     if ( pixel & 128 )
00203       u8g_pbxh24_SetTPixel(b, arg_pixel, 4);
00204     arg_pixel->x += dx;
00205     arg_pixel->y += dy;
00206     pixel <<= 1;
00207   } while( pixel != 0  );  
00208 }
00209 
00210 void u8g_pbxh24_Set4TPixel(u8g_pb_t *b, u8g_dev_arg_pixel_t *arg_pixel)
00211 {
00212   register uint8_t pixel = arg_pixel->pixel;
00213   u8g_uint_t dx = 0;
00214   u8g_uint_t dy = 0;
00215   
00216   switch( arg_pixel->dir )
00217   {
00218     case 0: dx++; break;
00219     case 1: dy++; break;
00220     case 2: dx--; break;
00221     case 3: dy--; break;
00222   }
00223   
00224   do
00225   {
00226     u8g_pbxh24_SetTPixel(b, arg_pixel, pixel >> 6);
00227     arg_pixel->x += dx;
00228     arg_pixel->y += dy;
00229     pixel <<= 2;
00230   } while( pixel != 0  );  
00231 }
00232 
00233 
00234 uint8_t u8g_dev_pbxh24_base_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
00235 {
00236   u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
00237   switch(msg)
00238   {
00239     case U8G_DEV_MSG_SET_8PIXEL:
00240       if ( u8g_pb_Is8PixelVisible(pb, (u8g_dev_arg_pixel_t *)arg) )
00241         u8g_pbxh24_Set8Pixel(pb, (u8g_dev_arg_pixel_t *)arg);
00242       break;
00243     case U8G_DEV_MSG_SET_PIXEL:
00244       u8g_pbxh24_SetTPixel(pb, (u8g_dev_arg_pixel_t *)arg, 4);
00245       break;
00246     case U8G_DEV_MSG_SET_4TPIXEL:
00247       u8g_pbxh24_Set4TPixel(pb, (u8g_dev_arg_pixel_t *)arg);
00248       break;
00249     case U8G_DEV_MSG_SET_TPIXEL:
00250       u8g_pbxh24_SetTPixel(pb, (u8g_dev_arg_pixel_t *)arg, ((u8g_dev_arg_pixel_t *)arg)->pixel&3);
00251       break;
00252     case U8G_DEV_MSG_INIT:
00253       break;
00254     case U8G_DEV_MSG_STOP:
00255       break;
00256     case U8G_DEV_MSG_PAGE_FIRST:
00257       u8g_pbxh24_Clear(pb);
00258       u8g_page_First(&(pb->p));
00259       break;
00260     case U8G_DEV_MSG_PAGE_NEXT:
00261       if ( u8g_page_Next(&(pb->p)) == 0 )
00262         return 0;
00263       u8g_pbxh24_Clear(pb);
00264       break;
00265 #ifdef U8G_DEV_MSG_IS_BBX_INTERSECTION
00266     case U8G_DEV_MSG_IS_BBX_INTERSECTION:
00267       return u8g_pb_IsIntersection(pb, (u8g_dev_arg_bbx_t *)arg);
00268 #endif
00269     case U8G_DEV_MSG_GET_PAGE_BOX:
00270       u8g_pb_GetPageBox(pb, (u8g_box_t *)arg);
00271       break;
00272     case U8G_DEV_MSG_GET_WIDTH:
00273       *((u8g_uint_t *)arg) = pb->width;
00274       break;
00275     case U8G_DEV_MSG_GET_HEIGHT:
00276       *((u8g_uint_t *)arg) = pb->p.total_height;
00277       break;
00278     case U8G_DEV_MSG_SET_COLOR_ENTRY:
00279       break;
00280     case U8G_DEV_MSG_SET_XY_CB:
00281       break;
00282     case U8G_DEV_MSG_GET_MODE:
00283       return U8G_MODE_TRUECOLOR;
00284   }
00285   return 1;
00286 }
00287 
00288