App

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

PointerArea.cpp
Go to the documentation of this file.
1
6 #include "PointerArea.hpp"
7
8 namespace app {
9
10 PointerArea::PointerArea(void * pStart, Rect origDim, Rect areaDim, unsigned int bpp) : bpp(bpp) {
11 this->pStart = (byte *) pStart;
12 this->origDim = origDim;
13 this->areaDim = Rect::getIntersection(origDim, areaDim);
14 /* this->bpp = bpp; */
15 }
16
17
18 int PointerArea::makeCommon(PointerArea &dst, PointerArea &src, Point srcOrig) {
19
20 Rect srcArea = src.getArea(); // odkud se budou brát data
21 if (!srcArea.isValid()) {return 1;}
22 Rect dstArea = dst.getArea();
23
24 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)...
25 // old: Rect srcPlaced = Rect::makeCopyAt(srcArea, srcOrig);
26 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...
27
28 Vect dtl, dbr;
29 srcPlaced.getDifference(placedCut, dtl, dbr); // Zjistím o co se změnila zdrojová oblast při ořezu...
30 srcArea.resizeBy(dtl, dbr); // Adekvátně ořežu původní zdrojovou oblast...
31
32 if (!(srcArea.isValid() && placedCut.isValid())) {return 2;}
33
34 src.areaDim = srcArea;
35 dst.areaDim = placedCut;
36
37 return 0;
38 }
39
40
41 int PointerArea:: makeCommon(PointerArea &dst, PointerArea &src1, Point src1Orig, PointerArea &src2, Point src2Orig) {
42
43 Rect src1Area = src1.getArea(); // odkud se budou brát data
44 Rect src2Area = src2.getArea();
45 if (!(src1Area.isValid() && src2Area.isValid())) {return 1;}
46 Rect dstArea = dst.getArea();
47
48 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)...
49 Rect src2Placed = src2Area.makeCopyAt(src2Orig);
50
51 Rect placedCut = Rect::getIntersection(dstArea, src1Placed); // ~~ dstCut // Získám průnik - toto je výřez cílové oblasti, pro který existují zdrojová data...
52 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...
53
54 Vect dtl, dbr;
55 src1Placed.getDifference(placedCut, dtl, dbr); // Zjistím o co se změnila zdrojová oblast při ořezu...
56 src1Area.resizeBy(dtl, dbr); // Adekvátně ořežu původní zdrojovou oblast...
57
58 src2Placed.getDifference(placedCut, dtl, dbr);
59 src2Area.resizeBy(dtl, dbr);
60
61 if (!(src1Area.isValid() && src2Area.isValid() && dstArea.isValid())) {return 2;}
62
63 src1.areaDim = src1Area;
64 src2.areaDim = src2Area;
65 dst.areaDim = placedCut;
66
67 return 0;
68 }
69
70 int PointerArea::copy(PointerArea dst, PointerArea src, Point srcOrig) {
71 if (src.bpp != dst.bpp) {return 1;}
72 int err = PointerArea::makeCommon(dst, src, srcOrig);
73 if (err) {return 100 + err;}
74 byte * s = (byte *) src.getAreaBgn();
75 byte * d = (byte *) dst.getAreaBgn();
76 byte * sEnd = (byte *) src.getAreaEnd();
77
78 int count = src.getAreaByteWidth();
79 int srcByteWidth = src.getOrigByteWidth();
80 int dstByteWidth = dst.getOrigByteWidth();
81
82 while (s < sEnd) {
83 memcpy(d, s, count);
84 s += srcByteWidth;
85 d += dstByteWidth;
86 }
87
88 return 0;
89 }
90
91 int PointerArea::fill(PointerArea dst, void * src) {
92 int count = dst.getAreaByteWidth();
93 byte * d = (byte *) dst.getAreaBgn();
94 byte * dRowEnd = d + count;
95
96 while (d < dRowEnd) {
97 memcpy(d, src, dst.bpp);
98 d += dst.bpp;
99 }
100
101 d += dst.getByteOffset();
102 byte * dEnd = (byte *) dst.getAreaEnd();
103 int dstByteWidth = dst.getOrigByteWidth();
104 src = (byte *) dst.getAreaBgn();
105
106 while (d < dEnd) {
107 memcpy(d, src, count);
108 d += dstByteWidth;
109 }
110
111 return 0;
112 }
113
114 }