コード例 #1
0
void RS_ActionDrawArc::mouseMoveEvent(QMouseEvent* e) {
    RS_DEBUG->print("RS_ActionDrawArc::mouseMoveEvent begin");

    RS_Vector mouse = snapPoint(e);
    switch (getStatus()) {
    case SetCenter:
        data.center = mouse;
        break;

    case SetRadius:
        if (data.center.valid) {
            data.radius = data.center.distanceTo(mouse);
            deletePreview();
            preview->addEntity(new RS_Circle(preview,
                                             RS_CircleData(data.center,
                                                           data.radius)));
            drawPreview();
        }
        break;

    case SetAngle1:
        data.angle1 = data.center.angleTo(mouse);
        if (data.reversed) {
            data.angle2 = RS_Math::correctAngle(data.angle1-M_PI/3);
        } else {
            data.angle2 = RS_Math::correctAngle(data.angle1+M_PI/3);
        }
        deletePreview();
        preview->addEntity(new RS_Arc(preview,
                                      data));
        drawPreview();
        break;

    case SetAngle2:
        data.angle2 = data.center.angleTo(mouse);
        deletePreview();
        preview->addEntity(new RS_Arc(preview,
                                      data));
        drawPreview();
        break;

    case SetIncAngle:
        data.angle2 = data.angle1 + data.center.angleTo(mouse);
        deletePreview();
        preview->addEntity(new RS_Arc(preview,
                                      data));
        drawPreview();
        break;

    case SetChordLength: {
            double x = data.center.distanceTo(mouse);
            if (fabs(x/(2*data.radius))<=1.0) {
                data.angle2 = data.angle1 + asin(x/(2*data.radius)) * 2;
                deletePreview();
                preview->addEntity(new RS_Arc(preview,
                                              data));
                drawPreview();
            }
        }
        break;

    default:
        break;

    }

    RS_DEBUG->print("RS_ActionDrawArc::mouseMoveEvent end");
}
コード例 #2
0
void RS_ActionModifyStretch::mouseMoveEvent(QMouseEvent* e) {
    RS_DEBUG->print("RS_ActionModifyStretch::mouseMoveEvent begin");

    RS_Vector mouse = snapPoint(e);
    switch (getStatus()) {
    case SetFirstCorner:
        break;

    case SetSecondCorner:
        if (firstCorner.valid) {
            secondCorner = snapPoint(e);
            deletePreview();
            preview->addEntity(
                new RS_Line(preview,
                            RS_LineData(RS_Vector(firstCorner.x,
                                                  firstCorner.y),
                                        RS_Vector(secondCorner.x,
                                                  firstCorner.y))));
            preview->addEntity(
                new RS_Line(preview,
                            RS_LineData(RS_Vector(secondCorner.x,
                                                  firstCorner.y),
                                        RS_Vector(secondCorner.x,
                                                  secondCorner.y))));
            preview->addEntity(
                new RS_Line(preview,
                            RS_LineData(RS_Vector(secondCorner.x,
                                                  secondCorner.y),
                                        RS_Vector(firstCorner.x,
                                                  secondCorner.y))));
            preview->addEntity(
                new RS_Line(preview,
                            RS_LineData(RS_Vector(firstCorner.x,
                                                  secondCorner.y),
                                        RS_Vector(firstCorner.x,
                                                  firstCorner.y))));
            drawPreview();
        }
        break;

    case SetReferencePoint:
        break;

    case SetTargetPoint:
        if (referencePoint.valid) {
            targetPoint = mouse;

            deletePreview();
            preview->addStretchablesFrom(*container, firstCorner, secondCorner);
            //preview->move(targetPoint-referencePoint);
            preview->stretch(firstCorner, secondCorner,
                             targetPoint-referencePoint);
            drawPreview();
        }
        break;

    default:
        break;
    }

    RS_DEBUG->print("RS_ActionModifyStretch::mouseMoveEvent end");
}
コード例 #3
0
void RS_ActionDrawEllipseAxis::mouseMoveEvent(QMouseEvent* e) {
    RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent begin");

    RS_Vector mouse = snapPoint(e);

    switch (getStatus()) {
//    case SetCenter:
//        break;

    case SetMajor:
        if (center.valid) {
            deletePreview();
            RS_EllipseData ed(center, mouse-center,
                              0.5,
                              0.0, isArc?2.*M_PI:0.0,
                              false);
			preview->addEntity(new RS_Ellipse(preview.get(), ed));
            drawPreview();
        }
        break;

    case SetMinor:
        if (center.valid && major.valid) {
            deletePreview();
            RS_Line line(NULL, RS_LineData(center-major, center+major));
            double d = line.getDistanceToPoint(mouse);
            ratio = d/(line.getLength()/2);
            RS_EllipseData ed(center, major,
                              ratio,
                              0.0, isArc?2.*M_PI:0.0,
                              false);
			preview->addEntity(new RS_Ellipse(preview.get(), ed));
            drawPreview();
        }
        break;

    case SetAngle1:
        if (center.valid && major.valid) {
            deletePreview();

            //angle1 = center.angleTo(mouse);

                        RS_Vector m = mouse;
                        m.rotate(center, -major.angle());
                        RS_Vector v = m-center;
                        v.scale(RS_Vector(1.0, 1.0/ratio));
                        angle1 = v.angle(); // + major.angle();

			preview->addEntity(new RS_Line(preview.get(), RS_LineData(center, mouse)));

            RS_EllipseData ed(center, major,
                              ratio,
                              angle1, angle1+1.0,
                              false);
			preview->addEntity(new RS_Ellipse(preview.get(), ed));
            drawPreview();
        }
        break;

    case SetAngle2:
        if (center.valid && major.valid) {
            deletePreview();
            //angle2 = center.angleTo(mouse);

                        RS_Vector m = mouse;
                        m.rotate(center, -major.angle());
                        RS_Vector v = m-center;
                        v.scale(RS_Vector(1.0, 1.0/ratio));
                        angle2 = v.angle(); // + major.angle();

			preview->addEntity(new RS_Line(preview.get(), RS_LineData(center, mouse)));

            RS_EllipseData ed(
                center, major,
                ratio,
                angle1, angle2,
                false);
			preview->addEntity(new RS_Ellipse(preview.get(), ed));
            drawPreview();
        }

    default:
        break;
    }

    RS_DEBUG->print("RS_ActionDrawEllipseAxis::mouseMoveEvent end");
}
コード例 #4
0
void RS_ActionDrawCircleTan1_2P::mouseMoveEvent(QMouseEvent* e) {
    RS_DEBUG->print("RS_ActionDrawCircleTan1_2P::mouseMoveEvent begin");

    switch(getStatus() ){
    case SetPoint1:
    {
        RS_Vector&& mouse=snapPoint(e);
		pPoints->points.clear();
		pPoints->points.push_back(mouse);
        switch(circle->rtti()){
        case RS2::EntityArc:
        case RS2::EntityCircle:
        {
			RS_Vector const& dvp=mouse - circle->getCenter();
			double rvp=dvp.magnitude();
            if(rvp<RS_TOLERANCE2) break;
			pPoints->cData.radius=(circle->getRadius()+rvp)*0.5;
			pPoints->cData.center=circle->getCenter()+dvp*(pPoints->cData.radius/rvp);
			pPoints->cData.radius=fabs(circle->getRadius()-pPoints->cData.radius);
        }
            break;
        case RS2::EntityLine:
        {
            RS_Line* line=static_cast<RS_Line*>(circle);
			RS_Vector&& vp=line->getNearestPointOnEntity(pPoints->points[0],false);
            if(vp.valid){
				pPoints->cData.center=(vp+pPoints->points[0])*0.5;
				pPoints->cData.radius=vp.distanceTo(pPoints->cData.center);
            }
        }
            break;
        default:
            return;
        }
        deletePreview();
		RS_Circle* e=new RS_Circle(preview.get(), pPoints->cData);
        preview->addEntity(e);
        drawPreview();
        break;
    }
    case SetPoint2: {
		RS_Vector const& mouse=snapPoint(e);
		pPoints->points.resize(1);
		pPoints->points.push_back(mouse);
        deletePreview();
		pPoints->coord=mouse;
		if (!getCenters()) return;
		if (preparePreview()) {
			RS_Circle* e=new RS_Circle(preview.get(), pPoints->cData);
            preview->addEntity(e);
            drawPreview();
        }
        break;
    }
    case SetCenter: {

        //        RS_Entity*  en = catchEntity(e, enTypeList, RS2::ResolveAll);
		pPoints->coord= graphicView->toGraph(e->x(), e->y());
        //        circles[getStatus()]=static_cast<RS_Line*>(en);
        if(preparePreview()) {
            deletePreview();
			RS_Circle* e=new RS_Circle(preview.get(), pPoints->cData);
			for(size_t i=0; i<pPoints->centers.size(); ++i)
				preview->addEntity(new RS_Point(preview.get(), RS_PointData(pPoints->centers.at(i))));
            preview->addEntity(e);
//            double r0=cData.radius*0.1;
//            if(centers.size()>1)
//                for(unsigned i=0; i< centers.size(); ++i){
//                    RS_DEBUG->print(RS_Debug::D_ERROR, "center %d: (%g, %g)\n",i,centers.at(i).x,centers.at(i).y);
//                    preview->addEntity(new RS_Circle(preview, RS_CircleData(centers.at(i), r0)));
//                }
            drawPreview();
        }
    }
        break;
    default:
        break;
    }
    RS_DEBUG->print("RS_ActionDrawCircleTan1_2P::mouseMoveEvent end");
}
コード例 #5
0
ファイル: resume.c プロジェクト: scorpius/chameleon
void HibernateBoot(char *image_filename)
{
	long long size, imageSize, codeSize, allocSize;
	long mem_base;
	IOHibernateImageHeader _header;
	IOHibernateImageHeader * header = &_header;
	long buffer;
	
	size = ReadFileAtOffset (image_filename, header, 0, sizeof(IOHibernateImageHeader));
	printf("header read size %x\n", size);
		
	imageSize = header->image1Size;
	codeSize  = header->restore1PageCount << 12;
	if (kIOHibernateHeaderSignature != header->signature)
	{
		printf ("Incorrect image signature\n");
		return;
	}
	if (header->encryptStart)
	{
		printf ("Resuming from Encrypted image is unsupported.\n"
				"Uncheck \"Use secure virtual memory\" in \"Security\" pane on system preferences.\n"
				"Press any key to proceed with normal boot.\n");
		getc ();
		return;
	}
// depends on NVRAM
#if 0
	{
		uint32_t machineSignature;
		size = GetProp(gChosenPH, kIOHibernateMachineSignatureKey, 
					   (char *)&machineSignature, sizeof(machineSignature));
		if (size != sizeof(machineSignature)) machineSignature = 0;
		if (machineSignature != header->machineSignature)
			break;
	}
#endif
		
	allocSize = imageSize + ((4095 + sizeof(hibernate_graphics_t)) & ~4095);

	mem_base = getmemorylimit() - allocSize;//TODO: lower this
		
	printf("mem_base %x\n", mem_base);
			
	if (!(long long)mem_base+allocSize<1024*bootInfo->extmem+0x100000)
	{
		printf ("Not enough space to restore image. Press any key to proceed with normal boot.\n");
		getc ();
		return;
	}
		
	bcopy(header, (void *) mem_base, sizeof(IOHibernateImageHeader));
	header = (IOHibernateImageHeader *) mem_base;
		
	imageSize -= sizeof(IOHibernateImageHeader);
	buffer = (long)(header + 1);
	
	if (header->previewSize)
	{
		uint64_t preview_offset = header->fileExtentMapSize - sizeof(header->fileExtentMap) + codeSize;
		uint8_t progressSaveUnder[kIOHibernateProgressCount][kIOHibernateProgressSaveUnderSize];
			
		ReadFileAtOffset (image_filename, (char *)buffer, sizeof(IOHibernateImageHeader), preview_offset+header->previewSize);
		drawPreview ((void *)(long)(buffer+preview_offset + header->previewPageListSize), &(progressSaveUnder[0][0]));
		previewTotalSectors = (imageSize-(preview_offset+header->previewSize))/512;
		previewLoadedSectors = 0;
		previewSaveunder = &(progressSaveUnder[0][0]);
		if (preview_offset+header->previewSize<imageSize)
			ReadFileAtOffset (image_filename, (char *)(long)(buffer+preview_offset+header->previewSize), 
							  sizeof(IOHibernateImageHeader)+preview_offset+header->previewSize,
							  imageSize-(preview_offset+header->previewSize));
		previewTotalSectors = 0;
		previewLoadedSectors = 0;
		previewSaveunder = 0;		
		if(check_vga_nvidia(root_pci_dev) ==1 ) setVideoMode( VGA_TEXT_MODE, 0 );
	}
	else
		ReadFileAtOffset (image_filename, (char *)buffer, sizeof(IOHibernateImageHeader), imageSize);
	
// Depends on NVRAM
#if 0
	if (header->encryptStart) {
		// decryption data
		static const unsigned char first_iv[AES_BLOCK_SIZE]
		= {  0xa3, 0x63, 0x65, 0xa9, 0x0b, 0x71, 0x7b, 0x1c,
		0xdf, 0x9e, 0x5f, 0x32, 0xd7, 0x61, 0x63, 0xda };
		hibernate_cryptvars_t       _cryptvars;
		hibernate_cryptvars_t *     cryptvars = &_cryptvars;
		
		aes_decrypt_key(&decryptkey,
						decryptkeysize,
						&cryptvars->ctx.decrypt);
			
		// set the vector for the following decryptions
		bcopy(((uint8_t *) header) + header->image1Size - AES_BLOCK_SIZE, 
				&cryptvars->aes_iv[0], AES_BLOCK_SIZE);
			
		// decrypt the buffer
		uint32_t len = (uint32_t)(header->image1Size - header->encryptStart);
		aes_decrypt_cbc(((uint8_t *) header) + header->encryptStart,
						&first_iv[0],
						len >> 4,
						((uint8_t *) header) + header->encryptStart,
						&cryptvars->ctx.decrypt);
		bzero(&cryptvars->aes_iv[0], sizeof(cryptvars));
		bzero(&decryptkey, sizeof(decryptkey));
	}
#endif
	
	WakeKernel(header);
}
コード例 #6
0
void HibernateBoot(char *image_filename)
{
	long long size, imageSize, codeSize, allocSize;
	long mem_base;
	IOHibernateImageHeader _header;
	IOHibernateImageHeader * header = &_header;
	long buffer;
	
	size = ReadFileAtOffset (image_filename, header, 0, sizeof(IOHibernateImageHeader));
	printf("header read size %x\n", size);
		
	imageSize = header->image1Size;
	codeSize  = header->restore1PageCount << 12;
	if (kIOHibernateHeaderSignature != header->signature)
	{
		printf ("Incorrect image signature\n");
		return;
	}
	if (header->encryptStart)
	{
		printf ("Resuming from Encrypted image is unsupported.\n"
				"Uncheck \"Use secure virtual memory\" in \"Security\" pane on system preferences.\n"
				"Press any key to proceed with normal boot.\n");
		getc ();
		return;
	}
// depends on NVRAM
#if 0
	{
		uint32_t machineSignature;
		size = GetProp(gChosenPH, kIOHibernateMachineSignatureKey, 
					   (char *)&machineSignature, sizeof(machineSignature));
		if (size != sizeof(machineSignature)) machineSignature = 0;
		if (machineSignature != header->machineSignature)
			break;
	}
#endif
		
	allocSize = imageSize + ((4095 + sizeof(hibernate_graphics_t)) & ~4095);

	mem_base = getmemorylimit() - allocSize;//TODO: lower this
		
	printf("mem_base %x\n", mem_base);
	/* Rek : hibernate fix
	if (!((long long)mem_base+allocSize<1024*bootInfo->extmem+0x100000))*/

	// valv: hibfix ;)
	long long hibfix;
	hibfix = mem_base+allocSize<1024*bootInfo->extmem+0x100000;
	if(!hibfix)
	{
		printf ("Not enough space to restore image. Press any key to proceed with normal boot.\n");
		getc ();
		return;
	}

	bcopy(header, (void *) mem_base, sizeof(IOHibernateImageHeader));
	header = (IOHibernateImageHeader *) mem_base;

	imageSize -= sizeof(IOHibernateImageHeader);
	buffer = (long)(header + 1);
	
	if (header->previewSize)
	{
		uint64_t preview_offset = header->fileExtentMapSize - sizeof(header->fileExtentMap) + codeSize;
		uint8_t progressSaveUnder[kIOHibernateProgressCount][kIOHibernateProgressSaveUnderSize];
			
		ReadFileAtOffset (image_filename, (char *)buffer, sizeof(IOHibernateImageHeader), preview_offset+header->previewSize);
		drawPreview ((void *)(long)(buffer+preview_offset + header->previewPageListSize), &(progressSaveUnder[0][0]));
		previewTotalSectors = (imageSize-(preview_offset+header->previewSize))/512;
		previewLoadedSectors = 0;
		previewSaveunder = &(progressSaveUnder[0][0]);
		if (preview_offset+header->previewSize<imageSize)
			ReadFileAtOffset (image_filename, (char *)(long)(buffer+preview_offset+header->previewSize), 
							  sizeof(IOHibernateImageHeader)+preview_offset+header->previewSize,
							  imageSize-(preview_offset+header->previewSize));
		previewTotalSectors = 0;
		previewLoadedSectors = 0;
		previewSaveunder = 0;
#if 0
		AsereBLN:
		check_vga_nvidia() didn't work as expected (recursion level > 0 & return value).
		Unforutnaltely I cannot find a note why to switch back to text mode for nVidia cards only
		and because it check_vga_nvidia does not work (cards normally are behind a bridge) I will
		remove it completely
		setVideoMode( VGA_TEXT_MODE, 0 );
#endif
	}