feat: 둥근 글리프가 더 잘보이도록 가독성 수정. 한국어 글리프 굵기 수정
parent
c2c4921018
commit
b7edf6654e
|
@ -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
|
@ -18,11 +18,11 @@ config = {
|
||||||
"Regular": [""],
|
"Regular": [""],
|
||||||
},
|
},
|
||||||
|
|
||||||
# TODO: 이 설정은 아직 동작하지 않습니다
|
|
||||||
# 일반적인 글자 (예: a) 의 너비입니다.
|
# 일반적인 글자 (예: a) 의 너비입니다.
|
||||||
# 작은 화면에 더많은 정보를 담아내려면
|
# 작은 화면에 더많은 정보를 담아내려면
|
||||||
# 이 값을 줄이세요. 단 스캐일이 조정되지
|
# 이 값을 줄이세요. 단 스캐일이 조정되지
|
||||||
# 않습니다
|
# 않습니다
|
||||||
|
# * 기본값 550
|
||||||
"FontBaseWidth": 550,
|
"FontBaseWidth": 550,
|
||||||
|
|
||||||
# TODO: 이 설정은 아직 동작하지 않습니다
|
# TODO: 이 설정은 아직 동작하지 않습니다
|
||||||
|
|
|
@ -3,8 +3,11 @@ import os
|
||||||
import zipfile
|
import zipfile
|
||||||
import shutil
|
import shutil
|
||||||
import math
|
import math
|
||||||
|
from . import utility as Utility
|
||||||
|
import fontforge
|
||||||
|
|
||||||
link_NanumSquareNeo = "https://campaign.naver.com/nanumsquare_neo/download/NaverNanumSquareNeo.zip"
|
link_NanumSquareNeo = "https://campaign.naver.com/nanumsquare_neo/download/NaverNanumSquareNeo.zip"
|
||||||
|
patchVersion = 2 # 업데이트 후 캐시를 무시하기 위해서 사용
|
||||||
|
|
||||||
# 폰트 다운로드와 열기
|
# 폰트 다운로드와 열기
|
||||||
# 배포 방식이 zip 으로 배포이기 때문에 zipfile 라이브러리로
|
# 배포 방식이 zip 으로 배포이기 때문에 zipfile 라이브러리로
|
||||||
|
@ -16,32 +19,69 @@ def getFontPath():
|
||||||
wgetHandler.download(link_NanumSquareNeo,"assets/NanumSquareNeoKr.zip")
|
wgetHandler.download(link_NanumSquareNeo,"assets/NanumSquareNeoKr.zip")
|
||||||
print("Unzipping NanumSquareNeoKr.zip",end="")
|
print("Unzipping NanumSquareNeoKr.zip",end="")
|
||||||
with zipfile.ZipFile("assets/NanumSquareNeoKr.zip", 'r') as zip_ref:
|
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")
|
os.rename(extractName,"assets/NanumSquareNeoKr.ttf")
|
||||||
shutil.rmtree('assets/NanumSquareNeoKr.extract')
|
shutil.rmtree('assets/NanumSquareNeoKr.extract')
|
||||||
print(" [OK]")
|
print(" [OK]")
|
||||||
return "assets/NanumSquareNeoKr.ttf"
|
return "assets/NanumSquareNeoKr.ttf"
|
||||||
|
|
||||||
def pasteGlyphs(target,source,baseSize=550):
|
# 한글 범위의 글립을 선택함
|
||||||
def select(font):
|
def selectGlyphs(font):
|
||||||
font.selection.none()
|
font.selection.none()
|
||||||
font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿
|
font.selection.select(("more","ranges","unicode"),0x3131,0x32BF) # ㄱ ~ ㊿
|
||||||
font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣
|
font.selection.select(("more","ranges","unicode"),0xAC00,0xD7A3) # 가 ~ 힣
|
||||||
select(source)
|
|
||||||
|
|
||||||
# 넓은 글자 크기 (한글에 모두 적용)
|
# 굵기/폭 설정 캐시파일 만들기
|
||||||
wideWidth = baseSize*2
|
def getCache(sourcePath,baseSize=550,weight=16):
|
||||||
for glyph in source.selection.byGlyphs:
|
# 캐시된 파일을 확인하고 있으면 반환
|
||||||
widthDiff = wideWidth-glyph.width # 타겟 너비와 얼마나 크기 차이가 나는지
|
filename = "assets/cache/NanumSquareNeoKr.cache_{}.base_{}.weight_{}.sfd".format(patchVersion,baseSize,weight)
|
||||||
sideAdjust = widthDiff/2 # 좌우 사이드 조정해야하는 정도
|
if os.path.exists(filename):
|
||||||
glyph.left_side_bearing = int(glyph.left_side_bearing + math.floor(sideAdjust)) # 좌우 베어링을 조정함
|
return fontforge.open(filename)
|
||||||
glyph.right_side_bearing = int(glyph.right_side_bearing + math.ceil(sideAdjust))
|
|
||||||
glyph.width = wideWidth # 타겟 너비로 정확하게 설정
|
# 새로운 캐시용 폰트 생성
|
||||||
|
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()
|
source.copy()
|
||||||
select(target)
|
selectGlyphs(target)
|
||||||
target.paste()
|
target.paste()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
# 캐시 닫기
|
||||||
getFontPath()
|
source.close()
|
||||||
|
|
16
src/build.py
16
src/build.py
|
@ -4,6 +4,7 @@ import os
|
||||||
from . import NanumSquareNeo as NanumSquareNeoLoader
|
from . import NanumSquareNeo as NanumSquareNeoLoader
|
||||||
from . import NotoMono as NotoMonoLoader
|
from . import NotoMono as NotoMonoLoader
|
||||||
from . import KawaiiMono as KawaiiMonoLoader
|
from . import KawaiiMono as KawaiiMonoLoader
|
||||||
|
from . import utility as Utility
|
||||||
|
|
||||||
def build(config=None):
|
def build(config=None):
|
||||||
# 메인 폰트 불러오기
|
# 메인 폰트 불러오기
|
||||||
|
@ -13,16 +14,21 @@ def build(config=None):
|
||||||
# 모든 글리프를 붇여넣을 수 있도록 인코딩을 utf full 로 변경
|
# 모든 글리프를 붇여넣을 수 있도록 인코딩을 utf full 로 변경
|
||||||
kawaii.encoding = 'UnicodeFull'
|
kawaii.encoding = 'UnicodeFull'
|
||||||
|
|
||||||
|
# 폰트 가로폭 설정
|
||||||
|
baseSize = config.get("FontBaseWidth")
|
||||||
|
if baseSize != 550:
|
||||||
|
Utility.setWidthWithSavingPosition(
|
||||||
|
font=kawaii,targetWidth=baseSize
|
||||||
|
)
|
||||||
|
|
||||||
# 한글 글리프 붇여넣기
|
# 한글 글리프 붇여넣기
|
||||||
if config.get("CopyKoreanGlyphs"):
|
if config.get("CopyKoreanGlyphs"):
|
||||||
# 나눔 스퀘어 네오 다운로드/불러오기
|
# 나눔 스퀘어 네오 다운로드/불러오기
|
||||||
nanumSquareNeo = fontforge.open(
|
nanumSquareNeo = NanumSquareNeoLoader.getFontPath()
|
||||||
NanumSquareNeoLoader.getFontPath())
|
|
||||||
# 글리프 붇여넣기
|
# 글리프 붇여넣기
|
||||||
NanumSquareNeoLoader.pasteGlyphs(
|
NanumSquareNeoLoader.pasteGlyphs(
|
||||||
target=kawaii,baseSize=550,
|
target=kawaii,baseSize=baseSize,weightStr="Regular",
|
||||||
source=nanumSquareNeo)
|
sourcePath=nanumSquareNeo)
|
||||||
nanumSquareNeo.close()
|
|
||||||
|
|
||||||
if (config.get("CopyJapaneseGlyphs") or
|
if (config.get("CopyJapaneseGlyphs") or
|
||||||
config.get("CopyCJKUnifiedIdeographs")):
|
config.get("CopyCJKUnifiedIdeographs")):
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
def pasteGlyphs(target,sourceList):
|
||||||
|
|
||||||
|
|
|
@ -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 # 타겟 너비로 정확하게 설정
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
1. nerd fonts gp
|
||||||
|
생각보다 위아래로 높이가 안 맞아서 아래로 내려가는 경우가 많은거 같다 그래서 높이도 맞춰줘야 한다. 글리프 속성에 바운딩 박스로 중심점을 구한 다음에 중심점의 위치가 높이의 절반이 될 수 있도록 조정하는 장치가 있어야 한다. 그리고 두칸 이상을 삐저나가는 글리프가 있다면, 크기를 조정해서 작게 만들고, 너무 작으면 크기를 키워야 한다. 이것도 바운딩 박스로 계산해야함 (ㅎ....)
|
||||||
|
|
||||||
|
경우가 2가지 있다. 글리프를 x,y 모두 중앙으로 옮겨도 바운딩 박스가 화면을 초과하는 경우. 이 경우 x,y 모두 글리프가 초과하지 못하도록 안쪽으로 들어가게 축소를 넣어준다 (퍼센트 계산 둘다 x,y 한다 그런다음 가장 크게 줄여야 하는 퍼센트를 선택한다)
|
||||||
|
|
Loading…
Reference in New Issue