diff options
author | mrwastl <mrwastl@users.sourceforge.net> | 2013-03-21 20:29:45 +0100 |
---|---|---|
committer | mrwastl <mrwastl@users.sourceforge.net> | 2013-03-21 20:29:45 +0100 |
commit | 60bdec72ecd6bb236f2f1153398c9996fb95730f (patch) | |
tree | 7b6a7667f41002b54dcc78360cef71256b811c94 /glcdgraphics/imagefile.c | |
parent | cf926629084ab015873859e759155f9bfe813e6b (diff) | |
download | graphlcd-base-60bdec72ecd6bb236f2f1153398c9996fb95730f.tar.gz graphlcd-base-60bdec72ecd6bb236f2f1153398c9996fb95730f.tar.bz2 |
glcdgraphics: bug fix in glcd.c, moved methods Scale() and Blend() to image.c, added static methods for loading/saving image; showpic and convpic working again; convpic cleaned up; showpic: added parameters for scaling and centering image
Diffstat (limited to 'glcdgraphics/imagefile.c')
-rw-r--r-- | glcdgraphics/imagefile.c | 122 |
1 files changed, 2 insertions, 120 deletions
diff --git a/glcdgraphics/imagefile.c b/glcdgraphics/imagefile.c index b8c6a42..0f9ec25 100644 --- a/glcdgraphics/imagefile.c +++ b/glcdgraphics/imagefile.c @@ -7,7 +7,7 @@ * to the COPYING file distributed with this package. * * (c) 2006 Andreas Regel <andreas.regel AT powarman.de> - * (c) 2010-2012 Wolfgang Astleitner <mrwastl AT users sourceforge net> + * (c) 2010-2013 Wolfgang Astleitner <mrwastl AT users sourceforge net> */ #include "image.h" @@ -35,130 +35,12 @@ bool cImageFile::Save(cImage & image, const std::string & fileName) } -uint32_t cImageFile::Blend(uint32_t FgColour, uint32_t BgColour, uint8_t Level, double antiAliasGranularity) const -{ - if (antiAliasGranularity > 0.0) - Level = uint8_t(int(Level / antiAliasGranularity + 0.5) * antiAliasGranularity); - int Af = (FgColour & 0xFF000000) >> 24; - int Rf = (FgColour & 0x00FF0000) >> 16; - int Gf = (FgColour & 0x0000FF00) >> 8; - int Bf = (FgColour & 0x000000FF); - int Ab = (BgColour & 0xFF000000) >> 24; - int Rb = (BgColour & 0x00FF0000) >> 16; - int Gb = (BgColour & 0x0000FF00) >> 8; - int Bb = (BgColour & 0x000000FF); - int A = (Ab + (Af - Ab) * Level / 0xFF) & 0xFF; - int R = (Rb + (Rf - Rb) * Level / 0xFF) & 0xFF; - int G = (Gb + (Gf - Gb) * Level / 0xFF) & 0xFF; - int B = (Bb + (Bf - Bb) * Level / 0xFF) & 0xFF; - return (A << 24) | (R << 16) | (G << 8) | B; -} - -bool cImageFile::Scale(cImage & image, uint16_t scalew, uint16_t scaleh, bool AntiAlias) -{ - if (! (scalew || scaleh) ) - return false; - - // one out of scalew/h == 0 ? -> auto aspect ratio - if (scalew && ! scaleh) { - scaleh = (uint16_t)( ((uint32_t)scalew * (uint32_t)image.Height()) / (uint32_t)image.Width() ); - } else if (!scalew && scaleh) { - scalew = (uint16_t)( ((uint32_t)scaleh * (uint32_t)image.Width()) / (uint32_t)image.Height() ); - } - - cImage tempImg = cImage(); - tempImg.SetWidth(scalew); - tempImg.SetHeight(scaleh); - - // Scaling/Blending based on VDR / osd.c - // Fixed point scaling code based on www.inversereality.org/files/bitmapscaling.pdf - // by deltener@mindtremors.com - // - // slightly improved by Wolfgang Astleitner (modify factors and ratios so that scaled image is centered when upscaling) - - double FactorX, FactorY; - int RatioX, RatioY; - - if (!AntiAlias) { - FactorX = (double)scalew / (double)image.Width(); - FactorY = (double)scaleh / (double)image.Height(); - RatioX = (image.Width() << 16) / scalew; - RatioY = (image.Height() << 16) / scaleh; - } else { - FactorX = (double)scalew / (double)(image.Width()-1); - FactorY = (double)scaleh / (double)(image.Height()-1); - RatioX = ((image.Width()-1) << 16) / scalew; - RatioY = ((image.Height()-1) << 16) / scaleh; - } - - bool downscale = (!AntiAlias || (FactorX <= 1.0 && FactorY <= 1.0)); - - for (unsigned int frame = 0; frame < image.Count() ; frame ++ ) { - cBitmap *b = new cBitmap(scalew, scaleh, GRAPHLCD_Transparent); - - cBitmap *currFrame = image.GetBitmap(frame); - - b->SetMonochrome(currFrame->IsMonochrome()); - - if (downscale) { - // Downscaling - no anti-aliasing: - const uint32_t *DestRow = b->Data(); - int SourceY = 0; - for (int y = 0; y < scaleh; y++) { - int SourceX = 0; - const uint32_t *SourceRow = currFrame->Data() + (SourceY >> 16) * image.Width(); - uint32_t *Dest = (uint32_t*) DestRow; - for (int x = 0; x < scalew; x++) { - *Dest++ = SourceRow[SourceX >> 16]; - SourceX += RatioX; - } - SourceY += RatioY; - DestRow += scalew; - } - } else { - // Upscaling - anti-aliasing: - int SourceY = 0; - for (int y = 0; y < scaleh /*- 1*/; y++) { - int SourceX = 0; - int sy = SourceY >> 16; - uint8_t BlendY = 0xFF - ((SourceY >> 8) & 0xFF); - for (int x = 0; x < scalew /*- 1*/; x++) { - int sx = SourceX >> 16; - uint8_t BlendX = 0xFF - ((SourceX >> 8) & 0xFF); - // TODO: antiAliasGranularity - uint32_t c1 = Blend(currFrame->GetPixel(sx, sy), currFrame->GetPixel(sx + 1, sy), BlendX); - uint32_t c2 = Blend(currFrame->GetPixel(sx, sy + 1), currFrame->GetPixel(sx + 1, sy + 1), BlendX); - uint32_t c3 = Blend(c1, c2, BlendY); - b->DrawPixel(x, y, c3); - SourceX += RatioX; - } - SourceY += RatioY; - } - } - tempImg.AddBitmap(b); - } - // clear all bitmaps from image - image.Clear(); - // set new resolution - image.SetWidth(scalew); - image.SetHeight(scaleh); - // re-add bitmaps from scaled image container - cBitmap * b; - cBitmap * tempb; - for (unsigned int frame = 0; frame < tempImg.Count(); frame ++) { - tempb = tempImg.GetBitmap(frame); - b = new cBitmap(scalew, scaleh, (uint32_t*)tempb->Data()); - b->SetMonochrome(tempb->IsMonochrome()); - image.AddBitmap(b); - } - return true; -} bool cImageFile::LoadScaled(cImage & image, const std::string & fileName, uint16_t & scalew, uint16_t & scaleh) { if (Load(image, fileName)) { if (scalew || scaleh) { - return Scale(image, scalew, scaleh, true); + return image.Scale(scalew, scaleh, true); } else { return true; } |