void DebugActor::doUpdate(const UpdateState& us) { static int fps = 0; ++_frames; if (_frames > 50) { timeMS this_time = getTimeMS(); if (this_time != _startTime) { fps = int(((float)_frames / (this_time - _startTime)) * 1000); } _startTime = this_time; _frames = 0; } std::stringstream s; s << "fps=" << fps << std::endl; #ifdef __S3E__ int mem_used = -1; int mem_free = -1; mem_used = s3eMemoryGetInt(S3E_MEMORY_USED); mem_free = s3eMemoryGetInt(S3E_MEMORY_FREE); s << "mfree=" << mem_free << " mem=" << mem_used << std::endl; #endif #ifdef OXYGINE_DEBUG_TRACE_LEAKS s << "objects=" << (int)ObjectBase::__getCreatedObjects().size() << std::endl; #endif #ifdef OXYGINE_TRACE_VIDEO_STATS s << "batches=" << _videoStats.batches << " triangles=" << _videoStats.triangles << std::endl; #endif s << "update=" << getStage()->_statUpdate << "ms "; s << "render=" << getStage()->_statRender << "ms "; s << "textures=" << NativeTexture::created << " "; s << "\nlisteners=" << getStage()->getListenersCount() << ""; if (!_debugText.empty()) { s << "\n"; s << _debugText; } _debugText = ""; _text->setText(s.str()); setHeight(_text->getTextRect().size.y + _text->getY() + 3); _bg->setSize(getSize()); Vector2 ds = core::getDisplaySize(); Vector2 pos(0, 0); switch (_corner) { case 1: pos.x = ds.x; break; case 2: pos = ds; break; case 3: pos.y = ds.y; break; } pos = getStage()->global2local(pos); Vector2 realSize = getScaledSize(); switch (_corner) { case 1: pos.x -= realSize.x; break; case 2: pos -= realSize; break; case 3: pos.y -= realSize.y; break; } setPosition(pos); setScale(1.0f / getStage()->getScaleX()); }
int decodeResizeImage(char const *filename, int maxPixels, Bitmap* bitmap) { LOGI("decodeResizeImage. START"); int returnCode; int maxWidth; int maxHeight; // Decode Image returnCode = decodeImage(filename, bitmap); if (returnCode != MEMORY_OK) { LOGE("Failed to decode image"); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } LOGI("decodeResizeImage. IMAGE DECODED"); doTransforms(bitmap, 1, 0, 0); // Resize red channel getScaledSize((*bitmap).redWidth, (*bitmap).redHeight, maxPixels, &maxWidth, &maxHeight); //We only need to do this once as r, g, b should be the same sizes returnCode = resizeChannel(&(*bitmap).red, (*bitmap).redWidth, (*bitmap).redHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { freeUnsignedCharArray(&(*bitmap).red); return returnCode; } // Set red channel dimensions if ((*bitmap).redWidth >= maxWidth && (*bitmap).redHeight >= maxHeight) { (*bitmap).redWidth = maxWidth; (*bitmap).redHeight = maxHeight; } LOGI("decodeResizeImage. RED COMPLETE"); /** * GREEN CHANNEL */ doTransforms(bitmap, 0, 1, 0); // Resize green channel returnCode = resizeChannel(&(*bitmap).green, (*bitmap).greenWidth, (*bitmap).greenHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); return returnCode; } // Set green channel dimensions if ((*bitmap).greenWidth >= maxWidth && (*bitmap).greenHeight >= maxHeight) { (*bitmap).greenWidth = maxWidth; (*bitmap).greenHeight = maxHeight; } LOGI("decodeResizeImage. GREEN COMPLETE"); /** * BLUE CHANNEL */ doTransforms(bitmap, 0, 0, 1); // Resize blue channel returnCode = resizeChannel(&(*bitmap).blue, (*bitmap).blueWidth, (*bitmap).blueHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } // Set blue channel dimensions if ((*bitmap).blueWidth >= maxWidth && (*bitmap).blueHeight >= maxHeight) { (*bitmap).blueWidth = maxWidth; (*bitmap).blueHeight = maxHeight; } LOGI("decodeResizeImage. BLUE COMPLETE"); // Set the final bitmap dimensions if ((*bitmap).redWidth == (*bitmap).greenWidth && (*bitmap).redWidth == (*bitmap).blueWidth && (*bitmap).redHeight == (*bitmap).greenHeight && (*bitmap).redHeight == (*bitmap).blueHeight) { (*bitmap).width = (*bitmap).redWidth; (*bitmap).height = (*bitmap).redHeight; } else { freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return INCONSISTENT_BITMAP_ERROR; } LOGI("decodeResizeImage. FINISHED"); return MEMORY_OK; }
int decodeJpegData(char* jpegData, int jpegSize, int maxPixels, Bitmap* bitmap) { int returnCode; int maxWidth; int maxHeight; // Decode red channel returnCode = decodeJpegChannel(jpegData, jpegSize, 0, &(*bitmap).red, &(*bitmap).redWidth, &(*bitmap).redHeight); if (returnCode != MEMORY_OK) { LOGE("Failed to decode red channel"); njDone(); freeUnsignedCharArray(&(*bitmap).red); return returnCode; } doTransforms(bitmap, 1, 0, 0); // Resize red channel getScaledSize((*bitmap).redWidth, (*bitmap).redHeight, maxPixels, &maxWidth, &maxHeight); //We only need to do this once as r, g, b should be the same sizes returnCode = resizeChannel(&(*bitmap).red, (*bitmap).redWidth, (*bitmap).redHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { njDone(); freeUnsignedCharArray(&(*bitmap).red); return returnCode; } // Set red channel dimensions if ((*bitmap).redWidth >= maxWidth && (*bitmap).redHeight >= maxHeight) { (*bitmap).redWidth = maxWidth; (*bitmap).redHeight = maxHeight; } // Decode green channel returnCode = decodeJpegChannel(jpegData, jpegSize, 1, &(*bitmap).green, &(*bitmap).greenWidth, &(*bitmap).greenHeight); if (returnCode != MEMORY_OK) { LOGE("Failed to decode green channel"); njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); return returnCode; } doTransforms(bitmap, 0, 1, 0); // Resize green channel returnCode = resizeChannel(&(*bitmap).green, (*bitmap).greenWidth, (*bitmap).greenHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); return returnCode; } // Set green channel dimensions if ((*bitmap).greenWidth >= maxWidth && (*bitmap).greenHeight >= maxHeight) { (*bitmap).greenWidth = maxWidth; (*bitmap).greenHeight = maxHeight; } // Decode blue channel returnCode = decodeJpegChannel(jpegData, jpegSize, 2, &(*bitmap).blue, &(*bitmap).blueWidth, &(*bitmap).blueHeight); if (returnCode != MEMORY_OK) { LOGE("Failed to decode blue channel"); njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } doTransforms(bitmap, 0, 0, 1); // Resize blue channel returnCode = resizeChannel(&(*bitmap).blue, (*bitmap).blueWidth, (*bitmap).blueHeight, maxWidth, maxHeight); if (returnCode != MEMORY_OK) { njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return returnCode; } // Set blue channel dimensions if ((*bitmap).blueWidth >= maxWidth && (*bitmap).blueHeight >= maxHeight) { (*bitmap).blueWidth = maxWidth; (*bitmap).blueHeight = maxHeight; } // Set the final bitmap dimensions if ((*bitmap).redWidth == (*bitmap).greenWidth && (*bitmap).redWidth == (*bitmap).blueWidth && (*bitmap).redHeight == (*bitmap).greenHeight && (*bitmap).redHeight == (*bitmap).blueHeight) { (*bitmap).width = (*bitmap).redWidth; (*bitmap).height = (*bitmap).redHeight; } else { njDone(); freeUnsignedCharArray(&(*bitmap).red); freeUnsignedCharArray(&(*bitmap).green); freeUnsignedCharArray(&(*bitmap).blue); return INCONSISTENT_BITMAP_ERROR; } njDoneLeaveRGBData(); return MEMORY_OK; }
void DebugActor::render(RenderState const& parentRS) { timeMS tm = getTimeMS(); static int fps = 0; ++_frames; if (_frames > 50) { if (tm != _startTime) { fps = int(((float)_frames / (tm - _startTime)) * 1000); } _startTime = tm; _frames = 0; } std::stringstream s; s << "fps=" << fps << std::endl; #ifdef __S3E__ int mem_used = -1; int mem_free = -1; mem_used = s3eMemoryGetInt(S3E_MEMORY_USED); mem_free = s3eMemoryGetInt(S3E_MEMORY_FREE); s << "mfree=" << mem_free << " mem=" << mem_used << std::endl; #endif const IVideoDriver::Stats& vstats = IVideoDriver::_stats; #ifdef OXYGINE_DEBUG_TRACE_LEAKS s << "objects=" << (int)ObjectBase::__getCreatedObjects().size() << std::endl; #endif #if OXYGINE_TRACE_VIDEO_STATS int primitives = 0; primitives += vstats.elements[IVideoDriver::PT_TRIANGLES] / 3; if (vstats.elements[IVideoDriver::PT_TRIANGLE_STRIP]) primitives += vstats.elements[IVideoDriver::PT_TRIANGLE_STRIP] - 2; s << "batches=" << aligned(vstats.batches, 3) << " primitives=" << aligned(primitives, 3) << std::endl; #endif s << "update=" << aligned(getStage()->_statUpdate, 2) << "ms "; s << "render=" << aligned(vstats.duration, 2) << "ms "; s << "textures=" << aligned(NativeTexture::created, 2) << " "; #ifdef __APPLE__ size_t mem; iosGetMemoryUsage(mem); s << "memory=" << mem / 1024 << "kb "; #endif #ifdef _WIN32 PROCESS_MEMORY_COUNTERS_EX pmc; GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*) &pmc, sizeof(pmc)); s << "memory=" << pmc.PrivateUsage / 1024 << "kb "; #endif if (!_debugText.empty()) { s << "\n"; s << _debugText; } _debugText = ""; _text->setText(s.str()); setHeight(_text->getTextRect().size.y + _text->getY() + 3); _bg->setSize(getSize()); Vector2 ds = core::getDisplaySize(); Vector2 pos(0, 0); switch (_corner) { case 1: pos.x = ds.x; break; case 2: pos = ds; break; case 3: pos.y = ds.y; break; } pos = getStage()->parent2local(pos); Vector2 realSize = getScaledSize(); switch (_corner) { case 1: pos.x -= realSize.x; break; case 2: pos -= realSize; break; case 3: pos.y -= realSize.y; break; } //setPosition(pos); setScale(1.0f / getStage()->getScaleX()); RenderState rs = parentRS; parentRS.material->finish(); STDRenderer renderer; STDMaterial mat(&renderer); mat.apply(0); IVideoDriver* driver = renderer.getDriver(); Rect vp(Point(0, 0), core::getDisplaySize()); driver->setViewport(vp); renderer.initCoordinateSystem(vp.getWidth(), vp.getHeight()); renderer.resetSettings(); rs.material = &mat; Actor::render(rs); renderer.drawBatch(); mat.finish(); Material::setCurrent(0); timeMS dur = getTimeMS() - tm; IVideoDriver::_stats.start += dur; }