コード例 #1
0
	std::vector<cv::Rect> RealSenseDetector::detectImpl(const ImageGrayscale &img) {
		std::vector<cv::Rect> rects = OpenCVDetector::detect(img);

		if (rects.empty()) {
			consecutiveDetects = 0;
			consecutiveNonDetects++;

			// depth face tracker overlap test
			if (consecutiveNonDetects < 4 && rsDepthFaceTracker->hasLastRoi()) {
				cv::Rect croi = RealSenseDepthFaceTracker::convertScale(rsDepthFaceTracker->getLastCroi(), setup.scale, setup.detectRoi);
				cv::Rect intersection = lastRoi & croi;
				cv::Rect smallerRoi = croi.area() < lastRoi.area() ? croi : lastRoi;

				std::cout << std::dec << " *** RealSenseDetector::detectImpl, lastRoi: " << lastRoi << ", croi: " << croi << ", intersection: " << intersection << std::endl;
				std::cout << std::dec << " *** RealSenseDetector::detectImpl, intersection/smallerRoi/croi/lastRoi areas: " <<
						intersection.area() << "/" << smallerRoi.area() << "/" << croi.area() << "/" << lastRoi.area() << std::endl;

				if (intersection.area() > smallerRoi.area() * 0.5) {
					cv::Point croiCenter(croi.x + croi.width / 2, croi.y + croi.height / 2);
					cv::Point lregCenter(lastRoi.x + lastRoi.width / 2, lastRoi.y + lastRoi.height / 2);
					cv::Point displ(croiCenter - lregCenter);
					std::cout << std::dec << " *** RealSenseDetector::detectImpl, displ vector: " << displ << std::endl;
					lastRoi.x += displ.x;
					lastRoi.y += displ.y;
					rects.push_back(lastRoi);
				}
			} else {
				std::cout << std::dec << " *** RealSenseDetector::detectImpl, NO FACE, consecutiveNonDetects: " << consecutiveNonDetects << std::endl;
			}
		} else {
			consecutiveDetects++;
			consecutiveNonDetects = 0;
			lastRoi = getBiggest(rects);
		}

		return rects;
	}
コード例 #2
0
ファイル: sci_view.c プロジェクト: rossdrummond/scilab
int sci_view(char *fname) 
{
  static int l1, m1, n1, l2, m2, n2, m3, n3, l3;
  static int minlhs=1, maxlhs=3, minrhs=3, maxrhs=3;

  /* Check number of inputs (rhs=3) and outputs (lhs=3) */
  CheckRhs(minrhs,maxrhs) ;
  CheckLhs(minlhs,maxlhs) ;

  /* Get X (1 ,double), Y (2, int) and  C (3, string) */
  GetRhsVar(1,MATRIX_OF_DOUBLE_DATATYPE, &m1, &n1, &l1);
  GetRhsVar(2,MATRIX_OF_INTEGER_DATATYPE, &m2, &n2, &l2);
  GetRhsVar(3,STRING_DATATYPE, &m3, &n3, &l3);

  /* Call display function
     stk(l1)->X (double), istk(l2)->Y (int), cstk(l3)->Z  (char)    */
  displ(stk(l1), m1, n1, istk(l2), m2, n2, cstk(l3), m3, n3);

  /*  Return variables  */
  LhsVar(1) = 1;
  LhsVar(2) = 2;
  LhsVar(3) = 3;
  return 0;
}
コード例 #3
0
avtVector
avtIVPVTKOffsetField::GetPositionCorrection( size_t compIndex ) const
{
    avtVector displ( 0.0, 0.0, 0.0 );
    vtkCell *cell = this->ds->GetCell( this->lastCell );
  
    // compute the parametric coordinates
    double pcoords[3], weights[12];
    double tol2 = 1.e-4;
    int subId;
    vtkIdType cellId = this->ds->FindCell(&this->lastPos.x, 
                                          cell, this->lastCell, 
                                          tol2, subId, 
                                          pcoords, 
                                          weights);
    if ( cellId < 0 ) 
    {
        std::stringstream msg;
        debug5 << "avtIVPVTKOffsetField: could not find cell\n";
        debug5 << " lastCell = " << this->lastCell << '\n';
        debug5 << " lastPos = " << this->lastPos.x << ", " << this->lastPos.y << ", " << this->lastPos.z << '\n';
        debug5 << " will set displacement to zero\n";
        return displ;
    }


    vtkIdType idPtLo, idPtHi;
    avtVector ptLo( 0.0, 0.0, 0.0 );
    avtVector ptHi( 0.0, 0.0, 0.0 );
    if ( cell->GetCellType( ) == VTK_QUAD ) 
    {
        std::vector< std::vector<double> > g(4); // 4 edges
        for (size_t i = 0; i < 4; ++i) {
          g[i].resize(3);
        }

        idPtLo = cell->GetPointId(0);
        idPtHi = cell->GetPointId(1);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[0][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(3);
        idPtHi = cell->GetPointId(2);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[1][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(0);
        idPtHi = cell->GetPointId(3);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[2][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(1);
        idPtHi = cell->GetPointId(2);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[3][i] = ptHi[i] - ptLo[i];
        }

        for (size_t i = 0; i < 3; ++i) 
        {
            displ[i] += this->nodeOffsets[compIndex][0] * (1.-pcoords[1])*g[0][i];
            displ[i] += this->nodeOffsets[compIndex][0] * (   pcoords[1])*g[1][i];

            displ[i] += this->nodeOffsets[compIndex][1] * (1.-pcoords[0])*g[2][i];
            displ[i] += this->nodeOffsets[compIndex][1] * (   pcoords[0])*g[3][i];
        }
    }
    else if ( cell->GetCellType( ) == VTK_HEXAHEDRON )
    {

        std::vector< std::vector<double> > g(12); // 12 edges
        for (size_t i = 0; i < 12; ++i) {
          g[i].resize(3);
        }

        idPtLo = cell->GetPointId(0);
        idPtHi = cell->GetPointId(1);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[0][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(3);
        idPtHi = cell->GetPointId(2);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[1][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(7);
        idPtHi = cell->GetPointId(6);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[2][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(4);
        idPtHi = cell->GetPointId(5);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[3][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(0);
        idPtHi = cell->GetPointId(3);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[4][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(1);
        idPtHi = cell->GetPointId(2);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[5][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(5);
        idPtHi = cell->GetPointId(6);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[6][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(4);
        idPtHi = cell->GetPointId(7);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[7][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(0);
        idPtHi = cell->GetPointId(4);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[8][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(1);
        idPtHi = cell->GetPointId(5);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[9][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(2);
        idPtHi = cell->GetPointId(6);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[10][i] = ptHi[i] - ptLo[i];
        }

        idPtLo = cell->GetPointId(3);
        idPtHi = cell->GetPointId(7);
        this->ds->GetPoint(idPtLo, &ptLo[0]);
        this->ds->GetPoint(idPtHi, &ptHi[0]);
        for (size_t i = 0; i < 3; ++i) {
          g[11][i] = ptHi[i] - ptLo[i];
        }

        for ( size_t i = 0; i < 3; ++i ) 
        {
            displ[i] += this->nodeOffsets[compIndex][0] * (1.-pcoords[1])*(1.-pcoords[2])*g[0][i];
            displ[i] += this->nodeOffsets[compIndex][0] * (   pcoords[1])*(1.-pcoords[2])*g[1][i];
            displ[i] += this->nodeOffsets[compIndex][0] * (   pcoords[1])*(   pcoords[2])*g[2][i];
            displ[i] += this->nodeOffsets[compIndex][0] * (1.-pcoords[1])*(   pcoords[2])*g[3][i];

            displ[i] += this->nodeOffsets[compIndex][1] * (1.-pcoords[0])*(1.-pcoords[2])*g[4][i];
            displ[i] += this->nodeOffsets[compIndex][1] * (   pcoords[0])*(1.-pcoords[2])*g[5][i];
            displ[i] += this->nodeOffsets[compIndex][1] * (   pcoords[0])*(   pcoords[2])*g[6][i];
            displ[i] += this->nodeOffsets[compIndex][1] * (1.-pcoords[0])*(   pcoords[2])*g[7][i];

            displ[i] += this->nodeOffsets[compIndex][2] * (1.-pcoords[0])*(1.-pcoords[1])*g[8][i];
            displ[i] += this->nodeOffsets[compIndex][2] * (   pcoords[0])*(1.-pcoords[1])*g[9][i];
            displ[i] += this->nodeOffsets[compIndex][2] * (   pcoords[0])*(   pcoords[1])*g[10][i];
            displ[i] += this->nodeOffsets[compIndex][2] * (1.-pcoords[0])*(   pcoords[1])*g[11][i];
        }

    }
    else 
    {
        EXCEPTION1( ImproperUseException,
                    "avtIVPVTKOffsetField: unsupported cell in GetPositionCorrection");
    }

    debug5 << "-----> displacement for component " << compIndex << " is " << displ[0] << ' ' << displ[1] << ' ' << displ[2] << '\n';
    return displ;
}
コード例 #4
0
ファイル: displacement.cpp プロジェクト: venkatarajasekhar/Qt
    virtual void onDraw(SkCanvas* canvas) {
        if (!fInitialized) {
            make_bitmaps();
            fInitialized = true;
        }
        canvas->clear(0x00000000);
        SkPaint paint;
        SkAutoTUnref<SkImageFilter> displ(SkBitmapSource::Create(fCheckerboard));
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kG_ChannelSelectorType, 0.0f, displ))->unref();
        drawClippedBitmap(canvas, 0, 0, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType, 16.0f, displ))->unref();
        drawClippedBitmap(canvas, 100, 0, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kB_ChannelSelectorType, 32.0f, displ))->unref();
        drawClippedBitmap(canvas, 200, 0, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType, 48.0f, displ))->unref();
        drawClippedBitmap(canvas, 300, 0, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType, 64.0f, displ))->unref();
        drawClippedBitmap(canvas, 400, 0, paint);

        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kG_ChannelSelectorType, 40.0f, displ))->unref();
        drawClippedBitmap(canvas, 0, 100, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
        drawClippedBitmap(canvas, 100, 100, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kB_ChannelSelectorType, 40.0f, displ))->unref();
        drawClippedBitmap(canvas, 200, 100, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
        drawClippedBitmap(canvas, 300, 100, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType, 40.0f, displ))->unref();
        drawClippedBitmap(canvas, 400, 100, paint);

        SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(30, 30, 40, 40));
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            0.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 0, 200, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            16.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 100, 200, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            32.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 200, 200, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            48.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 300, 200, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            64.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 400, 200, paint);

        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            40.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 0, 300, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            40.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 100, 300, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            40.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 200, 300, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            40.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 300, 300, paint);
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            40.0f, displ, NULL, &cropRect))->unref();
        drawClippedBitmap(canvas, 400, 300, paint);

        // Tests for images of different sizes
        displ.reset(SkBitmapSource::Create(fSmall));
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            40.0f, displ))->unref();
        drawClippedBitmap(canvas, 0, 400, paint);
        displ.reset(SkBitmapSource::Create(fLarge));
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            40.0f, displ))->unref();
        drawClippedBitmap(canvas, 100, 400, paint);
        displ.reset(SkBitmapSource::Create(fLargeW));
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kR_ChannelSelectorType,
            SkDisplacementMapEffect::kB_ChannelSelectorType,
            40.0f, displ))->unref();
        drawClippedBitmap(canvas, 200, 400, paint);
        displ.reset(SkBitmapSource::Create(fLargeH));
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            40.0f, displ))->unref();
        drawClippedBitmap(canvas, 300, 400, paint);

        // Test for no given displacement input. In this case, both displacement
        // and color should use the same bitmap, given to SkCanvas::drawBitmap()
        // as an input argument.
        paint.setImageFilter(SkDisplacementMapEffect::Create(
            SkDisplacementMapEffect::kG_ChannelSelectorType,
            SkDisplacementMapEffect::kA_ChannelSelectorType,
            40.0f, NULL))->unref();
        drawClippedBitmap(canvas, 400, 400, paint);
    }
コード例 #5
0
sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* source,
                                                             const Context& ctx,
                                                             SkIPoint* offset) const {
    SkIPoint colorOffset = SkIPoint::Make(0, 0);
    sk_sp<SkSpecialImage> color(this->filterInput(1, source, ctx, &colorOffset));
    if (!color) {
        return nullptr;
    }

    SkIPoint displOffset = SkIPoint::Make(0, 0);
    sk_sp<SkSpecialImage> displ(this->filterInput(0, source, ctx, &displOffset));
    if (!displ) {
        return nullptr;
    }

    const SkIRect srcBounds = SkIRect::MakeXYWH(colorOffset.x(), colorOffset.y(),
                                                color->width(), color->height());

    // Both paths do bounds checking on color pixel access, we don't need to
    // pad the color bitmap to bounds here.
    SkIRect bounds;
    if (!this->applyCropRect(ctx, srcBounds, &bounds)) {
        return nullptr;
    }

    SkIRect displBounds;
    displ = this->applyCropRect(ctx, displ.get(), &displOffset, &displBounds);
    if (!displ) {
        return nullptr;
    }

    if (!bounds.intersect(displBounds)) {
        return nullptr;
    }

    const SkIRect colorBounds = bounds.makeOffset(-colorOffset.x(), -colorOffset.y());

    SkVector scale = SkVector::Make(fScale, fScale);
    ctx.ctm().mapVectors(&scale, 1);

#if SK_SUPPORT_GPU
    if (source->isTextureBacked()) {
        GrContext* context = source->getContext();

        sk_sp<GrTexture> colorTexture(color->asTextureRef(context));
        sk_sp<GrTexture> displTexture(displ->asTextureRef(context));
        if (!colorTexture || !displTexture) {
            return nullptr;
        }

        GrSurfaceDesc desc;
        desc.fFlags = kRenderTarget_GrSurfaceFlag;
        desc.fWidth = bounds.width();
        desc.fHeight = bounds.height();
        desc.fConfig = kSkia8888_GrPixelConfig;

        SkAutoTUnref<GrTexture> dst(context->textureProvider()->createApproxTexture(desc));
        if (!dst) {
            return nullptr;
        }

        GrPaint paint;
        SkMatrix offsetMatrix = GrCoordTransform::MakeDivByTextureWHMatrix(displTexture.get());
        offsetMatrix.preTranslate(SkIntToScalar(colorOffset.fX - displOffset.fX),
                                  SkIntToScalar(colorOffset.fY - displOffset.fY));

        paint.addColorFragmentProcessor(
            GrDisplacementMapEffect::Create(fXChannelSelector,
                                            fYChannelSelector,
                                            scale,
                                            displTexture.get(),
                                            offsetMatrix,
                                            colorTexture.get(),
                                            SkISize::Make(color->width(),
                                                          color->height())))->unref();
        paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode);
        SkMatrix matrix;
        matrix.setTranslate(-SkIntToScalar(colorBounds.x()), -SkIntToScalar(colorBounds.y()));

        SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(dst->asRenderTarget()));
        if (!drawContext) {
            return nullptr;
        }

        drawContext->drawRect(GrClip::WideOpen(), paint, matrix, SkRect::Make(colorBounds));

        offset->fX = bounds.left();
        offset->fY = bounds.top();
        return SkSpecialImage::MakeFromGpu(SkIRect::MakeWH(bounds.width(), bounds.height()),
                                           kNeedNewImageUniqueID_SpecialImage,
                                           dst);
    }
#endif

    SkBitmap colorBM, displBM;

    if (!color->getROPixels(&colorBM) || !displ->getROPixels(&displBM)) {
        return nullptr;
    }

    if ((colorBM.colorType() != kN32_SkColorType) ||
        (displBM.colorType() != kN32_SkColorType)) {
        return nullptr;
    }

    SkAutoLockPixels colorLock(colorBM), displLock(displBM);
    if (!colorBM.getPixels() || !displBM.getPixels()) {
        return nullptr;
    }

    SkImageInfo info = SkImageInfo::MakeN32(bounds.width(), bounds.height(),
                                            colorBM.alphaType());

    SkBitmap dst;
    if (!dst.tryAllocPixels(info)) {
        return nullptr;
    }

    SkAutoLockPixels dstLock(dst);

    computeDisplacement(fXChannelSelector, fYChannelSelector, scale, &dst,
                        displBM, colorOffset - displOffset, colorBM, colorBounds);

    offset->fX = bounds.left();
    offset->fY = bounds.top();
    return SkSpecialImage::MakeFromRaster(SkIRect::MakeWH(bounds.width(), bounds.height()),
                                          dst);
}
コード例 #6
0
ファイル: ORD.cpp プロジェクト: MattBBaker/INDDGO-survey
int ORD::find_elim_ordering() {
    int ws;
    int wr;

    char eoname[512];
    char eoname_other[512];

    // Get size and rank from the communicator
    MPI_Comm_size(comm, &ws);
    MPI_Comm_rank(comm, &wr);

    double xtime = MPI_Wtime();
    sprintf(eoname, "%s.order.%d", this->filename.c_str(), ws);
    sprintf(eoname_other, "%s.order_other.%d", this->filename.c_str(), ws);

    DEBUG("size: %d, rank %d \n", ws, wr);
    int n = G->get_num_nodes();
    int x = n/ws;
    int xm = n%ws;
    int i = 0;
    DEBUG("n: %d x: %d xm: %d \n", n, x, xm);

    vector<int> xadj;
    vector<int> adjncy;

    vector<int> vtxdist(ws + 1, 0);
    vector<int> sizes(2*ws,0);
    vector<int> ordering(x+1, 0);
    vector<int> recvcnt(ws, 0);
    vector<int> displ(ws, 0);

    int numflag = 0;




    int options[10];

    options[0] = 0;
    vtxdist[0] = 0;
    for (i = 1; i <= ws; i++)
    {
        vtxdist[i] = vtxdist[i - 1] + x;
        if (i <= xm)
            vtxdist[i]++;
    }

    // prepareing displacement and receive counts to use with MPI_Gatherv
    for (i = 0; i < ws; i++)
    {
        recvcnt[i] = x;
        if (i < xm)
            recvcnt[i] ++;

        if (i > 0)
            displ[i] += displ[i - 1] + recvcnt[i - 1];
    }

    DEBUG("range: %d, %d\n", vtxdist[wr], vtxdist[wr + 1]);
    int j = 0;
    xadj.push_back(0);
    for (i = vtxdist[wr]; i < vtxdist[wr + 1]; i++)
    {
        Graph::Node *no = G->get_node(i);
        list<int> *l = no->get_nbrs_ptr();
        list<int>::iterator it = l->begin();

        for (; it != l->end(); ++it)
        {
            adjncy.push_back(*it);
            j++;
        }
        xadj.push_back(j);
    }

    if (METIS_OK != ParMETIS_V3_NodeND(&vtxdist.front(), &xadj.front(), &adjncy.front(), &numflag, options, &ordering.front(), &sizes.front(), &comm))
    {
        FERROR("error occured while processing parmetis, aborting\n");
        MPI_Abort(MPI_COMM_WORLD, -1);
    }

    DEBUG("output from ParMETIS\n");
    double parmet_time = MPI_Wtime() - xtime;

    vector<int> recvbuf;
    n = G->get_num_nodes();
    if (wr == 0)
    {
        recvbuf = vector<int>(n, 0);
    }

    if (MPI_SUCCESS !=
        MPI_Gatherv((void *)&ordering.front(), recvcnt[wr], MPI_INT,
                    (void *)&recvbuf.front(), &recvcnt.front(), &displ.front(), MPI_INT,
                    0, comm))
    {
        FERROR("MPI error occured at Gatherv, Abort!\n");
        MPI_Abort(comm, -1);
    }

    vector<int> eo(n, 0);
    if (wr == 0)
    {
        for (int i = 0; i < n; i++)
        {
            eo[recvbuf[i]] = i;
        }

        FILE *f = fopen(eoname_other, "w");
        for (int i = 0; i < n; i++)
            fprintf(f, "%d\n", eo[i] + 1);
        fclose(f);
        DEBUG("ParMetis NodeND elimination ordering is in : %s\n", eoname_other);
    }

    ordering.clear();
    ordering.resize(recvcnt[wr], 0);

    if (MPI_SUCCESS !=
        MPI_Scatterv ((void *)&eo.front(), &recvcnt.front(), &displ.front(), MPI_INT,
                      (void *)&ordering.front(), recvcnt[wr], MPI_INT,
                      0, comm))
    {
        FERROR("MPI error occured at Scatterv, Abort! \n");
        MPI_Abort(comm, -1);
    }

    DEBUG("Scatterv completed\n");

    Graph::GraphCreatorFile gf;
    Graph::VertexWeightedGraph *wg;
    Graph::GraphEOUtil eoutil;
    Graph::GraphProperties prop;
    list<int>members(ordering.begin(), ordering.end());

    wg = gf.create_component(G, &members, false);
    prop.make_canonical(wg);

    vector<int> ord(recvcnt[wr], 0);
    vector<int> ordsend(recvcnt[wr, 0]);
    double xxtime = MPI_Wtime();
    eoutil.find_elimination_ordering(wg, &ord, GD_AMD, false);
    DEBUG("eo time : %f\n", MPI_Wtime() - xxtime);
    
    int sz = recvcnt[wr];

    for (int i = 0; i < sz; i++)
        ordsend[i] = wg->get_node(ord[i])->get_label();


    recvbuf.assign(n, -1);
    if (MPI_SUCCESS !=
        MPI_Gatherv((void *)&ordsend.front(), recvcnt[wr], MPI_INT, (void *)&recvbuf.front(), &recvcnt.front(), &displ.front(), MPI_INT, 0, comm))
    {
        FERROR("MPI error occured at Gatherv, Abort!\n");
        MPI_Abort(comm, -1);
    }

    double p_amd_time = MPI_Wtime() - xtime;
    if (wr == 0)
    {
        FILE *f = fopen(eoname, "w");
        for (int i = 0; i < n && wr == 0; i++)
            fprintf(f, "%d\n", recvbuf[i]);
        fclose(f);
    } 
    DEBUG("ordering is written into %s\n", eoname);
    DEBUG("%f,%f\n", parmet_time, p_amd_time);

    return 0;
}