static void draw(EGLmanager *eglman) { VGfloat black[] = {0.f, 0.f, 0.f, 1.f}; // Render 3D scene by GL eglBindAPI(EGL_OPENGL_ES_API); eglMakeCurrent(eglman->dpy, eglman->pbuf_surface, eglman->pbuf_surface, eglman->es_ctx); // Modify GL texture source glClearColor(1.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, TEXTURE_WIDTH/2, TEXTURE_HEIGHT/2); glClearColor(0.0, 1.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, TEXTURE_WIDTH/2, 0, 0, 0, TEXTURE_WIDTH/2, TEXTURE_HEIGHT/2); glClearColor(0.0, 0.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, TEXTURE_HEIGHT/2, 0, 0, TEXTURE_WIDTH/2, TEXTURE_HEIGHT/2); glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glCopyTexSubImage2D(GL_TEXTURE_2D, 0, TEXTURE_WIDTH/2, TEXTURE_HEIGHT/2, 0, 0, TEXTURE_WIDTH/2, TEXTURE_HEIGHT/2); // Make current to VG content eglBindAPI(EGL_OPENVG_API); eglMakeCurrent(eglman->dpy, eglman->win_surface, eglman->win_surface, eglman->vg_ctx); // Draw VGImage target vgSetfv(VG_CLEAR_COLOR, 4, black); vgClear(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); vgSeti(VG_BLEND_MODE, VG_BLEND_SRC); vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); vgLoadIdentity(); vgTranslate(WINDOW_WIDTH/2.0f, WINDOW_HEIGHT/2.0f); vgScale((VGfloat)WINDOW_WIDTH/(VGfloat)TEXTURE_WIDTH * 0.8f, (VGfloat)WINDOW_HEIGHT/(VGfloat)TEXTURE_HEIGHT * 0.8f); vgTranslate(-TEXTURE_WIDTH/2.0f, -TEXTURE_HEIGHT/2.0f); vgDrawImage(eglman->vg_image); // Swap buffer eglSwapBuffers(eglman->dpy, eglman->win_surface); return; }
static bool vg_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg) { RARCH_PERFORMANCE_INIT(vg_fr); RARCH_PERFORMANCE_START(vg_fr); vg_t *vg = (vg_t*)data; if (width != vg->mRenderWidth || height != vg->mRenderHeight || vg->should_resize) { vg->mRenderWidth = width; vg->mRenderHeight = height; vg_calculate_quad(vg); matrix_3x3_quad_to_quad( vg->x1, vg->y1, vg->x2, vg->y1, vg->x2, vg->y2, vg->x1, vg->y2, // needs to be flipped, Khronos loves their bottom-left origin 0, height, width, height, width, 0, 0, 0, &vg->mTransformMatrix); vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE); vgLoadMatrix(vg->mTransformMatrix.data); vg->should_resize = false; } vgSeti(VG_SCISSORING, VG_FALSE); vgClear(0, 0, vg->mScreenWidth, vg->mScreenHeight); vgSeti(VG_SCISSORING, VG_TRUE); RARCH_PERFORMANCE_INIT(vg_image); RARCH_PERFORMANCE_START(vg_image); vg_copy_frame(vg, frame, width, height, pitch); RARCH_PERFORMANCE_STOP(vg_image); vgDrawImage(vg->mImage); if (msg && vg->mFontsOn) vg_draw_message(vg, msg); vg->driver->update_window_title(vg); RARCH_PERFORMANCE_STOP(vg_fr); vg->driver->swap_buffers(vg); return true; }
void CTReadWriteChild::PixmapSurfaceFuncL() { vgDrawImage(iImage); VgLeaveIfErrorL(); }
void CTReadWriteChild::VgImageFuncL() { vgDrawImage(iImage); VgLeaveIfErrorL(); }
TBool CHuiFxVg10TransformFilter::Draw(CHuiFxEngine& /*aEngine*/, CHuiGc& /*aGc*/, CHuiFxRenderbuffer& aTarget, CHuiFxRenderbuffer& aSource, const TRect& /*aTargetRect*/, const TRect& aSourceRect, TBool /*aHasSurface*/) { aSource.BindAsTexture(ERenderbufferUsageReadOnly); aTarget.BindAsRenderTarget(); VGImage srcImage = (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(&aSource))->AcquireSubImage(aSourceRect); vgLoadIdentity(); vgScale(iScaleX, iScaleY); vgSeti(VG_BLEND_MODE, VG_BLEND_SRC); vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_NORMAL); identity(); // Matrix multiplication is generally not commutative. // Therefore the order of the transformations matters. // In order to prevent the scaling ang skewing from affecting the translation, // if seems wiser to do the translation first, otherwise the results seem to be unpredictable. // Translation if (iTranslationX != 0.0f || iTranslationY != 0.0f || iTranslationZ != 0.0f) { translate(iTranslationX, iTranslationY, iTranslationZ); } // Scaling if (iScaleX != 1.0f || iScaleY != 1.0f || iScaleZ != 1.0f) { translate(iScaleOriginX, iScaleOriginY, iScaleOriginZ); scale(iScaleX, iScaleY, iScaleZ); translate(-iScaleOriginX, -iScaleOriginY, -iScaleOriginZ); } // Skewing if (iSkewAngleX != 0.0f || iSkewAngleY != 0.0f || iSkewAngleZ != 0.0f) { const TReal32 radsPerDeg = 2.0f * (float)M_PI / 360.0f; TReal32 skewX = tan(iSkewAngleX * radsPerDeg); TReal32 skewY = tan(iSkewAngleY * radsPerDeg); TReal32 skewZ = tan(iSkewAngleZ * radsPerDeg); translate(iSkewOriginX, iSkewOriginY, iSkewOriginZ); shear(skewX, skewY, skewZ); translate(-iSkewOriginX, -iSkewOriginY, -iSkewOriginZ); } // Rotation if (iRotationAngle != 0.0f) { translate(iRotationOriginX, iRotationOriginY, iRotationOriginZ); rotate(iRotationAngle, iRotationAxisX, iRotationAxisY, iRotationAxisZ); translate(-iRotationOriginX, -iRotationOriginY, -iRotationOriginZ); } /* // Translation if (iTranslationX != 0.0f || iTranslationY != 0.0f || iTranslationZ != 0.0f) { translate(iTranslationX, iTranslationY, iTranslationZ); } */ ASSERT(!"TODO: implement the following:"); // TODO: project vertices // TODO: create warp quad matrix from projected vertices, // see http://torus.untergrund.net/misc/projective_image_warping.pdf // TODO load matrix vgDrawImage(srcImage); // TODO: pixel relative parameters HUIFX_VG_INVARIANT(); (reinterpret_cast<CHuiFxVg10RenderbufferBase*>(&aSource))->ReleaseSubImage(srcImage); aTarget.UnbindAsRenderTarget(); aSource.UnbindAsTexture(); return ETrue; }