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"); }
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"); }
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"); }
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"); }
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); }
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 }