Exemplo n.º 1
0
void MoveSelectImage::MoveImage(LPINPUT_DATA lpd, LPPOINT beforPt)
{
	ImgFile *f = m_pImgEdit->GetActiveFile();
	if(f){
		int shiftX = lpd->x - beforPt->x;
		int shiftY = lpd->y - beforPt->y;
		ImgLayer *l = f->GetSelectLayer();		
		if(!l){
			IEMessageBox("レイヤーが選択されていません。");
		}
		const IplImageExt *ImgExt = l->GetDrawImage();
		IplImage* mask = f->GetSelectMask();


		move_X += shiftX;
		move_Y += shiftY;
		
		RECT newRc;
		newRc.top  = beforRc.top + shiftY;  newRc.bottom = beforRc.bottom + shiftY;
		newRc.left = beforRc.left + shiftX; newRc.right  = beforRc.right + shiftX;
		
		//
		RECT rc;
		OrRect(&beforRc, &newRc, &rc);

		//画像の移動
		m_editNode->to_rect = newRc;

		//mask zero clear
		cvSet(mask, cvScalar(0));

		//マスクの移動
		for(int y=0; y < move_mask->height; y++){
			for(int x=0; x < move_mask->width; x++){
				SetMaskDataPos(mask,
					x + move_X + maskRc.left,
					y + move_Y + maskRc.top,
					GetMaskDataPos(move_mask, x, y));
			}
		}


		//画像の更新
		UPDATE_DATA data;
		data.isAll = false;
		data.rect = rc;
		data.update_flag = UPDATE_FLAG::UPDATE_SELECT_LAYER_ALL_NODE;
		f->PushUpdateData(&data);

		beforRc = newRc;
	}
}
Exemplo n.º 2
0
bool ImgLayer::Update(const LPRECT enable_lprc, LPRECT updated_lprc)
{
	if (m_pUpdateDataForeGrnd_List->empty()) {
		return false;
	}

	UPDATE_DATA udLayer;
	bool isLayerRect = false;
	udLayer.isAll = false;

	//更新情報の縮小化
	ResourceLock( IE_LAYER_RESOURCE_ID::UPDATE_DATA_QUEUE );

	LPUpdateData_List::iterator itr = m_pUpdateDataForeGrnd_List->begin();
	for (; itr != m_pUpdateDataForeGrnd_List->end(); itr++) {
		bool isAll = (*itr)->isAll;
		
		switch ((*itr)->update_flag) {
			case UPDATE_FLAG::UPDATE_LAYER_IMAGE:
				if (isAll) {//全体更新
					udLayer.isAll = isAll;
				}
				else if (udLayer.isAll == false) {//部分更新
					if (isLayerRect == false) {//範囲の初期値がないなら
						udLayer.rect = (*itr)->rect;
						isLayerRect = true;
					}
					else {//範囲がすでに存在しているなら
						OrRect(&((*itr)->rect), &(udLayer.rect), &(udLayer.rect));
					}
				}
				break;
			case UPDATE_FLAG::NO_UPDATE:
				break;
			default:
				OutputError::PushLog( LOG_LEVEL::_WARN, "ImgLayer::Update() unknown update_flag");
				break;
		}

		//最大範囲の更新だったら抜ける。
		if ((*itr)->update_flag == UPDATE_FLAG::UPDATE_LAYER_IMAGE &&
			isAll)
		{
			break;
		}
	}
	ResourceUnlock( IE_LAYER_RESOURCE_ID::UPDATE_DATA_QUEUE );

	if (udLayer.isAll) {
		udLayer.rect = m_LayerRect;
		isLayerRect = true;
	}
	if (enable_lprc) {
		AndRect(&(udLayer.rect), enable_lprc, &(udLayer.rect));
	}
	
	//update
	if (isLayerRect) {
		UpdateEditNode(&udLayer.rect);
	}
	(*updated_lprc) = udLayer.rect;

	return IImgLayer::Update(enable_lprc, updated_lprc);
}