-
Notifications
You must be signed in to change notification settings - Fork 1
/
bitmap.c
97 lines (84 loc) · 2.33 KB
/
bitmap.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#ifdef HAVE_IMAGEMAGICK
#include "common.h"
#include "bitmap.h"
#include "config.h"
#ifndef X_DISPLAY_MISSING
#define X_DISPLAY_MISSING
#endif
#undef debug
#include <Magick++.h>
using namespace Magick;
#include <vector>
#include <vdr/themes.h>
void cOSDImageBitmap::Init(void)
{
InitializeMagick(NULL);
}
cOSDImageBitmap::cOSDImageBitmap()
{}
cOSDImageBitmap::~cOSDImageBitmap()
{}
bool cOSDImageBitmap::DrawImage(const char *fileNameP, int x, int y, int w, int h, int colors, cOsd *osd)
{
return DrawMagick(fileNameP, x, y, w, h, colors, osd);
}
bool cOSDImageBitmap::DrawMagick(const char *Filename, int x, int y, int width, int height, int colors, cOsd *osd)
{
Image image;
try {
Geometry geo;
image.read(Filename);
geo = image.size();
int w = geo.width();
int h = geo.height();
if (height != h || width != w) {
switch (EnigmaConfig.resizeImages) {
case 0:
image.sample(Geometry(width, height));
break;
case 1:
image.scale(Geometry(width, height));
break;
case 2:
image.zoom(Geometry(width, height));
break;
default:
esyslog("ERROR: unknown resize mode %d", EnigmaConfig.resizeImages);
break;
}
}
geo = image.size();
w = geo.width();
h = geo.height();
if (colors != 0){
image.opacity(OpaqueOpacity);
image.backgroundColor(Color(0, 0, 0, 0));
image.quantizeColorSpace(RGBColorspace);
image.quantizeColors(colors);
image.quantize();
}
// center image
x += ((width - w) / 2);
y += ((height - h) / 2);
const PixelPacket *pix = image.getConstPixels(0, 0, w, h);
for (int iy = 0; iy < h; ++iy) {
for (int ix = 0; ix < w; ++ix) {
tColor col = (~(int)(pix->opacity * 255 / MaxRGB) << 24)
| ((int)(pix->red * 255 / MaxRGB) << 16)
| ((int)(pix->green * 255 / MaxRGB) << 8)
| (int)(pix->blue * 255 / MaxRGB);
osd->DrawPixel(x + ix, y + iy, col);
++pix;
}
}
} catch (Exception &e) {
esyslog("ERROR: Couldn't load %s: %s", Filename, e.what());
return false;
} catch (...) {
esyslog("ERROR: Couldn't load %s: Unknown exception caught", Filename);
return false;
}
return true;
}
#endif //HAVE_IMAGEMAGICK
// vim:et:sw=2:ts=2: