mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-13 10:07:38 -04:00
A bit of context, this device is a clone of the FunKey-S with a different form factor, hardware is mostly identical, the relevant difference is it has audio out (via usb-c, adapter to 3.5mm is included), this is the reason why the FunKey-SDK is needed for bulding. This port is based on the old SDL 1.2 code because the device doesn't have SDL2 support. Alongside what was supported in the SDL 1.2 builds this port supports battery level, charging status and backlight control. Change-Id: I7fcb85be62748644b667c0efebabf59d6e9c5ade
165 lines
5.1 KiB
C
165 lines
5.1 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2006 Dan Everton
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include <SDL.h>
|
|
#include "lcd-sdl.h"
|
|
#include "sim-ui-defines.h"
|
|
#include "system.h" /* for MIN() and MAX() */
|
|
#if SDL_MAJOR_VERSION > 1
|
|
#include "window-sdl.h"
|
|
#endif
|
|
|
|
void sdl_update_rect(SDL_Surface *surface, int x_start, int y_start, int width,
|
|
int height, int max_x, int max_y,
|
|
unsigned long (*getpixel)(int, int))
|
|
{
|
|
SDL_Rect dest;
|
|
#if LCD_DEPTH >= 8 && (LCD_PIXELFORMAT == RGB565) && \
|
|
(LCD_STRIDEFORMAT == HORIZONTAL_STRIDE) && \
|
|
!defined(HAVE_LCD_SPLIT) && !defined(HAVE_REMOTE_LCD)
|
|
SDL_Rect src;
|
|
(void)max_x;
|
|
(void)max_y;
|
|
(void)getpixel;
|
|
/* Update complete screen via one blit operation (fast) */
|
|
SDL_Surface *lcd = SDL_CreateRGBSurfaceFrom(FBADDR(0, 0), LCD_FBWIDTH,
|
|
LCD_FBHEIGHT, LCD_DEPTH,
|
|
LCD_FBWIDTH * LCD_DEPTH/8,
|
|
0, 0, 0, 0);
|
|
src.x = x_start;
|
|
src.y = y_start;
|
|
src.w = width;
|
|
src.h = height;
|
|
|
|
dest = src;
|
|
SDL_BlitSurface(lcd, &src, surface, &dest);
|
|
SDL_FreeSurface(lcd);
|
|
#else
|
|
int x, y;
|
|
int xmax, ymax;
|
|
/* Very slow pixel-by-pixel drawing */
|
|
ymax = y_start + height;
|
|
xmax = x_start + width;
|
|
|
|
if(xmax > max_x)
|
|
xmax = max_x;
|
|
if(ymax >= max_y)
|
|
ymax = max_y;
|
|
|
|
dest.w = 1;
|
|
dest.h = 1;
|
|
|
|
for (x = x_start; x < xmax; x++) {
|
|
dest.x = x;
|
|
|
|
#ifdef HAVE_LCD_SPLIT
|
|
for (y = y_start; y < MIN(ymax, LCD_SPLIT_POS); y++) {
|
|
dest.y = y;
|
|
|
|
SDL_FillRect(surface, &dest, (Uint32)(getpixel(x, y) | 0x80));
|
|
}
|
|
for (y = MAX(y_start, LCD_SPLIT_POS); y < ymax; y++) {
|
|
dest.y = (y + LCD_SPLIT_LINES) ;
|
|
|
|
SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y));
|
|
}
|
|
#else
|
|
for (y = y_start; y < ymax; y++) {
|
|
dest.y = y;
|
|
|
|
SDL_FillRect(surface, &dest, (Uint32)getpixel(x, y));
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void sdl_gui_update(SDL_Surface *surface, int x_start, int y_start, int width,
|
|
int height, int max_x, int max_y, int ui_x, int ui_y)
|
|
{
|
|
if (x_start + width > max_x)
|
|
width = max_x - x_start;
|
|
if (y_start + height > max_y)
|
|
height = max_y - y_start;
|
|
|
|
SDL_Rect src = {x_start, y_start, width, height};
|
|
SDL_Rect dest= {ui_x + x_start, ui_y + y_start, width, height};
|
|
|
|
|
|
#if SDL_MAJOR_VERSION > 1
|
|
uint8_t alpha;
|
|
|
|
SDL_LockMutex(window_mutex);
|
|
|
|
if (SDL_GetSurfaceAlphaMod(surface,&alpha) == 0 && alpha < 255)
|
|
SDL_FillRect(sim_lcd_surface, NULL, 0); /* alpha needs a black background */
|
|
|
|
SDL_BlitSurface(surface, &src, sim_lcd_surface, NULL);
|
|
SDL_UpdateTexture(gui_texture, &dest,
|
|
sim_lcd_surface->pixels, sim_lcd_surface->pitch);
|
|
|
|
if (!sdl_window_adjust()) /* already calls sdl_window_render itself */
|
|
sdl_window_render();
|
|
SDL_UnlockMutex(window_mutex);
|
|
#else
|
|
if (surface->flags & SDL_SRCALPHA) /* alpha needs a black background */
|
|
SDL_FillRect(gui_surface, &dest, 0);
|
|
|
|
SDL_BlitSurface(surface, &src, gui_surface, &dest);
|
|
|
|
SDL_Flip(gui_surface);
|
|
#endif
|
|
}
|
|
|
|
/* set a range of bitmap indices to a gradient from startcolour to endcolour */
|
|
void sdl_set_gradient(SDL_Surface *surface, SDL_Color *start, SDL_Color *end,
|
|
int first, int steps)
|
|
{
|
|
int i;
|
|
SDL_Color palette[steps];
|
|
|
|
for (i = 0; i < steps; i++) {
|
|
palette[i].r = start->r + (end->r - start->r) * i / (steps - 1);
|
|
palette[i].g = start->g + (end->g - start->g) * i / (steps - 1);
|
|
palette[i].b = start->b + (end->b - start->b) * i / (steps - 1);
|
|
}
|
|
|
|
#if SDL_MAJOR_VERSION > 1
|
|
SDL_SetPaletteColors(surface->format->palette, palette, first , steps);
|
|
#else
|
|
SDL_SetPalette(surface, SDL_LOGPAL|SDL_PHYSPAL, palette, first, steps);
|
|
#endif
|
|
}
|
|
|
|
int lcd_get_dpi(void)
|
|
{
|
|
#if (CONFIG_PLATFORM & PLATFORM_MAEMO5)
|
|
return 267;
|
|
#elif (CONFIG_PLATFORM & PLATFORM_MAEMO4)
|
|
return 225;
|
|
#elif (CONFIG_PLATFORM & PLATFORM_PANDORA)
|
|
return 217;
|
|
#else
|
|
/* TODO: find a way to query it from the OS, SDL doesn't support it
|
|
* directly; for now assume the more or less standard 96 */
|
|
return 96;
|
|
#endif
|
|
}
|