void TestDialog::AdjustPanelBestSize( const wxSize & panelBestSize, wxSize &finalPanelSize, wxSize &finalClientSize)
{
  wxString log;
  const wxSize clientSize = GetClientSize();

  log << wxT("\nClient size is ") << clientSize;

  wxCollapsiblePane *cpane = wxDynamicCast( FindWindow(ID_COLLPANE), wxCollapsiblePane );

  // size of borders, margins and other controls
  const wxSize restSize = clientSize - cpane->GetSize();

  log << wxT("\nSize of dialog minus collpane is ") << restSize;

  // For that, this is how big the dialog has to be.  If expected client width is less that current width, we keep
  // the same width.  For height, we just add the height required by the panel to our current client height since
  // so far the panel's client height was 0
  const wxSize dlgBestClientSize( clientSize.x > panelBestSize.x? clientSize.x: panelBestSize.x + restSize.x,
                    panelBestSize.y + clientSize.y );

  log << wxT("\nFor that, the dialog has to be ") << dlgBestClientSize;

  // Available screen size (minus any app bars, status bars, etc
  const wxSize dispSize = GetCurrentUsableDisplaySize(this);

  log << wxT("\nBut the display size is only ") << dispSize;

  wxSize decoSize( GetSize() - clientSize );
  log << wxT("\nWindow decorations are ") << GetSize() << wxT(" minus ") << clientSize << wxT(", that is ") << decoSize;

  if ( decoSize.x == 0 )
    decoSize.x = 2*wxSystemSettings::GetMetric( wxSYS_BORDER_X, this);
  if (decoSize.y == 0 )
    decoSize.y = 2*wxSystemSettings::GetMetric( wxSYS_BORDER_Y, this) + wxSystemSettings::GetMetric(wxSYS_CAPTION_Y, this);

  log << wxT("\nFinal Window decorations are ") << decoSize;

  // This is how big the client size could be.  Basically, the entire screen minus all window decorations
  const wxSize maxClientSize = dispSize - decoSize;

  log << wxT("\nSo the max possible client size is ") << maxClientSize;

  // We only get as big as we need to be, so as to not cover up the entire screen unnecessarily
  finalClientSize.Set( wxMin(maxClientSize.x, dlgBestClientSize.x), wxMin(maxClientSize.y, dlgBestClientSize.y) );

  log << wxT("\nSo the final client size is ") << finalClientSize;

  finalPanelSize.Set( wxMin( (finalClientSize.x - restSize.x), panelBestSize.x), finalClientSize.y - restSize.y - cpane->GetSize().y );

  log << wxT("\nSo the final panel size is ") << finalPanelSize;
  wxLogDebug(log);
}
Пример #2
0
bool wxVideoXANIM::GetSize(wxSize& size) const
{
    if (m_size[0] == 0)
        return false;
    size.Set(m_size[0], m_size[1]);
    return true;
}
Пример #3
0
	bool ImageReader::readDDS( wxSize& po_size, BGR*& po_colors, uint8*& po_alphas ) const {
		Assert( isValidHeader( m_data.GetPointer( ), m_data.GetSize( ) ) );
		// Get header
		if ( m_data.GetSize( ) < sizeof( DDSHeader ) ) {
			return false;
		}
		auto header = reinterpret_cast<const DDSHeader*>( m_data.GetPointer( ) );

		// Ensure some of the values are correct
		if ( header->magic != FCC_DDS ||
			header->size != sizeof( DDSHeader ) -4 ||
			header->pixelFormat.size != sizeof( DDSPixelFormat ) ) {
			return false;
		}

		po_colors = nullptr;
		po_alphas = nullptr;

		// Determine the pixel format
		if ( header->pixelFormat.flags & 0x40 ) {               // 0x40 = DDPF_RGB, uncompressed data
			if ( !this->processUncompressedDDS( header, reinterpret_cast<RGB*&>( po_colors ), po_alphas ) ) {
				return false;
			}
		} else if ( header->pixelFormat.flags & 0x4 ) {         // 0x4 = DDPF_FOURCC, compressed
			const BGRA* data = reinterpret_cast<const BGRA*>( &m_data[sizeof( *header )] );
			switch ( header->pixelFormat.fourCC ) {
			case FCC_DXT1:
				this->processDXT1( data, header->width, header->height, po_colors, po_alphas );
				break;
			case FCC_DXT2:
			case FCC_DXT3:
				this->processDXT3( data, header->width, header->height, po_colors, po_alphas );
				break;
			case FCC_DXT4:
			case FCC_DXT5:
				this->processDXT5( data, header->width, header->height, po_colors, po_alphas );
				break;
			case FCC_R32F:
				break;
			}
		} else if ( header->pixelFormat.flags & 0x20000 ) {     // 0x20000 = DDPF_LUMINANCE, single-byte color
			if ( !this->processLuminanceDDS( header, reinterpret_cast<RGB*&>( po_colors ) ) ) {
				return false;
			}
		}

		if ( !!po_colors ) {
			po_size.Set( header->width, header->height );
		}

		return !!po_colors;
	}
Пример #4
0
	bool ImageReader::readATEX( wxSize& po_size, BGR*& po_colors, uint8*& po_alphas ) const {
		Assert( isValidHeader( m_data.GetPointer( ), m_data.GetSize( ) ) );
		auto atex = reinterpret_cast<const ANetAtexHeader*>( m_data.GetPointer( ) );

		// Determine mipmap0 size and bail if the file is too small
		if ( m_data.GetSize( ) >= sizeof( ANetAtexHeader ) +sizeof( uint32 ) ) {
			auto mipMap0Size = *reinterpret_cast<const uint32*>( &m_data[sizeof( ANetAtexHeader )] );

			if ( mipMap0Size + sizeof( ANetAtexHeader ) > m_data.GetSize( ) ) {
				po_size.Set( 0, 0 );
				return false;
			}
		} else {
			po_size.Set( 0, 0 );
			return false;
		}

		// Init some fields
		auto data = reinterpret_cast<const uint8_t*>( m_data.GetPointer( ) );
		po_colors = nullptr;
		po_alphas = nullptr;

		uint16 width = atex->width;
		uint16 height = atex->height;

		// Hack for read 126x64 ATEX
		if ( width == 126 && height == 64 ) {
			width = 128;
		}

		// Allocate output
		auto output = allocate<BGRA>( width * height );
		uint32_t outputBufferSize;

		// Uncompress
		switch ( atex->formatInteger ) {
		case FCC_DXT1:
			if ( gw2dt::compression::inflateTextureFileBuffer( m_data.GetSize( ), data, outputBufferSize, reinterpret_cast<uint8_t*>( output ) ) ) {
				this->processDXT1( output, width, height, po_colors, po_alphas );
			}
			break;
		case FCC_DXT2:
		case FCC_DXT3:
		case FCC_DXTN:
			if ( gw2dt::compression::inflateTextureFileBuffer( m_data.GetSize( ), data, outputBufferSize, reinterpret_cast< uint8_t* >( output ) ) ) {
				this->processDXT3( output, width, height, po_colors, po_alphas );
			}
			break;
		case FCC_DXT4:
		case FCC_DXT5:
			if ( gw2dt::compression::inflateTextureFileBuffer( m_data.GetSize( ), data, outputBufferSize, reinterpret_cast< uint8_t* >( output ) ) ) {
				this->processDXT5( output, width, height, po_colors, po_alphas );
			}
			break;
		case FCC_DXTA:
			if ( gw2dt::compression::inflateTextureFileBuffer( m_data.GetSize( ), data, outputBufferSize, reinterpret_cast< uint8_t* >( output ) ) ) {
				this->processDXTA( reinterpret_cast< uint64* >( output ), width, height, po_colors );
			}
			break;
		case FCC_DXTL:
			if ( gw2dt::compression::inflateTextureFileBuffer( m_data.GetSize( ), data, outputBufferSize, reinterpret_cast<uint8_t*>( output ) ) ) {
				this->processDXT5( output, width, height, po_colors, po_alphas );

				for ( uint i = 0; i < ( static_cast<uint>( width ) * static_cast<uint>( height ) ); i++ ) {
					po_colors[i].r = ( po_colors[i].r * po_alphas[i] ) / 0xff;
					po_colors[i].g = ( po_colors[i].g * po_alphas[i] ) / 0xff;
					po_colors[i].b = ( po_colors[i].b * po_alphas[i] ) / 0xff;
				}
			}
			break;
		case FCC_3DCX:
			if ( gw2dt::compression::inflateTextureFileBuffer( m_data.GetSize( ), data, outputBufferSize, reinterpret_cast< uint8_t* >( output ) ) ) {
				this->process3DCX( reinterpret_cast<RGBA*>( output ), width, height, po_colors, po_alphas );
			}
			break;
		default:
			freePointer( output );
			return false;
		}

		freePointer( output );

		if ( po_colors ) {
			po_size.Set( width, height );
			return true;
		}

		return false;
	}