69 {
72
73 if (
src.type == VertexDescriptor::NORMAL) {
74 map.m_maskAccessor->moveTo(
src.x,
src.y);
75 if (*map.m_maskAccessor->rawDataConst()) {
76 return 0;
77 }
78 }
79
80 if (dst.type == VertexDescriptor::NORMAL) {
81 map.m_maskAccessor->moveTo(dst.
x, dst.
y);
82 if (*map.m_maskAccessor->rawDataConst()) {
83 return 0;
84 }
85 }
86
87 bool srcLabelA =
src.type == VertexDescriptor::LABEL_A;
88 bool srcLabelB =
src.type == VertexDescriptor::LABEL_B;
89 bool dstLabelA = dst.type == VertexDescriptor::LABEL_A;
90 bool dstLabelB = dst.type == VertexDescriptor::LABEL_B;
91
92 if (srcLabelA || srcLabelB) {
93 std::swap(src, dst);
94 std::swap(srcLabelA, dstLabelA);
95 std::swap(srcLabelB, dstLabelB);
96 }
97
98 Q_ASSERT(!srcLabelA && !srcLabelB);
99
100
101
102 const int k = 2 * (map.m_mainRect.width() + map.m_mainRect.height());
103
105
107
108 if (dstLabelA) {
109 map.m_aAccessor->moveTo(
src.x,
src.y);
110 const int i0 = *((quint8*)map.m_aAccessor->rawDataConst());
111 value = i0 / 255.0 * k;
112
113 } else if (dstLabelB) {
114 map.m_bAccessor->moveTo(
src.x,
src.y);
115 const int i0 = *((quint8*)map.m_bAccessor->rawDataConst());
116 value = i0 / 255.0 * k;
117
118 } else {
119 map.m_mainAccessor->moveTo(
src.x,
src.y);
120 memcpy(map.m_srcPixelBuf.data(), map.m_mainAccessor->rawDataConst(), map.m_pixelSize);
121 map.m_mainAccessor->moveTo(dst.
x, dst.
y);
122
123
124
125
126
127 const quint8 i0 = *((quint8*)map.m_srcPixelBuf.data());
128 const quint8 i1 = *map.m_mainAccessor->rawDataConst();
129
130 const quint8 diff = qAbs(i1 - i0);
131
132 const qreal diffPenalty = qBound(0.0, qreal(diff) / 10.0, 1.0);
133 const qreal intensityPenalty = 1.0 - i1 / 255.0;
134
135 const qreal totalPenalty = qMax(0.0 * diffPenalty, intensityPenalty);
136
137 value = 1.0 + k * (1.0 -
pow2(totalPenalty));
138 }
139
141 }
float value(const T *src, size_t ch)
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)