|   1311 	if (document() == null or m_width == -1 or m_height == -1) | 
  1308 	if (document() == null or m_width == -1 or m_height == -1) | 
|   1312 		return; | 
  1309 		return; | 
|   1313  | 
  1310  | 
|   1314 	bool lastfilled = false; | 
  1311 	bool lastfilled = false; | 
|   1315 	bool firstrun = true; | 
  1312 	bool firstrun = true; | 
|   1316 	const uint32 white = 0xFFFFFFFF; | 
  1313 	enum { black = 0xFF000000 }; | 
|   1317 	bool inward = true; | 
  1314 	bool inward = true; | 
|   1318 	const int w = m_width, h = m_height; | 
        | 
|   1319 	int runaway = 50; | 
  1315 	int runaway = 50; | 
|   1320  | 
        | 
|   1321 	glClearColor (1.0, 1.0, 1.0, 1.0); | 
        | 
|   1322 	glDisable (GL_DITHER); | 
        | 
|   1323  | 
  1316  | 
|   1324 	// Use the pick list while drawing the scene, this way we can tell whether borders | 
  1317 	// Use the pick list while drawing the scene, this way we can tell whether borders | 
|   1325 	// are background or not. | 
  1318 	// are background or not. | 
|   1326 	setPicking (true); | 
  1319 	setPicking (true); | 
|   1327  | 
  1320  | 
|   1328 	while (--runaway) | 
  1321 	while (--runaway) | 
|   1329 	{ | 
  1322 	{ | 
|   1330 		if (zoom() > 10000.0 or zoom() < 0.0) | 
  1323 		if (zoom() > 10000.0 or zoom() < 0.0) | 
|   1331 		{ | 
  1324 		{ | 
|   1332 			// Obviously, there's nothing to draw if we get here. | 
  1325 			// Nothing to draw if we get here. | 
|   1333 			// Default to 30.0f and break out. | 
        | 
|   1334 			zoom() = 30.0; | 
  1326 			zoom() = 30.0; | 
|   1335 			break; | 
  1327 			break; | 
|   1336 		} | 
  1328 		} | 
|   1337  | 
  1329  | 
|   1338 		zoomNotch (inward); | 
  1330 		zoomNotch (inward); | 
|   1339  | 
  1331 		QVector<unsigned char> capture (4 * m_width * m_height); | 
|   1340 		uchar* cap = new uchar[4 * w * h]; | 
        | 
|   1341 		drawGLScene(); | 
  1332 		drawGLScene(); | 
|   1342 		glReadPixels (0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, cap); | 
  1333 		glReadPixels (0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, capture.data()); | 
|   1343 		uint32* imgdata = reinterpret_cast<uint32*> (cap); | 
  1334 		QImage image (capture.constData(), m_width, m_height, QImage::Format_ARGB32); | 
|   1344 		bool filled = false; | 
  1335 		bool filled = false; | 
|   1345  | 
  1336  | 
|   1346 		// Check the top and bottom rows | 
  1337 		// Check the top and bottom rows | 
|   1347 		for (int i = 0; i < w; ++i) | 
  1338 		for (int i = 0; i < image.width(); ++i) | 
|   1348 		{ | 
  1339 		{ | 
|   1349 			if (imgdata[i] != white or imgdata[((h - 1) * w) + i] != white) | 
  1340 			if (image.pixel (i, 0) != black or image.pixel (i, m_height - 1) != black) | 
|   1350 			{ | 
  1341 			{ | 
|   1351 				filled = true; | 
  1342 				filled = true; | 
|   1352 				break; | 
  1343 				break; | 
|   1353 			} | 
  1344 			} | 
|   1354 		} | 
  1345 		} | 
|   1355  | 
  1346  | 
|   1356 		// Left and right edges | 
  1347 		// Left and right edges | 
|   1357 		if (filled == false) | 
  1348 		if (filled == false) | 
|   1358 		{ | 
  1349 		{ | 
|   1359 			for (int i = 0; i < h; ++i) | 
  1350 			for (int i = 0; i < image.height(); ++i) | 
|   1360 			{ | 
  1351 			{ | 
|   1361 				if (imgdata[i * w] != white or imgdata[(i * w) + w - 1] != white) | 
  1352 				if (image.pixel (0, i) != black or image.pixel (m_width - 1, i) != black) | 
|   1362 				{ | 
  1353 				{ | 
|   1363 					filled = true; | 
  1354 					filled = true; | 
|   1364 					break; | 
  1355 					break; | 
|   1365 				} | 
  1356 				} | 
|   1366 			} | 
  1357 			} | 
|   1367 		} | 
  1358 		} | 
|   1368  | 
        | 
|   1369 		delete[] cap; | 
        | 
|   1370  | 
  1359  | 
|   1371 		if (firstrun) | 
  1360 		if (firstrun) | 
|   1372 		{ | 
  1361 		{ | 
|   1373 			// If this is the first run, we don't know enough to determine | 
  1362 			// If this is the first run, we don't know enough to determine | 
|   1374 			// whether the zoom was to fit, so we mark in our knowledge so | 
  1363 			// whether the zoom was to fit, so we mark in our knowledge so | 
|   1395 		} | 
  1384 		} | 
|   1396  | 
  1385  | 
|   1397 		lastfilled = filled; | 
  1386 		lastfilled = filled; | 
|   1398 	} | 
  1387 	} | 
|   1399  | 
  1388  | 
|   1400 	setBackground(); | 
        | 
|   1401 	setPicking (false); | 
  1389 	setPicking (false); | 
|   1402 } | 
  1390 } | 
|   1403  | 
  1391  | 
|   1404 // ============================================================================= | 
  1392 // ============================================================================= | 
|   1405 // | 
  1393 // | 
|   1406 void GLRenderer::zoomAllToFit() | 
  1394 void GLRenderer::zoomAllToFit() | 
|   1407 { | 
  1395 { | 
|   1408 	ECamera oldcam = camera(); | 
  1396 	zoomToFit(); | 
|   1409  | 
        | 
|   1410 	for (ECamera cam = EFirstCamera; cam < ENumCameras; ++cam) | 
        | 
|   1411 	{ | 
        | 
|   1412 		setCamera (cam); | 
        | 
|   1413 		zoomToFit(); | 
        | 
|   1414 	} | 
        | 
|   1415  | 
        | 
|   1416 	setCamera (oldcam); | 
        | 
|   1417 } | 
  1397 } | 
|   1418  | 
  1398  | 
|   1419 // ============================================================================= | 
  1399 // ============================================================================= | 
|   1420 // | 
  1400 // | 
|   1421 void GLRenderer::mouseDoubleClickEvent (QMouseEvent* ev) | 
  1401 void GLRenderer::mouseDoubleClickEvent (QMouseEvent* ev) |