App
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 
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 
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 }