diff options
| author | woro <woro@e10066b5-e1e2-0310-b819-94efdf66514b> | 2008-04-11 20:11:00 +0000 |
|---|---|---|
| committer | woro <woro@e10066b5-e1e2-0310-b819-94efdf66514b> | 2008-04-11 20:11:00 +0000 |
| commit | 57d7ee812c8be1bd118471512682cb3393ce595f (patch) | |
| tree | 2e0d792fc74eda1661b439853c004e2ed5c06820 /bitmap.c | |
| parent | b2550195d6b61f9be3470679082b8d6b5159aa83 (diff) | |
| download | vdr-plugin-muggle-57d7ee812c8be1bd118471512682cb3393ce595f.tar.gz vdr-plugin-muggle-57d7ee812c8be1bd118471512682cb3393ce595f.tar.bz2 | |
merge mp3ng branch into trunk
git-svn-id: https://vdr-muggle.svn.sourceforge.net/svnroot/vdr-muggle/trunk/muggle-plugin@1173 e10066b5-e1e2-0310-b819-94efdf66514b
Diffstat (limited to 'bitmap.c')
| -rw-r--r-- | bitmap.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/bitmap.c b/bitmap.c new file mode 100644 index 0000000..57f2a0e --- /dev/null +++ b/bitmap.c @@ -0,0 +1,184 @@ +/* + * borrowed from vdr-text2skin + */ + +#include "bitmap.h" +#include "quantize.h" +#include <vdr/tools.h> + +#define X_DISPLAY_MISSING + +#include <Imlib2.h> +cBitmapCache cMP3Bitmap::mCache(1); + +#include <glob.h> + +void cBitmapCache::DeleteObject(const tBitmapSpec &Key, cMP3Bitmap *&Data) { + delete Data; +} + +void cBitmapCache::ResetObject(cMP3Bitmap *&Data) { + Data->Reset(); +} + +cMP3Bitmap *cMP3Bitmap::Load(const std::string &Filename, int Alpha, int height, int width, int colors, bool Quiet) { + tBitmapSpec spec(Filename, Alpha, height, width, colors); + // d(printf("checking image with spec %s_%d_%d_%d_%d..", Filename.c_str(),Alpha,height,width,colors)); + std::string fname = Filename; + + cMP3Bitmap *res = NULL; + if (mCache.Contains(spec)) { + res = mCache[spec]; + // d(printf("..cache ok\n")); + } + else { + int pos; + if ((pos = fname.find('*')) != -1) { + glob_t gbuf; + if (glob(fname.c_str(), 0, NULL, &gbuf) == 0) { + // d(printf("GLOB: FOUND %s\n", gbuf.gl_pathv[0])); + fname = gbuf.gl_pathv[0]; + } + else { + if (!Quiet) d(printf("music: bitmap: ERROR: No match for wildcard filename %s", Filename.c_str())); + fname = ""; + } + globfree(&gbuf); + } + + res = new cMP3Bitmap; + bool result = false; + + result = res->LoadImlib(fname.c_str(),height,width,colors, Quiet); + + if (result) { + res->SetAlpha(Alpha); + } + else { + d(printf("music: bitmap: ERROR: filename %s too short to identify format", fname.c_str())); + DELETENULL(res); + } + mCache[spec] = res; + } + + return res; +} + +bool cMP3Bitmap::Available(const std::string &Filename, int Alpha, int height, int width, int colors) { + if ((int)Filename.find('*') != -1) { + bool result = false; + glob_t gbuf; + if (glob(Filename.c_str(), 0, NULL, &gbuf) == 0) + result = true; + globfree(&gbuf); + return result; + } + else + return access(Filename.c_str(), F_OK) == 0; +} + +cMP3Bitmap::cMP3Bitmap(void) { + mCurrent = 0; + mLastGet = 0; +} + +cMP3Bitmap::~cMP3Bitmap() { + for (int i = 0; i < (int)mBitmaps.size(); ++i) delete mBitmaps[i]; + mBitmaps.clear(); +} + +cBitmap &cMP3Bitmap::Get(void) { + if (mBitmaps.size() == 1) return *mBitmaps[0]; + + /* time_t upd; + int diff; + if (mLastGet == 0) { + mLastGet = Now; + upd = mDelay; + } else if ((diff = Now - mLastGet) >= mDelay) { + mCurrent = (mCurrent + 1) % mBitmaps.size(); + mLastGet = Now; + upd = mDelay - diff > 1 ? mDelay - diff : 1; + } else { + upd = mDelay - diff; + } + + if (UpdateIn == 0 || UpdateIn > (uint)upd) + UpdateIn = upd; + */ + mCurrent = (mCurrent + 1) % mBitmaps.size(); + return *mBitmaps[mCurrent]; +} + +void cMP3Bitmap::SetAlpha(int Alpha) { + if (Alpha > 0) { + std::vector<cBitmap*>::iterator it = mBitmaps.begin(); + for (; it != mBitmaps.end(); ++it) { + int count; + if ((*it)->Colors(count)) { + for (int i = 0; i < count; ++i) { + int alpha = (((*it)->Color(i) & 0xFF000000) >> 24) * Alpha / 255; + (*it)->SetColor(i, ((*it)->Color(i) & 0x00FFFFFF) | (alpha << 24)); + } + } + } + } +} + +bool cMP3Bitmap::LoadImlib(const char *Filename, int height, int width, int colors, bool Quiet) { + Imlib_Image buffer; + int h,w; + unsigned char * outputImage = NULL; + unsigned int * outputPalette = NULL; + cQuantizeWu* quantizer = new cQuantizeWu(); + cBitmap *bmp = NULL; + + buffer = imlib_load_image(Filename); + + imlib_context_set_image(buffer); + w= imlib_image_get_width(); + h= imlib_image_get_height(); + imlib_context_set_image(buffer); + + if (!buffer) + return false; + + Imlib_Image image; + image = imlib_create_cropped_scaled_image(0, 0, w, h ,width , height); + + imlib_context_set_image(buffer); + imlib_free_image_and_decache(); + + imlib_context_set_image(image); + w= imlib_image_get_width(); + h= imlib_image_get_height(); + imlib_context_set_image(image); + + bmp = new cBitmap(w, h, 8); + uint8_t *data = (uint8_t*)imlib_image_get_data_for_reading_only(); + + if ( colors != 0 ) { + quantizer->Quantize(data, w* h, colors); + outputImage = quantizer->OutputImage(); + outputPalette = quantizer->OutputPalette(); + } + imlib_free_image(); + + int pos = 0; + for (int y = 0; y < bmp->Height(); ++y) { + for (int x = 0; x < bmp->Width(); ++x) { + if ( colors != 0 ) { + bmp->DrawPixel(x, y , outputPalette[outputImage[y * bmp->Width() + x]] | 0xFF000000 ); + } + else { + tColor col = (data[pos + 3] << 24) | (data[pos + 2] << 16) | (data[pos + 1] << 8) | data[pos + 0]; + bmp->DrawPixel(x, y, col); + pos += 4; + } + } + } + + mBitmaps.push_back(bmp); + delete(quantizer); + return true; +} |
