2
0

BsScriptPixelUtility.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "BsScriptPixelUtility.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoClass.h"
  4. #include "BsMonoUtil.h"
  5. #include "BsDebug.h"
  6. #include "BsScriptPixelData.h"
  7. namespace BansheeEngine
  8. {
  9. ScriptPixelUtility::ScriptPixelUtility(MonoObject* instance)
  10. :ScriptObject(instance)
  11. { }
  12. void ScriptPixelUtility::initRuntimeData()
  13. {
  14. metaData.scriptClass->addInternalCall("Internal_GetMemorySize", &ScriptPixelUtility::internal_getMemorySize);
  15. metaData.scriptClass->addInternalCall("Internal_HasAlpha", &ScriptPixelUtility::internal_hasAlpha);
  16. metaData.scriptClass->addInternalCall("Internal_IsFloatingPoint", &ScriptPixelUtility::internal_isFloatingPoint);
  17. metaData.scriptClass->addInternalCall("Internal_IsCompressed", &ScriptPixelUtility::internal_isCompressed);
  18. metaData.scriptClass->addInternalCall("Internal_IsDepth", &ScriptPixelUtility::internal_isDepth);
  19. metaData.scriptClass->addInternalCall("Internal_GetMaxMipmaps", &ScriptPixelUtility::internal_getMaxMipmaps);
  20. metaData.scriptClass->addInternalCall("Internal_ConvertFormat", &ScriptPixelUtility::internal_convertFormat);
  21. metaData.scriptClass->addInternalCall("Internal_Compress", &ScriptPixelUtility::internal_compress);
  22. metaData.scriptClass->addInternalCall("Internal_GenerateMipmaps", &ScriptPixelUtility::internal_generateMipmaps);
  23. metaData.scriptClass->addInternalCall("Internal_Scale", &ScriptPixelUtility::internal_scale);
  24. metaData.scriptClass->addInternalCall("Internal_ApplyGamma", &ScriptPixelUtility::internal_applyGamma);
  25. }
  26. void ScriptPixelUtility::internal_getMemorySize(UINT32 width, UINT32 height, UINT32 depth, PixelFormat format, UINT32* value)
  27. {
  28. *value = PixelUtil::getMemorySize(width, height, depth, format);
  29. }
  30. void ScriptPixelUtility::internal_hasAlpha(PixelFormat format, bool* value)
  31. {
  32. *value = PixelUtil::hasAlpha(format);
  33. }
  34. void ScriptPixelUtility::internal_isFloatingPoint(PixelFormat format, bool* value)
  35. {
  36. *value = PixelUtil::isFloatingPoint(format);
  37. }
  38. void ScriptPixelUtility::internal_isCompressed(PixelFormat format, bool* value)
  39. {
  40. *value = PixelUtil::isCompressed(format);
  41. }
  42. void ScriptPixelUtility::internal_isDepth(PixelFormat format, bool* value)
  43. {
  44. *value = PixelUtil::isDepth(format);
  45. }
  46. void ScriptPixelUtility::internal_getMaxMipmaps(UINT32 width, UINT32 height, UINT32 depth, PixelFormat format, UINT32* value)
  47. {
  48. *value = PixelUtil::getMaxMipmaps(width, height, depth, format);
  49. }
  50. MonoObject* ScriptPixelUtility::internal_convertFormat(MonoObject* source, PixelFormat newFormat)
  51. {
  52. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  53. if (sourceScriptPixelData == nullptr)
  54. return nullptr;
  55. PixelDataPtr sourcePixelData = sourceScriptPixelData->getInternalValue();
  56. PixelDataPtr outputData = bs_shared_ptr<PixelData>(sourcePixelData->getWidth(), sourcePixelData->getHeight(),
  57. sourcePixelData->getDepth(), newFormat);
  58. outputData->allocateInternalBuffer();
  59. PixelUtil::bulkPixelConversion(*sourcePixelData, *outputData);
  60. return ScriptPixelData::create(outputData);
  61. }
  62. MonoObject* ScriptPixelUtility::internal_compress(MonoObject* source, CompressionOptions options)
  63. {
  64. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  65. if (sourceScriptPixelData == nullptr)
  66. return nullptr;
  67. PixelDataPtr sourcePixelData = sourceScriptPixelData->getInternalValue();
  68. PixelDataPtr outputData = bs_shared_ptr<PixelData>(sourcePixelData->getWidth(), sourcePixelData->getHeight(),
  69. sourcePixelData->getDepth(), options.format);
  70. outputData->allocateInternalBuffer();
  71. PixelUtil::compress(*sourcePixelData, *outputData, options);
  72. return ScriptPixelData::create(outputData);
  73. }
  74. MonoArray* ScriptPixelUtility::internal_generateMipmaps(MonoObject* source, MipMapGenOptions options)
  75. {
  76. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  77. if (sourceScriptPixelData == nullptr)
  78. return nullptr;
  79. PixelDataPtr sourcePixelData = sourceScriptPixelData->getInternalValue();
  80. Vector<PixelDataPtr> mipmaps = PixelUtil::genMipmaps(*sourcePixelData, options);
  81. UINT32 numElements = (UINT32)mipmaps.size();
  82. MonoArray* outputArray = mono_array_new(MonoManager::instance().getDomain(),
  83. ScriptPixelData::getMetaData()->scriptClass->_getInternalClass(), numElements);
  84. for (UINT32 i = 0; i < numElements; i++)
  85. {
  86. MonoObject* managedPixelData = ScriptPixelData::create(mipmaps[i]);
  87. mono_array_set(outputArray, MonoObject*, i, managedPixelData);
  88. }
  89. return outputArray;
  90. }
  91. MonoObject* ScriptPixelUtility::internal_scale(MonoObject* source, PixelVolume newSize, PixelUtil::Filter filter)
  92. {
  93. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  94. if (sourceScriptPixelData == nullptr)
  95. return nullptr;
  96. PixelDataPtr sourcePixelData = sourceScriptPixelData->getInternalValue();
  97. PixelDataPtr outputData = bs_shared_ptr<PixelData>(sourcePixelData->getWidth(), sourcePixelData->getHeight(),
  98. sourcePixelData->getDepth(), sourcePixelData->getFormat());
  99. outputData->allocateInternalBuffer();
  100. PixelUtil::scale(*sourcePixelData, *outputData, filter);
  101. return ScriptPixelData::create(outputData);
  102. }
  103. void ScriptPixelUtility::internal_applyGamma(MonoObject* source, float gamma)
  104. {
  105. ScriptPixelData* sourceScriptPixelData = ScriptPixelData::toNative(source);
  106. if (sourceScriptPixelData == nullptr)
  107. return;
  108. PixelDataPtr pixelData = sourceScriptPixelData->getInternalValue();
  109. PixelUtil::applyGamma(pixelData->getData(), gamma, pixelData->getSize(), PixelUtil::getNumElemBits(pixelData->getFormat()));
  110. }
  111. }