Merge branch 'fonts'

This commit is contained in:
SpaiR committed 2020-02-10 22:51:33 +03:00
commit ab29565d5b
16 files changed
+1501 -104

No files matched your search

-4
View File
@@ -164,10 +164,6 @@
<!-- See https://checkstyle.org/config_coding.html -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="HiddenField" >
<property name="ignoreSetter" value="true" />
<property name="ignoreConstructorParameter" value="true" />
</module>
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<module name="MagicNumber"/>
@@ -0,0 +1,9 @@
package imgui;
/**
* While implementing this interface, class could be manually destroyed (free allocated memory on the JNI side).
* Read javadoc and "BINDING NOTICE" for specific cases.
*/
interface ImDestroyable {
void destroy();
}
@@ -6,6 +6,7 @@ import java.nio.ByteOrder;
/**
* All draw data to render a Dear ImGui frame.
* <p>
* BINDING NOTICE: DO NOT TRY TO MODIFY FIELDS OF THIS CLASS MANUALLY! You should only access their values after {@link ImGui#render()} call.
*/
public final class ImDrawData {
@@ -0,0 +1,203 @@
package imgui;
/**
* Font runtime data and rendering
* ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32().
*/
public final class ImFont implements ImDestroyable {
final long ptr;
private ImFontGlyph fallbackGlyph = null;
/**
* This class will create a native structure.
* Call {@link #destroy()} method to manually free used memory.
*/
public ImFont() {
ImGui.touch();
ptr = nCreate();
}
ImFont(final long ptr) {
this.ptr = ptr;
}
@Override
public void destroy() {
nDestroy(ptr);
}
/*JNI
#include <imgui.h>
#include "jni_common.h"
jfieldID imFontPtrID;
#define IM_FONT ((ImFont*)env->GetLongField(object, imFontPtrID))
*/
static native void nInit(); /*
jclass jImFontClass = env->FindClass("imgui/ImFont");
imFontPtrID = env->GetFieldID(jImFontClass, "ptr", "J");
*/
private native long nCreate(); /*
ImFont* imFont = new ImFont();
return (long)imFont;
*/
private native void nDestroy(long ptr); /*
delete (ImFont*)ptr;
*/
// TODO IndexAdvanceX
/**
* = FallbackGlyph->AdvanceX
*/
public native float getFallbackAdvanceX(); /*
return IM_FONT->FallbackAdvanceX;
*/
/**
* = FallbackGlyph->AdvanceX
*/
public native void setFallbackAdvanceX(float fallbackAdvanceX); /*
IM_FONT->FallbackAdvanceX = fallbackAdvanceX;
*/
/**
* Height of characters/line, set during loading (don't change after loading)
*/
public native float getFontSize(); /*
return IM_FONT->FontSize;
*/
// TODO IndexLookup, Glyphs
/**
* = FindGlyph(FontFallbackChar)
*/
public ImFontGlyph getFallbackGlyph() {
if (fallbackGlyph == null) {
fallbackGlyph = new ImFontGlyph(nGetFallbackGlyphPtr());
}
return fallbackGlyph;
}
private native long nGetFallbackGlyphPtr(); /*
return (long)IM_FONT->FallbackGlyph;
*/
/**
* Offset font rendering by xx pixels
*/
public native void getDisplayOffset(ImVec2 dstImVec2); /*
Jni::ImVec2Cpy(env, &IM_FONT->DisplayOffset, dstImVec2);
*/
/**
* Offset font rendering by xx pixels
*/
public native void setDisplayOffset(float x, float y); /*
IM_FONT->DisplayOffset.x = x;
IM_FONT->DisplayOffset.y = y;
*/
// TODO ContainerAtlas, ConfigData
/**
* Number of ImFontConfig involved in creating this font.
* Bigger than 1 when merging multiple font sources into one ImFont.
*/
public native short getConfigDataCount(); /*
return IM_FONT->ConfigDataCount;
*/
/**
* Replacement character if a glyph isn't found.
*/
public native short getFallbackChar(); /*
return IM_FONT->FallbackChar;
*/
/**
* Character used for ellipsis rendering.
*/
public native short getEllipsisChar(); /*
return IM_FONT->EllipsisChar;
*/
/**
* Character used for ellipsis rendering.
*/
public native void setEllipsisChar(short ellipsisChar); /*
IM_FONT->EllipsisChar = (ImWchar)ellipsisChar;
*/
/**
* Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
*/
public native float getScale(); /*
return IM_FONT->Scale;
*/
/**
* Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
*/
public native void setScale(float scale); /*
IM_FONT->Scale = scale;
*/
/**
* Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
*/
public native float getAscent(); /*
return IM_FONT->Ascent;
*/
/**
* Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
*/
public native void setAscent(float ascent); /*
IM_FONT->Ascent = ascent;
*/
/**
* Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
*/
public native float getDescent(); /*
return IM_FONT->Descent;
*/
/**
* Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
*/
public native void setDescent(float descent); /*
IM_FONT->Descent = descent;
*/
/**
* Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
*/
public native int getMetricsTotalSurface(); /*
return IM_FONT->MetricsTotalSurface;
*/
/**
* Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
*/
public native void setMetricsTotalSurface(int metricsTotalSurface); /*
IM_FONT->MetricsTotalSurface = metricsTotalSurface;
*/
public native boolean getDirtyLookupTables(); /*
return IM_FONT->DirtyLookupTables;
*/
public native void setDirtyLookupTables(boolean dirtyLookupTables); /*
IM_FONT->DirtyLookupTables = dirtyLookupTables;
*/
// TODO methods
}
@@ -0,0 +1,548 @@
package imgui;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
/**
* Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding:
* - One or more fonts.
* - Custom graphics data needed to render the shapes needed by Dear ImGui.
* - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas).
* It is the user-code responsibility to setup/build the atlas, then upload the pixel data into a texture accessible by your graphics api.
* - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you.
* - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
* - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples)
* - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API.
* This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details.
* Common pitfalls:
* - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the
* atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data.
* - Important: By default, AddFontFromMemoryTTF() takes ownership of the data. Even though we are not writing to it, we will free the pointer on destruction.
* You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed,
* - Even though many functions are suffixed with "TTF", OTF data is supported just as well.
* - This is an old API and it is currently awkward for those and and various other reasons! We will address them in the future!
*/
public final class ImFontAtlas implements ImDestroyable {
final long ptr;
/**
* This class will create a native structure.
* Call {@link #destroy()} method to manually free used memory.
*/
public ImFontAtlas() {
ImGui.touch();
ptr = nCreate();
}
ImFontAtlas(final long ptr) {
this.ptr = ptr;
}
@Override
public void destroy() {
nDestroy(ptr);
}
/*JNI
#include <imgui.h>
jfieldID imFontAtlasPtrID;
#define IM_FONT_ATLAS ((ImFontAtlas*)env->GetLongField(object, imFontAtlasPtrID))
*/
static native void nInit(); /*
jclass jImFontAtlasClass = env->FindClass("imgui/ImFontAtlas");
imFontAtlasPtrID = env->GetFieldID(jImFontAtlasClass, "ptr", "J");
*/
private native long nCreate(); /*
ImFontAtlas* imFontAtlas = new ImFontAtlas();
return (long)imFontAtlas;
*/
private native void nDestroy(long ptr); /*
delete (ImFontAtlas*)ptr;
*/
public ImFont addFont(final ImFontConfig imFontConfig) {
return new ImFont(nAddFont(imFontConfig.ptr));
}
private native long nAddFont(long imFontConfigPtr); /*
return (long)IM_FONT_ATLAS->AddFont((ImFontConfig*)imFontConfigPtr);
*/
public ImFont addFontDefault() {
return new ImFont(nAddFontDefault());
}
private native long nAddFontDefault(); /*
return (long)IM_FONT_ATLAS->AddFontDefault();
*/
public ImFont addFontDefault(final ImFontConfig imFontConfig) {
return new ImFont(nAddFontDefault(imFontConfig.ptr));
}
private native long nAddFontDefault(long imFontConfigPtr); /*
return (long)IM_FONT_ATLAS->AddFontDefault((ImFontConfig*)imFontConfigPtr);
*/
public ImFont addFontFromFileTTF(final String filename, final float sizePixels) {
return new ImFont(nAddFontFromFileTTF(filename, sizePixels));
}
private native long nAddFontFromFileTTF(String filename, float sizePixels); /*
return (long)IM_FONT_ATLAS->AddFontFromFileTTF(filename, sizePixels);
*/
public ImFont addFontFromFileTTF(final String filename, final float sizePixels, final ImFontConfig imFontConfig) {
return new ImFont(nAddFontFromFileTTF(filename, sizePixels, imFontConfig.ptr));
}
private native long nAddFontFromFileTTF(String filename, float sizePixels, long imFontConfigPtr); /*
return (long)IM_FONT_ATLAS->AddFontFromFileTTF(filename, sizePixels, (ImFontConfig*)imFontConfigPtr);
*/
public ImFont addFontFromFileTTF(final String filename, final float sizePixels, final short[] glyphRanges) {
return new ImFont(nAddFontFromFileTTF(filename, sizePixels, glyphRanges));
}
private native long nAddFontFromFileTTF(String filename, float sizePixels, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromFileTTF(filename, sizePixels, NULL, (ImWchar*)&glyphRanges[0]);
*/
public ImFont addFontFromFileTTF(final String filename, final float sizePixels, final ImFontConfig imFontConfig, final short[] glyphRanges) {
return new ImFont(nAddFontFromFileTTF(filename, sizePixels, imFontConfig.ptr, glyphRanges));
}
private native long nAddFontFromFileTTF(String filename, float sizePixels, long imFontConfigPtr, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromFileTTF(filename, sizePixels, (ImFontConfig*)imFontConfigPtr, (ImWchar*)&glyphRanges[0]);
*/
/**
* Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas.
* Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
*/
public ImFont addFontFromMemoryTTF(final byte[] fontData, final float sizePixels) {
return new ImFont(nAddFontFromMemoryTTF(fontData, fontData.length, sizePixels));
}
private native long nAddFontFromMemoryTTF(byte[] fontData, int fontSize, float sizePixels); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryTTF(&fontData[0], fontSize, sizePixels);
*/
/**
* Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas.
* Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
*/
public ImFont addFontFromMemoryTTF(final byte[] fontData, final float sizePixels, final ImFontConfig imFontConfig) {
return new ImFont(nAddFontFromMemoryTTF(fontData, fontData.length, sizePixels, imFontConfig.ptr));
}
private native long nAddFontFromMemoryTTF(byte[] fontData, int fontSize, float sizePixels, long imFontConfigPtr); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryTTF(&fontData[0], fontSize, sizePixels, (ImFontConfig*)imFontConfigPtr);
*/
/**
* Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas.
* Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
*/
public ImFont addFontFromMemoryTTF(final byte[] fontData, final float sizePixels, final short[] glyphRanges) {
return new ImFont(nAddFontFromMemoryTTF(fontData, fontData.length, sizePixels, glyphRanges));
}
private native long nAddFontFromMemoryTTF(byte[] fontData, int fontSize, float sizePixels, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryTTF(&fontData[0], fontSize, sizePixels, NULL, (ImWchar*)&glyphRanges[0]);
*/
/**
* Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas.
* Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed.
*/
public ImFont addFontFromMemoryTTF(final byte[] fontData, final float sizePixels, final ImFontConfig imFontConfig, final short[] glyphRanges) {
return new ImFont(nAddFontFromMemoryTTF(fontData, fontData.length, sizePixels, imFontConfig.ptr, glyphRanges));
}
private native long nAddFontFromMemoryTTF(byte[] fontData, int fontSize, float sizePixels, long imFontConfigPtr, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryTTF(&fontData[0], fontSize, sizePixels, (ImFontConfig*)imFontConfigPtr, (ImWchar*)&glyphRanges[0]);
*/
/**
* 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
*/
public ImFont addFontFromMemoryCompressedTTF(final byte[] compressedFontData, final float sizePixels) {
return new ImFont(nAddFontFromMemoryCompressedTTF(compressedFontData, compressedFontData.length, sizePixels));
}
private native long nAddFontFromMemoryCompressedTTF(byte[] compressedFontData, int fontSize, float sizePixels); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedTTF(&compressedFontData[0], fontSize, sizePixels);
*/
/**
* 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
*/
public ImFont addFontFromMemoryCompressedTTF(final byte[] compressedFontData, final float sizePixels, final ImFontConfig imFontConfig) {
return new ImFont(nAddFontFromMemoryCompressedTTF(compressedFontData, compressedFontData.length, sizePixels, imFontConfig.ptr));
}
private native long nAddFontFromMemoryCompressedTTF(byte[] compressedFontData, int fontSize, float sizePixels, long imFontConfigPtr); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedTTF(&compressedFontData[0], fontSize, sizePixels, (ImFontConfig*)imFontConfigPtr);
*/
/**
* 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
*/
public ImFont addFontFromMemoryCompressedTTF(final byte[] compressedFontData, final float sizePixels, final short[] glyphRanges) {
return new ImFont(nAddFontFromMemoryCompressedTTF(compressedFontData, compressedFontData.length, sizePixels, glyphRanges));
}
private native long nAddFontFromMemoryCompressedTTF(byte[] compressedFontData, int fontSize, float sizePixels, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedTTF(&compressedFontData[0], fontSize, sizePixels, NULL, (ImWchar*)&glyphRanges[0]);
*/
/**
* 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
*/
public ImFont addFontFromMemoryCompressedTTF(final byte[] compressedFontData, final float sizePixels, final ImFontConfig imFontConfig, final short[] glyphRanges) {
return new ImFont(nAddFontFromMemoryCompressedTTF(compressedFontData, compressedFontData.length, sizePixels, imFontConfig.ptr, glyphRanges));
}
private native long nAddFontFromMemoryCompressedTTF(byte[] compressedFontData, int fontSize, float sizePixels, long imFontConfigPtr, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedTTF(&compressedFontData[0], fontSize, sizePixels, (ImFontConfig*)imFontConfigPtr, (ImWchar*)&glyphRanges[0]);
*/
/**
* 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
*/
public ImFont addFontFromMemoryCompressedBase85TTF(final String compressedFontDataBase85, final float sizePixels) {
return new ImFont(nAddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels));
}
private native long nAddFontFromMemoryCompressedBase85TTF(String compressedFontDataBase85, float sizePixels); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels);
*/
/**
* 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp.
*/
public ImFont addFontFromMemoryCompressedBase85TTF(final String compressedFontDataBase85, final float sizePixels, final ImFontConfig imFontConfig) {
return new ImFont(nAddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels, imFontConfig.ptr));
}
private native long nAddFontFromMemoryCompressedBase85TTF(String compressedFontDataBase85, float sizePixels, long imFontConfigPtr); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels, (ImFontConfig*)imFontConfigPtr);
*/
/**
* 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
*/
public ImFont addFontFromMemoryCompressedBase85TTF(final String compressedFontDataBase85, final float sizePixels, final short[] glyphRanges) {
return new ImFont(nAddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels, glyphRanges));
}
private native long nAddFontFromMemoryCompressedBase85TTF(String compressedFontDataBase85, float sizePixels, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels, NULL, (ImWchar*)&glyphRanges[0]);
*/
/**
* 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter.
*/
public ImFont addFontFromMemoryCompressedBase85TTF(final String compressedFontDataBase85, final float sizePixels, final ImFontConfig imFontConfig, final short[] glyphRanges) {
return new ImFont(nAddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels, imFontConfig.ptr, glyphRanges));
}
private native long nAddFontFromMemoryCompressedBase85TTF(String compressedFontDataBase85, float sizePixels, long imFontConfigPtr, short[] glyphRanges); /*
return (long)IM_FONT_ATLAS->AddFontFromMemoryCompressedBase85TTF(compressedFontDataBase85, sizePixels, (ImFontConfig*)imFontConfigPtr, (ImWchar*)&glyphRanges[0]);
*/
/**
* Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts.
*/
public native void clearInputData(); /*
IM_FONT_ATLAS->ClearInputData();
*/
/**
* Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory.
*/
public native void clearTexData(); /*
IM_FONT_ATLAS->ClearTexData();
*/
/**
* Clear output font data (glyphs storage, UV coordinates).
*/
public native void clearFonts(); /*
IM_FONT_ATLAS->ClearFonts();
*/
/**
* Clear all input and output.
*/
public native void clear(); /*
IM_FONT_ATLAS->Clear();
*/
// Build atlas, retrieve pixel data.
// User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().
// The pitch is always = Width * BytesPerPixels (1 or 4)
// Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into
// the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste.
/**
* Build pixels data. This is called automatically for you by the GetTexData*** functions.
*/
public native boolean build(); /*
return IM_FONT_ATLAS->Build();
*/
/**
* 1 byte-per-pixel
*/
public ByteBuffer getTexDataAsAlpha8(final ImInt outWidth, final ImInt outHeight) {
return getTexDataAsAlpha8(outWidth, outHeight, new ImInt());
}
/**
* 1 byte-per-pixel
*/
public ByteBuffer getTexDataAsAlpha8(final ImInt outWidth, final ImInt outHeight, final ImInt outBytesPerPixel) {
final byte[] tmpBuff = getTexDataAsAlpha8(outWidth.data, outHeight.data, outBytesPerPixel.data);
final ByteBuffer buffer = ByteBuffer.allocateDirect(tmpBuff.length).order(ByteOrder.nativeOrder());
buffer.put(tmpBuff);
buffer.flip();
return buffer;
}
private native byte[] getTexDataAsAlpha8(int[] outWidth, int[] outHeight, int[] outBytesPerPixel); /*
unsigned char* pixels;
IM_FONT_ATLAS->GetTexDataAsAlpha8(&pixels, &outWidth[0], &outHeight[0], &outBytesPerPixel[0]);
int size = outWidth[0] * outHeight[0] * outBytesPerPixel[0];
jbyteArray jBytes = env->NewByteArray(size);
env->SetByteArrayRegion(jBytes, 0, size, (jbyte*)pixels);
return jBytes;
*/
/**
* 4 bytes-per-pixel
*/
public ByteBuffer getTexDataAsRGBA32(final ImInt outWidth, final ImInt outHeight) {
return getTexDataAsRGBA32(outWidth, outHeight, new ImInt());
}
/**
* 4 bytes-per-pixel
*/
public ByteBuffer getTexDataAsRGBA32(final ImInt outWidth, final ImInt outHeight, final ImInt outBytesPerPixel) {
final byte[] tmpBuff = nGetTexDataAsRGBA32(outWidth.data, outHeight.data, outBytesPerPixel.data);
final ByteBuffer buffer = ByteBuffer.allocateDirect(tmpBuff.length).order(ByteOrder.nativeOrder());
buffer.put(tmpBuff);
buffer.flip();
return buffer;
}
private native byte[] nGetTexDataAsRGBA32(int[] outWidth, int[] outHeight, int[] outBytesPerPixel); /*
unsigned char* pixels;
IM_FONT_ATLAS->GetTexDataAsRGBA32(&pixels, &outWidth[0], &outHeight[0], &outBytesPerPixel[0]);
int size = outWidth[0] * outHeight[0] * outBytesPerPixel[0];
jbyteArray jBytes = env->NewByteArray(size);
env->SetByteArrayRegion(jBytes, 0, size, (jbyte*)pixels);
return jBytes;
*/
public native boolean isBuilt(); /*
return IM_FONT_ATLAS->IsBuilt();
*/
public native void setTexID(int imTextureId); /*
IM_FONT_ATLAS->SetTexID((ImTextureID)imTextureId);
*/
//-------------------------------------------
// Glyph Ranges
//-------------------------------------------
// Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
// NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details.
// NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data.
/*JNI
#define RETURN_GLYPH_2_SHORT(glyphs) \
int size = sizeof(glyphs); \
jshortArray jShorts = env->NewShortArray(size); \
env->SetShortArrayRegion(jShorts, 0, size, (jshort*)glyphs); \
return jShorts;
*/
/**
* Basic Latin, Extended Latin
*/
public native short[] getGlyphRangesDefault(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesDefault());
*/
/**
* Default + Korean characters
*/
public native short[] getGlyphRangesKorean(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesKorean());
*/
/**
* Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
*/
public native short[] getGlyphRangesJapanese(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesJapanese());
*/
/**
* Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs
*/
public native short[] getGlyphRangesChineseFull(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesChineseFull());
*/
/**
* Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese
*/
public native short[] getGlyphRangesChineseSimplifiedCommon(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesChineseSimplifiedCommon());
*/
/**
* Default + about 400 Cyrillic characters
*/
public native short[] getGlyphRangesCyrillic(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesCyrillic());
*/
/**
* Default + Thai characters
*/
public native short[] getGlyphRangesThai(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesThai());
*/
/**
* Default + Vietnamese characters
*/
public native short[] getGlyphRangesVietnamese(); /*
RETURN_GLYPH_2_SHORT(IM_FONT_ATLAS->GetGlyphRangesVietnamese());
*/
//-------------------------------------------
// [BETA] Custom Rectangles/Glyphs API
//-------------------------------------------
// You can request arbitrary rectangles to be packed into the atlas, for your own purposes.
// After calling Build(), you can query the rectangle position and render your pixels.
// You can also request your rectangles to be mapped as font glyph (given a font + Unicode point),
// so you can render e.g. custom colorful icons and use them as regular glyphs.
// Read docs/FONTS.txt for more details about using colorful icons.
/**
* Id needs to be >= 0x110000. Id >= 0x80000000 are reserved for ImGui and ImDrawList
*/
public native int addCustomRectRegular(int id, int width, int height); /*
return IM_FONT_ATLAS->AddCustomRectRegular((unsigned int)id, width, height);
*/
/**
* Id needs to be < 0x110000 to register a rectangle to map into a specific font.
*/
public int addCustomRectFontGlyph(final ImFont imFont, final short id, final int width, final int height, final float advanceX) {
return nAddCustomRectFontGlyph(imFont.ptr, id, width, height, advanceX);
}
private native int nAddCustomRectFontGlyph(long imFontPtr, short id, int width, int height, float advanceX); /*
return IM_FONT_ATLAS->AddCustomRectFontGlyph((ImFont*)imFontPtr, id, width, height, advanceX);
*/
/**
* Id needs to be < 0x110000 to register a rectangle to map into a specific font.
*/
public int addCustomRectFontGlyph(final ImFont imFont, final short id, final int width, final int height, final float advanceX, final float offsetX, final float offsetY) {
return nAddCustomRectFontGlyph(imFont.ptr, id, width, height, advanceX, offsetX, offsetY);
}
private native int nAddCustomRectFontGlyph(long imFontPtr, short id, int width, int height, float advanceX, float offsetX, float offsetY); /*
return IM_FONT_ATLAS->AddCustomRectFontGlyph((ImFont*)imFontPtr, id, width, height, advanceX, ImVec2(offsetX, offsetY));
*/
// TODO GetCustomRectByIndex
//-------------------------------------------
// Members
//-------------------------------------------
/**
* Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
*/
public native boolean getLocked(); /*
return IM_FONT_ATLAS->Locked;
*/
/**
* Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert.
*/
public native void setLocked(boolean locked); /*
IM_FONT_ATLAS->Locked = locked;
*/
/**
* Build flags (see ImFontAtlasFlags_)
*/
public native int getFlags(); /*
return IM_FONT_ATLAS->Flags;
*/
/**
* Build flags (see ImFontAtlasFlags_)
*/
public native void setFlags(int imFontAtlasFlags); /*
IM_FONT_ATLAS->Flags = imFontAtlasFlags;
*/
/**
* User data to refer to the texture once it has been uploaded to user's graphic systems.
* It is passed back to you during rendering via the ImDrawCmd structure.
*/
public native int getTexID(); /*
return (int)(long)(void*)IM_FONT_ATLAS->TexID;
*/
/**
* Texture width desired by user before Build(). Must be a power-of-two.
* If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
*/
public native int getTexDesiredWidth(); /*
return IM_FONT_ATLAS->TexDesiredWidth;
*/
/**
* Texture width desired by user before Build(). Must be a power-of-two.
* If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
*/
public native void setTexDesiredWidth(int texDesiredWidth); /*
IM_FONT_ATLAS->TexDesiredWidth = texDesiredWidth;
*/
/**
* Padding between glyphs within texture in pixels. Defaults to 1.
* If your rendering method doesn't rely on bilinear filtering you may set this to 0.
*/
public native int getTexGlyphPadding(); /*
return IM_FONT_ATLAS->TexGlyphPadding;
*/
/**
* Padding between glyphs within texture in pixels. Defaults to 1.
* If your rendering method doesn't rely on bilinear filtering you may set this to 0.
*/
public native void setTexGlyphPadding(int texGlyphPadding); /*
IM_FONT_ATLAS->TexGlyphPadding = texGlyphPadding;
*/
}
@@ -0,0 +1,321 @@
package imgui;
public final class ImFontConfig implements ImDestroyable {
final long ptr;
private short[] glyphRanges;
/**
* This class will create a native structure.
* Call {@link #destroy()} method to manually free used memory.
*/
public ImFontConfig() {
ImGui.touch();
ptr = nCreate();
setFontDataOwnedByAtlas(false); // Read method javadoc
}
ImFontConfig(final long ptr) {
this.ptr = ptr;
setFontDataOwnedByAtlas(false); // Read method javadoc
}
@Override
public void destroy() {
nDestroy(ptr);
}
/*JNI
#include <imgui.h>
#include "jni_common.h"
jfieldID imFontConfigPtrID;
#define IM_FONT_CONFIG ((ImFontConfig*)env->GetLongField(object, imFontConfigPtrID))
*/
static native void nInit(); /*
jclass jImFontConfigClass = env->FindClass("imgui/ImFontConfig");
imFontConfigPtrID = env->GetFieldID(jImFontConfigClass, "ptr", "J");
*/
private native long nCreate(); /*
ImFontConfig* imFontConfig = new ImFontConfig();
return (long)imFontConfig;
*/
private native void nDestroy(long ptr); /*
delete (ImFontConfig*)ptr;
*/
/**
* TTF/OTF data
*/
public native byte[] getFontData(); /*
int size = IM_FONT_CONFIG->FontDataSize;
jbyteArray jBytes = env->NewByteArray(size);
env->SetByteArrayRegion(jBytes, 0, size, (jbyte*)IM_FONT_CONFIG->FontData);
return jBytes;
*/
/**
* TTF/OTF data
*/
public native void setFontData(byte[] fontData); /*
IM_FONT_CONFIG->FontData = &fontData[0];
*/
/**
* TTF/OTF data size
*/
public native int getFontDataSize(); /*
return IM_FONT_CONFIG->FontDataSize;
*/
/**
* TTF/OTF data size
*/
public native void setFontDataSize(int fontDataSize); /*
IM_FONT_CONFIG->FontDataSize = fontDataSize;
*/
/**
* TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
*/
public native boolean getFontDataOwnedByAtlas(); /*
return IM_FONT_CONFIG->FontDataOwnedByAtlas;
*/
/**
* TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
* <p>
* BINDING NOTICE: By default binding will set this value to <b>false</b>.
* If this is not done, Dear ImGui will try to free memory allocated by JVM to store fonts data while running {@link ImGui#destroyContext()}.
* This will result into a native exception, since JVM by itself controls it's own resources.
*/
public native void setFontDataOwnedByAtlas(boolean isFontDataOwnedByAtlas); /*
IM_FONT_CONFIG->FontDataOwnedByAtlas = isFontDataOwnedByAtlas;
*/
/**
* Index of font within TTF/OTF file
*/
public native int getFontNo(); /*
return IM_FONT_CONFIG->FontNo;
*/
/**
* Index of font within TTF/OTF file
*/
public native void setFontNo(int fontNo); /*
IM_FONT_CONFIG->FontNo = fontNo;
*/
/**
* Size in pixels for rasterizer (more or less maps to the resulting font height).
*/
public native float getSizePixels(); /*
return IM_FONT_CONFIG->SizePixels;
*/
/**
* Size in pixels for rasterizer (more or less maps to the resulting font height).
*/
public native void setSizePixels(float sizePixels); /*
IM_FONT_CONFIG->SizePixels = sizePixels;
*/
/**
* Rasterize at higher quality for sub-pixel positioning.
* Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
*/
public native int getOversampleH(); /*
return IM_FONT_CONFIG->OversampleH;
*/
/**
* Rasterize at higher quality for sub-pixel positioning.
* Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
*/
public native void setOversampleH(int oversampleH); /*
IM_FONT_CONFIG->OversampleH = oversampleH;
*/
/**
* Rasterize at higher quality for sub-pixel positioning.
* We don't use sub-pixel positions on the Y axis.
*/
public native int getOversampleV(); /*
return IM_FONT_CONFIG->OversampleV;
*/
/**
* Rasterize at higher quality for sub-pixel positioning.
* We don't use sub-pixel positions on the Y axis.
*/
public native void setOversampleV(int oversampleV); /*
IM_FONT_CONFIG->OversampleV = oversampleV;
*/
/**
* Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font.
* If enabled, you can set OversampleH/V to 1.
*/
public native boolean getPixelSnapH(); /*
return IM_FONT_CONFIG->PixelSnapH;
*/
/**
* Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font.
* If enabled, you can set OversampleH/V to 1.
*/
public native void setPixelSnapH(boolean isPixelSnapH); /*
IM_FONT_CONFIG->PixelSnapH = isPixelSnapH;
*/
/**
* Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
*/
public native void getGlyphExtraSpacing(ImVec2 dstImVec2); /*
Jni::ImVec2Cpy(env, &IM_FONT_CONFIG->GlyphExtraSpacing, dstImVec2);
*/
/**
* Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
*/
public native void setGlyphExtraSpacing(float x, float y); /*
IM_FONT_CONFIG->GlyphExtraSpacing.x = x;
IM_FONT_CONFIG->GlyphExtraSpacing.y = y;
*/
/**
* Offset all glyphs from this font input.
*/
public native void getGlyphOffset(ImVec2 dstImVec2); /*
Jni::ImVec2Cpy(env, &IM_FONT_CONFIG->GlyphOffset, dstImVec2);
*/
/**
* Offset all glyphs from this font input.
*/
public native void setGlyphOffset(float x, float y); /*
IM_FONT_CONFIG->GlyphOffset.x = x;
IM_FONT_CONFIG->GlyphOffset.y = y;
*/
/**
* Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list).
* THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.
*/
public short[] getGlyphRanges() {
return glyphRanges;
}
/**
* Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list).
* THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE.
*/
public void setGlyphRanges(final short[] glyphRanges) {
this.glyphRanges = glyphRanges;
nSetGlyphRanges(glyphRanges);
}
private native void nSetGlyphRanges(short[] glyphRanges); /*
IM_FONT_CONFIG->GlyphRanges = glyphRanges != NULL ? (ImWchar*)&glyphRanges[0] : NULL;
*/
/**
* Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font
*/
public native float getGlyphMinAdvanceX(); /*
return IM_FONT_CONFIG->GlyphMinAdvanceX;
*/
/**
* Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font
*/
public native void setGlyphMinAdvanceX(float glyphMinAdvanceX); /*
IM_FONT_CONFIG->GlyphMinAdvanceX = glyphMinAdvanceX;
*/
/**
* Maximum AdvanceX for glyphs
*/
public native float getGlyphMaxAdvanceX(); /*
return IM_FONT_CONFIG->GlyphMaxAdvanceX;
*/
/**
* Maximum AdvanceX for glyphs
*/
public native void setGlyphMaxAdvanceX(float glyphMaxAdvanceX); /*
IM_FONT_CONFIG->GlyphMaxAdvanceX = glyphMaxAdvanceX;
*/
/**
* Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs).
* You may want to use GlyphOffset.y when merge font of different heights.
*/
public native boolean getMergeMode(); /*
return IM_FONT_CONFIG->MergeMode;
*/
/**
* Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs).
* You may want to use GlyphOffset.y when merge font of different heights.
*/
public native void setMergeMode(boolean mergeMode); /*
IM_FONT_CONFIG->MergeMode = mergeMode;
*/
/**
* Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one.
*/
public native int getRasterizerFlags(); /*
return IM_FONT_CONFIG->RasterizerFlags;
*/
/**
* Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one.
*/
public native void setRasterizerFlags(int rasterizerFlags); /*
IM_FONT_CONFIG->RasterizerFlags = (unsigned int)rasterizerFlags;
*/
/**
* Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.
*/
public native float getRasterizerMultiply(); /*
return IM_FONT_CONFIG->RasterizerMultiply;
*/
/**
* Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.
*/
public native void setRasterizerMultiply(float rasterizerMultiply); /*
IM_FONT_CONFIG->RasterizerMultiply = rasterizerMultiply;
*/
/**
* Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
*/
public native short getEllipsisChar(); /*
return (short)IM_FONT_CONFIG->EllipsisChar;
*/
/**
* Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
*/
public native void setEllipsisChar(short ellipsisChar); /*
IM_FONT_CONFIG->EllipsisChar = (ImWchar)ellipsisChar;
*/
// [Internal]
/**
* Name (strictly to ease debugging)
*/
public native void setName(String name); /*
strcpy(IM_FONT_CONFIG->Name, name);
*/
}
@@ -0,0 +1,186 @@
package imgui;
public final class ImFontGlyph implements ImDestroyable {
final long ptr;
/**
* This class will create a native structure.
* Call {@link #destroy()} method to manually free used memory.
*/
public ImFontGlyph() {
ImGui.touch();
ptr = nCreate();
}
ImFontGlyph(final long ptr) {
this.ptr = ptr;
}
@Override
public void destroy() {
nDestroy(ptr);
}
/*JNI
#include <imgui.h>
#include "jni_common.h"
jfieldID imFontGlyphPtrID;
#define IM_FONT_GLYPH ((ImFontGlyph*)env->GetLongField(object, imFontGlyphPtrID))
*/
static native void nInit(); /*
jclass jImFontGlyphClass = env->FindClass("imgui/ImFontGlyph");
imFontGlyphPtrID = env->GetFieldID(jImFontGlyphClass, "ptr", "J");
*/
private native long nCreate(); /*
ImFontConfig* imFontConfig = new ImFontConfig();
return (long)imFontConfig;
*/
private native void nDestroy(long ptr); /*
delete (ImFontConfig*)ptr;
*/
/**
* 0x0000..0xFFFF
*/
public native short getCodepoint(); /*
return (short)IM_FONT_GLYPH->Codepoint;
*/
/**
* 0x0000..0xFFFF
*/
public native void setCodepoint(short codepoint); /*
IM_FONT_GLYPH->Codepoint = (ImWchar)codepoint;
*/
/**
* Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in)
*/
public native float getAdvanceX(); /*
return IM_FONT_GLYPH->AdvanceX;
*/
/**
* Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in)
*/
public native void setAdvanceX(float advanceX); /*
IM_FONT_GLYPH->AdvanceX = advanceX;
*/
/**
* Glyph corners
*/
public native float getX0(); /*
return IM_FONT_GLYPH->X0;
*/
/**
* Glyph corners
*/
public native void setX0(float x0); /*
IM_FONT_GLYPH->X0 = x0;
*/
/**
* Glyph corners
*/
public native float getY0(); /*
return IM_FONT_GLYPH->Y0;
*/
/**
* Glyph corners
*/
public native void setY0(float y0); /*
IM_FONT_GLYPH->Y0 = y0;
*/
/**
* Glyph corners
*/
public native float getX1(); /*
return IM_FONT_GLYPH->X1;
*/
/**
* Glyph corners
*/
public native void setX1(float x1); /*
IM_FONT_GLYPH->X1 = x1;
*/
/**
* Glyph corners
*/
public native float getY1(); /*
return IM_FONT_GLYPH->Y1;
*/
/**
* Glyph corners
*/
public native void setY1(float y1); /*
IM_FONT_GLYPH->Y1 = y1;
*/
/**
* Texture coordinates
*/
public native float getU0(); /*
return IM_FONT_GLYPH->U0;
*/
/**
* Texture coordinates
*/
public native void setU0(float u0); /*
IM_FONT_GLYPH->U0 = u0;
*/
/**
* Texture coordinates
*/
public native float getV0(); /*
return IM_FONT_GLYPH->V0;
*/
/**
* Texture coordinates
*/
public native void setV0(float v0); /*
IM_FONT_GLYPH->V0 = v0;
*/
/**
* Texture coordinates
*/
public native float getU1(); /*
return IM_FONT_GLYPH->U1;
*/
/**
* Texture coordinates
*/
public native void setU1(float u1); /*
IM_FONT_GLYPH->U1 = u1;
*/
/**
* Texture coordinates
*/
public native float getV1(); /*
return IM_FONT_GLYPH->V1;
*/
/**
* Texture coordinates
*/
public native void setV1(float v1); /*
IM_FONT_GLYPH->V1 = v1;
*/
}
+50 -7
View File
@@ -17,14 +17,16 @@ public final class ImGui {
private static final String LIB_NAME_DEFAULT = System.getProperty("os.arch").contains("64") ? "imgui-java64" : "imgui-java";
private static final String LIB_TMP_DIR_PREFIX = "imgui-java-bin_" + System.getProperty("user.name", "user");
private static final ImDrawData DRAW_DATA = new ImDrawData(100_000, 100_000, 1000);
private static final ImGuiIO IMGUI_IO = new ImGuiIO();
private static final ImGuiStyle IMGUI_STYLE = new ImGuiStyle();
private static final ImDrawData DRAW_DATA;
private static final ImGuiIO IMGUI_IO;
private static final ImGuiStyle IMGUI_STYLE;
private static final ImDrawList IM_DRAW_LIST_WINDOW = new ImDrawList(ImDrawList.TYPE_WINDOW);
private static final ImDrawList IM_DRAW_LIST_BACKGROUND = new ImDrawList(ImDrawList.TYPE_BACKGROUND);
private static final ImDrawList IM_DRAW_LIST_FOREGROUND = new ImDrawList(ImDrawList.TYPE_FOREGROUND);
private static ImFont font;
static {
final String libPath = System.getProperty(LIB_PATH_PROP);
final String libName = System.getProperty(LIB_NAME_PROP, LIB_NAME_DEFAULT);
@@ -40,9 +42,17 @@ public final class ImGui {
System.loadLibrary(libName);
}
DRAW_DATA = new ImDrawData(100_000, 100_000, 1000);
IMGUI_IO = new ImGuiIO();
IMGUI_STYLE = new ImGuiStyle();
nInitJni();
ImDrawList.nInit();
ImDrawData.nInit();
ImFontAtlas.nInit();
ImFontConfig.nInit();
ImFontGlyph.nInit();
ImFont.nInit();
nInitInputTextData();
}
@@ -81,6 +91,14 @@ public final class ImGui {
}
}
/**
* For internal usage.
* Method is used to initiate static instantiation (loading of the native libraries etc.).
* Otherwise native libraries will be loaded on demand and natively mapped objects won't work.
*/
static void touch() {
}
private ImGui() {
}
@@ -107,7 +125,13 @@ public final class ImGui {
ImGui::CreateContext();
*/
// public static void CreateContext(ImFontAtlas sharedFontAtlas) TODO create context with fonts
public static void createContext(ImFontAtlas sharedFontAtlas) {
nCreateContext(sharedFontAtlas.ptr);
}
private static native void nCreateContext(long sharedFontAtlasPtr); /*
ImGui::CreateContext((ImFontAtlas*)sharedFontAtlasPtr);
*/
public static native void destroyContext(); /*
ImGui::DestroyContext();
@@ -769,7 +793,13 @@ public final class ImGui {
// Parameters stacks (shared)
// TODO void PushFont(ImFont* font);
public static void pushFont(ImFont font) {
nPushFont(font.ptr);
}
private static native void nPushFont(long fontPtr); /*
ImGui::PushFont((ImFont*)fontPtr);
*/
public static native void popFont(); /*
ImGui::PopFont();
@@ -815,7 +845,19 @@ public final class ImGui {
Jni::ImVec4Cpy(env, ImGui::GetStyleColorVec4(imGuiStyleVar), dstImVec4);
*/
// TODO ImFont* GetFont();
/**
* Get current font.
*/
public static ImFont getFont() {
if (font == null) {
font = new ImFont(nGetFont());
}
return font;
}
private static native long nGetFont(); /*
return (long)ImGui::GetFont();
*/
/**
* Get current font size (= height in pixels) of current font with current scale applied
@@ -854,6 +896,7 @@ public final class ImGui {
/**
* Retrieve given color with style alpha applied
* <p>
* BINDING NOTICE: Since {@link #getColorU32(int)} has the same signature, this specific method has an 'i' suffix.
*/
public static native int getColorU32i(int col); /*
@@ -1196,6 +1239,7 @@ public final class ImGui {
/**
* Formatted text
* <p>
* BINDING NOTICE: Since all text formatting could be done on Java side, this call is equal to {@link ImGui#textUnformatted(String)}.
*/
public static native void text(String text); /*
@@ -3349,7 +3393,6 @@ public final class ImGui {
*/
// Widgets: List Boxes
// - FIXME: To be consistent with all the newer API, ListBoxHeader/ListBoxFooter should in reality be called BeginListBox/EndListBox. Will rename them.
public static void listBox(String label, ImInt currentItem, String[] items, int itemsCount) {
nListBox(label, currentItem.data, items, itemsCount, -1);
+66 -6
View File
@@ -8,6 +8,8 @@ import imgui.callbacks.ImStrSupplier;
* Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
*/
public final class ImGuiIO {
private ImFontAtlas imFontAtlas;
ImGuiIO() {
}
@@ -152,11 +154,70 @@ public final class ImGuiIO {
ImGui::GetIO().KeyRepeatRate = keyRepeatRate;
*/
// TODO fonts configuration
/**
* Font atlas: load, rasterize and pack one or more fonts into a single texture.
*/
public ImFontAtlas getFonts() {
// on demand instantiation
// will throw native exception if Dear ImGui context isn't created (like in the original library)
if (imFontAtlas == null) {
imFontAtlas = new ImFontAtlas(nGetFontsPtr());
}
return imFontAtlas;
}
// BINDING NOTICE: this is a stub to pass important for ImGui info
public native void setFontsTexID(int id); /*
ImGui::GetIO().Fonts->TexID = (ImTextureID)id;
private native long nGetFontsPtr(); /*
return (long)ImGui::GetIO().Fonts;
*/
/**
* Font atlas: load, rasterize and pack one or more fonts into a single texture.
* <p>
* BINDING NOTICE: You SHOULD manually destroy previously used ImFontAtlas.
*/
public void setFonts(final ImFontAtlas imFontAtlas) {
this.imFontAtlas = imFontAtlas;
nSetFonts(imFontAtlas.ptr);
}
private native void nSetFonts(long imFontAtlasPtr); /*
ImGui::GetIO().Fonts = (ImFontAtlas*)imFontAtlasPtr;
*/
/**
* Global scale all fonts
*/
public native float getFontGlobalScale(); /*
return ImGui::GetIO().FontGlobalScale;
*/
/**
* Global scale all fonts
*/
public native void setFontGlobalScale(float fontGlobalScale); /*
ImGui::GetIO().FontGlobalScale = fontGlobalScale;
*/
/**
* Allow user scaling text of individual window with CTRL+Wheel.
*/
public native boolean getFontAllowUserScaling(); /*
return ImGui::GetIO().FontAllowUserScaling;
*/
/**
* Allow user scaling text of individual window with CTRL+Wheel.
*/
public native void setFontAllowUserScaling(boolean fontAllowUserScaling); /*
ImGui::GetIO().FontAllowUserScaling = fontAllowUserScaling;
*/
public void setFontDefault(final ImFont fontDefault) {
nSetFontDefault(fontDefault.ptr);
}
private native void nSetFontDefault(long fontDefaultPtr); /*
ImGui::GetIO().FontDefault = (ImFont*)fontDefaultPtr;
*/
// Miscellaneous options
@@ -626,8 +687,7 @@ public final class ImGuiIO {
* Queue new character input.
*/
public native void addInputCharacter(int c); /*
if (c > 0 && c < 0x10000)
ImGui::GetIO().AddInputCharacter((unsigned short)c);
ImGui::GetIO().AddInputCharacter((unsigned int)c);
*/
/**
@@ -440,4 +440,8 @@ public final class ImGuiStyle {
env->DeleteLocalRef(jColors);
}
*/
public native void scaleAllSizes(float scaleFactor); /*
ImGui::GetStyle().ScaleAllSizes(scaleFactor);
*/
}
@@ -1,48 +0,0 @@
package imgui;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public final class TexDataRGBA32 {
public int width;
public int height;
public ByteBuffer pixelBuffer;
private TexDataRGBA32() {
final int pixelMax = 131072;
pixelBuffer = ByteBuffer.allocateDirect(pixelMax).order(ByteOrder.nativeOrder());
}
public static TexDataRGBA32 create() {
final TexDataRGBA32 data = new TexDataRGBA32();
data.nFillData(data.pixelBuffer);
return data;
}
/*JNI
#include <imgui.h>
*/
private native void nFillData(Buffer pixelBuf); /*
jclass jTexDataClass = env->GetObjectClass(object);
if(jTexDataClass == NULL)
return;
jfieldID widthID = env->GetFieldID(jTexDataClass, "width", "I");
jfieldID heightID = env->GetFieldID(jTexDataClass, "height", "I");
unsigned char* pixels;
int width, height;
ImGuiIO& io = ImGui::GetIO();
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
env->SetIntField(object, widthID, width);
env->SetIntField(object, heightID, height);
memcpy(pixelBuf, pixels, width * height * 4);
*/
}
@@ -1,14 +1,16 @@
package imgui.gl3;
import imgui.ImDrawData;
import imgui.ImFontAtlas;
import imgui.ImGui;
import imgui.TexDataRGBA32;
import imgui.ImInt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UncheckedIOException;
import java.nio.ByteBuffer;
import java.util.Objects;
import static org.lwjgl.opengl.GL30.*;
@@ -191,18 +193,21 @@ public final class ImGuiImplGl3 {
}
private void prepareFont() {
final TexDataRGBA32 texData = TexDataRGBA32.create();
gFontTexture = glGenTextures();
final ImFontAtlas fontAtlas = ImGui.getIO().getFonts();
final ImInt width = new ImInt();
final ImInt height = new ImInt();
final ByteBuffer buffer = fontAtlas.getTexDataAsRGBA32(width, height);
glBindTexture(GL_TEXTURE_2D, gFontTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texData.width, texData.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texData.pixelBuffer);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width.get(), height.get(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
ImGui.getIO().setFontsTexID(gFontTexture);
fontAtlas.setTexID(gFontTexture);
}
private void backupGlState() {
+103 -34
View File
@@ -1,4 +1,6 @@
import imgui.ImBool;
import imgui.ImFontAtlas;
import imgui.ImFontConfig;
import imgui.ImGui;
import imgui.ImGuiIO;
import imgui.ImString;
@@ -11,13 +13,16 @@ import imgui.enums.ImGuiConfigFlags;
import imgui.enums.ImGuiInputTextFlags;
import imgui.enums.ImGuiKey;
import imgui.enums.ImGuiMouseCursor;
import imgui.enums.ImGuiWindowFlags;
import imgui.gl3.ImGuiImplGl3;
import org.lwjgl.glfw.GLFWErrorCallback;
import org.lwjgl.glfw.GLFWVidMode;
import org.lwjgl.opengl.GL;
import org.lwjgl.system.MemoryStack;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.nio.IntBuffer;
import java.util.Objects;
@@ -47,16 +52,16 @@ public final class ImGuiGlfwExample {
// Mouse cursors provided by GLFW
private final long[] mouseCursors = new long[ImGuiMouseCursor.COUNT];
// LWJGL3 rendered itself (SHOULD be initialized)
private final ImGuiImplGl3 imGuiGl3 = new ImGuiImplGl3();
// Local app variables go here
private final String imguiDemoLink = "https://raw.githubusercontent.com/ocornut/imgui/v1.74/imgui_demo.cpp";
private final byte[] testPayload = "Test Payload".getBytes();
// Local variables for application goes here
private final String imguiDemoLink = "https://raw.githubusercontent.com/ocornut/imgui/v1.74/imgui_demo.cpp"; // Link to put into clipboard
private final byte[] testPayload = "Test Payload".getBytes(); // Test data for payload. Should be represented as raw byt array.
private String dropTargetText = "Drop Here";
private float[] backgroundColor = new float[]{0.5f, 0, 0};
private float[] backgroundColor = new float[]{0.5f, 0, 0}; // To modify background color dynamically
private int clickCount = 0;
private final ImString resizableStr = new ImString(5);
private final ImBool showDemoWindow = new ImBool();
public void run() {
@@ -67,7 +72,7 @@ public final class ImGuiGlfwExample {
destroyGlfw();
}
// Method initializes GLFW window. All code is mostly a copy-paste from the official LWJGL3 website.
// Method initializes GLFW window. All code is mostly a copy-paste from the official LWJGL3 "Get Started": https://www.lwjgl.org/guide
private void initGlfw() {
// Setup an error callback. The default implementation
// will print the error message in System.err.
@@ -85,7 +90,7 @@ public final class ImGuiGlfwExample {
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE); // the window will be maximized
// Create the window
window = glfwCreateWindow(DEFAULT_WIDTH, DEFAULT_HEIGHT, "ImGui+GLFW+LWJGL Example", NULL, NULL);
window = glfwCreateWindow(DEFAULT_WIDTH, DEFAULT_HEIGHT, "Dear ImGui + GLFW + LWJGL Example", NULL, NULL);
if (window == NULL) {
throw new RuntimeException("Failed to create the GLFW window");
@@ -122,22 +127,21 @@ public final class ImGuiGlfwExample {
// Here we will initialize ImGui stuff.
private void initImGui() {
// IMPORTANT!!
// This line is critical for ImGui to work.
// This line is critical for Dear ImGui to work.
ImGui.createContext();
// ImGui provides three different color schemas for styling. We will use the classic one here.
// ImGui provides 3 different color schemas for styling. We will use the classic one here.
// Try others with ImGui.styleColors*() methods.
ImGui.styleColorsClassic();
// ImGui.StyleColorsDark(); // This is a default style for ImGui
// ImGui.StyleColorsLight();
// Initialize ImGuiIO config
final ImGuiIO io = ImGui.getIO();
io.setIniFilename(null);
io.setConfigFlags(ImGuiConfigFlags.NavEnableKeyboard);
io.setBackendFlags(ImGuiBackendFlags.HasMouseCursors);
io.setBackendPlatformName("imgui_java_impl_glfw");
io.setBackendRendererName("imgui_java_impl_lwjgl");
io.setIniFilename(null); // We don't want to save .ini file
io.setConfigFlags(ImGuiConfigFlags.NavEnableKeyboard); // Navigation with keyboard
io.setBackendFlags(ImGuiBackendFlags.HasMouseCursors); // Mouse cursors to display while resizing windows etc.
io.setBackendPlatformName("imgui_java_impl_glfw"); // For debug purpose
io.setBackendRendererName("imgui_java_impl_lwjgl"); // For debug purpose
// Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array.
final int[] keyMap = new int[ImGuiKey.COUNT];
@@ -175,7 +179,9 @@ public final class ImGuiGlfwExample {
mouseCursors[ImGuiMouseCursor.ResizeNWSE] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
mouseCursors[ImGuiMouseCursor.Hand] = glfwCreateStandardCursor(GLFW_HAND_CURSOR);
// Here goes GLFW callbacks to update user input stuff in ImGui
// ------------------------------------------------------------
// Here goes GLFW callbacks to update user input in Dear ImGui
glfwSetKeyCallback(window, (w, key, scancode, action, mods) -> {
if (action == GLFW_PRESS) {
io.setKeysDown(key, true);
@@ -230,10 +236,41 @@ public final class ImGuiGlfwExample {
}
});
// Initialize renderer itself
// ------------------------------------------------------------
// Fonts configuration
final ImFontAtlas fontAtlas = io.getFonts();
// Dear ImGui uses 'ProggyClean.ttf, 13px' by default
fontAtlas.addFontDefault();
final ImFontConfig fontConfig = new ImFontConfig(); // Keep in mind that creation of the ImFontConfig will allocate native memory
fontConfig.setRasterizerMultiply(1.2f); // This will make fonts a bit more readable
fontConfig.setGlyphRanges(fontAtlas.getGlyphRangesCyrillic()); // Additional glyphs could be added like here or in addFontFrom*() methods
// We can add new fonts directly from file
fontAtlas.addFontFromFileTTF("imgui-lwjgl3/src/test/resources/DroidSans.ttf", 13, fontConfig);
fontAtlas.addFontFromFileTTF("imgui-lwjgl3/src/test/resources/DroidSans.ttf", 14, fontConfig);
fontAtlas.addFontFromFileTTF("imgui-lwjgl3/src/test/resources/JetBrainsMono-Regular.ttf", 13, fontConfig);
fontAtlas.addFontFromFileTTF("imgui-lwjgl3/src/test/resources/JetBrainsMono-Regular.ttf", 14, fontConfig);
// Or directly from memory
fontConfig.setName("Roboto-Regular.ttf, 13px"); // This name will be displayed in Style Editor
fontAtlas.addFontFromMemoryTTF(loadFromResources("Roboto-Regular.ttf"), 13, fontConfig);
fontConfig.setName("Roboto-Regular.ttf, 14px"); // We can apply a new config value every time we add a new font
fontAtlas.addFontFromMemoryTTF(loadFromResources("Roboto-Regular.ttf"), 14, fontConfig);
// After fonts were added and since we won't use fontConfig again - we should clean it
fontConfig.destroy();
// IMPORTANT!!!
// Method initializes renderer itself.
// This method SHOULD be called after you've initialized your ImGui configuration (fonts and so on).
// ImGui context should be created as well.
imGuiGl3.init();
}
// Main application loop
private void loop() {
double time = 0; // to track our frame delta value
@@ -244,8 +281,9 @@ public final class ImGuiGlfwExample {
final double deltaTime = (time > 0) ? (currentTime - time) : 1f / 60f;
time = currentTime;
// Set the clear color
// Set the clear color and do clear itself
glClearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
// Get window size properties and mouse position
glfwGetWindowSize(window, winWidth, winHeight);
@@ -265,16 +303,13 @@ public final class ImGuiGlfwExample {
glfwSetCursor(window, mouseCursors[imguiCursor]);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
// Clear the framebuffer
glClear(GL_COLOR_BUFFER_BIT);
// IMPORTANT!!
// Any ImGui code SHOULD go between NewFrame()/Render() methods
// Any Dear ImGui code SHOULD go between NewFrame()/Render() methods
ImGui.newFrame();
showUi(); // ImGui calls goes here
showUi();
ImGui.render();
// After ImGui#render call we provide draw data into LWJGL3 render.
// After ImGui#render call we provide draw data into LWJGL3 renderer.
// At that moment ImGui will be rendered to the current OpenGL context.
imGuiGl3.render(ImGui.getDrawData());
@@ -289,9 +324,14 @@ public final class ImGuiGlfwExample {
ImGui.setNextWindowSize(600, 300, ImGuiCond.Once);
ImGui.setNextWindowPos(10, 10, ImGuiCond.Once);
ImGui.begin("Custom window", ImGuiWindowFlags.NoDecoration); // Start Custom window
ImGui.text("Hello from Java!");
ImGui.begin("Custom window"); // Start Custom window
// Simple text label
ImGui.checkbox("Show demo window", showDemoWindow);
ImGui.separator();
// Drag'n'Drop functionality
ImGui.button("Drag me");
if (ImGui.beginDragDropSource()) {
ImGui.setDragDropPayload("payload_type", testPayload, testPayload.length);
@@ -308,11 +348,13 @@ public final class ImGuiGlfwExample {
ImGui.endDragDropTarget();
}
// Color picker
ImGui.alignTextToFramePadding();
ImGui.text("Background color:");
ImGui.sameLine();
ImGui.colorEdit3("##click_counter_col", backgroundColor, ImGuiColorEditFlags.NoInputs | ImGuiColorEditFlags.NoDragDrop);
// Simple click counter
if (ImGui.button("Click")) {
clickCount++;
}
@@ -321,14 +363,24 @@ public final class ImGuiGlfwExample {
}
ImGui.sameLine();
ImGui.text("Count: " + clickCount);
ImGui.checkbox("Show demo window", showDemoWindow);
ImGui.newLine();
ImGui.inputText("Resizable input", resizableStr, ImGuiInputTextFlags.CallbackResize);
ImGui.text(String.format("text len: %d | buffer size: %d", resizableStr.getLength(), resizableStr.getBufferSize()));
ImGui.newLine();
ImGui.separator();
// Input field with auto-resize ability
ImGui.text("You can use text inputs with auto-resizable strings!");
ImGui.inputText("Resizable input", resizableStr, ImGuiInputTextFlags.CallbackResize);
ImGui.text("text len:");
ImGui.sameLine();
ImGui.textColored(.12f, .6f, 1, 1, Integer.toString(resizableStr.getLength()));
ImGui.sameLine();
ImGui.text("| buffer size:");
ImGui.sameLine();
ImGui.textColored(1, .6f, 0, 1, Integer.toString(resizableStr.getBufferSize()));
ImGui.separator();
ImGui.newLine();
// Link to the original demo file
ImGui.text("Consider to look the original ImGui demo: ");
ImGui.setNextItemWidth(500);
ImGui.textColored(0, .8f, 0, 1, imguiDemoLink);
@@ -361,6 +413,23 @@ public final class ImGuiGlfwExample {
Objects.requireNonNull(glfwSetErrorCallback(null)).free();
}
private byte[] loadFromResources(final String fileName) {
try (InputStream is = Objects.requireNonNull(ImGuiGlfwExample.class.getClassLoader().getResourceAsStream(fileName));
ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
final byte[] data = new byte[16384];
int nRead;
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
return buffer.toByteArray();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
public static void main(final String[] args) {
new ImGuiGlfwExample().run();
}
Binary file not shown.
Binary file not shown.