mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-06 13:15:25 -05:00
They haven't seen any work since 2013, and likely hasn't compiled in at least a couple of releases -- not that we ever "released" anything for these targets. Futhermore, upstream for both has been effectively dead for about as long, and there's been no user reports of these being used since 2017 (and even then only in passing). It isn't worth the effort to triage their current state, much less uplift into something supportable, while the maintenance burden of keeping these things in-tree can be demonstrated by the diffstat. Change-Id: Id93bd450679d1b75e2c74295b3ae1548cd241b24
157 lines
4.9 KiB
C
157 lines
4.9 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)
|
|
{
|
|
/* 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;
|
|
}
|