Changeset View
Changeset View
Standalone View
Standalone View
libs/image/tests/kis_filter_weights_applicator_test.cpp
Show First 20 Lines • Show All 192 Lines • ▼ Show 20 Line(s) | 190 | if (c.red() != r[i] || | |||
---|---|---|---|---|---|
193 | dbgKrita << "Failed to compare RA channels:" << ppVar(x0 + i); | 193 | dbgKrita << "Failed to compare RA channels:" << ppVar(x0 + i); | ||
194 | dbgKrita << "Red:" << c.red() << "Expected:" << r[i]; | 194 | dbgKrita << "Red:" << c.red() << "Expected:" << r[i]; | ||
195 | dbgKrita << "Alpha:" << c.alpha() << "Expected:" << a[i]; | 195 | dbgKrita << "Alpha:" << c.alpha() << "Expected:" << a[i]; | ||
196 | QFAIL("failed"); | 196 | QFAIL("failed"); | ||
197 | } | 197 | } | ||
198 | } | 198 | } | ||
199 | } | 199 | } | ||
200 | 200 | | |||
201 | void testLineImpl(qreal scale, qreal dx, quint8 expR[], quint8 expA[], int x0, int len, bool clampToEdge, bool horizontal) | 201 | void testLineImpl(qreal scale, qreal dx, quint8 expR[], quint8 expA[], int x0, int len, bool clampToEdge, bool horizontal, KisFilterStrategy *filter = 0, KisPaintDeviceSP dev = 0) | ||
202 | { | 202 | { | ||
203 | int startPos = 0; | ||||
204 | int endPos = 4; | ||||
203 | const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8(); | 205 | const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8(); | ||
204 | KisPaintDeviceSP dev = new KisPaintDevice(cs); | 206 | if (!filter) { | ||
205 | KisFilterStrategy *filter = new KisBilinearFilterStrategy(); | 207 | filter = new KisBilinearFilterStrategy(); | ||
206 | 208 | } | |||
207 | KisFilterWeightsBuffer buf(filter, qAbs(scale)); | 209 | if (!dev) { | ||
208 | KisFilterWeightsApplicator applicator(dev, dev, scale, 0.0, dx, clampToEdge); | 210 | dev = new KisPaintDevice(cs); | ||
209 | 211 | | |||
210 | for (int i = 0; i < 4; i++) { | 212 | for (int i = 0; i < 4; i++) { | ||
211 | int x = horizontal ? i : 0; | 213 | int x = horizontal ? i : 0; | ||
212 | int y = horizontal ? 0 : i; | 214 | int y = horizontal ? 0 : i; | ||
213 | dev->setPixel(x,y,QColor(10 + i * 10, 20 + i * 10, 40 + i * 10)); | 215 | dev->setPixel(x,y,QColor(10 + i * 10, 20 + i * 10, 40 + i * 10)); | ||
214 | } | 216 | } | ||
215 | 217 | | |||
216 | { | 218 | { | ||
217 | quint8 r[] = { 0, 10, 20, 30, 40, 0, 0}; | 219 | quint8 r[] = { 0, 10, 20, 30, 40, 0, 0}; | ||
218 | quint8 a[] = { 0,255,255,255,255, 0, 0}; | 220 | quint8 a[] = { 0,255,255,255,255, 0, 0}; | ||
219 | checkRA(dev, -1, 6, r, a, horizontal); | 221 | checkRA(dev, -1, 6, r, a, horizontal); | ||
220 | } | 222 | } | ||
221 | 223 | | |||
222 | KisFilterWeightsApplicator::LinePos srcPos(0,4); | 224 | startPos = 0; | ||
225 | endPos = 4; | ||||
226 | | ||||
227 | } else { | ||||
228 | QRect rc = dev->exactBounds(); | ||||
229 | if (horizontal) { | ||||
230 | startPos = rc.left(); | ||||
231 | endPos = rc.left() + rc.width(); | ||||
232 | } else { | ||||
233 | startPos = rc.top(); | ||||
234 | endPos = rc.top() + rc.height(); | ||||
235 | } | ||||
236 | } | ||||
237 | | ||||
238 | KisFilterWeightsBuffer buf(filter, qAbs(scale)); | ||||
239 | KisFilterWeightsApplicator applicator(dev, dev, scale, 0.0, dx, clampToEdge); | ||||
240 | | ||||
241 | | ||||
242 | KisFilterWeightsApplicator::LinePos srcPos(startPos, endPos); | ||||
223 | KisFilterWeightsApplicator::LinePos dstPos; | 243 | KisFilterWeightsApplicator::LinePos dstPos; | ||
224 | 244 | | |||
225 | if (horizontal) { | 245 | if (horizontal) { | ||
226 | dstPos = applicator.processLine<KisHLineIteratorSP>(srcPos,0,&buf, filter->support()); | 246 | dstPos = applicator.processLine<KisHLineIteratorSP>(srcPos,0,&buf, filter->support(buf.weightsPositionScale().toFloat())); | ||
227 | } else { | 247 | } else { | ||
228 | dstPos = applicator.processLine<KisVLineIteratorSP>(srcPos,0,&buf, filter->support()); | 248 | dstPos = applicator.processLine<KisVLineIteratorSP>(srcPos,0,&buf, filter->support(buf.weightsPositionScale().toFloat())); | ||
229 | } | 249 | } | ||
230 | 250 | | |||
231 | QRect rc = dev->exactBounds(); | 251 | QRect rc = dev->exactBounds(); | ||
232 | 252 | | |||
233 | if (horizontal) { | 253 | if (horizontal) { | ||
234 | QVERIFY(rc.left() >= dstPos.start()); | 254 | QVERIFY(rc.left() >= dstPos.start()); | ||
235 | QVERIFY(rc.left() + rc.width() <= dstPos.end()); | 255 | QVERIFY(rc.left() + rc.width() <= dstPos.end()); | ||
236 | } else { | 256 | } else { | ||
237 | QVERIFY(rc.top() >= dstPos.start()); | 257 | QVERIFY(rc.top() >= dstPos.start()); | ||
238 | QVERIFY(rc.top() + rc.height() <= dstPos.end()); | 258 | QVERIFY(rc.top() + rc.height() <= dstPos.end()); | ||
239 | } | 259 | } | ||
240 | 260 | | |||
241 | //printPixels(dev, x0, len, horizontal); | 261 | //printPixels(dev, x0, len, horizontal); | ||
242 | checkRA(dev, x0, len, expR, expA, horizontal); | 262 | checkRA(dev, x0, len, expR, expA, horizontal); | ||
243 | } | 263 | } | ||
244 | 264 | | |||
245 | void testLine(qreal scale, qreal dx, quint8 expR[], quint8 expA[], int x0, int len, bool clampToEdge = false) | 265 | void testLine(qreal scale, qreal dx, quint8 expR[], quint8 expA[], int x0, int len, bool clampToEdge = false, KisFilterStrategy* filter = 0, KisPaintDeviceSP dev = 0) | ||
246 | { | 266 | { | ||
247 | testLineImpl(scale, dx, expR, expA, x0, len, clampToEdge, true); | 267 | testLineImpl(scale, dx, expR, expA, x0, len, clampToEdge, true, filter, dev); | ||
248 | testLineImpl(scale, dx, expR, expA, x0, len, clampToEdge, false); | 268 | testLineImpl(scale, dx, expR, expA, x0, len, clampToEdge, false, filter, dev); | ||
249 | } | 269 | } | ||
250 | 270 | | |||
251 | void KisFilterWeightsApplicatorTest::testProcessLine_Scale_1_0_Aligned() | 271 | void KisFilterWeightsApplicatorTest::testProcessLine_Scale_1_0_Aligned() | ||
252 | { | 272 | { | ||
253 | qreal scale = 1.0; | 273 | qreal scale = 1.0; | ||
254 | qreal dx = 0.0; | 274 | qreal dx = 0.0; | ||
255 | 275 | | |||
256 | quint8 r[] = { 0, 10, 20, 30, 40, 0, 0}; | 276 | quint8 r[] = { 0, 10, 20, 30, 40, 0, 0}; | ||
▲ Show 20 Lines • Show All 173 Lines • ▼ Show 20 Line(s) | 448 | { | |||
430 | qreal dx = 0.125; | 450 | qreal dx = 0.125; | ||
431 | 451 | | |||
432 | quint8 r[] = { 0, 0, 0, 40, 34, 18, 10, 0, 0, 0}; | 452 | quint8 r[] = { 0, 0, 0, 40, 34, 18, 10, 0, 0, 0}; | ||
433 | quint8 a[] = { 0, 0, 0, 16,207,239, 48, 0, 0, 0}; | 453 | quint8 a[] = { 0, 0, 0, 16,207,239, 48, 0, 0, 0}; | ||
434 | 454 | | |||
435 | testLine(scale, dx, r, a, -6, 10); | 455 | testLine(scale, dx, r, a, -6, 10); | ||
436 | } | 456 | } | ||
437 | 457 | | |||
458 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_2x() | ||||
459 | { | ||||
460 | qreal scale = 2.0; | ||||
461 | qreal dx = 0; | ||||
462 | | ||||
463 | quint8 r[] = {0, 10, 10, 20, 20, 30, 30, 40, 40, 0, 0}; | ||||
464 | quint8 a[] = {0, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0}; | ||||
465 | | ||||
466 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
467 | testLine(scale, dx, r, a, -1, 11, true, filter); | ||||
468 | } | ||||
469 | | ||||
470 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_1x() | ||||
471 | { | ||||
472 | | ||||
473 | qreal scale = 1.0; | ||||
474 | qreal dx = 0; | ||||
475 | | ||||
476 | quint8 r[] = { 0, 10, 20, 30, 40, 0, 0}; | ||||
477 | quint8 a[] = { 0,255,255,255,255, 0, 0}; | ||||
478 | | ||||
479 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
480 | testLine(scale, dx, r, a, -1, 7, false, filter); | ||||
481 | } | ||||
482 | | ||||
483 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_05x() | ||||
484 | { | ||||
485 | | ||||
486 | qreal scale = 0.5; | ||||
487 | qreal dx = 0; | ||||
488 | | ||||
489 | quint8 r[] = { 0, 10, 30, 0, 0, 0, 0}; | ||||
490 | quint8 a[] = { 0,255,255, 0, 0, 0, 0}; | ||||
491 | | ||||
492 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
493 | testLine(scale, dx, r, a, -1, 7, false, filter); | ||||
494 | } | ||||
495 | | ||||
496 | | ||||
497 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_077x() | ||||
498 | { | ||||
499 | | ||||
500 | qreal scale = 0.77; | ||||
501 | qreal dx = 0; | ||||
502 | | ||||
503 | quint8 r[] = { 0, 10, 20, 40, 0, 0, 0}; | ||||
504 | quint8 a[] = { 0,255,255, 255, 0, 0, 0}; | ||||
505 | | ||||
506 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
507 | testLine(scale, dx, r, a, -1, 7, false, filter); | ||||
508 | } | ||||
509 | | ||||
510 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_074x() | ||||
511 | { | ||||
512 | | ||||
513 | qreal scale = 0.74; | ||||
514 | qreal dx = 0; | ||||
515 | | ||||
516 | quint8 r[] = { 0, 10, 30, 40, 0, 0, 0}; | ||||
517 | quint8 a[] = { 0,255,255, 255, 0, 0, 0}; | ||||
518 | | ||||
519 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
520 | testLine(scale, dx, r, a, -1, 7, false, filter); | ||||
521 | } | ||||
522 | | ||||
523 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_075x() | ||||
524 | { | ||||
525 | | ||||
526 | qreal scale = 0.75; | ||||
527 | qreal dx = 0; | ||||
528 | | ||||
529 | quint8 r[] = { 0, 10, 20, 40, 0, 0, 0}; | ||||
530 | quint8 a[] = { 0,255,255, 255, 0, 0, 0}; | ||||
531 | | ||||
532 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
533 | testLine(scale, dx, r, a, -1, 7, false, filter); | ||||
534 | } | ||||
535 | | ||||
536 | | ||||
537 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_15x() | ||||
538 | { | ||||
539 | | ||||
540 | qreal scale = 1.5; | ||||
541 | qreal dx = 0; | ||||
542 | | ||||
543 | quint8 r[] = { 0, 10, 10, 20, 30, 30, 40}; | ||||
544 | quint8 a[] = { 0,255,255, 255, 255, 255, 255}; | ||||
545 | | ||||
546 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
547 | testLine(scale, dx, r, a, -1, 7, false, filter); | ||||
548 | } | ||||
549 | | ||||
550 | | ||||
551 | | ||||
552 | KisPaintDeviceSP prepareUniformPaintDevice(int pixelsNumber, bool horizontal) | ||||
553 | { | ||||
554 | const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8(); | ||||
555 | KisPaintDeviceSP dev = new KisPaintDevice(cs); | ||||
556 | for (int i = 0; i < pixelsNumber; i++) { | ||||
557 | int x = horizontal ? i : 0; | ||||
558 | int y = horizontal ? 0 : i; | ||||
559 | | ||||
560 | QColor c = QColor(10, 0, 0, 255); | ||||
561 | dev->setPixel(x, y, c); | ||||
562 | } | ||||
563 | | ||||
564 | return dev; | ||||
565 | } | ||||
566 | | ||||
567 | void prepareUniformPixels(quint8 r[], quint8 a[], int pixelsNumber, bool horizontal) | ||||
568 | { | ||||
569 | for (int i = 0; i < pixelsNumber; i++) { | ||||
570 | | ||||
571 | QColor c = QColor(10, 0, 0, 255); | ||||
572 | r[i] = c.red(); | ||||
573 | a[i] = c.alpha(); | ||||
574 | } | ||||
575 | | ||||
576 | } | ||||
577 | | ||||
578 | | ||||
579 | | ||||
580 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_0098x_horizontal() | ||||
581 | { | ||||
582 | int before = 5075; | ||||
583 | int after = 500; | ||||
584 | | ||||
585 | qreal scale = before/after; | ||||
586 | qreal dx = 0; | ||||
587 | | ||||
588 | bool horizontal = true; | ||||
589 | | ||||
590 | KisPaintDeviceSP dev = prepareUniformPaintDevice(before, horizontal); | ||||
591 | | ||||
592 | quint8 *r = new quint8[after]; | ||||
593 | quint8 *a = new quint8[after]; | ||||
594 | | ||||
595 | prepareUniformPixels(r, a, after, horizontal); | ||||
596 | | ||||
597 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
598 | testLineImpl(scale, dx, r, a, 0, after, false, horizontal, filter, dev); | ||||
599 | | ||||
600 | } | ||||
601 | | ||||
602 | void KisFilterWeightsApplicatorTest::testProcessLine_NearestNeighbourFilter_0098x_vertical() | ||||
603 | { | ||||
604 | int before = 4725; | ||||
605 | int after = 466; | ||||
606 | | ||||
607 | qreal scale = before/after; | ||||
608 | qreal dx = 0; | ||||
609 | | ||||
610 | bool horizontal = false; | ||||
611 | | ||||
612 | KisPaintDeviceSP dev = prepareUniformPaintDevice(before, horizontal); | ||||
613 | | ||||
614 | quint8 *r = new quint8[after]; | ||||
615 | quint8 *a = new quint8[after]; | ||||
616 | | ||||
617 | prepareUniformPixels(r, a, after, horizontal); | ||||
618 | | ||||
619 | KisFilterStrategy* filter = new KisBoxFilterStrategy(); | ||||
620 | testLineImpl(scale, dx, r, a, 0, after, false, horizontal, filter, dev); | ||||
621 | | ||||
622 | } | ||||
623 | | ||||
624 | | ||||
438 | void KisFilterWeightsApplicatorTest::benchmarkProcesssLine() | 625 | void KisFilterWeightsApplicatorTest::benchmarkProcesssLine() | ||
439 | { | 626 | { | ||
440 | const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8(); | 627 | const KoColorSpace *cs = KoColorSpaceRegistry::instance()->rgb8(); | ||
441 | KisPaintDeviceSP dev = new KisPaintDevice(cs); | 628 | KisPaintDeviceSP dev = new KisPaintDevice(cs); | ||
442 | KisFilterStrategy *filter = new KisBilinearFilterStrategy(); | 629 | KisFilterStrategy *filter = new KisBilinearFilterStrategy(); | ||
443 | 630 | | |||
444 | const qreal scale = 0.873; | 631 | const qreal scale = 0.873; | ||
445 | const qreal dx = 0.0387; | 632 | const qreal dx = 0.0387; | ||
446 | 633 | | |||
447 | KisFilterWeightsBuffer buf(filter, qAbs(scale)); | 634 | KisFilterWeightsBuffer buf(filter, qAbs(scale)); | ||
448 | KisFilterWeightsApplicator applicator(dev, dev, scale, 0.0, dx, false); | 635 | KisFilterWeightsApplicator applicator(dev, dev, scale, 0.0, dx, false); | ||
449 | 636 | | |||
450 | for (int i = 0; i < 32767; i++) { | 637 | for (int i = 0; i < 32767; i++) { | ||
451 | dev->setPixel(i,0,QColor(10 + i%240,20,40)); | 638 | dev->setPixel(i,0,QColor(10 + i%240,20,40)); | ||
452 | } | 639 | } | ||
453 | 640 | | |||
454 | KisFilterWeightsApplicator::LinePos linePos(0,32767); | 641 | KisFilterWeightsApplicator::LinePos linePos(0,32767); | ||
455 | 642 | | |||
456 | QBENCHMARK { | 643 | QBENCHMARK { | ||
457 | applicator.processLine<KisHLineIteratorSP>(linePos,0,&buf, filter->support()); | 644 | applicator.processLine<KisHLineIteratorSP>(linePos,0,&buf, filter->support(buf.weightsPositionScale().toFloat())); | ||
458 | } | 645 | } | ||
459 | } | 646 | } | ||
460 | 647 | | |||
461 | QTEST_MAIN(KisFilterWeightsApplicatorTest) | 648 | QTEST_MAIN(KisFilterWeightsApplicatorTest) |