aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/05Font/05Font.vcxproj2
-rw-r--r--build/libjin/libjin.vcxproj2
-rw-r--r--libjin/Graphics/Font.cpp50
-rw-r--r--libjin/Graphics/Font.h8
-rw-r--r--libjin/Graphics/Mesh.cpp11
-rw-r--r--libjin/Graphics/Mesh.h18
-rw-r--r--libjin/Graphics/OpenGL.h15
-rw-r--r--test/05Font/main.cpp18
8 files changed, 92 insertions, 32 deletions
diff --git a/build/05Font/05Font.vcxproj b/build/05Font/05Font.vcxproj
index 5827205..046472d 100644
--- a/build/05Font/05Font.vcxproj
+++ b/build/05Font/05Font.vcxproj
@@ -22,7 +22,7 @@
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{D1953718-E728-4A86-9CCF-8BEC1F5C5F97}</ProjectGuid>
<RootNamespace>My05Font</RootNamespace>
- <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+ <WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
diff --git a/build/libjin/libjin.vcxproj b/build/libjin/libjin.vcxproj
index 7e7051c..9dac72a 100644
--- a/build/libjin/libjin.vcxproj
+++ b/build/libjin/libjin.vcxproj
@@ -126,7 +126,7 @@
<ProjectGuid>{407E9199-D39C-4460-B218-0C29AB42483B}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>libjin</RootNamespace>
- <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+ <WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
diff --git a/libjin/Graphics/Font.cpp b/libjin/Graphics/Font.cpp
index 9d21dba..c1afd53 100644
--- a/libjin/Graphics/Font.cpp
+++ b/libjin/Graphics/Font.cpp
@@ -118,40 +118,49 @@ namespace graphics
void Font::print(const char* t, int x, int y)
{
- // typesetting
- vector<GlyphArrayDrawInfo> glyphinfolist;
- vector<GlyphVertex> glyphvertices;
+ Page* page = typeset(t, x, y);
+ render(page);
+ delete page;
+ }
+
+ Page* Font::typeset(const char* t, int x, int y)
+ {
+ // typesetting
+ Page* page = new Page();
+ vector<GlyphArrayDrawInfo>& glyphinfolist = page->glyphinfolist;
+ vector<GlyphVertex>& glyphvertices = page->glyphvertices;
Vector2<int> p(x, y);
Codepoint c;
int texture = -1;
Glyph* glyph = nullptr;
GlyphVertex vertex;
- for(int i = 0; *t != NULL; i+=4)
+ for (int i = 0; *t != NULL; i += 4)
{
t = utf8toCodepoint(t, &c);
- if (c == 0x0D) continue;
- /* new line */
+ if (c == 0x0D)
+ continue;
+ /* new line */
if (c == 0x0A)
{
p.y += descent;
- p.x = 0;
+ p.x = x;
continue;
}
glyph = findGlyph(c);
if (texture != glyph->atlas)
{
GlyphArrayDrawInfo info;
- info.start = i;
- info.count = 0;
- info.texture = glyph->atlas;
+ info.start = i;
+ info.count = 0;
+ info.texture = glyph->atlas;
texture = glyph->atlas;
glyphinfolist.push_back(info);
}
glyphinfolist[glyphinfolist.size() - 1].count += 4;
Glyph::Bbox& bbox = glyph->bbox;
// 1
- vertex.x = p.x; vertex.u = bbox.x;
- vertex.y = p.y; vertex.v = bbox.y;
+ vertex.x = p.x; vertex.u = bbox.x;
+ vertex.y = p.y; vertex.v = bbox.y;
glyphvertices.push_back(vertex);
// 2
vertex.x = p.x; vertex.u = bbox.x;
@@ -162,19 +171,24 @@ namespace graphics
vertex.y = p.y + glyph->height; vertex.v = bbox.y + bbox.height;
glyphvertices.push_back(vertex);
// 4
- vertex.x = p.x + glyph->width; vertex.u = bbox.x + bbox.width;
- vertex.y = p.y; vertex.v = bbox.y;
+ vertex.x = p.x + glyph->width; vertex.u = bbox.x + bbox.width;
+ vertex.y = p.y; vertex.v = bbox.y;
glyphvertices.push_back(vertex);
p.x += glyph->width;
}
+ return page;
+ }
- // draw
+ void Font::render(const Page* page)
+ {
+ const vector<GlyphArrayDrawInfo>& glyphinfolist = page->glyphinfolist;
+ const vector<GlyphVertex>& glyphvertices = page->glyphvertices;
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
for (int i = 0; i < glyphinfolist.size(); ++i)
{
- GlyphArrayDrawInfo& info = glyphinfolist[i];
+ const GlyphArrayDrawInfo& info = glyphinfolist[i];
glBindTexture(GL_TEXTURE_2D, info.texture);
glVertexPointer(2, GL_INT, sizeof(GlyphVertex), &glyphvertices[info.start].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(GlyphVertex), &glyphvertices[info.start].u);
@@ -188,14 +202,14 @@ namespace graphics
glBindTexture(GL_TEXTURE_2D, 1);
float xy[] = {
0,0,
- 0,textureHeight,
+ 0,textureHeight,
textureWidth, textureHeight,
textureWidth, 0
};
float uv[] = {
0, 0,
0, 1,
- 1, 1,
+ 1, 1,
1, 0
};
glVertexPointer(2, GL_FLOAT, 0, xy);
diff --git a/libjin/Graphics/Font.h b/libjin/Graphics/Font.h
index a39e6a6..e944b41 100644
--- a/libjin/Graphics/Font.h
+++ b/libjin/Graphics/Font.h
@@ -40,6 +40,12 @@ namespace graphics
unsigned int width, height;
};
+ struct Page
+ {
+ std::vector<GlyphArrayDrawInfo> glyphinfolist;
+ std::vector<GlyphVertex> glyphvertices;
+ };
+
class Font
{
public:
@@ -48,6 +54,8 @@ namespace graphics
static Font* createFont(FontData* fontData, unsigned int fontSzie);
void print(const char* text, int x, int y);
+ Page* typeset(const char* text, int x, int y);
+ void render(const Page* page);
#if defined(font_debug)
void drawAtlas();
#endif
diff --git a/libjin/Graphics/Mesh.cpp b/libjin/Graphics/Mesh.cpp
index e69de29..503a189 100644
--- a/libjin/Graphics/Mesh.cpp
+++ b/libjin/Graphics/Mesh.cpp
@@ -0,0 +1,11 @@
+#include "Mesh.h"
+
+namespace jin
+{
+namespace graphics
+{
+
+
+
+}
+} \ No newline at end of file
diff --git a/libjin/Graphics/Mesh.h b/libjin/Graphics/Mesh.h
index 6f70f09..d0bb93e 100644
--- a/libjin/Graphics/Mesh.h
+++ b/libjin/Graphics/Mesh.h
@@ -1 +1,17 @@
-#pragma once
+#ifndef __LIBJIN_MESH_H
+#define __LIBJIN_MESH_H
+
+namespace jin
+{
+namespace graphics
+{
+
+ class Mesh
+ {
+
+ };
+
+}
+}
+
+#endif \ No newline at end of file
diff --git a/libjin/Graphics/OpenGL.h b/libjin/Graphics/OpenGL.h
index f73650b..2f087be 100644
--- a/libjin/Graphics/OpenGL.h
+++ b/libjin/Graphics/OpenGL.h
@@ -1,5 +1,8 @@
#ifndef __LIBJIN_OPENGL_H
#define __LIBJIN_OPENGL_H
+#include <vector>
+#include "../3rdparty/GLee/GLee.h"
+#include "Color.h"
namespace jin
{
@@ -10,9 +13,19 @@ namespace graphics
class OpenGL
{
public:
- void bindTexture();
+ OpenGL();
+
+ void bindTexture(GLuint texture);
+
+ private:
+ std::vector<Color> color;
+
+ ~OpenGL();
};
+
+ /* OpenGL instance singleton */
+ extern OpenGL gl;
}
}
diff --git a/test/05Font/main.cpp b/test/05Font/main.cpp
index 1388537..78a1142 100644
--- a/test/05Font/main.cpp
+++ b/test/05Font/main.cpp
@@ -17,19 +17,17 @@ void onLoad()
uniform float dt;
Color effect(Color col, Texture tex, vec2 uv, vec2 screen)
{
- float d = 130;
- float f = clamp(abs((screen.x - d * sin(dt))/75), 0, 1);
- return vec4(col.r*(f), col.g*(1-f + 0.5), 0,Texel(tex, uv).a);
- //return Texel(tex, uv);
+ float a = Texel(tex, uv).a;
+ return Color(col.rgb, a/5);
}
)";
shader = JSLProgram::createJSLProgram(program);
Filesystem* fs = Filesystem::get();
fs->mount("../Debug");
Buffer buffer;
- fs->read("font.ttf", &buffer);
+ fs->read("simhei.ttf", &buffer);
data = FontData::createFontData((const unsigned char*)buffer.data, buffer.size);
- font = Font::createFont(data, 17);
+ font = Font::createFont(data, 14);
//canvas = Canvas::createCanvas(100, 100);
}
@@ -56,10 +54,10 @@ void onDraw()
if (font != nullptr)
{
glColor4f(1, 1, 1, 1);
- font->print(u8"Hello, world!", 10, 10);
- font->print(u8"Привет мир!", 10, 10 + 15 * 1);
- font->print(u8"こんにちは世界!", 10, 10 + 15 * 2);
- font->print(u8"你好世界!", 10, 10 + 15*3);
+ font->print(u8"Hello,你好\n啊 world!", 10, 10);
+ //font->print(u8"Привет мир!", 10, 10 + 15 * 1);
+ //font->print(u8"こんにちは世界!", 10, 10 + 15 * 2);
+ //font->print(u8"你好世界!", 10, 10 + 15*3);
glColor4f(1, 1, 1, 1);
}
shader->unuse();