2013-01-17 13:16:44 +01:00
|
|
|
#include <math.h>
|
2013-01-17 14:33:53 +01:00
|
|
|
#include <string>
|
|
|
|
#include <dirent.h>
|
|
|
|
#include <iostream>
|
2013-12-21 11:25:03 +01:00
|
|
|
#include <vdr/channels.h>
|
2013-01-17 13:16:44 +01:00
|
|
|
|
2013-12-07 15:51:50 +01:00
|
|
|
#include "config.h"
|
|
|
|
#include "imageloader.h"
|
2013-12-21 11:25:03 +01:00
|
|
|
#include "tools.h"
|
2013-12-07 15:51:50 +01:00
|
|
|
|
2013-01-17 13:16:44 +01:00
|
|
|
using namespace Magick;
|
|
|
|
|
|
|
|
cImageLoader::cImageLoader() {
|
2013-02-03 17:38:05 +01:00
|
|
|
InitializeMagick(NULL);
|
2013-01-17 13:16:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
cImageLoader::~cImageLoader() {
|
|
|
|
}
|
|
|
|
|
2013-12-21 11:25:03 +01:00
|
|
|
bool cImageLoader::LoadLogo(const cChannel *channel, int width, int height) {
|
|
|
|
if (!channel || (width == 0)||(height==0))
|
2013-01-17 14:33:53 +01:00
|
|
|
return false;
|
2013-12-21 11:25:03 +01:00
|
|
|
std::string channelID = StrToLowerCase(*(channel->GetChannelID().ToString()));
|
|
|
|
std::string logoLower = StrToLowerCase(channel->Name());
|
2013-01-17 14:33:53 +01:00
|
|
|
cString extension;
|
|
|
|
if (tvguideConfig.logoExtension == 0) {
|
2013-05-26 11:38:05 +02:00
|
|
|
extension = "png";
|
|
|
|
} else if (tvguideConfig.logoExtension == 1) {
|
|
|
|
extension = "jpg";
|
|
|
|
}
|
2013-12-21 11:25:03 +01:00
|
|
|
bool success = false;
|
2014-01-25 15:52:53 +01:00
|
|
|
if (tvguideConfig.logoPathSet) {
|
|
|
|
success = LoadImage(channelID.c_str(), *tvguideConfig.logoPath, *extension);
|
|
|
|
if (!success) {
|
|
|
|
success = LoadImage(logoLower.c_str(), *tvguideConfig.logoPath, *extension);
|
|
|
|
}
|
2013-12-21 11:25:03 +01:00
|
|
|
}
|
2014-01-25 15:52:53 +01:00
|
|
|
if (!success)
|
|
|
|
success = LoadImage(channelID.c_str(), *tvguideConfig.logoPathDefault, *extension);
|
|
|
|
if (!success)
|
|
|
|
success = LoadImage(logoLower.c_str(), *tvguideConfig.logoPathDefault, *extension);
|
2013-12-21 11:25:03 +01:00
|
|
|
if (success)
|
|
|
|
buffer.sample(Geometry(width, height));
|
|
|
|
return success;
|
2013-01-17 14:33:53 +01:00
|
|
|
}
|
2013-01-17 13:16:44 +01:00
|
|
|
|
2013-12-21 11:25:03 +01:00
|
|
|
bool cImageLoader::LoadEPGImage(int eventID, int width, int height) {
|
2013-01-17 14:33:53 +01:00
|
|
|
if ((width == 0)||(height==0))
|
|
|
|
return false;
|
2013-12-22 10:28:47 +01:00
|
|
|
bool success = false;
|
|
|
|
success = LoadImage(*cString::sprintf("%d", eventID), *tvguideConfig.epgImagePath, "jpg");
|
|
|
|
if (!success)
|
|
|
|
success = LoadImage(*cString::sprintf("%d_0", eventID), *tvguideConfig.epgImagePath, "jpg");
|
|
|
|
if (!success)
|
2013-01-17 14:33:53 +01:00
|
|
|
return false;
|
2013-12-21 11:25:03 +01:00
|
|
|
buffer.sample( Geometry(width, height));
|
2013-01-17 14:33:53 +01:00
|
|
|
return true;
|
2013-01-17 13:16:44 +01:00
|
|
|
}
|
|
|
|
|
2013-06-03 09:52:54 +02:00
|
|
|
bool cImageLoader::LoadAdditionalEPGImage(cString name) {
|
|
|
|
int width = tvguideConfig.epgImageWidthLarge;
|
|
|
|
int height = tvguideConfig.epgImageHeightLarge;
|
|
|
|
if ((width == 0)||(height==0))
|
|
|
|
return false;
|
|
|
|
bool success = false;
|
2013-12-21 11:25:03 +01:00
|
|
|
success = LoadImage(*name, *tvguideConfig.epgImagePath, "jpg");
|
2013-06-03 09:52:54 +02:00
|
|
|
if (!success)
|
|
|
|
return false;
|
|
|
|
if (height != 0 || width != 0) {
|
|
|
|
buffer.sample( Geometry(width, height));
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-08-25 13:57:10 +02:00
|
|
|
bool cImageLoader::LoadPoster(const char *poster, int width, int height) {
|
|
|
|
if (LoadImage(poster)) {
|
|
|
|
buffer.sample(Geometry(width, height));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-07-09 00:17:42 +02:00
|
|
|
bool cImageLoader::LoadIcon(const char *cIcon, int size) {
|
|
|
|
if (size==0)
|
|
|
|
return false;
|
|
|
|
bool success = false;
|
2014-01-25 15:52:53 +01:00
|
|
|
if (tvguideConfig.iconsPathSet) {
|
|
|
|
cString iconPathTheme = cString::sprintf("%s%s/recmenuicons/", *tvguideConfig.iconPath, *tvguideConfig.themeName);
|
|
|
|
success = LoadImage(cIcon, *iconPathTheme, "png");
|
|
|
|
if (!success) {
|
|
|
|
cString iconPath = cString::sprintf("%srecmenuicons/", *tvguideConfig.iconPath);
|
|
|
|
success = LoadImage(cIcon, *iconPath, "png");
|
|
|
|
}
|
|
|
|
}
|
2013-12-29 18:13:45 +01:00
|
|
|
if (!success) {
|
2014-01-25 15:52:53 +01:00
|
|
|
cString iconPathTheme = cString::sprintf("%s%s/recmenuicons/", *tvguideConfig.iconPathDefault, *tvguideConfig.themeName);
|
|
|
|
success = LoadImage(cIcon, *iconPathTheme, "png");
|
|
|
|
if (!success) {
|
|
|
|
cString iconPath = cString::sprintf("%srecmenuicons/", *tvguideConfig.iconPathDefault);
|
|
|
|
success = LoadImage(cIcon, *iconPath, "png");
|
|
|
|
}
|
2013-12-29 18:13:45 +01:00
|
|
|
}
|
2013-07-09 00:17:42 +02:00
|
|
|
if (!success)
|
|
|
|
return false;
|
|
|
|
buffer.sample(Geometry(size, size));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-12-21 11:25:03 +01:00
|
|
|
bool cImageLoader::LoadOsdElement(cString name, int width, int height) {
|
|
|
|
if ((width == 0)||(height==0))
|
|
|
|
return false;
|
|
|
|
bool success = false;
|
2014-01-25 15:52:53 +01:00
|
|
|
if (tvguideConfig.iconsPathSet) {
|
|
|
|
cString path = cString::sprintf("%s%s%s", *tvguideConfig.iconPath, *tvguideConfig.themeName, "/osdElements/");
|
|
|
|
success = LoadImage(*name, *path, "png");
|
|
|
|
if (!success) {
|
|
|
|
path = cString::sprintf("%s%s", *tvguideConfig.iconPath, "/osdElements/");
|
|
|
|
success = LoadImage(*name, *path, "png");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!success) {
|
|
|
|
cString path = cString::sprintf("%s%s%s", *tvguideConfig.iconPathDefault, *tvguideConfig.themeName, "/osdElements/");
|
|
|
|
success = LoadImage(*name, *path, "png");
|
|
|
|
}
|
|
|
|
if (!success) {
|
|
|
|
cString path = cString::sprintf("%s%s", *tvguideConfig.iconPathDefault, "/osdElements/");
|
|
|
|
success = LoadImage(*name, *path, "png");
|
|
|
|
}
|
2013-12-21 11:25:03 +01:00
|
|
|
if (!success)
|
|
|
|
return false;
|
2014-01-22 17:47:44 +01:00
|
|
|
Geometry size(width, height);
|
|
|
|
size.aspect(true);
|
|
|
|
buffer.sample(size);
|
2013-12-21 11:25:03 +01:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-01-17 16:19:37 +01:00
|
|
|
bool cImageLoader::DrawBackground(tColor back, tColor blend, int width, int height) {
|
2013-07-09 00:17:42 +02:00
|
|
|
if ((width < 1) || (height < 1) || (width > 1920) || (height > 1080))
|
2013-01-17 16:19:37 +01:00
|
|
|
return false;
|
2013-12-22 10:39:46 +01:00
|
|
|
CreateGradient(back, blend, width, height, 0.8, 0.8);
|
2013-01-17 16:19:37 +01:00
|
|
|
return true;
|
2013-01-17 13:16:44 +01:00
|
|
|
}
|
|
|
|
|
2013-01-17 14:33:53 +01:00
|
|
|
cImage cImageLoader::GetImage() {
|
|
|
|
int w, h;
|
|
|
|
w = buffer.columns();
|
|
|
|
h = buffer.rows();
|
|
|
|
cImage image (cSize(w, h));
|
|
|
|
const PixelPacket *pixels = buffer.getConstPixels(0, 0, w, h);
|
|
|
|
for (int iy = 0; iy < h; ++iy) {
|
|
|
|
for (int ix = 0; ix < w; ++ix) {
|
|
|
|
tColor col = (~int(pixels->opacity * 255 / MaxRGB) << 24)
|
|
|
|
| (int(pixels->green * 255 / MaxRGB) << 8)
|
|
|
|
| (int(pixels->red * 255 / MaxRGB) << 16)
|
|
|
|
| (int(pixels->blue * 255 / MaxRGB) );
|
|
|
|
image.SetPixel(cPoint(ix, iy), col);
|
|
|
|
++pixels;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return image;
|
|
|
|
}
|
2013-12-22 10:39:46 +01:00
|
|
|
|
|
|
|
void cImageLoader::CreateGradient(tColor back, tColor blend, int width, int height, double wfactor, double hfactor) {
|
|
|
|
Color Back = Argb2Color(back);
|
|
|
|
Color Blend = Argb2Color(blend);
|
|
|
|
int maxw = MaxRGB * wfactor;
|
|
|
|
int maxh = MaxRGB * hfactor;
|
|
|
|
|
|
|
|
Image imgblend(Geometry(width, height), Blend);
|
|
|
|
imgblend.modifyImage();
|
|
|
|
imgblend.type(TrueColorMatteType);
|
|
|
|
PixelPacket *pixels = imgblend.getPixels(0, 0, width, height);
|
|
|
|
for (int x = 0; x < width; x++) {
|
|
|
|
for (int y = 0; y < height; y++) {
|
|
|
|
PixelPacket *pixel = pixels + y * width + x;
|
|
|
|
int opacity = (maxw / width * x + maxh - maxh / height * y) / 2;
|
|
|
|
pixel->opacity = (opacity <= MaxRGB) ? opacity : MaxRGB;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
imgblend.syncPixels();
|
|
|
|
|
|
|
|
Image imgback(Geometry(width, height), Back);
|
|
|
|
imgback.composite(imgblend, 0, 0, OverCompositeOp);
|
|
|
|
|
|
|
|
buffer = imgback;
|
|
|
|
}
|