summaryrefslogtreecommitdiff
path: root/imageloader.c
blob: 64dc4dac0211ca1c02ba08063b9da1a50069f448 (plain)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "imageloader.h"
#include <math.h>
#include <string>
#include <dirent.h>
#include <iostream>

using namespace Magick;

cImageLoader::cImageLoader() {
    InitializeMagick(NULL);
    logoExtension = "png";
}

cImageLoader::~cImageLoader() {
}

bool cImageLoader::LoadLogo(const char *logo, int width=-1, int height=-1) {
    if( width == -1 )
        width = logoWidth;
    if( height == -1 )
        height = logoHeight;

    if( (width == 0) || (height==0) )
        return false;
    std::string logoLower = logo;
    toLowerCase(logoLower);
    bool success = LoadImage(logoLower.c_str(), Config.logoPath, logoExtension);
    if( !success )
        return false;

    if( height != 0 || width != 0 ) {
        buffer.sample( Geometry(width, height) );
    }
    return true;
}

int cImageLoader::Height(void) {
    Geometry geo = buffer.size();
    return geo.height();
}

int cImageLoader::Width(void) {
    Geometry geo = buffer.size();
    return geo.width();
}

bool cImageLoader::LoadIcon(const char *cIcon, int size) {
	if (size==0)
        return false;
    cString iconThemePath = cString::sprintf("%s%s/", *Config.iconPath, Setup.OSDTheme);
    bool success = LoadImage(cString(cIcon), iconThemePath, "png");
    if (!success)
        return false;
    buffer.sample(Geometry(size, size));
    return true;
}

bool cImageLoader::LoadIcon(const char *cIcon, int width, int height, bool preserveAspect) {
  try {
    if ((width == 0)||(height==0))
        return false;
    cString iconThemePath = cString::sprintf("%s%s/", *Config.iconPath, Setup.OSDTheme);
    bool success = LoadImage(cString(cIcon), iconThemePath, "png");
    if (!success)
        return false;
    if (preserveAspect) {
        buffer.sample(Geometry(width, height));
    } else {
        cString geometry = cString::sprintf("%dx%d!", width, height);
        buffer.scale(Geometry(*geometry));
    }
    return true;
  }
  catch (...) {
    return false;
  }
}

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;
}

Color cImageLoader::Argb2Color(tColor col) {
    tIndex alpha = (col & 0xFF000000) >> 24;
    tIndex red = (col & 0x00FF0000) >> 16;
    tIndex green = (col & 0x0000FF00) >> 8;
    tIndex blue = (col & 0x000000FF);
    Color color(MaxRGB*red/255, MaxRGB*green/255, MaxRGB*blue/255, MaxRGB*(0xFF-alpha)/255);
    return color;
}

void cImageLoader::toLowerCase(std::string &str) {
    const int length = str.length();
    for(int i=0; i < length; ++i) {
        str[i] = std::tolower(str[i]);
    }
}

bool cImageLoader::LoadImage(cString FileName, cString Path, cString Extension) {
    try {
        cString File = cString::sprintf("%s%s.%s", *Path, *FileName, *Extension);
        dsyslog("imageloader: trying to load: %s", *File);
        //printf("imageloader: trying to load: %s\n", *File);
        buffer.read(*File);
        dsyslog("imageloader: %s sucessfully loaded", *File);
        //printf("imageloader: %s sucessfully loaded\n", *File);
    } catch (...) {     
        return false;
    }
    return true;
}