acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
lv_draw_sdl_utils.c (4958B)
1 /** 2 * @file lv_draw_sdl_utils.c 3 * 4 */ 5 6 /********************* 7 * INCLUDES 8 *********************/ 9 #include "../../lv_conf_internal.h" 10 11 #if LV_USE_GPU_SDL 12 13 #include "lv_draw_sdl_utils.h" 14 15 #include "../lv_draw.h" 16 #include "../lv_draw_label.h" 17 #include "../../core/lv_refr.h" 18 19 /********************* 20 * DEFINES 21 *********************/ 22 23 /********************** 24 * TYPEDEFS 25 **********************/ 26 27 /********************** 28 * STATIC PROTOTYPES 29 **********************/ 30 /********************** 31 * STATIC VARIABLES 32 **********************/ 33 extern const uint8_t _lv_bpp1_opa_table[2]; 34 extern const uint8_t _lv_bpp2_opa_table[4]; 35 extern const uint8_t _lv_bpp4_opa_table[16]; 36 extern const uint8_t _lv_bpp8_opa_table[256]; 37 38 static int utils_init_count = 0; 39 static SDL_Palette * lv_sdl_palette_grayscale8 = NULL; 40 41 /********************** 42 * MACROS 43 **********************/ 44 45 /********************** 46 * GLOBAL FUNCTIONS 47 **********************/ 48 49 void _lv_draw_sdl_utils_init() 50 { 51 utils_init_count++; 52 if(utils_init_count > 1) { 53 return; 54 } 55 lv_sdl_palette_grayscale8 = lv_sdl_alloc_palette_for_bpp(_lv_bpp8_opa_table, 8); 56 } 57 58 void _lv_draw_sdl_utils_deinit() 59 { 60 if(utils_init_count == 0) { 61 return; 62 } 63 utils_init_count--; 64 if(utils_init_count == 0) { 65 SDL_FreePalette(lv_sdl_palette_grayscale8); 66 lv_sdl_palette_grayscale8 = NULL; 67 } 68 } 69 70 void lv_area_to_sdl_rect(const lv_area_t * in, SDL_Rect * out) 71 { 72 out->x = in->x1; 73 out->y = in->y1; 74 out->w = in->x2 - in->x1 + 1; 75 out->h = in->y2 - in->y1 + 1; 76 } 77 78 void lv_color_to_sdl_color(const lv_color_t * in, SDL_Color * out) 79 { 80 #if LV_COLOR_DEPTH == 32 81 out->a = in->ch.alpha; 82 out->r = in->ch.red; 83 out->g = in->ch.green; 84 out->b = in->ch.blue; 85 #else 86 uint32_t color32 = lv_color_to32(*in); 87 lv_color32_t * color32_t = (lv_color32_t *) &color32; 88 out->a = color32_t->ch.alpha; 89 out->r = color32_t->ch.red; 90 out->g = color32_t->ch.green; 91 out->b = color32_t->ch.blue; 92 #endif 93 } 94 95 void lv_area_zoom_to_sdl_rect(const lv_area_t * in, SDL_Rect * out, uint16_t zoom, const lv_point_t * pivot) 96 { 97 if(zoom == LV_IMG_ZOOM_NONE) { 98 lv_area_to_sdl_rect(in, out); 99 return; 100 } 101 lv_area_t tmp; 102 _lv_img_buf_get_transformed_area(&tmp, lv_area_get_width(in), lv_area_get_height(in), 0, zoom, pivot); 103 lv_area_move(&tmp, in->x1, in->y1); 104 lv_area_to_sdl_rect(&tmp, out); 105 } 106 107 SDL_Palette * lv_sdl_alloc_palette_for_bpp(const uint8_t * mapping, uint8_t bpp) 108 { 109 SDL_assert(bpp >= 1 && bpp <= 8); 110 int color_cnt = 1 << bpp; 111 SDL_Palette * result = SDL_AllocPalette(color_cnt); 112 SDL_Color palette[256]; 113 for(int i = 0; i < color_cnt; i++) { 114 palette[i].r = palette[i].g = palette[i].b = 0xFF; 115 palette[i].a = mapping ? mapping[i] : i; 116 } 117 SDL_SetPaletteColors(result, palette, 0, color_cnt); 118 return result; 119 } 120 121 SDL_Surface * lv_sdl_create_opa_surface(lv_opa_t * opa, lv_coord_t width, lv_coord_t height, lv_coord_t stride) 122 { 123 SDL_Surface * indexed = SDL_CreateRGBSurfaceFrom(opa, width, height, 8, stride, 0, 0, 0, 0); 124 SDL_SetSurfacePalette(indexed, lv_sdl_palette_grayscale8); 125 SDL_Surface * converted = SDL_ConvertSurfaceFormat(indexed, LV_DRAW_SDL_TEXTURE_FORMAT, 0); 126 SDL_FreeSurface(indexed); 127 return converted; 128 } 129 130 SDL_Texture * lv_sdl_create_opa_texture(SDL_Renderer * renderer, lv_opa_t * pixels, lv_coord_t width, 131 lv_coord_t height, lv_coord_t stride) 132 { 133 SDL_Surface * indexed = lv_sdl_create_opa_surface(pixels, width, height, stride); 134 SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, indexed); 135 SDL_FreeSurface(indexed); 136 return texture; 137 } 138 139 void lv_sdl_to_8bpp(uint8_t * dest, const uint8_t * src, int width, int height, int stride, uint8_t bpp) 140 { 141 int src_len = width * height; 142 int cur = 0; 143 int curbit; 144 uint8_t opa_mask; 145 const uint8_t * opa_table; 146 switch(bpp) { 147 case 1: 148 opa_mask = 0x1; 149 opa_table = _lv_bpp1_opa_table; 150 break; 151 case 2: 152 opa_mask = 0x4; 153 opa_table = _lv_bpp2_opa_table; 154 break; 155 case 4: 156 opa_mask = 0xF; 157 opa_table = _lv_bpp4_opa_table; 158 break; 159 case 8: 160 opa_mask = 0xFF; 161 opa_table = _lv_bpp8_opa_table; 162 break; 163 default: 164 return; 165 } 166 /* Does this work well on big endian systems? */ 167 while(cur < src_len) { 168 curbit = 8 - bpp; 169 uint8_t src_byte = src[cur * bpp / 8]; 170 while(curbit >= 0 && cur < src_len) { 171 uint8_t src_bits = opa_mask & (src_byte >> curbit); 172 dest[(cur / width * stride) + (cur % width)] = opa_table[src_bits]; 173 curbit -= bpp; 174 cur++; 175 } 176 } 177 } 178 179 /********************** 180 * STATIC FUNCTIONS 181 **********************/ 182 183 #endif /*LV_USE_GPU_SDL*/