diff options
author | lordjaxom <lordjaxom> | 2004-06-16 18:50:57 +0000 |
---|---|---|
committer | lordjaxom <lordjaxom> | 2004-06-16 18:50:57 +0000 |
commit | 1d3cd38e88ae97dd6906f9818d52b9ef07bf057d (patch) | |
tree | 925b1ff6a76c29178ba6fd4bf1c5516848ab9ab3 /bitmap.c | |
parent | 3d738f9c8a5d48bb22b3330c036b6887b0f9d6c1 (diff) | |
download | vdr-plugin-text2skin-1d3cd38e88ae97dd6906f9818d52b9ef07bf057d.tar.gz vdr-plugin-text2skin-1d3cd38e88ae97dd6906f9818d52b9ef07bf057d.tar.bz2 |
- fixed disappearing Scrolltext when Message was displayedv0.0.5
- fixed display-items "MenuScrollUp" and "MenuScrollDown" which didn't display
any other items than "Symbol"
- fixed the above for all replay- and channel-symbols
(for all display-items that can be symbols there must be path, altpath or
both to tell the plugin if that item is to be drawn if the symbol is on,
off or in both cases)
- fixed various memory leaks and missing destructions (valgrind rox)
- fixed the image loaders to respect the alpha value and palette properly
(this hopefully also fixes the phenomenon that images "get lost" after some
time)
- added display-item "Scrollbar"
- SKINS and SKINS.de are now generated during the make
Diffstat (limited to 'bitmap.c')
-rw-r--r-- | bitmap.c | 79 |
1 files changed, 53 insertions, 26 deletions
@@ -1,5 +1,5 @@ /* - * $Id: bitmap.c,v 1.15 2004/06/12 19:16:11 lordjaxom Exp $ + * $Id: bitmap.c,v 1.16 2004/06/16 18:46:50 lordjaxom Exp $ */ #include "bitmap.h" @@ -11,9 +11,7 @@ #endif #ifdef HAVE_IMAGEMAGICK #include <Magick++.h> -using Magick::Image; -using Magick::PixelPacket; -using Magick::Exception; +using namespace Magick; #endif template<> @@ -22,6 +20,7 @@ void cImageCache::Delete(string &key, cText2SkinBitmap *&value) { } cImageCache cText2SkinBitmap::mCache(Text2SkinSetup.MaxCacheFill); +bool cText2SkinBitmap::mFirstTime = true; cText2SkinBitmap::cText2SkinBitmap(void) { mCurrent = 0; @@ -31,6 +30,7 @@ cText2SkinBitmap::cText2SkinBitmap(void) { cText2SkinBitmap::~cText2SkinBitmap() { for (int i = 0; i < (int)mBitmaps.size(); ++i) delete mBitmaps[i]; + mBitmaps.clear(); } cBitmap &cText2SkinBitmap::Get(int &UpdateIn) { @@ -60,10 +60,25 @@ cBitmap &cText2SkinBitmap::Get(int &UpdateIn) { return *mBitmaps[mCurrent]; } +void cText2SkinBitmap::SetAlpha(int Alpha) { + if (Alpha > 0) { + 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)); + } + } + } + } +} + cText2SkinBitmap *cText2SkinBitmap::Load(const char *Filename, int Alpha) { - if (mCache.Contains(Filename)) { + if (mCache.Contains(Filename)) return mCache[Filename]; - } else { + else { cText2SkinBitmap *bmp = new cText2SkinBitmap; int len = strlen(Filename); bool result = false; @@ -84,8 +99,11 @@ cText2SkinBitmap *cText2SkinBitmap::Load(const char *Filename, int Alpha) { } else esyslog("ERROR: text2skin: filename %s too short to identify format", Filename); - if (result) + if (result) { + bmp->SetAlpha(Alpha); return (mCache[Filename] = bmp); + } else + delete bmp; } return false; } @@ -93,11 +111,6 @@ cText2SkinBitmap *cText2SkinBitmap::Load(const char *Filename, int Alpha) { bool cText2SkinBitmap::LoadXpm(const char *Filename, int Alpha) { cBitmap *bmp = new cBitmap(1,1,1); if (bmp->LoadXpm(Filename)) { - int count; - if (Alpha && bmp->Colors(count)) { - for (int i = 0; i < count; ++i) - bmp->SetColor(i, (bmp->Color(i) & 0x00FFFFFF) | (Alpha << 24)); - } mBitmaps.push_back(bmp); return true; } @@ -121,13 +134,7 @@ bool cText2SkinBitmap::LoadImlib(const char *Filename, int Alpha) { for (int y = 0; y < bmp->Height(); ++y) { for (int x = 0; x < bmp->Width(); ++x) { tColor col = (data[pos + 3] << 24) | (data[pos + 2] << 16) | (data[pos + 1] << 8) | data[pos + 0]; - if (Alpha) - col = (col & 0x00FFFFFF) | (Alpha << 24); - int res = bmp->Index(col); - if (pal > 0 && res == 0) - ;//esyslog("ERROR: text2skin: Too many colors used in palette"); - else - bmp->SetIndex(x, y, res); + bmp->DrawPixel(x, y, col); pos += 4; } } @@ -140,6 +147,9 @@ bool cText2SkinBitmap::LoadImlib(const char *Filename, int Alpha) { #ifdef HAVE_IMAGEMAGICK bool cText2SkinBitmap::LoadMagick(const char *Filename, int Alpha) { + if (mFirstTime) + InitializeMagick("text2skin"); + vector<Image> images; cBitmap *bmp = NULL; try { @@ -154,16 +164,33 @@ bool cText2SkinBitmap::LoadMagick(const char *Filename, int Alpha) { for (it = images.begin(); it != images.end(); ++it) { w = (*it).columns(); h = (*it).rows(); - bmp = new cBitmap(w, h, 8); + if ((*it).depth() > 8) { + esyslog("ERROR: text2skin: More than 8bpp images are not supported"); + return false; + } + bmp = new cBitmap(w, h, (*it).depth()); - const PixelPacket *ptr = (*it).getConstPixels(0, 0, w, h); + if ((*it).classType() == PseudoClass) { + int total = (*it).totalColors(); + for (int ic = 0; ic < (int)total; ++ic) { + Color c = (*it).colorMap(ic); + tColor col = (~(c.alphaQuantum() * 255 / MaxRGB) << 24) | ((c.redQuantum() * 255 / MaxRGB) << 16) | ((c.greenQuantum() * 255 / MaxRGB) << 8) | (c.blueQuantum() * 255 / MaxRGB); + bmp->SetColor(ic, col); + } + } + + const PixelPacket *pix = (*it).getConstPixels(0, 0, w, h); + const IndexPacket *idx = (*it).getConstIndexes(); for (int iy = 0; iy < h; ++iy) { for (int ix = 0; ix < w; ++ix) { - tColor col = (((~ptr->opacity & 0xFF00) << 16) | ((ptr->red & 0xFF00) << 8) | (ptr->green & 0xFF00) | ((ptr->blue & 0xFF00) >> 8)); - if (Alpha) - col = (col & 0x00FFFFFF) | (Alpha << 24); - bmp->DrawPixel(ix, iy, col); - ++ptr; + if ((*it).classType() == PseudoClass) { + bmp->SetIndex(ix, iy, *idx); + ++idx; + } else { + tColor col = (~(pix->opacity * 255 / MaxRGB) << 24) | ((pix->red * 255 / MaxRGB) << 16) | ((pix->green * 255 / MaxRGB) << 8) | (pix->blue * 255 / MaxRGB); + bmp->DrawPixel(ix, iy, col); + ++pix; + } } } mBitmaps.push_back(bmp); |