mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Implemented scaling images
This commit is contained in:
parent
35c8b3d22c
commit
b1418b6bcd
@ -3750,3 +3750,6 @@ Timo Weing
|
|||||||
|
|
||||||
Jose Angel <joseangelpp@gmail.com>
|
Jose Angel <joseangelpp@gmail.com>
|
||||||
for reporting a bug in default values for DVB-T
|
for reporting a bug in default values for DVB-T
|
||||||
|
|
||||||
|
Andreas Baierl <post@andreasbaierl.de>
|
||||||
|
for implementing scaling images
|
||||||
|
1
HISTORY
1
HISTORY
@ -9871,3 +9871,4 @@ Video Disk Recorder Revision History
|
|||||||
Ehrnsperger).
|
Ehrnsperger).
|
||||||
- Using a dummy OSD if no OSD provider is available is not considered an error any
|
- Using a dummy OSD if no OSD provider is available is not considered an error any
|
||||||
more (thanks to Markus Ehrnsperger).
|
more (thanks to Markus Ehrnsperger).
|
||||||
|
- Implemented scaling images (thanks to Andreas Baierl).
|
||||||
|
77
osd.c
77
osd.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: osd.c 5.1 2024/01/18 11:06:45 kls Exp $
|
* $Id: osd.c 5.2 2024/01/18 12:04:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "osd.h"
|
#include "osd.h"
|
||||||
@ -1139,6 +1139,49 @@ void cImage::Fill(tColor Color)
|
|||||||
data[i] = Color;
|
data[i] = Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cImage *cImage::Scaled(double FactorX, double FactorY, bool AntiAlias) const
|
||||||
|
{
|
||||||
|
int w = max(1, int(round(Width() * FactorX)));
|
||||||
|
int h = max(1, int(round(Height() * FactorY)));
|
||||||
|
cImage *i = new cImage(cSize(w, h));
|
||||||
|
int RatioX = (Width() << 16) / i->Width();
|
||||||
|
int RatioY = (Height() << 16) / i->Height();
|
||||||
|
|
||||||
|
if (!AntiAlias || FactorX <= 1.0 && FactorY <= 1.0) {
|
||||||
|
// Downscaling - no anti-aliasing:
|
||||||
|
int SourceY = 0;
|
||||||
|
for (int y = 0; y < i->Height(); y++) {
|
||||||
|
int SourceX = 0;
|
||||||
|
for (int x = 0; x < i->Width(); x++) {
|
||||||
|
tColor c1 = GetPixel(cPoint(SourceX >> 16, SourceY >> 16));
|
||||||
|
i->SetPixel(cPoint(x, y), c1);
|
||||||
|
SourceX += RatioX;
|
||||||
|
}
|
||||||
|
SourceY += RatioY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Upscaling - anti-aliasing:
|
||||||
|
int SourceY = 0;
|
||||||
|
for (int y = 0; y < i->Height(); y++) {
|
||||||
|
int SourceX = 0;
|
||||||
|
int sy = min(SourceY >> 16, Height() - 2);
|
||||||
|
uint8_t BlendY = 0xFF - ((SourceY >> 8) & 0xFF);
|
||||||
|
for (int x = 0; x < i->Width(); x++) {
|
||||||
|
int sx = min(SourceX >> 16, Width() - 2);
|
||||||
|
uint8_t BlendX = 0xFF - ((SourceX >> 8) & 0xFF);
|
||||||
|
tColor c1 = AlphaBlend(GetPixel(cPoint(sx, sy)), GetPixel(cPoint(sx + 1, sy)), BlendX);
|
||||||
|
tColor c2 = AlphaBlend(GetPixel(cPoint(sx, sy + 1)), GetPixel(cPoint(sx + 1, sy + 1)), BlendX);
|
||||||
|
tColor c3 = AlphaBlend(c1, c2, BlendY);
|
||||||
|
i->SetPixel(cPoint(x, y), c3);
|
||||||
|
SourceX += RatioX;
|
||||||
|
}
|
||||||
|
SourceY += RatioY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
// --- cPixmapMemory ---------------------------------------------------------
|
// --- cPixmapMemory ---------------------------------------------------------
|
||||||
|
|
||||||
cPixmapMemory::cPixmapMemory(void)
|
cPixmapMemory::cPixmapMemory(void)
|
||||||
@ -1259,6 +1302,26 @@ void cPixmapMemory::DrawImage(const cPoint &Point, int ImageHandle)
|
|||||||
Unlock();
|
Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cPixmapMemory::DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias)
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
const cImage *i = &Image;
|
||||||
|
if (!DoubleEqual(FactorX, 1.0) || !DoubleEqual(FactorY, 1.0))
|
||||||
|
i = i->Scaled(FactorX, FactorY, AntiAlias);
|
||||||
|
DrawImage(Point, *i);
|
||||||
|
if (i != &Image)
|
||||||
|
delete i;
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cPixmapMemory::DrawScaledImage(const cPoint &Point, int ImageHandle, double FactorX, double FactorY, bool AntiAlias)
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
if (const cImage *Image = cOsdProvider::GetImageData(ImageHandle))
|
||||||
|
DrawScaledImage(Point, *Image, FactorX, FactorY, AntiAlias);
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
void cPixmapMemory::DrawPixel(const cPoint &Point, tColor Color)
|
void cPixmapMemory::DrawPixel(const cPoint &Point, tColor Color)
|
||||||
{
|
{
|
||||||
Lock();
|
Lock();
|
||||||
@ -2118,6 +2181,18 @@ void cOsd::DrawImage(const cPoint &Point, int ImageHandle)
|
|||||||
pixmaps[0]->DrawImage(Point, ImageHandle);
|
pixmaps[0]->DrawImage(Point, ImageHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cOsd::DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias)
|
||||||
|
{
|
||||||
|
if (isTrueColor)
|
||||||
|
pixmaps[0]->DrawScaledImage(Point, Image, FactorX, FactorY, AntiAlias);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cOsd::DrawScaledImage(const cPoint &Point, int ImageHandle, double FactorX, double FactorY, bool AntiAlias)
|
||||||
|
{
|
||||||
|
if (isTrueColor)
|
||||||
|
pixmaps[0]->DrawScaledImage(Point, ImageHandle, FactorX, FactorY, AntiAlias);
|
||||||
|
}
|
||||||
|
|
||||||
void cOsd::DrawPixel(int x, int y, tColor Color)
|
void cOsd::DrawPixel(int x, int y, tColor Color)
|
||||||
{
|
{
|
||||||
if (isTrueColor)
|
if (isTrueColor)
|
||||||
|
39
osd.h
39
osd.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: osd.h 5.1 2021/05/21 12:54:08 kls Exp $
|
* $Id: osd.h 5.2 2024/01/18 12:04:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __OSD_H
|
#ifndef __OSD_H
|
||||||
@ -447,6 +447,11 @@ public:
|
|||||||
///< Clears the image data by setting all pixels to be fully transparent.
|
///< Clears the image data by setting all pixels to be fully transparent.
|
||||||
void Fill(tColor Color);
|
void Fill(tColor Color);
|
||||||
///< Fills the image data with the given Color.
|
///< Fills the image data with the given Color.
|
||||||
|
cImage *Scaled(double FactorX, double FactorY, bool AntiAlias = false) const;
|
||||||
|
///< Creates a copy of this image, scaled by the given factors.
|
||||||
|
///< If AntiAlias is true and either of the factors is greater than 1.0,
|
||||||
|
///< anti-aliasing is applied.
|
||||||
|
///< The caller must delete the returned image once it is no longer used.
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAXPIXMAPLAYERS 8
|
#define MAXPIXMAPLAYERS 8
|
||||||
@ -602,6 +607,23 @@ public:
|
|||||||
///< the given Point. ImageHandle must be a value that has previously been
|
///< the given Point. ImageHandle must be a value that has previously been
|
||||||
///< returned by a call to cOsdProvider::StoreImage(). If ImageHandle
|
///< returned by a call to cOsdProvider::StoreImage(). If ImageHandle
|
||||||
///< has an invalid value, nothing happens.
|
///< has an invalid value, nothing happens.
|
||||||
|
virtual void DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias = false) {};
|
||||||
|
///< Draws the given Image into this pixmap at the given Point and scales it.
|
||||||
|
///< If AntiAlias is true and either of the factors is greater than
|
||||||
|
///< 1.0, anti-aliasing is applied.
|
||||||
|
///< This function should be 'pure', just like all the others. However, since it was
|
||||||
|
///< introduced when this class was already in widespread use, the default was made
|
||||||
|
///< empty, so that existing code will still compile.
|
||||||
|
virtual void DrawScaledImage(const cPoint &Point, int ImageHandle, double FactorX, double FactorY, bool AntiAlias = false) {};
|
||||||
|
///< Draws the image referenced by the given ImageHandle into this pixmap at
|
||||||
|
///< the given Point and scales it. ImageHandle must be a value that has
|
||||||
|
///< previously been returned by a call to cOsdProvider::StoreImage().
|
||||||
|
///< If ImageHandle has an invalid value, nothing happens.
|
||||||
|
///< If AntiAlias is true and either of the factors is greater than
|
||||||
|
///< 1.0, anti-aliasing is applied.
|
||||||
|
///< This function should be 'pure', just like all the others. However, since it was
|
||||||
|
///< introduced when this class was already in widespread use, the default was made
|
||||||
|
///< empty, so that existing code will still compile.
|
||||||
virtual void DrawPixel(const cPoint &Point, tColor Color) = 0;
|
virtual void DrawPixel(const cPoint &Point, tColor Color) = 0;
|
||||||
///< Sets the pixel at the given Point to the given Color, which is
|
///< Sets the pixel at the given Point to the given Color, which is
|
||||||
///< a full 32 bit ARGB value. If the alpha value of Color is not 0xFF
|
///< a full 32 bit ARGB value. If the alpha value of Color is not 0xFF
|
||||||
@ -700,6 +722,8 @@ public:
|
|||||||
virtual void Fill(tColor Color);
|
virtual void Fill(tColor Color);
|
||||||
virtual void DrawImage(const cPoint &Point, const cImage &Image);
|
virtual void DrawImage(const cPoint &Point, const cImage &Image);
|
||||||
virtual void DrawImage(const cPoint &Point, int ImageHandle);
|
virtual void DrawImage(const cPoint &Point, int ImageHandle);
|
||||||
|
virtual void DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias = false);
|
||||||
|
virtual void DrawScaledImage(const cPoint &Point, int ImageHandle, double FactorX, double FactorY, bool AntiAlias = false);
|
||||||
virtual void DrawPixel(const cPoint &Point, tColor Color);
|
virtual void DrawPixel(const cPoint &Point, tColor Color);
|
||||||
virtual void DrawBlendedPixel(const cPoint &Point, tColor Color, uint8_t AlphaLayer = ALPHA_OPAQUE);
|
virtual void DrawBlendedPixel(const cPoint &Point, tColor Color, uint8_t AlphaLayer = ALPHA_OPAQUE);
|
||||||
virtual void DrawBitmap(const cPoint &Point, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool Overlay = false);
|
virtual void DrawBitmap(const cPoint &Point, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool Overlay = false);
|
||||||
@ -857,6 +881,19 @@ public:
|
|||||||
///< returned by a call to cOsdProvider::StoreImage(). If ImageHandle
|
///< returned by a call to cOsdProvider::StoreImage(). If ImageHandle
|
||||||
///< has an invalid value, nothing happens.
|
///< has an invalid value, nothing happens.
|
||||||
///< If this is not a true color OSD, this function does nothing.
|
///< If this is not a true color OSD, this function does nothing.
|
||||||
|
virtual void DrawScaledImage(const cPoint &Point, const cImage &Image, double FactorX, double FactorY, bool AntiAlias = false);
|
||||||
|
///< Draws the given Image on this OSD at the given Point and scales it.
|
||||||
|
///< If AntiAlias is true and either of the factors is greater than
|
||||||
|
///< 1.0, anti-aliasing is applied.
|
||||||
|
///< If this is not a true color OSD, this function does nothing.
|
||||||
|
virtual void DrawScaledImage(const cPoint &Point, int ImageHandle, double FactorX, double FactorY, bool AntiAlias = false);
|
||||||
|
///< Draws the image referenced by the given ImageHandle on this OSD at
|
||||||
|
///< the given Point and scales it. ImageHandle must be a value that has
|
||||||
|
///< previously been returned by a call to cOsdProvider::StoreImage().
|
||||||
|
///< If ImageHandle has an invalid value, nothing happens.
|
||||||
|
///< If AntiAlias is true and either of the factors is greater than
|
||||||
|
///< 1.0, anti-aliasing is applied.
|
||||||
|
///< If this is not a true color OSD, this function does nothing.
|
||||||
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
|
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
|
||||||
///< Checks whether the OSD can display the given set of sub-areas.
|
///< Checks whether the OSD can display the given set of sub-areas.
|
||||||
///< The return value indicates whether a call to SetAreas() with this
|
///< The return value indicates whether a call to SetAreas() with this
|
||||||
|
Loading…
x
Reference in New Issue
Block a user