Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Tue Jul 12 2022 17:30:58 by
1.7.2