root/src/tests/kits/opengl/glinfo/CapabilitiesView.cpp
/*
 * Copyright 2009-2012 Haiku Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              John Scipione <jscipione@gmail.com>
 *              Alex Wilson <yourpalal2@gmail.com>
 *              Artur Wyszynski <harakash@gmail.com>
 */


#include "CapabilitiesView.h"

#include <stdio.h>

#include <Catalog.h>
#include <ControlLook.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <LayoutBuilder.h>
#include <Locale.h>
#include <Message.h>
#include <String.h>
#include <StringView.h>


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Capabilities"


CapabilitiesView::CapabilitiesView()
        :
        BGroupView(B_TRANSLATE("Capabilities"), B_VERTICAL),
        fCapabilitiesList(new BColumnListView("CapabilitiesList", 0))
{
        // add the columns

        float capabilityColWidth = this->StringWidth("M") * 28;

        fCapabilityColumn = new BStringColumn(B_TRANSLATE("Capability"),
                capabilityColWidth, capabilityColWidth - 20.0,
                capabilityColWidth + 60.0, B_TRUNCATE_MIDDLE);
        fCapabilitiesList->AddColumn(fCapabilityColumn, 0);
        fCapabilitiesList->SetSortingEnabled(true);
        fCapabilitiesList->SetSortColumn(fCapabilityColumn, true, true);

        float valueColWidth = this->StringWidth("M") * 8;

        fValueColumn = new BStringColumn(B_TRANSLATE("Value"), valueColWidth,
                valueColWidth, valueColWidth, B_TRUNCATE_MIDDLE);
        fCapabilitiesList->AddColumn(fValueColumn, 1);

        // add the rows

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_AUX_BUFFERS,
                B_TRANSLATE("Auxiliary buffer(s)")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(
                GL_MAX_MODELVIEW_STACK_DEPTH, B_TRANSLATE("Model stack size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(
                GL_MAX_PROJECTION_STACK_DEPTH, B_TRANSLATE("Projection stack size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(
                GL_MAX_TEXTURE_STACK_DEPTH, B_TRANSLATE("Texture stack size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(
                GL_MAX_NAME_STACK_DEPTH, B_TRANSLATE("Name stack size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_LIST_NESTING,
                B_TRANSLATE("List stack size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(
                GL_MAX_ATTRIB_STACK_DEPTH, B_TRANSLATE("Attributes stack size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_TEXTURE_SIZE,
                B_TRANSLATE("Maximum 2D texture size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_3D_TEXTURE_SIZE,
                B_TRANSLATE("Maximum 3D texture size")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_TEXTURE_UNITS_ARB,
                B_TRANSLATE("Maximum texture units")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_LIGHTS,
                B_TRANSLATE("Maximum lights")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_CLIP_PLANES,
                B_TRANSLATE("Maximum clipping planes")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_EVAL_ORDER,
                B_TRANSLATE("Maximum evaluators equation order")));

        fCapabilitiesList->AddRow(_CreateConvolutionCapabilitiesRow());

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_ELEMENTS_INDICES,
                B_TRANSLATE("Maximum recommended index elements")));

        fCapabilitiesList->AddRow(_CreateCapabilitiesRow(GL_MAX_ELEMENTS_VERTICES,
                B_TRANSLATE("Maximum recommended vertex elements")));

        // add the list

        AddChild(fCapabilitiesList);
        GroupLayout()->SetInsets(5.0, 5.0, 5.0, 5.0);
}


CapabilitiesView::~CapabilitiesView()
{
        BRow *row;
        while ((row = fCapabilitiesList->RowAt((int32)0, NULL)) != NULL) {
                fCapabilitiesList->RemoveRow(row);
                delete row;
        }
}


//      #pragma mark -


BRow*
CapabilitiesView::_CreateCapabilitiesRow(GLenum capability, const char* name)
{
        BRow* row = new BRow();
        row->SetField(new BStringField(B_TRANSLATE(name)), 0);

        int value = 0;
        glGetIntegerv(capability, &value);
        row->SetField(new BStringField(BString() << (int32)value), 1);

        return row;
}


BRow*
CapabilitiesView::_CreateConvolutionCapabilitiesRow()
{
        BRow* row = new BRow();
        row->SetField(new BStringField(B_TRANSLATE("Maximum convolution")), 0);

        int width = 0;
        glGetConvolutionParameteriv(GL_CONVOLUTION_2D,
                GL_MAX_CONVOLUTION_WIDTH, &width);

        int height = 0;
        glGetConvolutionParameteriv(GL_CONVOLUTION_2D,
                GL_MAX_CONVOLUTION_HEIGHT, &height);

        BString convolution;
        convolution << (int32)width << 'x' << (int32)height;
        row->SetField(new BStringField(convolution), 1);

        return row;
}