feat: 둥근 글리프가 더 잘보이도록 가독성 수정. 한국어 글리프 굵기 수정

master
Qwreey 2023-02-01 09:33:29 +09:00
parent c2c4921018
commit b7edf6654e
9 changed files with 3658 additions and 1234 deletions

48
.trash/korean/korean.py Normal file
View File

@ -0,0 +1,48 @@
import fontforge
startKList = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
midKList = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
endKList = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''];
print(startKList.__len__())
print(midKList.__len__())
print(endKList.__len__())
def getCodepoint(start,mid,end):
return (start * 588) + (mid * 28) + end
for start in range(19):
for mid in range(21):
for end in range(28):
getCodepoint(start,mid,end)
# def
# local codes = utf8.codes;
# local floor = math.floor;
# local char = utf8.char;
# local concat = table.concat;
# local insert = table.insert
# function module.split(str)
# local returnStr = {};
# for _,code in codes(str) do -- 글자 utf 에서 코드를 가져옴
# if code >= 44032 and code <= 55199 then -- 한국어임
# local kcode = code - 44032; -- 한국어 시작점인 44032 를 뺀값
# local startK = floor(kcode / 588); -- 초성 인덱스
# local midK = floor((kcode - (startK * 588)) / 28); -- 중성 인덱스
# local endK = floor((kcode - (startK * 588) - (midK * 28))); -- 종성 인덱스
# insert(returnStr,startKList[startK]);
# insert(returnStr,midKList[midK]);
# insert(returnStr,endKList[endK]);
# else -- 한국어가 아님
# insert(returnStr,char(code));
# end
# end
# return concat(returnStr);
# end
# return module;

File diff suppressed because it is too large Load Diff

View File

@ -18,11 +18,11 @@ config = {
"Regular": [""],
},
# TODO: 이 설정은 아직 동작하지 않습니다
# 일반적인 글자 (예: a) 의 너비입니다.
# 작은 화면에 더많은 정보를 담아내려면
# 이 값을 줄이세요. 단 스캐일이 조정되지
# 않습니다
# * 기본값 550
"FontBaseWidth": 550,
# TODO: 이 설정은 아직 동작하지 않습니다

View File

@ -3,8 +3,11 @@ import os
import zipfile
import shutil
import math
from . import utility as Utility
import fontforge
link_NanumSquareNeo = "https://campaign.naver.com/nanumsquare_neo/download/NaverNanumSquareNeo.zip"
patchVersion = 2 # 업데이트 후 캐시를 무시하기 위해서 사용
# 폰트 다운로드와 열기
# 배포 방식이 zip 으로 배포이기 때문에 zipfile 라이브러리로
@ -16,32 +19,69 @@ def getFontPath():
wgetHandler.download(link_NanumSquareNeo,"assets/NanumSquareNeoKr.zip")
print("Unzipping NanumSquareNeoKr.zip",end="")
with zipfile.ZipFile("assets/NanumSquareNeoKr.zip", 'r') as zip_ref:
extractName = zip_ref.extract("NaverNanumSquareNeo/TTF/NanumSquareNeo-cBd.ttf","assets/NanumSquareNeoKr.extract")
extractName = zip_ref.extract("NaverNanumSquareNeo/TTF/NanumSquareNeo-bRg.ttf","assets/NanumSquareNeoKr.extract")
os.rename(extractName,"assets/NanumSquareNeoKr.ttf")
shutil.rmtree('assets/NanumSquareNeoKr.extract')
print(" [OK]")
return "assets/NanumSquareNeoKr.ttf"
def pasteGlyphs(target,source,baseSize=550):
def select(font):
# 한글 범위의 글립을 선택함
def selectGlyphs(font):
font.selection.none()
font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿
font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣
select(source)
# 넓은 글자 크기 (한글에 모두 적용)
wideWidth = baseSize*2
for glyph in source.selection.byGlyphs:
widthDiff = wideWidth-glyph.width # 타겟 너비와 얼마나 크기 차이가 나는지
sideAdjust = widthDiff/2 # 좌우 사이드 조정해야하는 정도
glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함
glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust))
glyph.width = wideWidth # 타겟 너비로 정확하게 설정
# 굵기/폭 설정 캐시파일 만들기
def getCache(sourcePath,baseSize=550,weight=16):
# 캐시된 파일을 확인하고 있으면 반환
filename = "assets/cache/NanumSquareNeoKr.cache_{}.base_{}.weight_{}.sfd".format(patchVersion,baseSize,weight)
if os.path.exists(filename):
return fontforge.open(filename)
# 새로운 캐시용 폰트 생성
cache=fontforge.font()
cache.encoding = 'UnicodeFull'
# 소스 폰트를 패치시킴
source=fontforge.open(sourcePath)
selectGlyphs(source)
source.changeWeight(weight) # 굵기 변경
# 너비 지정
Utility.setWidthWithSavingPosition(
font=source,targetWidth=baseSize*2
)
# 캐시에 붇여넣기
source.copy()
selectGlyphs(cache)
cache.paste()
# 캐시 폰트 저장
if not os.path.exists("assets/cache"): os.mkdir("assets/cache")
cache.save(filename)
return cache
# Regular 같은 문자열 weight 를 포인트 값으로 변경
weightStrToNum = {
"Regular": 16,
}
# 캐시를 가져와서 글리프를 타겟 폰트에 붇여넣음
def pasteGlyphs(target,sourcePath,baseSize=550,weightStr="Regular"):
# 캐시된 소스를 읽어드림
source = getCache(
sourcePath = sourcePath,
baseSize = baseSize,
weight = weightStrToNum.get(weightStr)
)
# 타겟으로 글리프 복사
selectGlyphs(source)
source.copy()
select(target)
selectGlyphs(target)
target.paste()
if __name__ == "__main__":
getFontPath()
# 캐시 닫기
source.close()

View File

@ -4,6 +4,7 @@ import os
from . import NanumSquareNeo as NanumSquareNeoLoader
from . import NotoMono as NotoMonoLoader
from . import KawaiiMono as KawaiiMonoLoader
from . import utility as Utility
def build(config=None):
# 메인 폰트 불러오기
@ -13,16 +14,21 @@ def build(config=None):
# 모든 글리프를 붇여넣을 수 있도록 인코딩을 utf full 로 변경
kawaii.encoding = 'UnicodeFull'
# 폰트 가로폭 설정
baseSize = config.get("FontBaseWidth")
if baseSize != 550:
Utility.setWidthWithSavingPosition(
font=kawaii,targetWidth=baseSize
)
# 한글 글리프 붇여넣기
if config.get("CopyKoreanGlyphs"):
# 나눔 스퀘어 네오 다운로드/불러오기
nanumSquareNeo = fontforge.open(
NanumSquareNeoLoader.getFontPath())
nanumSquareNeo = NanumSquareNeoLoader.getFontPath()
# 글리프 붇여넣기
NanumSquareNeoLoader.pasteGlyphs(
target=kawaii,baseSize=550,
source=nanumSquareNeo)
nanumSquareNeo.close()
target=kawaii,baseSize=baseSize,weightStr="Regular",
sourcePath=nanumSquareNeo)
if (config.get("CopyJapaneseGlyphs") or
config.get("CopyCJKUnifiedIdeographs")):

4
src/liga/liga.py Normal file
View File

@ -0,0 +1,4 @@
def pasteGlyphs(target,sourceList):

View File

9
src/utility.py Normal file
View File

@ -0,0 +1,9 @@
import math
def setWidthWithSavingPosition(font,targetWidth):
for glyph in font.selection.byGlyphs:
widthDiff = targetWidth-glyph.width # 타겟 너비와 얼마나 크기 차이가 나는지
sideAdjust = widthDiff/2 # 좌우 사이드 조정해야하는 정도
glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함
glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust))
glyph.width = targetWidth # 타겟 너비로 정확하게 설정

6
todo.md Normal file
View File

@ -0,0 +1,6 @@
1. nerd fonts gp
생각보다 위아래로 높이가 안 맞아서 아래로 내려가는 경우가 많은거 같다 그래서 높이도 맞춰줘야 한다. 글리프 속성에 바운딩 박스로 중심점을 구한 다음에 중심점의 위치가 높이의 절반이 될 수 있도록 조정하는 장치가 있어야 한다. 그리고 두칸 이상을 삐저나가는 글리프가 있다면, 크기를 조정해서 작게 만들고, 너무 작으면 크기를 키워야 한다. 이것도 바운딩 박스로 계산해야함 (ㅎ....)
경우가 2가지 있다. 글리프를 x,y 모두 중앙으로 옮겨도 바운딩 박스가 화면을 초과하는 경우. 이 경우 x,y 모두 글리프가 초과하지 못하도록 안쪽으로 들어가게 축소를 넣어준다 (퍼센트 계산 둘다 x,y 한다 그런다음 가장 크게 줄여야 하는 퍼센트를 선택한다)