hadif azli / Mbed 2 deprecated TEST123

Dependencies:   mbed Blynk

Committer:
lixianyu
Date:
Mon Jun 13 02:21:11 2016 +0000
Revision:
1:0e75de2a5d21
Parent:
0:d8f4c441e032
u8glib???????????????????????????Adafruit_GFX????OLED????????bitmap??????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 0:d8f4c441e032 1 /*
lixianyu 0:d8f4c441e032 2
lixianyu 0:d8f4c441e032 3 u8g_pbxh24.c
lixianyu 0:d8f4c441e032 4
lixianyu 0:d8f4c441e032 5 x lines per page, horizontal, 24 bits per pixel (true color modes)
lixianyu 0:d8f4c441e032 6
lixianyu 0:d8f4c441e032 7 Universal 8bit Graphics Library
lixianyu 0:d8f4c441e032 8
lixianyu 0:d8f4c441e032 9 Copyright (c) 2013, olikraus@gmail.com
lixianyu 0:d8f4c441e032 10 All rights reserved.
lixianyu 0:d8f4c441e032 11
lixianyu 0:d8f4c441e032 12 Redistribution and use in source and binary forms, with or without modification,
lixianyu 0:d8f4c441e032 13 are permitted provided that the following conditions are met:
lixianyu 0:d8f4c441e032 14
lixianyu 0:d8f4c441e032 15 * Redistributions of source code must retain the above copyright notice, this list
lixianyu 0:d8f4c441e032 16 of conditions and the following disclaimer.
lixianyu 0:d8f4c441e032 17
lixianyu 0:d8f4c441e032 18 * Redistributions in binary form must reproduce the above copyright notice, this
lixianyu 0:d8f4c441e032 19 list of conditions and the following disclaimer in the documentation and/or other
lixianyu 0:d8f4c441e032 20 materials provided with the distribution.
lixianyu 0:d8f4c441e032 21
lixianyu 0:d8f4c441e032 22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
lixianyu 0:d8f4c441e032 23 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
lixianyu 0:d8f4c441e032 24 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
lixianyu 0:d8f4c441e032 25 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
lixianyu 0:d8f4c441e032 26 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
lixianyu 0:d8f4c441e032 27 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
lixianyu 0:d8f4c441e032 28 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
lixianyu 0:d8f4c441e032 29 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
lixianyu 0:d8f4c441e032 30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
lixianyu 0:d8f4c441e032 31 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
lixianyu 0:d8f4c441e032 32 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
lixianyu 0:d8f4c441e032 33 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
lixianyu 0:d8f4c441e032 34 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
lixianyu 0:d8f4c441e032 35
lixianyu 0:d8f4c441e032 36
lixianyu 0:d8f4c441e032 37 struct _u8g_pb_t
lixianyu 0:d8f4c441e032 38 {
lixianyu 0:d8f4c441e032 39 u8g_page_t p;
lixianyu 0:d8f4c441e032 40 u8g_uint_t width;
lixianyu 0:d8f4c441e032 41 void *buf;
lixianyu 0:d8f4c441e032 42 };
lixianyu 0:d8f4c441e032 43 typedef struct _u8g_pb_t u8g_pb_t;
lixianyu 0:d8f4c441e032 44
lixianyu 0:d8f4c441e032 45
lixianyu 0:d8f4c441e032 46 uint8_t u8g_index_color_xh16_buf[2*WIDTH*PAGE_HEIGHT] U8G_NOCOMMON ;
lixianyu 0:d8f4c441e032 47 u8g_pb_t u8g_index_color_xh16_pb = { {PAGE_HEIGHT, HEIGHT, 0, 0, 0}, WIDTH, u8g_index_color_xh16_buf};
lixianyu 0:d8f4c441e032 48 u8g_dev_t name = { dev_fn, &u8g_index_color_xh16_pb , com_fn }
lixianyu 0:d8f4c441e032 49
lixianyu 0:d8f4c441e032 50 */
lixianyu 0:d8f4c441e032 51
lixianyu 0:d8f4c441e032 52 #include "u8g.h"
lixianyu 0:d8f4c441e032 53
lixianyu 0:d8f4c441e032 54 /*
lixianyu 0:d8f4c441e032 55 #define WIDTH_BITS 7
lixianyu 0:d8f4c441e032 56 #define WIDTH (1<<WIDTH_BITS)
lixianyu 0:d8f4c441e032 57 #define PAGE_HEIGHT_BITS 3
lixianyu 0:d8f4c441e032 58 #define PAGE_HEIGHT (1<<PAGE_HEIGHT_BITS)
lixianyu 0:d8f4c441e032 59 */
lixianyu 0:d8f4c441e032 60
lixianyu 0:d8f4c441e032 61 void u8g_pbxh24_Clear(u8g_pb_t *b)
lixianyu 0:d8f4c441e032 62 {
lixianyu 0:d8f4c441e032 63 uint8_t *ptr = (uint8_t *)b->buf;
lixianyu 0:d8f4c441e032 64 uint8_t *end_ptr = ptr;
lixianyu 0:d8f4c441e032 65 uint8_t cnt = b->p.page_height;
lixianyu 0:d8f4c441e032 66 do
lixianyu 0:d8f4c441e032 67 {
lixianyu 0:d8f4c441e032 68 end_ptr += b->width*3;
lixianyu 0:d8f4c441e032 69 cnt--;
lixianyu 0:d8f4c441e032 70 } while( cnt > 0 );
lixianyu 0:d8f4c441e032 71 do
lixianyu 0:d8f4c441e032 72 {
lixianyu 0:d8f4c441e032 73 *ptr++ = 0;
lixianyu 0:d8f4c441e032 74 } while( ptr != end_ptr );
lixianyu 0:d8f4c441e032 75 }
lixianyu 0:d8f4c441e032 76
lixianyu 0:d8f4c441e032 77
lixianyu 0:d8f4c441e032 78 void u8g_pbxh24_Init(u8g_pb_t *b, void *buf, u8g_uint_t width)
lixianyu 0:d8f4c441e032 79 {
lixianyu 0:d8f4c441e032 80 b->buf = buf;
lixianyu 0:d8f4c441e032 81 b->width = width;
lixianyu 0:d8f4c441e032 82 u8g_pbxh24_Clear(b);
lixianyu 0:d8f4c441e032 83 }
lixianyu 0:d8f4c441e032 84
lixianyu 0:d8f4c441e032 85 #ifdef OBSOLETE
lixianyu 0:d8f4c441e032 86 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)
lixianyu 0:d8f4c441e032 87 {
lixianyu 0:d8f4c441e032 88 uint16_t tmp;
lixianyu 0:d8f4c441e032 89 uint8_t *ptr = b->buf;
lixianyu 0:d8f4c441e032 90 y -= b->p.page_y0;
lixianyu 0:d8f4c441e032 91 tmp = y;
lixianyu 0:d8f4c441e032 92 tmp *= b->width;
lixianyu 0:d8f4c441e032 93 tmp += x;
lixianyu 0:d8f4c441e032 94 tmp *= 3;
lixianyu 0:d8f4c441e032 95 ptr += tmp;
lixianyu 0:d8f4c441e032 96 *ptr = r;
lixianyu 0:d8f4c441e032 97 ptr++;
lixianyu 0:d8f4c441e032 98 *ptr = g;
lixianyu 0:d8f4c441e032 99 ptr++;
lixianyu 0:d8f4c441e032 100 *ptr = b;
lixianyu 0:d8f4c441e032 101 }
lixianyu 0:d8f4c441e032 102 #endif
lixianyu 0:d8f4c441e032 103
lixianyu 0:d8f4c441e032 104 /*
lixianyu 0:d8f4c441e032 105 intensity
lixianyu 0:d8f4c441e032 106 0..3 intensity value
lixianyu 0:d8f4c441e032 107 4 replace color
lixianyu 0:d8f4c441e032 108 */
lixianyu 0:d8f4c441e032 109 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)
lixianyu 0:d8f4c441e032 110 {
lixianyu 0:d8f4c441e032 111 uint16_t tmp;
lixianyu 0:d8f4c441e032 112 uint8_t *ptr = b->buf;
lixianyu 0:d8f4c441e032 113
lixianyu 0:d8f4c441e032 114 if ( intensity == 0 )
lixianyu 0:d8f4c441e032 115 return;
lixianyu 0:d8f4c441e032 116
lixianyu 0:d8f4c441e032 117 y -= b->p.page_y0;
lixianyu 0:d8f4c441e032 118 tmp = y;
lixianyu 0:d8f4c441e032 119 tmp *= b->width;
lixianyu 0:d8f4c441e032 120 tmp += x;
lixianyu 0:d8f4c441e032 121 tmp *= 3;
lixianyu 0:d8f4c441e032 122 ptr += tmp;
lixianyu 0:d8f4c441e032 123
lixianyu 0:d8f4c441e032 124 if ( intensity == 4 )
lixianyu 0:d8f4c441e032 125 {
lixianyu 0:d8f4c441e032 126 *ptr = red;
lixianyu 0:d8f4c441e032 127 ptr++;
lixianyu 0:d8f4c441e032 128 *ptr = green;
lixianyu 0:d8f4c441e032 129 ptr++;
lixianyu 0:d8f4c441e032 130 *ptr = blue;
lixianyu 0:d8f4c441e032 131 return;
lixianyu 0:d8f4c441e032 132 }
lixianyu 0:d8f4c441e032 133
lixianyu 0:d8f4c441e032 134 if ( intensity == 2 )
lixianyu 0:d8f4c441e032 135 {
lixianyu 0:d8f4c441e032 136 /*
lixianyu 0:d8f4c441e032 137 red = red/4 + red/2;
lixianyu 0:d8f4c441e032 138 green = green/4 + green/2;
lixianyu 0:d8f4c441e032 139 blue = blue/4 + blue/2;
lixianyu 0:d8f4c441e032 140 */
lixianyu 0:d8f4c441e032 141 red >>= 1;
lixianyu 0:d8f4c441e032 142 green >>= 1;
lixianyu 0:d8f4c441e032 143 blue >>= 1;
lixianyu 0:d8f4c441e032 144 }
lixianyu 0:d8f4c441e032 145 else if ( intensity == 1 )
lixianyu 0:d8f4c441e032 146 {
lixianyu 0:d8f4c441e032 147 red >>= 2;
lixianyu 0:d8f4c441e032 148 green >>= 2;
lixianyu 0:d8f4c441e032 149 blue >>= 2;
lixianyu 0:d8f4c441e032 150 }
lixianyu 0:d8f4c441e032 151
lixianyu 0:d8f4c441e032 152 if ( *ptr >= 255-red ) *ptr = 255;
lixianyu 0:d8f4c441e032 153 else *ptr += red;
lixianyu 0:d8f4c441e032 154 ptr++;
lixianyu 0:d8f4c441e032 155
lixianyu 0:d8f4c441e032 156 if ( *ptr >= 255-green ) *ptr = 255;
lixianyu 0:d8f4c441e032 157 else *ptr += green;
lixianyu 0:d8f4c441e032 158 ptr++;
lixianyu 0:d8f4c441e032 159
lixianyu 0:d8f4c441e032 160 if ( *ptr >= 255-blue ) *ptr = 255;
lixianyu 0:d8f4c441e032 161 else *ptr += blue;
lixianyu 0:d8f4c441e032 162
lixianyu 0:d8f4c441e032 163 /*
lixianyu 0:d8f4c441e032 164 if ( *ptr < red ) *ptr = red;
lixianyu 0:d8f4c441e032 165 ptr++;
lixianyu 0:d8f4c441e032 166 if ( *ptr < green ) *ptr = green;
lixianyu 0:d8f4c441e032 167 ptr++;
lixianyu 0:d8f4c441e032 168 if ( *ptr < blue ) *ptr = blue;
lixianyu 0:d8f4c441e032 169 */
lixianyu 0:d8f4c441e032 170
lixianyu 0:d8f4c441e032 171
lixianyu 0:d8f4c441e032 172 }
lixianyu 0:d8f4c441e032 173
lixianyu 0:d8f4c441e032 174 void u8g_pbxh24_SetTPixel(u8g_pb_t *b, const u8g_dev_arg_pixel_t * const arg_pixel, uint8_t intensity)
lixianyu 0:d8f4c441e032 175 {
lixianyu 0:d8f4c441e032 176 if ( arg_pixel->y < b->p.page_y0 )
lixianyu 0:d8f4c441e032 177 return;
lixianyu 0:d8f4c441e032 178 if ( arg_pixel->y > b->p.page_y1 )
lixianyu 0:d8f4c441e032 179 return;
lixianyu 0:d8f4c441e032 180 if ( arg_pixel->x >= b->width )
lixianyu 0:d8f4c441e032 181 return;
lixianyu 0:d8f4c441e032 182 u8g_pbxh24_set_tpixel(b, arg_pixel->x, arg_pixel->y, arg_pixel->color, arg_pixel->hi_color, arg_pixel->blue, intensity);
lixianyu 0:d8f4c441e032 183 }
lixianyu 0:d8f4c441e032 184
lixianyu 0:d8f4c441e032 185
lixianyu 0:d8f4c441e032 186 void u8g_pbxh24_Set8Pixel(u8g_pb_t *b, u8g_dev_arg_pixel_t *arg_pixel)
lixianyu 0:d8f4c441e032 187 {
lixianyu 0:d8f4c441e032 188 register uint8_t pixel = arg_pixel->pixel;
lixianyu 0:d8f4c441e032 189 u8g_uint_t dx = 0;
lixianyu 0:d8f4c441e032 190 u8g_uint_t dy = 0;
lixianyu 0:d8f4c441e032 191
lixianyu 0:d8f4c441e032 192 switch( arg_pixel->dir )
lixianyu 0:d8f4c441e032 193 {
lixianyu 0:d8f4c441e032 194 case 0: dx++; break;
lixianyu 0:d8f4c441e032 195 case 1: dy++; break;
lixianyu 0:d8f4c441e032 196 case 2: dx--; break;
lixianyu 0:d8f4c441e032 197 case 3: dy--; break;
lixianyu 0:d8f4c441e032 198 }
lixianyu 0:d8f4c441e032 199
lixianyu 0:d8f4c441e032 200 do
lixianyu 0:d8f4c441e032 201 {
lixianyu 0:d8f4c441e032 202 if ( pixel & 128 )
lixianyu 0:d8f4c441e032 203 u8g_pbxh24_SetTPixel(b, arg_pixel, 4);
lixianyu 0:d8f4c441e032 204 arg_pixel->x += dx;
lixianyu 0:d8f4c441e032 205 arg_pixel->y += dy;
lixianyu 0:d8f4c441e032 206 pixel <<= 1;
lixianyu 0:d8f4c441e032 207 } while( pixel != 0 );
lixianyu 0:d8f4c441e032 208 }
lixianyu 0:d8f4c441e032 209
lixianyu 0:d8f4c441e032 210 void u8g_pbxh24_Set4TPixel(u8g_pb_t *b, u8g_dev_arg_pixel_t *arg_pixel)
lixianyu 0:d8f4c441e032 211 {
lixianyu 0:d8f4c441e032 212 register uint8_t pixel = arg_pixel->pixel;
lixianyu 0:d8f4c441e032 213 u8g_uint_t dx = 0;
lixianyu 0:d8f4c441e032 214 u8g_uint_t dy = 0;
lixianyu 0:d8f4c441e032 215
lixianyu 0:d8f4c441e032 216 switch( arg_pixel->dir )
lixianyu 0:d8f4c441e032 217 {
lixianyu 0:d8f4c441e032 218 case 0: dx++; break;
lixianyu 0:d8f4c441e032 219 case 1: dy++; break;
lixianyu 0:d8f4c441e032 220 case 2: dx--; break;
lixianyu 0:d8f4c441e032 221 case 3: dy--; break;
lixianyu 0:d8f4c441e032 222 }
lixianyu 0:d8f4c441e032 223
lixianyu 0:d8f4c441e032 224 do
lixianyu 0:d8f4c441e032 225 {
lixianyu 0:d8f4c441e032 226 u8g_pbxh24_SetTPixel(b, arg_pixel, pixel >> 6);
lixianyu 0:d8f4c441e032 227 arg_pixel->x += dx;
lixianyu 0:d8f4c441e032 228 arg_pixel->y += dy;
lixianyu 0:d8f4c441e032 229 pixel <<= 2;
lixianyu 0:d8f4c441e032 230 } while( pixel != 0 );
lixianyu 0:d8f4c441e032 231 }
lixianyu 0:d8f4c441e032 232
lixianyu 0:d8f4c441e032 233
lixianyu 0:d8f4c441e032 234 uint8_t u8g_dev_pbxh24_base_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
lixianyu 0:d8f4c441e032 235 {
lixianyu 0:d8f4c441e032 236 u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem);
lixianyu 0:d8f4c441e032 237 switch(msg)
lixianyu 0:d8f4c441e032 238 {
lixianyu 0:d8f4c441e032 239 case U8G_DEV_MSG_SET_8PIXEL:
lixianyu 0:d8f4c441e032 240 if ( u8g_pb_Is8PixelVisible(pb, (u8g_dev_arg_pixel_t *)arg) )
lixianyu 0:d8f4c441e032 241 u8g_pbxh24_Set8Pixel(pb, (u8g_dev_arg_pixel_t *)arg);
lixianyu 0:d8f4c441e032 242 break;
lixianyu 0:d8f4c441e032 243 case U8G_DEV_MSG_SET_PIXEL:
lixianyu 0:d8f4c441e032 244 u8g_pbxh24_SetTPixel(pb, (u8g_dev_arg_pixel_t *)arg, 4);
lixianyu 0:d8f4c441e032 245 break;
lixianyu 0:d8f4c441e032 246 case U8G_DEV_MSG_SET_4TPIXEL:
lixianyu 0:d8f4c441e032 247 u8g_pbxh24_Set4TPixel(pb, (u8g_dev_arg_pixel_t *)arg);
lixianyu 0:d8f4c441e032 248 break;
lixianyu 0:d8f4c441e032 249 case U8G_DEV_MSG_SET_TPIXEL:
lixianyu 0:d8f4c441e032 250 u8g_pbxh24_SetTPixel(pb, (u8g_dev_arg_pixel_t *)arg, ((u8g_dev_arg_pixel_t *)arg)->pixel&3);
lixianyu 0:d8f4c441e032 251 break;
lixianyu 0:d8f4c441e032 252 case U8G_DEV_MSG_INIT:
lixianyu 0:d8f4c441e032 253 break;
lixianyu 0:d8f4c441e032 254 case U8G_DEV_MSG_STOP:
lixianyu 0:d8f4c441e032 255 break;
lixianyu 0:d8f4c441e032 256 case U8G_DEV_MSG_PAGE_FIRST:
lixianyu 0:d8f4c441e032 257 u8g_pbxh24_Clear(pb);
lixianyu 0:d8f4c441e032 258 u8g_page_First(&(pb->p));
lixianyu 0:d8f4c441e032 259 break;
lixianyu 0:d8f4c441e032 260 case U8G_DEV_MSG_PAGE_NEXT:
lixianyu 0:d8f4c441e032 261 if ( u8g_page_Next(&(pb->p)) == 0 )
lixianyu 0:d8f4c441e032 262 return 0;
lixianyu 0:d8f4c441e032 263 u8g_pbxh24_Clear(pb);
lixianyu 0:d8f4c441e032 264 break;
lixianyu 0:d8f4c441e032 265 #ifdef U8G_DEV_MSG_IS_BBX_INTERSECTION
lixianyu 0:d8f4c441e032 266 case U8G_DEV_MSG_IS_BBX_INTERSECTION:
lixianyu 0:d8f4c441e032 267 return u8g_pb_IsIntersection(pb, (u8g_dev_arg_bbx_t *)arg);
lixianyu 0:d8f4c441e032 268 #endif
lixianyu 0:d8f4c441e032 269 case U8G_DEV_MSG_GET_PAGE_BOX:
lixianyu 0:d8f4c441e032 270 u8g_pb_GetPageBox(pb, (u8g_box_t *)arg);
lixianyu 0:d8f4c441e032 271 break;
lixianyu 0:d8f4c441e032 272 case U8G_DEV_MSG_GET_WIDTH:
lixianyu 0:d8f4c441e032 273 *((u8g_uint_t *)arg) = pb->width;
lixianyu 0:d8f4c441e032 274 break;
lixianyu 0:d8f4c441e032 275 case U8G_DEV_MSG_GET_HEIGHT:
lixianyu 0:d8f4c441e032 276 *((u8g_uint_t *)arg) = pb->p.total_height;
lixianyu 0:d8f4c441e032 277 break;
lixianyu 0:d8f4c441e032 278 case U8G_DEV_MSG_SET_COLOR_ENTRY:
lixianyu 0:d8f4c441e032 279 break;
lixianyu 0:d8f4c441e032 280 case U8G_DEV_MSG_SET_XY_CB:
lixianyu 0:d8f4c441e032 281 break;
lixianyu 0:d8f4c441e032 282 case U8G_DEV_MSG_GET_MODE:
lixianyu 0:d8f4c441e032 283 return U8G_MODE_TRUECOLOR;
lixianyu 0:d8f4c441e032 284 }
lixianyu 0:d8f4c441e032 285 return 1;
lixianyu 0:d8f4c441e032 286 }
lixianyu 0:d8f4c441e032 287
lixianyu 0:d8f4c441e032 288