IDE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ BlackBerry 10 рдХреЗ рд▓рд┐рдП C ++ рд╡рд┐рдХрд╛рд╕ (OpenGL ES 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

рдмреНрд▓реИрдХрдмреЗрд░реА рдУрдПрд╕ 10 рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдорд╛рд╣реМрд▓ рд╣реИ: рдХреНрдпреВрдПрдирдПрдХреНрд╕ рдореЛрдореЗрдВрдЯрд┐рдХреНрд╕ рдЖрдИрдбреАрдИ, рдЧреНрд░рд╣рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдмрд┐рд▓реНрдб рдмрд┐рд▓реНрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ TeamCity рдкрд░ рдмрд┐рд▓реНрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛, IDE рдХреЛ рдХреБрддреНрддреЗ рдХреА рддрд░рд╣ рдкрд╛рдВрдЪрд╡реЗрдВ рдкреИрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдорд╛рд░реЗ рдЗрдВрдЬрди рдХреЛ рдмреНрд▓реИрдХрдмреЗрд░реА рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдереАред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рддрд░рдг рдкреИрдХреЗрдЬ рдХреЛ рдкреИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдмрд┐рдирд╛ рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдПред



рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ



рд╣рдореЗрдВ рдЬрд┐рд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:



C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдиреНрдпреВрдирддрдо рдЖрд╡реЗрджрди рдХреЗ рдХрдЪреНрдЪреЗ рдорд╛рд▓ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдУрдкрдирдЬреАрдПрд▓ рдИрдПрд╕ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░рдВрдЧреАрди рддреНрд░рд┐рдХреЛрдг рдЦреАрдВрдЪреЗрдЧрд╛ред

рдпрд╣ main.cpp рд╣реЛрдЧрд╛ред
#include <assert.h> #include <screen/screen.h> #include <bps/navigator.h> #include <bps/screen.h> #include <bps/bps.h> #include <bps/event.h> #include <bps/locale.h> #include <bps/virtualkeyboard.h> #include <sys/keycodes.h> #include <input/event_types.h> #include <input/screen_helpers.h> #include <stdarg.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <EGL/egl.h> #include <GLES2/gl2.h> #include "bbutil.h" static const char g_vShaderStr[] = "#version 100\n" "precision highp float;\n" "attribute vec3 vPosition;\n" "attribute vec3 vColor;\n" "varying vec4 Color;\n" "void main()\n" "{\n" " Color = vec4( vColor, 1.0 );\n" " gl_Position = vec4( vPosition, 1.0 );\n" "}\n"; static const char g_fShaderStr[] = "#version 100\n" "precision highp float;\n" "varying vec4 Color;\n" "void main()\n" "{\n" " gl_FragColor = Color;\n" "}\n"; static GLuint g_ProgramObject = 0; static GLuint LoadShader( GLenum type, const char* shaderSrc ) { GLuint shader = glCreateShader( type ); glShaderSource ( shader, 1, &shaderSrc, NULL ); glCompileShader ( shader ); GLint compiled; glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled ); GLsizei MaxLength = 0; glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &MaxLength ); char* InfoLog = new char[MaxLength]; glGetShaderInfoLog( shader, MaxLength, &MaxLength, InfoLog ); return shader; } static void GLDebug_LoadStaticProgramObject() { if ( g_ProgramObject == 0 ) { GLuint vertexShader = LoadShader ( GL_VERTEX_SHADER, g_vShaderStr ); GLuint fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, g_fShaderStr ); g_ProgramObject = glCreateProgram ( ); glAttachShader ( g_ProgramObject, vertexShader ); glAttachShader ( g_ProgramObject, fragmentShader ); glLinkProgram ( g_ProgramObject ); GLint linked; glGetProgramiv ( g_ProgramObject, GL_LINK_STATUS, &linked ); GLsizei Length = 0; GLsizei MaxLength = 0; glGetProgramiv( g_ProgramObject, GL_INFO_LOG_LENGTH, &MaxLength ); char* InfoLog = new char[MaxLength]; glGetProgramInfoLog( g_ProgramObject, MaxLength, &Length, InfoLog ); } } static void GLDebug_RenderTriangle() { const GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f }; const GLfloat vColors[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f }; glUseProgram ( g_ProgramObject ); GLint Loc1 = glGetAttribLocation( g_ProgramObject, "vPosition" ); GLint Loc2 = glGetAttribLocation( g_ProgramObject, "vColor" ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 ); glVertexAttribPointer ( Loc1, 3, GL_FLOAT, GL_FALSE, 0, vVertices ); glVertexAttribPointer ( Loc2, 3, GL_FLOAT, GL_FALSE, 0, vColors ); glEnableVertexAttribArray ( Loc1 ); glEnableVertexAttribArray ( Loc2 ); //glUseProgram ( g_ProgramObject ); glDisable( GL_DEPTH_TEST ); glDrawArrays ( GL_TRIANGLES, 0, 3 ); glUseProgram ( 0 ); glDisableVertexAttribArray ( Loc1 ); glDisableVertexAttribArray ( Loc2 ); } static screen_context_t screen_cxt; void handleScreenEvent( bps_event_t* event ) { screen_event_t screen_event = screen_event_get_event( event ); // handle clicks, touches, keypresses } void handleNavigatorEvent( bps_event_t* event ) { int rc; bps_event_t* activation_event = NULL; switch ( bps_event_get_code( event ) ) { case NAVIGATOR_ORIENTATION_CHECK: // signal navigator that we do not intend to resize navigator_orientation_check_response( event, false ); break; } } int main( int argc, char* argv[] ) { int rc; int exit_application = 0; screen_create_context( &screen_cxt, 0 ); bps_initialize(); //Use utility code to initialize EGL for rendering with GL ES 2.0 if ( EXIT_SUCCESS != bbutil_init_egl( screen_cxt ) ) { fprintf( stderr, "bbutil_init_egl failed\n" ); bbutil_terminate(); screen_destroy_context( screen_cxt ); return 0; } // Signal BPS library that navigator and screen events will be requested if ( BPS_SUCCESS != screen_request_events( screen_cxt ) ) { fprintf( stderr, "screen_request_events failed\n" ); bbutil_terminate(); screen_destroy_context( screen_cxt ); bps_shutdown(); return 0; } if ( BPS_SUCCESS != navigator_request_events( 0 ) ) { fprintf( stderr, "navigator_request_events failed\n" ); bbutil_terminate(); screen_destroy_context( screen_cxt ); bps_shutdown(); return 0; } if ( BPS_SUCCESS != virtualkeyboard_request_events( 0 ) ) { fprintf( stderr, "virtualkeyboard_request_events failed\n" ); bbutil_terminate(); screen_destroy_context( screen_cxt ); bps_shutdown(); return 0; } // Signal BPS library that navigator orientation is not to be locked if ( BPS_SUCCESS != navigator_rotation_lock( false ) ) { fprintf( stderr, "navigator_rotation_lock failed\n" ); bbutil_terminate(); screen_destroy_context( screen_cxt ); bps_shutdown(); return 0; } // Query width and height of the window surface created by utility code EGLint surface_width, surface_height; eglQuerySurface( egl_disp, egl_surf, EGL_WIDTH, &surface_width ); eglQuerySurface( egl_disp, egl_surf, EGL_HEIGHT, &surface_height ); GLDebug_LoadStaticProgramObject(); while ( !exit_application ) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // Request and process all available BPS events bps_event_t* event = NULL; for ( ;; ) { rc = bps_get_event( &event, 0 ); assert( rc == BPS_SUCCESS ); if ( event ) { int domain = bps_event_get_domain( event ); if ( domain == screen_get_domain() ) { handleScreenEvent( event ); } else if ( domain == navigator_get_domain() ) { handleNavigatorEvent( event ); if ( NAVIGATOR_EXIT == bps_event_get_code( event ) ) { exit_application = 1; } } } else break; } // render frame here GLDebug_RenderTriangle(); bbutil_swap(); } // Stop requesting events from libscreen screen_stop_events( screen_cxt ); // Shut down BPS library for this process bps_shutdown(); // Use utility code to terminate EGL setup bbutil_terminate(); // Destroy libscreen context screen_destroy_context( screen_cxt ); return 0; } 



рдмреНрд▓реИрдХрдмреЗрд░реА 10 рдиреЗрдЯрд┐рд╡ рдПрд╕рдбреАрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рд╣рдореЗрдВ bbutil.c рдФрд░ bbutil.h рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЦрдЬрд╛рдиреЗ рдХреА рдЦреЛрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдереЛрдбрд╝рд╛ рдиреНрдпреВрдЯреНрд░рд░реНрдб рд╕рд╛рдордЧреНрд░реА рд╣реИ (рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд┐рдиреА-рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред

bbutil.h
 /* * Copyright (c) 2011-2012 Research In Motion Limited. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _UTILITY_H_INCLUDED #define _UTILITY_H_INCLUDED #include <EGL/egl.h> #include <screen/screen.h> #include <sys/platform.h> #define USING_GL20 extern EGLDisplay egl_disp; extern EGLSurface egl_surf; typedef struct font_t font_t; #define BBUTIL_DEFAULT_FONT "/usr/fonts/font_repository/monotype/arial.ttf" #ifdef __cplusplus extern "C" { #endif /** * Initializes EGL * * @param libscreen context that will be used for EGL setup * @return EXIT_SUCCESS if initialization succeeded otherwise EXIT_FAILURE */ int bbutil_init_egl( screen_context_t ctx ); /** * Terminates EGL */ void bbutil_terminate(); /** * Swaps default bbutil window surface to the screen */ void bbutil_swap(); /** * Returns dpi for a given screen * * @param ctx path libscreen context that corresponds to display of interest * @return dpi for a given screen */ int bbutil_calculate_dpi( screen_context_t ctx ); /** * Rotates the screen to a given angle * * @param angle to rotate screen surface to, must by 0, 90, 180, or 270 * @return EXIT_SUCCESS if texture loading succeeded otherwise EXIT_FAILURE */ int bbutil_rotate_screen_surface( int angle ); #ifdef __cplusplus } #endif #endif 



bbutil.c
 /* * Copyright (c) 2011-2012 Research In Motion Limited. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <assert.h> #include <ctype.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/keycodes.h> #include <time.h> #include <stdbool.h> #include <math.h> #include "bbutil.h" #ifdef USING_GL11 #include <GLES/gl.h> #include <GLES/glext.h> #elif defined(USING_GL20) #include <GLES2/gl2.h> #else #error bbutil must be compiled with either USING_GL11 or USING_GL20 flags #endif EGLDisplay egl_disp; EGLSurface egl_surf; static EGLConfig egl_conf; static EGLContext egl_ctx; static screen_context_t screen_ctx; static screen_window_t screen_win; static screen_display_t screen_disp; static int nbuffers = 2; static int initialized = 0; #ifdef USING_GL20 static GLuint text_rendering_program; static int text_program_initialized = 0; static GLint positionLoc; static GLint texcoordLoc; static GLint textureLoc; static GLint colorLoc; #endif struct font_t { unsigned int font_texture; float pt; float advance[128]; float width[128]; float height[128]; float tex_x1[128]; float tex_x2[128]; float tex_y1[128]; float tex_y2[128]; float offset_x[128]; float offset_y[128]; int initialized; }; static void bbutil_egl_perror( const char* msg ) { static const char* errmsg[] = { "function succeeded", "EGL is not initialized, or could not be initialized, for the specified display", "cannot access a requested resource", "failed to allocate resources for the requested operation", "an unrecognized attribute or attribute value was passed in an attribute list", "an EGLConfig argument does not name a valid EGLConfig", "an EGLContext argument does not name a valid EGLContext", "the current surface of the calling thread is no longer valid", "an EGLDisplay argument does not name a valid EGLDisplay", "arguments are inconsistent", "an EGLNativePixmapType argument does not refer to a valid native pixmap", "an EGLNativeWindowType argument does not refer to a valid native window", "one or more argument values are invalid", "an EGLSurface argument does not name a valid surface configured for rendering", "a power management event has occurred", "unknown error code" }; int message_index = eglGetError() - EGL_SUCCESS; if ( message_index < 0 || message_index > 14 ) { message_index = 15; } fprintf( stderr, "%s: %s\n", msg, errmsg[message_index] ); } int bbutil_init_egl( screen_context_t ctx ) { int usage; int format = SCREEN_FORMAT_RGBX8888; EGLint interval = 1; int rc, num_configs; EGLint attrib_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RENDERABLE_TYPE, 0, EGL_NONE }; #ifdef USING_GL11 usage = SCREEN_USAGE_OPENGL_ES1 | SCREEN_USAGE_ROTATION; attrib_list[9] = EGL_OPENGL_ES_BIT; #elif defined(USING_GL20) usage = SCREEN_USAGE_OPENGL_ES2 | SCREEN_USAGE_ROTATION; attrib_list[9] = EGL_OPENGL_ES2_BIT; EGLint attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; #else fprintf( stderr, "bbutil should be compiled with either USING_GL11 or USING_GL20 -D flags\n" ); return EXIT_FAILURE; #endif //Simple egl initialization screen_ctx = ctx; egl_disp = eglGetDisplay( EGL_DEFAULT_DISPLAY ); if ( egl_disp == EGL_NO_DISPLAY ) { bbutil_egl_perror( "eglGetDisplay" ); bbutil_terminate(); return EXIT_FAILURE; } rc = eglInitialize( egl_disp, NULL, NULL ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglInitialize" ); bbutil_terminate(); return EXIT_FAILURE; } rc = eglBindAPI( EGL_OPENGL_ES_API ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglBindApi" ); bbutil_terminate(); return EXIT_FAILURE; } if ( !eglChooseConfig( egl_disp, attrib_list, &egl_conf, 1, &num_configs ) ) { bbutil_terminate(); return EXIT_FAILURE; } #ifdef USING_GL20 egl_ctx = eglCreateContext( egl_disp, egl_conf, EGL_NO_CONTEXT, attributes ); #elif defined(USING_GL11) egl_ctx = eglCreateContext( egl_disp, egl_conf, EGL_NO_CONTEXT, NULL ); #endif if ( egl_ctx == EGL_NO_CONTEXT ) { bbutil_egl_perror( "eglCreateContext" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_create_window( &screen_win, screen_ctx ); if ( rc ) { perror( "screen_create_window" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_FORMAT, &format ); if ( rc ) { perror( "screen_set_window_property_iv(SCREEN_PROPERTY_FORMAT)" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_USAGE, &usage ); if ( rc ) { perror( "screen_set_window_property_iv(SCREEN_PROPERTY_USAGE)" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_get_window_property_pv( screen_win, SCREEN_PROPERTY_DISPLAY, ( void** )&screen_disp ); if ( rc ) { perror( "screen_get_window_property_pv" ); bbutil_terminate(); return EXIT_FAILURE; } int screen_resolution[2]; rc = screen_get_display_property_iv( screen_disp, SCREEN_PROPERTY_SIZE, screen_resolution ); if ( rc ) { perror( "screen_get_display_property_iv" ); bbutil_terminate(); return EXIT_FAILURE; } int angle = atoi( getenv( "ORIENTATION" ) ); screen_display_mode_t screen_mode; rc = screen_get_display_property_pv( screen_disp, SCREEN_PROPERTY_MODE, ( void** )&screen_mode ); if ( rc ) { perror( "screen_get_display_property_pv" ); bbutil_terminate(); return EXIT_FAILURE; } int size[2]; rc = screen_get_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size ); if ( rc ) { perror( "screen_get_window_property_iv" ); bbutil_terminate(); return EXIT_FAILURE; } int buffer_size[2] = {size[0], size[1]}; if ( ( angle == 0 ) || ( angle == 180 ) ) { if ( ( ( screen_mode.width > screen_mode.height ) && ( size[0] < size[1] ) ) || ( ( screen_mode.width < screen_mode.height ) && ( size[0] > size[1] ) ) ) { buffer_size[1] = size[0]; buffer_size[0] = size[1]; } } else if ( ( angle == 90 ) || ( angle == 270 ) ) { if ( ( ( screen_mode.width > screen_mode.height ) && ( size[0] > size[1] ) ) || ( ( screen_mode.width < screen_mode.height && size[0] < size[1] ) ) ) { buffer_size[1] = size[0]; buffer_size[0] = size[1]; } } else { fprintf( stderr, "Navigator returned an unexpected orientation angle.\n" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, buffer_size ); if ( rc ) { perror( "screen_set_window_property_iv" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_ROTATION, &angle ); if ( rc ) { perror( "screen_set_window_property_iv" ); bbutil_terminate(); return EXIT_FAILURE; } rc = screen_create_window_buffers( screen_win, nbuffers ); if ( rc ) { perror( "screen_create_window_buffers" ); bbutil_terminate(); return EXIT_FAILURE; } egl_surf = eglCreateWindowSurface( egl_disp, egl_conf, screen_win, NULL ); if ( egl_surf == EGL_NO_SURFACE ) { bbutil_egl_perror( "eglCreateWindowSurface" ); bbutil_terminate(); return EXIT_FAILURE; } rc = eglMakeCurrent( egl_disp, egl_surf, egl_surf, egl_ctx ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglMakeCurrent" ); bbutil_terminate(); return EXIT_FAILURE; } rc = eglSwapInterval( egl_disp, interval ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglSwapInterval" ); bbutil_terminate(); return EXIT_FAILURE; } initialized = 1; return EXIT_SUCCESS; } void bbutil_terminate() { //Typical EGL cleanup if ( egl_disp != EGL_NO_DISPLAY ) { eglMakeCurrent( egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); if ( egl_surf != EGL_NO_SURFACE ) { eglDestroySurface( egl_disp, egl_surf ); egl_surf = EGL_NO_SURFACE; } if ( egl_ctx != EGL_NO_CONTEXT ) { eglDestroyContext( egl_disp, egl_ctx ); egl_ctx = EGL_NO_CONTEXT; } if ( screen_win != NULL ) { screen_destroy_window( screen_win ); screen_win = NULL; } eglTerminate( egl_disp ); egl_disp = EGL_NO_DISPLAY; } eglReleaseThread(); initialized = 0; } void bbutil_swap() { int rc = eglSwapBuffers( egl_disp, egl_surf ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglSwapBuffers" ); } } /* Finds the next power of 2 */ static inline int nextp2( int x ) { int val = 1; while ( val < x ) { val <<= 1; } return val; } int bbutil_calculate_dpi( screen_context_t ctx ) { int rc; int screen_phys_size[2]; rc = screen_get_display_property_iv( screen_disp, SCREEN_PROPERTY_PHYSICAL_SIZE, screen_phys_size ); if ( rc ) { perror( "screen_get_display_property_iv" ); bbutil_terminate(); return EXIT_FAILURE; } //Simulator will return 0,0 for physical size of the screen, so use 170 as default dpi if ( ( screen_phys_size[0] == 0 ) && ( screen_phys_size[1] == 0 ) ) { return 170; } else { int screen_resolution[2]; rc = screen_get_display_property_iv( screen_disp, SCREEN_PROPERTY_SIZE, screen_resolution ); if ( rc ) { perror( "screen_get_display_property_iv" ); bbutil_terminate(); return EXIT_FAILURE; } double diagonal_pixels = sqrt( screen_resolution[0] * screen_resolution[0] + screen_resolution[1] * screen_resolution[1] ); double diagonal_inches = 0.0393700787 * sqrt( screen_phys_size[0] * screen_phys_size[0] + screen_phys_size[1] * screen_phys_size[1] ); return ( int )( diagonal_pixels / diagonal_inches + 0.5 ); } } int bbutil_rotate_screen_surface( int angle ) { int rc, rotation, skip = 1, temp;; EGLint interval = 1; int size[2]; if ( ( angle != 0 ) && ( angle != 90 ) && ( angle != 180 ) && ( angle != 270 ) ) { fprintf( stderr, "Invalid angle\n" ); return EXIT_FAILURE; } rc = screen_get_window_property_iv( screen_win, SCREEN_PROPERTY_ROTATION, &rotation ); if ( rc ) { perror( "screen_set_window_property_iv" ); return EXIT_FAILURE; } rc = screen_get_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size ); if ( rc ) { perror( "screen_set_window_property_iv" ); return EXIT_FAILURE; } switch ( angle - rotation ) { case -270: case -90: case 90: case 270: temp = size[0]; size[0] = size[1]; size[1] = temp; skip = 0; break; } if ( !skip ) { rc = eglMakeCurrent( egl_disp, NULL, NULL, NULL ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglMakeCurrent" ); return EXIT_FAILURE; } rc = eglDestroySurface( egl_disp, egl_surf ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglMakeCurrent" ); return EXIT_FAILURE; } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_SOURCE_SIZE, size ); if ( rc ) { perror( "screen_set_window_property_iv" ); return EXIT_FAILURE; } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_BUFFER_SIZE, size ); if ( rc ) { perror( "screen_set_window_property_iv" ); return EXIT_FAILURE; } egl_surf = eglCreateWindowSurface( egl_disp, egl_conf, screen_win, NULL ); if ( egl_surf == EGL_NO_SURFACE ) { bbutil_egl_perror( "eglCreateWindowSurface" ); return EXIT_FAILURE; } rc = eglMakeCurrent( egl_disp, egl_surf, egl_surf, egl_ctx ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglMakeCurrent" ); return EXIT_FAILURE; } rc = eglSwapInterval( egl_disp, interval ); if ( rc != EGL_TRUE ) { bbutil_egl_perror( "eglSwapInterval" ); return EXIT_FAILURE; } } rc = screen_set_window_property_iv( screen_win, SCREEN_PROPERTY_ROTATION, &angle ); if ( rc ) { perror( "screen_set_window_property_iv" ); return EXIT_FAILURE; } return EXIT_SUCCESS; } 



рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд╕реЗрдВрдмрд▓реА



рдЕрдВрджрд░, рдмреНрд▓реИрдХрдмреЗрд░реА 10 рдореЗрдВ QNX рд╣реИ рдФрд░ gcc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред рдЖрдЗрдП рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдореЗрдХрдЕрдк :

 BBARCH=x86 CC = i486-pc-nto-qnx8.0.0-gcc.exe CXX = i486-pc-nto-qnx8.0.0-gcc.exe AR = i486-pc-nto-qnx8.0.0-ar.exe OBJDIR=out OUTDIR=out OBJS = $(OBJDIR)/main.o $(OBJDIR)/bbutil.o $(OBJDIR)/bbutil.o: bbutil.c bbutil.h $(CC) -c bbutil.c -o $(OBJDIR)/bbutil.o $(CFLAGS) $(OBJDIR)/main.o: main.cpp $(CXX) -c main.cpp -o $(OBJDIR)/main.o $(CFLAGS) $(CPPFLAGS) OBJS += $(OBJDIR)/bbutil.o $(OBJDIR)/main.o USEDLIBS = -lstdc++ -lbps -lscreen -lm -lEGL -lGLESv2 -lfreetype -lsocket -lcurl -lOpenAL CFLAGS = -m32 -fomit-frame-pointer CPPFLAGS = -std=gnu++0x -fpermissive PACK: $(OBJS) rm -f $(OBJDIR)/pack.a ar -ru $(OBJDIR)/pack.a $(OBJS) all: $(OBJS) PACK $(CXX) $(CFLAGS) $(CPPFLAGS) -o Main.exe-$(BBARCH) main.cpp $(OBJDIR)/pack.a $(USEDLIBS) 


рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдЙрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред

рдЕрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд╛рдЗрдирд░реА рдХреЛ рд▓рдЧрднрдЧ рд╕рднреА рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ рдмреНрд▓реИрдХрдмреЗрд░реА 10 рдПрдирдХреЗ рдПрд╕рдбреАрдХреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд▓рдХреНрд╖реНрдп рд╣реИрдВ (x86 рдкрд░ рдмрд╛рдВрд╣ рдкрд░ рдПрдХ рдЙрдкрдХрд░рдг рдФрд░ рдПрдХ рдПрдореБрд▓реЗрдЯрд░), рд╣рдордиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдЬрдЧрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдБ рд╣реИ- x86.py :

 #!/usr/bin/python import os Target = "M:/BBNDK/target_10_0_9_1673/qnx6" Host = "M:/BBNDK/host_10_0_9_404/win32/x86" os.environ['QNX_TARGET'] = Target os.environ['QNX_HOST' ] = Host os.environ['PATH' ] = Host + "/usr/bin;" + os.environ['PATH'] os.system( "make all" ) 


Make-x86.py рд░рди рдХрд░реЗрдВ рдФрд░ Main.exe-x86 рдмрд╛рдЗрдирд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдкреИрдХреЗрдЬ рд╡рд┐рдзрд╛рдирд╕рднрд╛



рдЕрдм рдЖрдкрдХреЛ BlackBerry 10. рдкрд░ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╛рд░-рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░-x86.xml рдореЗрдВ рдкреИрдХреЗрдЬ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦреЗрдВ

 <?xml version="1.0" encoding="utf-8" standalone="no"?> <qnx xmlns="http://www.qnx.com/schemas/application/1.0"> <id>com.linderdaum.test_app</id> <name>Test App</name> <versionNumber>1.0.0</versionNumber> <buildId>1</buildId> <description>Test App</description> <author>Linderdaum</author> <platformVersion>10.0.9.1673</platformVersion> <initialWindow> <systemChrome>none</systemChrome> <transparent>false</transparent> <aspectRatio>landscape</aspectRatio> <autoOrients>false</autoOrients> </initialWindow> <category>core.games</category> <asset path="BB10Res/icon.png">icon.png</asset> <configuration id="com.qnx.qcc.toolChain.1246487324" name="Simulator-Debug"> <platformArchitecture>x86</platformArchitecture> <asset path="Main.exe-x86" entry="true" type="Qnx/Elf">Main.exe-x86</asset> </configuration> <icon> <image>icon.png</image> </icon> <permission system="true">run_native</permission> <env var="LD_LIBRARY_PATH" value="app/native/lib"/> </qnx> 


рдФрд░ BB10Res / icon.png рдореЗрдВ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЖрдЗрдХрди рдбрд╛рд▓рдирд╛ рдордд рднреВрд▓рдирд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ 150x150 рд╣реИ:
рдЫрд╡рд┐

рд╣рдо Main-x86.bar рдореЗрдВ рд╕рдм рдХреБрдЫ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВ:

 blackberry-nativepackager -devMode -package Main-x86.bar bar-descriptor-x86.xml 


рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рд▓реЙрдиреНрдЪ



рдпрд╣ рдХреЗрд╡рд▓ рдПрдореБрд▓реЗрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ:

 blackberry-deploy -installApp -device 192.168.70.130 Main-x86.bar 


рдЫрд╡рд┐

рдФрд░ рдЪрд▓рд╛рдПрдВ:

рдЫрд╡рд┐

PS рдмреНрд▓реИрдХрдмреЗрд░реА рдРрдк рд╡рд░реНрд▓реНрдб рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ, рдпрд╣ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 blackberry-signer -storepass <   > Main-armv7.bar 


PPS рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдЗрддрдирд╛ рдХреЛрдбред рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рд╕рдм рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ 15 рдорд┐рдирдЯ рдореЗрдВ рддреИрдпрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In165523/


All Articles