App
Public Member Functions | Static Public Member Functions | Public Attributes | Private Attributes | List of all members
app::PointerArea Class Reference

Třída pro práci s nízkoúrovňovou reprezentací bitmapy v paměti. Třída pro práci s nízkoúrovňovou reprezentací bitmapy v paměti - dvourozměrné pole pixelů uložené jako souvislý blok dat. More...

#include <PointerArea.hpp>

Public Member Functions

 PointerArea (void *pStart, Rect origDim, unsigned int bpp)
 Vytvoří oblast o daných parametrech.
 
 PointerArea (void *pStart, Rect origDim, Rect areaDim, unsigned int bpp)
 Vytvoří oblast o daných parametrech.
 
 PointerArea (const PointerArea &other)
 Kopírovací konstruktor, kvůli konstantnímu bpp.
 
Rect getOrig () const
 Vrací obdélník představující původní oblast.
 
Rect getArea () const
 Vrací obdélník reprezentující vybranou oblast.
 
unsigned int getAreaWidth () const
 Vrací šířku vybrané oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).
 
unsigned int getOrigWidth () const
 Vrací šířku původní oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).
 
unsigned int getAreaHeight () const
 Vrací výšku vybrané oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).
 
unsigned int getOrigHeight () const
 Vrací výšku původní oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).
 
unsigned int getAreaByteWidth () const
 Vrací šířku vybrané oblasti v bajtech.
 
unsigned int getOrigByteWidth () const
 Vrací šířku původní oblasti v bajtech.
 
unsigned int getOrigSize () const
 Vrací velikost původní oblasti v bajtech.
 
unsigned int getAreaSize () const
 Vrací velikost dat ve vybrané oblasti v bajtech.
 
unsigned int getByteOffset () const
 Vrací offset řádků vybrané oblasti vzhledem k původní v bajtech.
 
unsigned int getOffset () const
 Vrací offset řádků vybrané oblasti vzhledem k původní v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).
 
void * getOrigBgn () const
 Vrací pointer na počátek původní oblasti.
 
void * getAreaBgn () const
 Vrací pointer na počátek vybrané oblasti.
 
void * getAreaRowEnd () const
 Vrací pointer na první prvek za posledním prvkem v prvním řádku vybrané oblasti.
 
void * getOrigEnd () const
 Vrací pointer ukazujici na první prvek za původní oblastí oblastí.
 
void * getOrigRowEnd () const
 Vrací pointer na první prvek za posledním prvkem v prvním řádku (tedy na první (nultý) prvek druhého řádku).
 
void * getAreaEnd () const
 Vrací pointer ukazujici na první prvek za oblastí oblastí.
 

Static Public Member Functions

static int makeCommon (PointerArea &dst, PointerArea &src, Point srcOrig)
 Upraví oblasti tak, aby obě obsahovali pouze "společnou část" (průnik) se zadaným posunutím.
 
static int makeCommon (PointerArea &dst, PointerArea &src1, Point src1Orig, PointerArea &src2, Point src2Orig)
 Upraví oblasti tak, aby všechny obsahovali pouze "společnou část" (průnik) se zadaným posunutím.
 
static int copy (PointerArea dst, PointerArea src, Point srcOrig)
 Zkopíruje data z jedné oblasti do druhé na vybrané místo.
 
static int fill (PointerArea dst, void *src)
 Vyplní oblast konstantní hodnotou.
 

Public Attributes

const unsigned int bpp
 udává, kolik je bajtů na pixel (BytesPerPixel).
 

Private Attributes

bytepStart
 Pointer na začátek oblasti v paměti.
 
Rect origDim
 Obdélník s údaji o původní velikosti celé oblasti - maximální možná velikost oblasti.
 
Rect areaDim
 Obdélník představující velikost skutečně používané oblasti (výseče) z té původní.
 

Detailed Description

Třída pro práci s nízkoúrovňovou reprezentací bitmapy v paměti. Třída pro práci s nízkoúrovňovou reprezentací bitmapy v paměti - dvourozměrné pole pixelů uložené jako souvislý blok dat.

Není vhodné, aby byla template, protože hlavní účel - makeCommon() musí zvládat odlišné bpp.

Není závislé na počtu bajtů na pixel, takže je obecně použitelné pro dvourozměrné pole jakýhkoliv dat, ale vyžaduje přetypování!!!

Definition at line 32 of file PointerArea.hpp.

Constructor & Destructor Documentation

app::PointerArea::PointerArea ( void *  pStart,
Rect  origDim,
unsigned int  bpp 
)
inline

Vytvoří oblast o daných parametrech.

Vytvoří oblast o daných parametrech, velikost oblasti je totožná s původní velikostí.

Uvažuje se šířka oblasti (počet prvků v oblasti) daná výsledkem volání origDim.getWidth() a výška oblasti daná voláním origDim.getHeight(), proto je pro správné fungování je doporučeno, aby origDim měl horní levý roh v bodě (0, 0) a dolní pravý roh měl souřadnice (width, height), přičemž při indexování od 0 již na souřadnici (width, height) není žádný prvek!

Parameters
pStartPointer na začátek oblasti.
origDimVelikost původní oblasti, bude použita i jako velikost výřezu.
bppPočet bajtů na pixel

Definition at line 50 of file PointerArea.hpp.

: bpp(bpp) { this->pStart = (byte *) pStart; this->origDim = origDim; this->areaDim = origDim; /*this->bpp = bpp;*/ }
app::PointerArea::PointerArea ( void *  pStart,
Rect  origDim,
Rect  areaDim,
unsigned int  bpp 
)

Vytvoří oblast o daných parametrech.

Vytvoří oblast o daných parametrech, velikost oblasti se pokusí nastavit na areaDim, pokud tato přesahuje maximální (origDim), provede se ořez.

Uvažuje se šířka oblasti (počet prvků v oblasti) daná výsledkem volání origDim.getWidth() a výška oblasti daná voláním origDim.getHeight(), proto je pro správné fungování je doporučeno, aby origDim měl horní levý roh v bodě (0, 0) a dolní pravý roh měl souřadnice (width, height), přičemž při indexování od 0 již na souřadnici (width, height) není žádný prvek!

Totéž platí i pro areaDim.

Parameters
pStartPointer na začátek oblasti.
origDimVelikost původní oblasti.
areaDimVelikost požadované oblasti, může být ořezána.
bppPočet bajtů na pixel.

Definition at line 10 of file PointerArea.cpp.

: bpp(bpp) {
this->pStart = (byte *) pStart;
this->origDim = origDim;
/* this->bpp = bpp; */
}
app::PointerArea::PointerArea ( const PointerArea other)
inline

Kopírovací konstruktor, kvůli konstantnímu bpp.

Kopírovací konstruktor kvůli konstantnímu bpp.

Parameters
otherKopírovaná PointerArea.

Definition at line 74 of file PointerArea.hpp.

: bpp(other.bpp) { pStart = other.pStart; origDim = other.origDim; areaDim = other.areaDim; /*this->bpp = bpp;*/ }

Member Function Documentation

int app::PointerArea::copy ( PointerArea  dst,
PointerArea  src,
Point  srcOrig 
)
static

Zkopíruje data z jedné oblasti do druhé na vybrané místo.

Zkopíruje data z jedné oblasti do druhé na vybrané místo, pokud mají stejný typ (bpp) a existuje společná část (průnik).

Parameters
dstZdrojová oblast.
srcCílová oblast.
srcOrigUmístění horního levého rohu zdrojové oblasti v ss cílové oblasti.
Returns
0 při úspěchu, jinak kód chyby.

Definition at line 70 of file PointerArea.cpp.

{
if (src.bpp != dst.bpp) {return 1;}
int err = PointerArea::makeCommon(dst, src, srcOrig);
if (err) {return 100 + err;}
byte * s = (byte *) src.getAreaBgn();
byte * d = (byte *) dst.getAreaBgn();
byte * sEnd = (byte *) src.getAreaEnd();
int count = src.getAreaByteWidth();
int srcByteWidth = src.getOrigByteWidth();
int dstByteWidth = dst.getOrigByteWidth();
while (s < sEnd) {
memcpy(d, s, count);
s += srcByteWidth;
d += dstByteWidth;
}
return 0;
}
int app::PointerArea::fill ( PointerArea  dst,
void *  src 
)
static

Vyplní oblast konstantní hodnotou.

Vyplní oblast dst konstantní hodnotou, kterou nalezne na adrese src.

Parameters
dstOblast, která se má vyplnit.
srcMísto, odkud se berou konstantní data.
Returns
0 při úspěchu, jinak kód chyby.

Definition at line 91 of file PointerArea.cpp.

{
int count = dst.getAreaByteWidth();
byte * d = (byte *) dst.getAreaBgn();
byte * dRowEnd = d + count;
while (d < dRowEnd) {
memcpy(d, src, dst.bpp);
d += dst.bpp;
}
d += dst.getByteOffset();
byte * dEnd = (byte *) dst.getAreaEnd();
int dstByteWidth = dst.getOrigByteWidth();
src = (byte *) dst.getAreaBgn();
while (d < dEnd) {
memcpy(d, src, count);
d += dstByteWidth;
}
return 0;
}
Rect app::PointerArea::getArea ( ) const
inline

Vrací obdélník reprezentující vybranou oblast.

Definition at line 80 of file PointerArea.hpp.

{return areaDim;}
void* app::PointerArea::getAreaBgn ( ) const
inline

Vrací pointer na počátek vybrané oblasti.

Definition at line 128 of file PointerArea.hpp.

unsigned int app::PointerArea::getAreaByteWidth ( ) const
inline

Vrací šířku vybrané oblasti v bajtech.

Definition at line 95 of file PointerArea.hpp.

{return areaDim.getWidth() * bpp;}
void* app::PointerArea::getAreaEnd ( ) const
inline

Vrací pointer ukazujici na první prvek za oblastí oblastí.

Definition at line 140 of file PointerArea.hpp.

{return pStart + (areaDim.br.y - 1) * getOrigByteWidth() + (areaDim.br.x - 1) * bpp;}
unsigned int app::PointerArea::getAreaHeight ( ) const
inline

Vrací výšku vybrané oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).

Definition at line 89 of file PointerArea.hpp.

{ return areaDim.getHeight(); }
void* app::PointerArea::getAreaRowEnd ( ) const
inline

Vrací pointer na první prvek za posledním prvkem v prvním řádku vybrané oblasti.

Definition at line 131 of file PointerArea.hpp.

{ return pStart + areaDim.tl.y * getOrigByteWidth() + areaDim.br.x * bpp;} // NETESTOVANO V DEMU
unsigned int app::PointerArea::getAreaSize ( ) const
inline

Vrací velikost dat ve vybrané oblasti v bajtech.

Definition at line 104 of file PointerArea.hpp.

unsigned int app::PointerArea::getAreaWidth ( ) const
inline

Vrací šířku vybrané oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).

Definition at line 83 of file PointerArea.hpp.

{ return areaDim.getWidth(); }
unsigned int app::PointerArea::getByteOffset ( ) const
inline

Vrací offset řádků vybrané oblasti vzhledem k původní v bajtech.

Vrací offset řádků vybrané oblasti vzhledem k původní oblasti v bajtech, tedy počet bajtů, o které je nutné se posunout při přechodu na začátek dalšího řádku vybrané oblasti od konce stávajícího řádku vybrané oblasti

Returns
Offset v bajtech.

Definition at line 113 of file PointerArea.hpp.

unsigned int app::PointerArea::getOffset ( ) const
inline

Vrací offset řádků vybrané oblasti vzhledem k původní v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).

Vrací offset řádků vybrané oblasti vzhledem k původní oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů), tedy počet prvků, o které je nutné se posunout při přechodu na začátek dalšího řádku vybrané oblasti od konce stávajícího řádku vybrané oblasti.

Returns
Offset v počtu prvků.

Definition at line 122 of file PointerArea.hpp.

{ return getOrigWidth() - getAreaWidth(); }
Rect app::PointerArea::getOrig ( ) const
inline

Vrací obdélník představující původní oblast.

Definition at line 77 of file PointerArea.hpp.

{return origDim;}
void* app::PointerArea::getOrigBgn ( ) const
inline

Vrací pointer na počátek původní oblasti.

Definition at line 125 of file PointerArea.hpp.

{return pStart;}
unsigned int app::PointerArea::getOrigByteWidth ( ) const
inline

Vrací šířku původní oblasti v bajtech.

Definition at line 98 of file PointerArea.hpp.

{return origDim.getWidth() * bpp;}
void* app::PointerArea::getOrigEnd ( ) const
inline

Vrací pointer ukazujici na první prvek za původní oblastí oblastí.

Definition at line 134 of file PointerArea.hpp.

unsigned int app::PointerArea::getOrigHeight ( ) const
inline

Vrací výšku původní oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).

Definition at line 92 of file PointerArea.hpp.

{ return origDim.getHeight(); }
void* app::PointerArea::getOrigRowEnd ( ) const
inline

Vrací pointer na první prvek za posledním prvkem v prvním řádku (tedy na první (nultý) prvek druhého řádku).

Definition at line 137 of file PointerArea.hpp.

{ return pStart + getOrigByteWidth();} // NETESTOVANO V DEMU
unsigned int app::PointerArea::getOrigSize ( ) const
inline

Vrací velikost původní oblasti v bajtech.

Definition at line 101 of file PointerArea.hpp.

unsigned int app::PointerArea::getOrigWidth ( ) const
inline

Vrací šířku původní oblasti v počtu prvků (předpokládá se jeden prvek o velikosti bpp bajtů).

Definition at line 86 of file PointerArea.hpp.

{ return origDim.getWidth(); }
int app::PointerArea::makeCommon ( PointerArea dst,
PointerArea src,
Point  srcOrig 
)
static

Upraví oblasti tak, aby obě obsahovali pouze "společnou část" (průnik) se zadaným posunutím.

Nalezne společnou část (průnik) dvou oblastí tak, že do souřadného systému oblasti dst se umístí zdrojová oblast src tak, že její horní levý roh je totožný s bodem srcOrig (v ss dst). Oblasti jsou následně ořezány tak, aby tvořili průnik.

Parameters
dstCílová oblast.
srcZdrojová oblast.
srcOrigUmístění horního levého rohu zdrojové oblasti v ss cílové oblasti.
Returns
0 při úspěchu, jinak kód chyby.

Definition at line 18 of file PointerArea.cpp.

{
Rect srcArea = src.getArea(); // odkud se budou brát data
if (!srcArea.isValid()) {return 1;}
Rect dstArea = dst.getArea();
Rect srcPlaced = srcArea.makeCopyAt(srcOrig); // Vezmu zdrojovou oblast a umístím ji tam, kde se má vykreslovat (převedu ji do ss cílové oblasti)...
// old: Rect srcPlaced = Rect::makeCopyAt(srcArea, srcOrig);
Rect placedCut = Rect::getIntersection(dstArea, srcPlaced); // == dstCut == srcPlacedCut // Získám průnik - toto je výřez cílové oblasti, pro který existují zdrojová data...
Vect dtl, dbr;
srcPlaced.getDifference(placedCut, dtl, dbr); // Zjistím o co se změnila zdrojová oblast při ořezu...
srcArea.resizeBy(dtl, dbr); // Adekvátně ořežu původní zdrojovou oblast...
if (!(srcArea.isValid() && placedCut.isValid())) {return 2;}
src.areaDim = srcArea;
dst.areaDim = placedCut;
return 0;
}
int app::PointerArea::makeCommon ( PointerArea dst,
PointerArea src1,
Point  src1Orig,
PointerArea src2,
Point  src2Orig 
)
static

Upraví oblasti tak, aby všechny obsahovali pouze "společnou část" (průnik) se zadaným posunutím.

Nalezne společnou část (průnik) oblastí tak, že do souřadného systému oblasti dst se umístí zdrojové oblasti srcX tak, že jejch horní levý roh je totožný s bodem srcXOrig (v ss dst). Oblasti jsou následně ořezány tak, aby tvořili průnik.

Parameters
dstCílová oblast.
src1První zdrojová oblast.
src1OrigHorní levý roh první zdrojové oblasti v ss cílové.
src2Druhá zdrojová oblast.
src2OrigHorní levý roh druhé zdrojové oblasti v ss cílové.
Returns
0 při úspěchu, jinak kód chyby.

Definition at line 41 of file PointerArea.cpp.

{
Rect src1Area = src1.getArea(); // odkud se budou brát data
Rect src2Area = src2.getArea();
if (!(src1Area.isValid() && src2Area.isValid())) {return 1;}
Rect dstArea = dst.getArea();
Rect src1Placed = src1Area.makeCopyAt(src1Orig); // Vezmu zdrojovou oblast a umístím ji tam, kde se má vykreslovat (převedu ji do ss cílové oblasti)...
Rect src2Placed = src2Area.makeCopyAt(src2Orig);
Rect placedCut = Rect::getIntersection(dstArea, src1Placed); // ~~ dstCut // Získám průnik - toto je výřez cílové oblasti, pro který existují zdrojová data...
placedCut = Rect::getIntersection(placedCut, src2Placed); // == dstCut == src1PlacedCut == src2PlacedCut // Stačí jeden srcPlacedCut, protože musí být pro všechny totožný!!! ve finále je to spíš placedCut...
Vect dtl, dbr;
src1Placed.getDifference(placedCut, dtl, dbr); // Zjistím o co se změnila zdrojová oblast při ořezu...
src1Area.resizeBy(dtl, dbr); // Adekvátně ořežu původní zdrojovou oblast...
src2Placed.getDifference(placedCut, dtl, dbr);
src2Area.resizeBy(dtl, dbr);
if (!(src1Area.isValid() && src2Area.isValid() && dstArea.isValid())) {return 2;}
src1.areaDim = src1Area;
src2.areaDim = src2Area;
dst.areaDim = placedCut;
return 0;
}

Member Data Documentation

Rect app::PointerArea::areaDim
private

Obdélník představující velikost skutečně používané oblasti (výseče) z té původní.

Definition at line 35 of file PointerArea.hpp.

const unsigned int app::PointerArea::bpp

udává, kolik je bajtů na pixel (BytesPerPixel).

Definition at line 37 of file PointerArea.hpp.

Rect app::PointerArea::origDim
private

Obdélník s údaji o původní velikosti celé oblasti - maximální možná velikost oblasti.

Definition at line 34 of file PointerArea.hpp.

byte* app::PointerArea::pStart
private

Pointer na začátek oblasti v paměti.

Definition at line 33 of file PointerArea.hpp.


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