1
0
mirror of https://github.com/lxsang/Diya-API.git synced 2024-12-27 03:48:21 +01:00
Diya-API/Diya/OpenGLFontTex.class.st

190 lines
4.7 KiB
Smalltalk
Raw Normal View History

2022-03-04 20:28:38 +01:00
Class {
#name : #OpenGLFontTex,
#superclass : #OpenGLTexImage2D,
#instVars : [
'charmap',
'cellw',
2022-03-06 18:33:10 +01:00
'cellh',
2022-03-16 21:33:35 +01:00
'spacing',
'fontSize',
'colp',
'rowp',
'face',
'maxbearing',
2022-03-21 01:45:21 +01:00
'maxrows',
'meanww'
2022-03-04 20:28:38 +01:00
],
#pools : [
'OpenGLConstants',
'OpenGLTypes'
],
#category : #'Diya-Fonts'
}
{ #category : #'instance creation' }
OpenGLFontTex class >> fromFace: face ofSize: size [
^self new fromFace: face ofSize: size; yourself
2022-03-04 20:28:38 +01:00
]
{ #category : #'instance creation' }
OpenGLFontTex >> blitPixel8: bitmap at: offset size: size [
size = (0@0) ifTrue:[^self].
0 to: size y - 1 do: [ :i|
LibC memCopy: (bitmap getHandle + (i* (size x))) to:(data getHandle + ((i + offset y) * width + (offset x) )) size: size x
2022-03-16 21:33:35 +01:00
].
2022-03-04 20:28:38 +01:00
]
{ #category : #accessing }
OpenGLFontTex >> cellh [
^ cellh
2022-03-04 20:28:38 +01:00
]
{ #category : #accessing }
OpenGLFontTex >> cellw [
^ cellw
2022-03-04 20:28:38 +01:00
]
{ #category : #accessing }
OpenGLFontTex >> charmap [
^ charmap
]
2022-03-06 18:33:10 +01:00
{ #category : #accessing }
OpenGLFontTex >> drop [
OpenGL
pixelstorei: GL_UNPACK_ALIGNMENT param: 4;
disable: GL_CULL_FACE;
disable: GL_BLEND.
]
2022-03-16 21:33:35 +01:00
{ #category : #accessing }
OpenGLFontTex >> fontSize [
^ fontSize
]
{ #category : #'instance creation' }
OpenGLFontTex >> fromFace: aFace ofSize: size [
2022-03-21 01:45:21 +01:00
|minhang rec iptr charcode w numw|
2022-03-16 21:33:35 +01:00
fontSize := size.
face := aFace.
charmap := Dictionary new.
face setPixelWidth:0 height: self fontSize.
cellw := cellh := minhang := maxbearing := 0.
2022-03-16 21:33:35 +01:00
iptr := FFIExternalArray externalNewType: GLuint size:1.
iptr at:1 put: 0.
rec := (FTFaceRec fromHandle: face getHandle).
2022-03-16 21:33:35 +01:00
charcode := face getFirstChar: iptr getHandle.
2022-03-21 01:45:21 +01:00
meanww := 0.
numw := 0.
2022-03-16 21:33:35 +01:00
[ (iptr at: 1) = 0 ] whileFalse: [
face loadCharacter: charcode flags: (1 << 2).
w := ((rec glyph metrics width) >> 6).
(w > (size << 1)) ifFalse:[
maxbearing := maxbearing max: ((rec glyph metrics horiBearingY) >> 6).
cellw := cellw max: w.
minhang := minhang min: ((( rec glyph metrics horiBearingY) - (rec glyph metrics height)) >> 6).
2022-03-21 01:45:21 +01:00
meanww := meanww + w.
numw := numw + 1.
2022-03-16 21:33:35 +01:00
].
charcode := face getNextChar: charcode iptr: iptr getHandle.
].
cellh := maxbearing - minhang.
spacing := (cellw >> 2) asInteger.
2022-03-21 01:45:21 +01:00
meanww := meanww / numw.
maxrows := 8.
data := FFIExternalArray externalNewType: GLubyte size:cellw * cellh * (maxrows << 5).
LibC memset: data getHandle value: 0 size: data size.
width := cellw << 5.
height := cellh.
data autoRelease.
2022-03-16 21:33:35 +01:00
iptr free.
]
{ #category : #accessing }
OpenGLFontTex >> genGlyph:c [
|rec offset glyph gsize|
face setPixelWidth:0 height: self fontSize.
face loadCharacter: c flags: (1 << 2).
rec := (FTFaceRec fromHandle: face getHandle).
gsize := ((rec glyph metrics width) >> 6)@((rec glyph metrics height) >> 6).
offset := (colp * cellw) @ (rowp*cellh).
glyph := (DiyaFontGlyph origin: offset extent: ((gsize x) @ cellh)).
glyph
bearing: face glyph hBearing asFloatPoint;
advance: face glyph advance;
tex: self.
self blitPixel8: rec glyph bitmap buffer at: (offset x) @ ((offset y) + maxbearing - ((rec glyph metrics horiBearingY) >> 6) ) size: gsize.
colp := (colp + 1) % 32.
colp = 0 ifTrue:[
rowp := rowp + 1.
height := height + cellh.
rowp >= maxrows ifTrue:[
self reallocateBuffer.
].
].
^glyph
]
2022-03-06 12:07:20 +01:00
{ #category : #accessing }
OpenGLFontTex >> getGlyph: c [
^(self charmap at: c ifAbsentPut:[self genGlyph:c])
2022-03-06 12:07:20 +01:00
]
{ #category : #initialization }
OpenGLFontTex >> initialize [
super initialize.
2022-03-16 21:33:35 +01:00
charmap := Dictionary new.
data := nil.
2022-03-04 20:28:38 +01:00
level := 0.
border := 0.
format := GL_ALPHA.
internalFormat := GL_ALPHA.
2022-03-04 20:28:38 +01:00
type := GL_UNSIGNED_BYTE.
target := GL_TEXTURE_2D.
colp := 0.
rowp := 0.
2022-03-04 20:28:38 +01:00
]
{ #category : #accessing }
OpenGLFontTex >> linespace [
^ cellh
]
2022-03-21 01:45:21 +01:00
{ #category : #accessing }
OpenGLFontTex >> meanww [
^ meanww
]
{ #category : #accessing }
OpenGLFontTex >> reallocateBuffer [
|newbuffer|
maxrows := maxrows + 4.
newbuffer := FFIExternalArray externalNewType: GLubyte size:cellw * cellh * (maxrows << 5).
LibC memset: newbuffer getHandle value: 0 size: newbuffer size.
LibC memCopy: data getHandle to: newbuffer getHandle size: data size.
newbuffer autoRelease.
data free.
data := newbuffer
]
2022-03-06 18:33:10 +01:00
{ #category : #accessing }
OpenGLFontTex >> setup [
OpenGL
enable: GL_CULL_FACE;
enable: GL_BLEND;
blendFnWithSfactor: GL_SRC_ALPHA dfactor: GL_ONE_MINUS_SRC_ALPHA;
pixelstorei: GL_UNPACK_ALIGNMENT param: 1.
OpenGLTexture
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_WRAP_S param: GL_CLAMP_TO_EDGE;
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_WRAP_T param: GL_CLAMP_TO_EDGE;
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_MIN_FILTER param: GL_LINEAR;
parameteri: GL_TEXTURE_2D pname: GL_TEXTURE_MAG_FILTER param: GL_LINEAR.
]
{ #category : #accessing }
OpenGLFontTex >> spacing [
2022-03-06 18:33:10 +01:00
^ spacing
2022-03-04 20:28:38 +01:00
]