App
Public Member Functions | Static Public Attributes | Protected Attributes | List of all members
app::TBitmap< TPIXEL, TCHANNEL > Class Template Reference

Třída pro reprezentaci bitmapy. More...

#include <TBitmap.hpp>

Public Member Functions

 TBitmap ()
 Defaultní konstruktor, vytvoří neplatnou bitmapu.
 
 TBitmap (unsigned int width, unsigned int height, ColorMode type, int premultiplied)
 Konstruktor.
 
 TBitmap (void *data, unsigned width, unsigned height, ColorMode type, int premultiplied)
 Vytvoří bitmapu nad oblastí dat v paměti.
 
 TBitmap (TBitmap< TPIXEL, TCHANNEL > &other)
 Kopírovací konstuktor, provede hlubokou kopii.
 
virtual ~TBitmap ()
 Destruktor.
 
ColorMode getType () const
 Vrací typ bitmapy.
 
void setType (ColorMode mode)
 Nastaví typ bitmapy.
 
TPIXEL * getData () const
 Vrací pointer na data bitmapy.
 
unsigned int getWidth () const
 Vrací šířku bitmapy v pixelech.
 
unsigned int getHeight () const
 Vrací výšku bitmapy v pixelech.
 
unsigned int getBpp () const
 Vrací počet Bajtů na pixel.
 
Rect getRect () const
 Vrací obdélník odpovídající rozměrům bitmapy s počátkem v 0.
 
PointerArea getPointerArea () const
 Vrací instanci PointerArea, která odpovídá oblasti v paměti, kde je uložená bitmapa.
 
int isPremultiplied ()
 Vrací, jeslti je bitmapa přednásobena alphou.
 
void setPremultiplied (int premultiplied)
 Nastaví, zda je bitmapa přednásobena alphou.
 
virtual int premultiply ()
 Přednásobí hodnoty kanálů alphou, pokud je aplikovatelné.
 
virtual int demultiply ()
 Odstraní přednásobení kanálů alphou, pokud lze provést.
 
virtual TBitmap< TCHANNEL,
TCHANNEL > * 
getChannel (unsigned index) const
 Extrahuje požadovaný kanál.
 
virtual int copyTo (TBitmap< TPIXEL, TCHANNEL > &dst, Rect srcRect, Point srcOrig) const
 Zkopíruje data z bitmapy do cílové bitmapy bez převzorkování.
 
virtual int fill (Rect area, TPIXEL *src)
 Vyplní oblast bitmapy konstantní hodnotou.
 
int clear ()
 Vyplní celou oblast nulami.
 
virtual TBitmap< TPIXEL,
TCHANNEL > * 
difference (TBitmap< TPIXEL, TCHANNEL > &other, int proportional=0) const
 Debug metoda.
 

Static Public Attributes

static const unsigned int chCount = sizeof(TPIXEL) / sizeof(TCHANNEL)
 Počet kanálů.
 
static const TCHANNEL maxVal = ~0
 Maximální hodnota kanálu.
 

Protected Attributes

ColorMode type
 Definuje typ bitmapy.
 
TPIXEL * data
 Ukazuje na obrazová data v paměti, ty jsou zapsaná po řádcích v souvislé oblasti.
 
unsigned int width
 Šířka bitmapy v pixelech.
 
unsigned int height
 Výška bitmapy v pixelech.
 
unsigned int bpp
 Počet Bajtů na pixel.
 
int premultiplied
 Informace o tom, zda jsou jednotlivé kanály přednásobeny alphou.
 
int ownsData
 Informace, jestli bitmapa vlastní svoje data. Bitmapa nevlastní svoje data, pokud si je sama nealokovala a nemůže je tedy uvolnit.
 

Detailed Description

template<typename TPIXEL, typename TCHANNEL>
class app::TBitmap< TPIXEL, TCHANNEL >

Třída pro reprezentaci bitmapy.

Třída pro reprezentaci bitmapy. Parametrizovatelná tak, že zvládne reprezentovat více barevných hloubek. Není úplně optimální, protože nezvládne více jak 16bitů na kanál pro RGBA bitmapu. Vyšší bitová hloubka nelze vzhledem k interpolátorům a blendingu použít, ale vzhledem k tomu, že i RAW formát má 12 - 14 bitů na kanál, 16 bitů na kanál je dostačující. 16 bitů na kanál není zatím podporováno, ale lze na ni snadno rozšířit.

Template Parameters
TPIXEL- celočíselný typ reprezentující celý pixel - přípustné jsou px_4x8bit a px_1x8bit
TCHANNEL- celočíselný typ reprezentující jeden kanál - přípustné je pouze px_1x8bit

Definition at line 66 of file TBitmap.hpp.

Constructor & Destructor Documentation

template<typename TPIXEL, typename TCHANNEL>
app::TBitmap< TPIXEL, TCHANNEL >::TBitmap ( )
inline

Defaultní konstruktor, vytvoří neplatnou bitmapu.

Definition at line 82 of file TBitmap.hpp.

{
data = NULL;
width = 0;
height = 0;
bpp = 0;
ownsData = 0;
}
template<typename TPIXEL, typename TCHANNEL>
app::TBitmap< TPIXEL, TCHANNEL >::TBitmap ( unsigned int  width,
unsigned int  height,
ColorMode  type,
int  premultiplied 
)
inline

Konstruktor.

Konstruktor pro tvorbu bitmapy.

Parameters
widthŠířka bitmapy.
heightVýška bitmapy.
typeMód bitmapy, používaný barevný prostor.
premultipliedInformace o tom, jestli jsou kanály bitmapy přednásobeny alphou.

Definition at line 100 of file TBitmap.hpp.

{
data = NULL;
unsigned long int size = width * height;
if (size > 0) {
data = (TPIXEL *) malloc((unsigned long int)(size * sizeof(TPIXEL))); // ANDROID_SPECIFIC Přetypování na unsigned long int kvůli Eclipse a androidu
}
if (data != NULL) {
this->type = type;
this->width = width;
this->height = height;
bpp = sizeof(TPIXEL);
ownsData = 1;
} else {
data = NULL;
this->width = 0;
this->height = 0;
bpp = 0;
this->premultiplied = 0;
ownsData = 0;
}
}
template<typename TPIXEL, typename TCHANNEL>
app::TBitmap< TPIXEL, TCHANNEL >::TBitmap ( void *  data,
unsigned  width,
unsigned  height,
ColorMode  type,
int  premultiplied 
)
inline

Vytvoří bitmapu nad oblastí dat v paměti.

Vytvoří bitmapu nad oblastí dat v paměti. Slouží k přístupu k datům třídy PDBitmap na straně Javy.

Parameters
dataUkazatel na začátek oblasti.
widthŠířka bitmapy.
heightVýška bitmapy
typeMód bitmapy, používaný barevný prostor.
premultipliedInformace o tom, jestli je bitmapa přednásobena alphou.

Definition at line 133 of file TBitmap.hpp.

{
if (data != NULL && width > 0 && height > 0) {
this->type = type;
this->width = width;
this->height = height;
bpp = sizeof(TPIXEL);
ownsData = 0;
this->data = (TPIXEL *) data;
} else {
data = NULL;
this->width = 0;
this->height = 0;
bpp = 0;
this->premultiplied = 0;
ownsData = 0;
}
}
template<typename TPIXEL, typename TCHANNEL>
app::TBitmap< TPIXEL, TCHANNEL >::TBitmap ( TBitmap< TPIXEL, TCHANNEL > &  other)
inline

Kopírovací konstuktor, provede hlubokou kopii.

Definition at line 155 of file TBitmap.hpp.

{
type = other.type;
width = other.width;
height = other.height;
bpp = other.bpp;
premultiplied = other.premultiplied;
if (other.data != NULL) { // raději jak neplatný typ, že se jedná o stejnou bitmapu je dáno template
int size = width * height * sizeof(TPIXEL);
data = (TPIXEL *) malloc(size);
if (data != NULL) {
memcpy(data, other.data, size);
ownsData = 1;
} else {
ownsData = 0;
}
} else {
data = NULL;
ownsData = 0;
}
}
template<typename TPIXEL , typename TCHANNEL >
TBitmap< TPIXEL, TCHANNEL >::~TBitmap ( )
virtual

Destruktor.

Definition at line 41 of file TBitmap.cpp.

{
if (ownsData && (data != NULL)) {
free(data);
}
}

Member Function Documentation

template<typename TPIXEL, typename TCHANNEL>
int app::TBitmap< TPIXEL, TCHANNEL >::clear ( )
inline

Vyplní celou oblast nulami.

Definition at line 271 of file TBitmap.hpp.

{
if (data != NULL) {
memset(data, 0, width * height * bpp);
return 0;
}
return 1;
}
template<typename TPIXEL , typename TCHANNEL >
int TBitmap< TPIXEL, TCHANNEL >::copyTo ( TBitmap< TPIXEL, TCHANNEL > &  dst,
Rect  srcRect,
Point  srcOrig 
) const
virtual

Zkopíruje data z bitmapy do cílové bitmapy bez převzorkování.

Zkopíruje vybranou oblast z bitmapy do cílové bitmapy bez převzorkování. Kopírovaná oblast je určena obdélníkem srcRect (ss této bitmapy, body určené pravou a dolní maximální souřadnicí se již nekopírují). Pozice kam se data kopírují je určena bodem srcOrig, který určuje, kam se v ss cílové bítmapy má umístit kopírovaná oblast.

Je možné zadat požadavek na kopírování takový, že by se mělo kopírovat z / mimo platnou oblast Bitmapy. V tom případě budou oblasti adekvátně ořezány, aby se kopírovala pouze platná data do platné oblasti.

Parameters
dstCílová bitmapa.
srcRectObdélník určující vybranou oblast, která se bude kopírovat.
srcOrigBod určující cílovou oblast, kam se bude kopírovat.
Returns
Vrací 0 při úspěchu, jinak kód chyby.

Definition at line 110 of file TBitmap.cpp.

{
if (data == NULL) {
return 1;
}
if (dst.getData() == NULL) {
return 2;
}
if (type != dst.getType()) {
return 3;
}
PointerArea srcArea = PointerArea(data, getRect(), srcRect, bpp);
PointerArea dstArea = dst.getPointerArea();
int err = PointerArea::copy(dstArea, srcArea, srcOrig);
if (err) {
return 100 + err;
} else {
return 0;
}
}
template<typename TPIXEL , typename TCHANNEL >
int TBitmap< TPIXEL, TCHANNEL >::demultiply ( )
virtual

Odstraní přednásobení kanálů alphou, pokud lze provést.

Odstraní přednásobení kanálů alphou, pokud lze provést. Pokud se jendíá o jednokanálovou bitmapu nebo je bitmapa vedená jako nepřednásobená, neprovede se nic.

Returns
Vrací 0 v případě úspěchu, jinak kód chyby.

Definition at line 76 of file TBitmap.cpp.

{
if (!premultiplied) {
return 1;
}
if (chCount != 4) {
return 2;
}
if (data == NULL) {
return 3;
}
TCHANNEL * ptr = (TCHANNEL *) data;
TCHANNEL * ptrEnd = (TCHANNEL *) (data + width * height);
TCHANNEL tmp;
double alpha;
while (ptr < ptrEnd) {
tmp = *(ptr + 3);
if (tmp == 0) {
ptr += 4;
continue;
}
alpha = tmp / (double) maxVal;
*ptr = *ptr / alpha + 0.5;
ptr++;
*ptr = *ptr / alpha + 0.5;
ptr++;
*ptr = *ptr / alpha + 0.5;
ptr++;
ptr++;
}
return 0;
}
template<typename TPIXEL , typename TCHANNEL >
TBitmap< TPIXEL, TCHANNEL > * TBitmap< TPIXEL, TCHANNEL >::difference ( TBitmap< TPIXEL, TCHANNEL > &  other,
int  proportional = 0 
) const
virtual

Debug metoda.

Debug metoda, která vrací bitmapu, jejíž kanály odpovídají absolutní hodnotě rozdílu této a porovnávané bitmapy.

Výsledky mohou být buď proporcionální (kanál se ZHASNE) nebo neproporcionální - kanál se ZHASNE úplně, zhasínání oproti předchozí implementaci zvoleno kvůli porovnávání alphy, pokud by se rovnala, byl by pixel neviditelný, což je špatně... Holt se na to bude hůř koukat... Alternativně dostat mimo třídu a implementovat pro jednotlivé bitmapy, ale jde jen o debug

Parameters
otherBitmapa k porovnání.
proportionalpožadavek na proporcionální zobrazení rozdílu.
Returns
Vrací rozdílovou bitmapu.

Definition at line 144 of file TBitmap.cpp.

{
if (data == NULL) {
return NULL;
}
if (other.getType() != type || other.getData() == NULL) {
return NULL;
}
TCHANNEL * s1 = (TCHANNEL *) data;
TCHANNEL * s2 = (TCHANNEL *) other.getData();
TCHANNEL * d = (TCHANNEL *) res->getData();
TCHANNEL * s1End = (TCHANNEL *) (data + width * height);
TCHANNEL minVal = 0;
TCHANNEL maxVal = ~minVal; // 111...111
if (!proportional) {
while (s1 < s1End) {
*d = (*s1 == *s2) ? maxVal : minVal;
s1++;
s2++;
d++;
}
} else {
while (s1 < s1End) {
*d = abs(*s1 - *s2);
s1++;
s2++;
d++;
}
}
return res;
}
template<typename TPIXEL , typename TCHANNEL >
int TBitmap< TPIXEL, TCHANNEL >::fill ( Rect  area,
TPIXEL *  src 
)
virtual

Vyplní oblast bitmapy konstantní hodnotou.

Vyplní oblast bitmapy konstantní hodnotou. Hodnota představuje pixel typu, který odpovídá této bitmapě.

Parameters
areaOblast, která má být vyplněna.
srcData, která se mají k vyplnění použít.
Returns
Vrací 0 při úspěchu, v opačném případě kód chyby.

Definition at line 130 of file TBitmap.cpp.

{
if (data == NULL) {
return 1;
}
PointerArea dstArea = PointerArea(data, getRect(), area, bpp);
int err = PointerArea::fill(dstArea, src);
if (err) {
return 100 + err;
} else {
return 0;
}
}
template<typename TPIXEL, typename TCHANNEL>
unsigned int app::TBitmap< TPIXEL, TCHANNEL >::getBpp ( ) const
inline

Vrací počet Bajtů na pixel.

Definition at line 196 of file TBitmap.hpp.

{return bpp;}
template<typename TPIXEL , typename TCHANNEL >
TBitmap< TCHANNEL, TCHANNEL > * TBitmap< TPIXEL, TCHANNEL >::getChannel ( unsigned  index) const
virtual

Extrahuje požadovaný kanál.

Extrahuje požadovaný kanál, který vrátí jako novou jednokanálovou bitmapu.

Parameters
chPožadovaný kanál.
Returns
Jednokanálová bitmapa tvořená požadovaným kanálem, v případě neúspěchu NULL.

Definition at line 14 of file TBitmap.cpp.

{
if (data == NULL) {
return NULL;
}
if (index >= chCount) {
return NULL;
}
if (res->getData() == NULL) {
delete res;
return NULL;
}
TCHANNEL * s = (TCHANNEL *) data + index;
TCHANNEL * end = (TCHANNEL *) (data + width * height);
TCHANNEL * d = res->getData();
while (s < end) {
*d = *s;
s += 4;
d++;
}
return res;
}
template<typename TPIXEL, typename TCHANNEL>
TPIXEL* app::TBitmap< TPIXEL, TCHANNEL >::getData ( ) const
inline

Vrací pointer na data bitmapy.

Definition at line 187 of file TBitmap.hpp.

{return data;}
template<typename TPIXEL, typename TCHANNEL>
unsigned int app::TBitmap< TPIXEL, TCHANNEL >::getHeight ( ) const
inline

Vrací výšku bitmapy v pixelech.

Definition at line 193 of file TBitmap.hpp.

{return height;}
template<typename TPIXEL, typename TCHANNEL>
PointerArea app::TBitmap< TPIXEL, TCHANNEL >::getPointerArea ( ) const
inline

Vrací instanci PointerArea, která odpovídá oblasti v paměti, kde je uložená bitmapa.

Definition at line 206 of file TBitmap.hpp.

{return PointerArea(data, getRect(), bpp);}
template<typename TPIXEL, typename TCHANNEL>
Rect app::TBitmap< TPIXEL, TCHANNEL >::getRect ( ) const
inline

Vrací obdélník odpovídající rozměrům bitmapy s počátkem v 0.

Vrací obdélník mezi body (0, 0) a (width, height)

Returns
Obdélník reprezentující bitmapu.

Definition at line 203 of file TBitmap.hpp.

{return Rect(0, 0, width, height);}
template<typename TPIXEL, typename TCHANNEL>
ColorMode app::TBitmap< TPIXEL, TCHANNEL >::getType ( ) const
inline

Vrací typ bitmapy.

Definition at line 181 of file TBitmap.hpp.

{return type;}
template<typename TPIXEL, typename TCHANNEL>
unsigned int app::TBitmap< TPIXEL, TCHANNEL >::getWidth ( ) const
inline

Vrací šířku bitmapy v pixelech.

Definition at line 190 of file TBitmap.hpp.

{return width;}
template<typename TPIXEL, typename TCHANNEL>
int app::TBitmap< TPIXEL, TCHANNEL >::isPremultiplied ( )
inline

Vrací, jeslti je bitmapa přednásobena alphou.

Definition at line 209 of file TBitmap.hpp.

{ return premultiplied; }
template<typename TPIXEL , typename TCHANNEL >
int TBitmap< TPIXEL, TCHANNEL >::premultiply ( )
virtual

Přednásobí hodnoty kanálů alphou, pokud je aplikovatelné.

Přednásobí hodnoty kanálů alphou, pokud je aplikovatelné. Pokud se jedná o jednokanálovou bitmapu nebo je již bitmapa vedená jako přednásobená, neprovede nic.

Returns
Vrací 0 v případě úspěchu, jinak kód chyby.

Definition at line 48 of file TBitmap.cpp.

{
return 1;
}
if (chCount != 4) {
return 2;
}
if (data == NULL) {
return 3;
}
TCHANNEL * ptr = (TCHANNEL *) data;
TCHANNEL * ptrEnd = (TCHANNEL *) (data + width * height);
double alpha;
while (ptr < ptrEnd) {
alpha = *(ptr + 3) / (double) maxVal;
*ptr = *ptr * alpha + 0.5;
ptr++;
*ptr = *ptr * alpha + 0.5;
ptr++;
*ptr = *ptr * alpha + 0.5;
ptr++;
ptr++;
}
return 0;
}
template<typename TPIXEL, typename TCHANNEL>
void app::TBitmap< TPIXEL, TCHANNEL >::setPremultiplied ( int  premultiplied)
inline

Nastaví, zda je bitmapa přednásobena alphou.

Nastaví, zda je bitmapa přednásobena alphou, nezávisle na tom, jeslti skutečně je.

Parameters
premultiplied

Definition at line 216 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
void app::TBitmap< TPIXEL, TCHANNEL >::setType ( ColorMode  mode)
inline

Nastaví typ bitmapy.

Definition at line 184 of file TBitmap.hpp.

{type = mode;}

Member Data Documentation

template<typename TPIXEL, typename TCHANNEL>
unsigned int app::TBitmap< TPIXEL, TCHANNEL >::bpp
protected

Počet Bajtů na pixel.

Definition at line 72 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
const unsigned TBitmap< TPIXEL, TCHANNEL >::chCount = sizeof(TPIXEL) / sizeof(TCHANNEL)
static

Počet kanálů.

Definition at line 78 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
TPIXEL* app::TBitmap< TPIXEL, TCHANNEL >::data
protected

Ukazuje na obrazová data v paměti, ty jsou zapsaná po řádcích v souvislé oblasti.

Definition at line 69 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
unsigned int app::TBitmap< TPIXEL, TCHANNEL >::height
protected

Výška bitmapy v pixelech.

Definition at line 71 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
const TCHANNEL TBitmap< TPIXEL, TCHANNEL >::maxVal = ~0
static

Maximální hodnota kanálu.

Definition at line 79 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
int app::TBitmap< TPIXEL, TCHANNEL >::ownsData
protected

Informace, jestli bitmapa vlastní svoje data. Bitmapa nevlastní svoje data, pokud si je sama nealokovala a nemůže je tedy uvolnit.

Definition at line 74 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
int app::TBitmap< TPIXEL, TCHANNEL >::premultiplied
protected

Informace o tom, zda jsou jednotlivé kanály přednásobeny alphou.

Definition at line 73 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
ColorMode app::TBitmap< TPIXEL, TCHANNEL >::type
protected

Definuje typ bitmapy.

Definition at line 68 of file TBitmap.hpp.

template<typename TPIXEL, typename TCHANNEL>
unsigned int app::TBitmap< TPIXEL, TCHANNEL >::width
protected

Šířka bitmapy v pixelech.

Definition at line 70 of file TBitmap.hpp.


The documentation for this class was generated from the following files: