summaryrefslogtreecommitdiff
path: root/NxWidgets
diff options
context:
space:
mode:
Diffstat (limited to 'NxWidgets')
-rw-r--r--NxWidgets/ChangeLog.txt2
-rw-r--r--NxWidgets/Kconfig22
-rw-r--r--NxWidgets/libnxwidgets/include/cscaledbitmap.hxx4
-rw-r--r--NxWidgets/libnxwidgets/src/crlepalettebitmap.cxx2
-rw-r--r--NxWidgets/libnxwidgets/src/cscaledbitmap.cxx62
-rw-r--r--NxWidgets/nxwm/include/ctaskbar.hxx4
-rw-r--r--NxWidgets/nxwm/include/nxwmconfig.hxx24
-rw-r--r--NxWidgets/nxwm/src/ctaskbar.cxx38
8 files changed, 129 insertions, 29 deletions
diff --git a/NxWidgets/ChangeLog.txt b/NxWidgets/ChangeLog.txt
index 3fb1e5398..996ed236c 100644
--- a/NxWidgets/ChangeLog.txt
+++ b/NxWidgets/ChangeLog.txt
@@ -390,4 +390,6 @@
* NxWidgets::CScaledImage: This new class is a wrapper for an class
the exports IBitMap. It will perform scaling via bi-linear interpolation
so that images can be scaled to any size desired (2013-10-15).
+* NxWM::CTaskbar:: Can now be configured to scale taskbasr icons using
+ NxWidgets::CScaledImage (2013-10-15)
diff --git a/NxWidgets/Kconfig b/NxWidgets/Kconfig
index e1ca03169..2de112c3f 100644
--- a/NxWidgets/Kconfig
+++ b/NxWidgets/Kconfig
@@ -420,6 +420,28 @@ config NXWM_TASKBAR_WIDTH
Task bar thickness (either vertical or horizontal). Default: 25 + 2*2
endif
+config NXWM_TASKBAR_ICONSCALE
+ bool "Scale Icons"
+ default n
+ ---help---
+ Enable scaling of icons in the task bar
+
+if NXWM_TASKBAR_ICONSCALE
+
+config NXWM_TASKBAR_ICONWIDTH
+ int "Icon Width (pixels)"
+ default 50
+ ---help---
+ Scaled width of each taskbar ICON in pixels.
+
+config NXWM_TASKBAR_ICONHEIGHT
+ int "Icon Height (rows)"
+ default 42
+ ---help---
+ Scaled height of each taskbar ICON in pixels.
+
+endif #NXWM_TASKBAR_ICONSCALE
+
config NXWM_DISABLE_MINIMIZE
bool "Disable Minimize Button"
default n
diff --git a/NxWidgets/libnxwidgets/include/cscaledbitmap.hxx b/NxWidgets/libnxwidgets/include/cscaledbitmap.hxx
index 4c5d8f729..3c0594a1d 100644
--- a/NxWidgets/libnxwidgets/include/cscaledbitmap.hxx
+++ b/NxWidgets/libnxwidgets/include/cscaledbitmap.hxx
@@ -75,7 +75,7 @@ namespace NXWidgets
FAR IBitmap *m_bitmap; /**< The bitmap that is being scaled */
struct nxgl_size_s m_size; /**< Scaled size of the image */
FAR uint8_t *m_rowCache[2]; /**< Two cached rows of the image */
- unsigned int m_row; /**< Row number of the first cached row */
+ int m_row; /**< Row number of the first cached row */
b16_t m_xScale; /**< X scale factor */
b16_t m_yScale; /**< Y scale factor */
@@ -167,7 +167,7 @@ namespace NXWidgets
* @return The bitmap's height (in rows).
*/
- inline const nxgl_coord_t getHeight(void) const;
+ const nxgl_coord_t getHeight(void) const;
/**
* Get the bitmap's width (in bytes).
diff --git a/NxWidgets/libnxwidgets/src/crlepalettebitmap.cxx b/NxWidgets/libnxwidgets/src/crlepalettebitmap.cxx
index 241736add..1fb2518a5 100644
--- a/NxWidgets/libnxwidgets/src/crlepalettebitmap.cxx
+++ b/NxWidgets/libnxwidgets/src/crlepalettebitmap.cxx
@@ -192,7 +192,7 @@ bool CRlePaletteBitmap::getRun(nxgl_coord_t x, nxgl_coord_t y, nxgl_coord_t widt
{
// Check ranges. Casts to unsigned int are ugly but permit one-sided comparisons
- if (((unsigned int)x < (unsigned int)width) &&
+ if (((unsigned int)x < (unsigned int)m_bitmap->width) &&
((unsigned int)(x + width) <= (unsigned int)m_bitmap->width))
{
// Seek to the requested row
diff --git a/NxWidgets/libnxwidgets/src/cscaledbitmap.cxx b/NxWidgets/libnxwidgets/src/cscaledbitmap.cxx
index 6fe211ca4..e274bbb0a 100644
--- a/NxWidgets/libnxwidgets/src/cscaledbitmap.cxx
+++ b/NxWidgets/libnxwidgets/src/cscaledbitmap.cxx
@@ -81,16 +81,17 @@ CScaledBitmap::CScaledBitmap(IBitmap *bitmap, struct nxgl_size_s &newSize)
// yImage = yRequested * oldHeight / newHeight
// = yRequested * yScale
- m_xScale = itob16((uint32_t)m_bitmap->getHeight()) / newSize.h;
+ m_yScale = itob16((uint32_t)m_bitmap->getHeight()) / newSize.h;
// Allocate and initialize the row cache
size_t stride = bitmap->getStride();
- m_rowCache[0] = new uint8_t(stride);
- m_rowCache[1] = new uint8_t(stride);
+ m_rowCache[0] = new uint8_t[stride];
+ m_rowCache[1] = new uint8_t[stride];
// Read the first two rows into the cache
+ m_row = m_bitmap->getWidth(); // Set to an impossible value
cacheRows(0);
}
@@ -100,6 +101,8 @@ CScaledBitmap::CScaledBitmap(IBitmap *bitmap, struct nxgl_size_s &newSize)
CScaledBitmap::~CScaledBitmap(void)
{
+ // Delete the allocated row cache memory
+
if (m_rowCache[0])
{
delete m_rowCache[0];
@@ -108,6 +111,13 @@ CScaledBitmap::~CScaledBitmap(void)
if (m_rowCache[1])
{
delete m_rowCache[1];
+ }
+
+ // We are also responsible for deleting the contained IBitmap
+
+ if (m_bitmap)
+ {
+ delete m_bitmap;
}
}
@@ -372,7 +382,7 @@ bool CScaledBitmap::cacheRows(unsigned int row)
row = bitmapHeight - 1;
}
- if (!m_bitmap->getRun(0, row, bitmapWidth, &m_rowCache[1]))
+ if (!m_bitmap->getRun(0, row, bitmapWidth, m_rowCache[1]))
{
gdbg("Failed to read bitmap row %d\n", row);
return false;
@@ -391,7 +401,7 @@ bool CScaledBitmap::cacheRows(unsigned int row)
row = bitmapHeight - 1;
}
- if (!m_bitmap->getRun(0, row, bitmapWidth, &m_rowCache[0]))
+ if (!m_bitmap->getRun(0, row, bitmapWidth, m_rowCache[0]))
{
gdbg("Failed to read bitmap row %d\n", row);
return false;
@@ -408,7 +418,7 @@ bool CScaledBitmap::cacheRows(unsigned int row)
row = bitmapHeight - 1;
}
- if (!m_bitmap->getRun(0, row, bitmapWidth, &m_rowCache[1]))
+ if (!m_bitmap->getRun(0, row, bitmapWidth, m_rowCache[1]))
{
gdbg("Failed to read bitmap row %d\n", row);
return false;
@@ -432,21 +442,33 @@ bool CScaledBitmap::scaleColor(FAR const struct rgbcolor_s &incolor1,
FAR const struct rgbcolor_s &incolor2,
b16_t fraction, FAR struct rgbcolor_s &outcolor)
{
- unsigned int red;
- unsigned int green;
- unsigned int blue;
+ uint8_t component;
+ b16_t red;
+ b16_t green;
+ b16_t blue;
+
+ // A fraction of < 0.5 would mean to use use mostly color1; a fraction
+ // greater than 0.5 would men to use mostly color2
+
b16_t remainder = b16ONE - fraction;
-
- red = (unsigned int)incolor1.r * fraction +
- (unsigned int)incolor2.r * remainder;
- green = (unsigned int)incolor1.g * fraction +
- (unsigned int)incolor2.g * remainder;
- blue = (unsigned int)incolor1.b * fraction +
- (unsigned int)incolor2.b * remainder;
-
- outcolor.r = red < 256 ? red : 255;
- outcolor.g = green < 256 ? green : 255;
- outcolor.b = blue < 256 ? blue : 255;
+
+ // Interpolate each color value (converting to b15)
+
+ red = (b16_t)incolor1.r * remainder + (b16_t)incolor2.r * fraction;
+ green = (b16_t)incolor1.g * remainder + (b16_t)incolor2.g * fraction;
+ blue = (b16_t)incolor1.b * remainder + (b16_t)incolor2.b * fraction;
+
+ // Return the integer, interpolated values, clipping to the range of
+ // uint8_t
+
+ component = b16toi(red);
+ outcolor.r = component < 256 ? component : 255;
+
+ component = b16toi(green);
+ outcolor.g = component < 256 ? component : 255;
+
+ component = b16toi(blue);
+ outcolor.b = component < 256 ? component : 255;
return true;
}
diff --git a/NxWidgets/nxwm/include/ctaskbar.hxx b/NxWidgets/nxwm/include/ctaskbar.hxx
index 84c7b28f4..cbd35b52f 100644
--- a/NxWidgets/nxwm/include/ctaskbar.hxx
+++ b/NxWidgets/nxwm/include/ctaskbar.hxx
@@ -92,8 +92,8 @@ namespace NxWM
struct STaskbarSlot
{
- IApplication *app; /**< A reference to the icon */
- NXWidgets::CImage *image; /**< The icon image that goes with the application */
+ IApplication *app; /**< A reference to the application */
+ NXWidgets::CImage *image; /**< The icon image for the application */
};
/**
diff --git a/NxWidgets/nxwm/include/nxwmconfig.hxx b/NxWidgets/nxwm/include/nxwmconfig.hxx
index 6e540fefc..7715224e2 100644
--- a/NxWidgets/nxwm/include/nxwmconfig.hxx
+++ b/NxWidgets/nxwm/include/nxwmconfig.hxx
@@ -223,6 +223,24 @@
# define CONFIG_NXWM_TASKBAR_TOP 1
#endif
+// Taskbar ICON scaling
+
+#ifdef CONFIG_NXWM_TASKBAR_ICONSCALE
+# ifndef CONFIG_NXWM_TASKBAR_ICONWIDTH
+# error Scaling requires CONFIG_NXWM_TASKBAR_ICONWIDTH
+# define CONFIG_NXWM_TASKBAR_ICONWIDTH 50
+# endif
+# ifndef CONFIG_NXWM_TASKBAR_ICONHEIGHT
+# error Scaling requires CONFIG_NXWM_TASKBAR_ICONHEIGHT
+# define CONFIG_NXWM_TASKBAR_ICONHEIGHT 42
+# endif
+#else
+# undef CONFIG_NXWM_TASKBAR_ICONWIDTH
+# define CONFIG_NXWM_TASKBAR_ICONWIDTH 25 // Used below
+# undef CONFIG_NXWM_TASKBAR_ICONHEIGHT
+# define CONFIG_NXWM_TASKBAR_ICONHEIGHT 21 // Used below (NOT)
+#endif
+
/**
* At present, all icons are 25 pixels in "width" and, hence require a
* task bar of at least that size.
@@ -230,9 +248,11 @@
#ifndef CONFIG_NXWM_TASKBAR_WIDTH
# if defined(CONFIG_NXWM_TASKBAR_TOP) || defined(CONFIG_NXWM_TASKBAR_BOTTOM)
-# define CONFIG_NXWM_TASKBAR_WIDTH (25+2*CONFIG_NXWM_TASKBAR_HSPACING)
+# define CONFIG_NXWM_TASKBAR_WIDTH \
+ (CONFIG_NXWM_TASKBAR_ICONWIDTH+2*CONFIG_NXWM_TASKBAR_HSPACING)
# else
-# define CONFIG_NXWM_TASKBAR_WIDTH (25+2*CONFIG_NXWM_TASKBAR_VSPACING)
+# define CONFIG_NXWM_TASKBAR_WIDTH \
+ (CONFIG_NXWM_TASKBAR_ICONWIDTH+2*CONFIG_NXWM_TASKBAR_VSPACING)
# endif
#endif
diff --git a/NxWidgets/nxwm/src/ctaskbar.cxx b/NxWidgets/nxwm/src/ctaskbar.cxx
index 226ebe7bb..3a5e44aec 100644
--- a/NxWidgets/nxwm/src/ctaskbar.cxx
+++ b/NxWidgets/nxwm/src/ctaskbar.cxx
@@ -46,6 +46,7 @@
#include "crect.hxx"
#include "cwidgetcontrol.hxx"
#include "cnxtkwindow.hxx"
+#include "cscaledbitmap.hxx"
#include "cwindowmessenger.hxx"
#include "ctaskbar.hxx"
@@ -456,12 +457,43 @@ bool CTaskbar::startApplication(IApplication *app, bool minimized)
NXWidgets::IBitmap *bitmap = app->getIcon();
+#ifdef CONFIG_NXWM_TASKBAR_ICONSCALE
+ // Create a CScaledBitmap to scale the bitmap icon
+
+ NXWidgets::CScaledBitmap *scaler = (NXWidgets::CScaledBitmap *)0;
+ if (bitmap)
+ {
+ // Create a CScaledBitmap to scale the bitmap icon
+
+ struct nxgl_size_s iconSize;
+ iconSize.w = CONFIG_NXWM_TASKBAR_ICONWIDTH;
+ iconSize.h = CONFIG_NXWM_TASKBAR_ICONHEIGHT;
+
+ scaler = new NXWidgets::CScaledBitmap(bitmap, iconSize);
+ if (!scaler)
+ {
+ return false;
+ }
+ }
+#endif
+
// Create a CImage instance to manage the applications icon. Assume the
// minimum size in case no bitmap is provided (bitmap == NULL)
int w = 1;
int h = 1;
+#ifdef CONFIG_NXWM_TASKBAR_ICONSCALE
+ if (scaler)
+ {
+ w = scaler->getWidth();
+ h = scaler->getHeight();
+ }
+
+ NXWidgets::CImage *image =
+ new NXWidgets::CImage(control, 0, 0, w, h, scaler, 0);
+
+#else
if (bitmap)
{
w = bitmap->getWidth();
@@ -471,6 +503,8 @@ bool CTaskbar::startApplication(IApplication *app, bool minimized)
NXWidgets::CImage *image =
new NXWidgets::CImage(control, 0, 0, w, h, bitmap, 0);
+#endif
+
if (!image)
{
return false;
@@ -490,8 +524,8 @@ bool CTaskbar::startApplication(IApplication *app, bool minimized)
// the task bar
struct STaskbarSlot slot;
- slot.app = app;
- slot.image = image;
+ slot.app = app;
+ slot.image = image;
m_slots.push_back(slot);
// Initialize the application states