diff --git a/Zframework/font.lua b/Zframework/font.lua index fc95d5fe..a5e52edf 100644 --- a/Zframework/font.lua +++ b/Zframework/font.lua @@ -1,67 +1,60 @@ local gc=love.graphics local set=gc.setFont -local fontCache={} -local currentFontSize +local fontFiles,fontCache={},{} +local defaultFont,defaultFallBack +local curFont=false--Current using font object local FONT={} -function FONT.set(s) - if s~=currentFontSize then - if not fontCache[s]then - fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2) - end - set(fontCache[s]) - currentFontSize=s - end -end -function FONT.get(s) +function FONT.setDefault(name)defaultFont=name end +function FONT.setFallback(name)defaultFallBack=name end +function FONT.rawget(s) if not fontCache[s]then fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2) end return fontCache[s] end -function FONT.reset() - for s in next,fontCache do - fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2) - end +function FONT.rawset(s) + set(fontCache[s]or FONT.rawget(s)) end - -function FONT.load(mainFont,secFont) - assert(love.filesystem.getInfo(mainFont),"Font file '"..mainFont.."' not exist!") - mainFont=love.filesystem.newFile(mainFont) - if secFont and love.filesystem.getInfo(secFont)then - secFont=love.filesystem.newFile(secFont) - else - secFont=false - end - function FONT.set(s) - if s~=currentFontSize then - if not fontCache[s]then - fontCache[s]=gc.setNewFont(mainFont,s,'light',gc.getDPIScale()*SCR.k*2) - if secFont then - fontCache[s]:setFallbacks(gc.setNewFont(secFont,s,'light',gc.getDPIScale()*SCR.k*2)) - end - end - set(fontCache[s]) - currentFontSize=s - end - end - function FONT.get(s) - if not fontCache[s]then - fontCache[s]=gc.setNewFont(mainFont,s,'light',gc.getDPIScale()*SCR.k*2) - if secFont then - fontCache[s]:setFallbacks(gc.setNewFont(secFont,s,'light',gc.getDPIScale()*SCR.k*2)) - end - end - return fontCache[s] - end - function FONT.reset() - for s in next,fontCache do - fontCache[s]=gc.setNewFont(mainFont,s,'light',gc.getDPIScale()*SCR.k*2) - if secFont then - fontCache[s]:setFallbacks(gc.setNewFont(secFont,s,'light',gc.getDPIScale()*SCR.k*2)) - end - end +function FONT.load(fonts) + for name,path in next,fonts do + assert(love.filesystem.getInfo(path),("Font file $1($2) not exist!"):repD(name,path)) + fontFiles[name]=love.filesystem.newFile(path) + fontCache[name]={} end FONT.reset() end +function FONT.get(size,name) + if not name then name=defaultFont end + local f=fontCache[name][size] + if not f then + f=gc.setNewFont(fontFiles[name],size,'light',gc.getDPIScale()*SCR.k*2) + if defaultFallBack and name~=defaultFallBack then + f:setFallbacks(FONT.get(size,defaultFallBack)) + end + fontCache[name][size]=f + end + return f +end +function FONT.set(size,name) + if not name then name=defaultFont end + + local f=fontCache[name][size] + if f~=curFont then + curFont=f or FONT.get(size,name) + set(curFont) + end +end +function FONT.reset() + for name,cache in next,fontCache do + if type(cache)=='table'then + for size in next,cache do + cache[size]=FONT.get(size,name) + end + else + fontCache[name]=FONT.rawget(name) + end + end +end + return FONT diff --git a/Zframework/gcExtend.lua b/Zframework/gcExtend.lua index 9e0b4259..57cea2b0 100644 --- a/Zframework/gcExtend.lua +++ b/Zframework/gcExtend.lua @@ -95,6 +95,7 @@ do--function GC.DO(L) setLJ="setLineJoin", print="print", + rawFT=function(...)FONT.rawset(...)end, setFT=function(...)FONT.set(...)end, mText=GC.mStr, mDraw=GC.draw, diff --git a/Zframework/init.lua b/Zframework/init.lua index f02687e9..5f1bfd86 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -527,17 +527,17 @@ local wsBottomImage do wsBottomImage=GC.DO(L) end local ws_deadImg=GC.DO{20,20, - {'setFT',20}, + {'rawFT',20}, {'setCL',1,.3,.3}, {'mText',"X",11,-1}, } local ws_connectingImg=GC.DO{20,20, - {'setFT',20}, + {'rawFT',20}, {'setLW',3}, {'mText',"C",11,-1}, } local ws_runningImg=GC.DO{20,20, - {'setFT',20}, + {'rawFT',20}, {'setCL',.5,1,0}, {'mText',"R",11,-1}, } diff --git a/Zframework/widget.lua b/Zframework/widget.lua index fb099056..240f0bfa 100644 --- a/Zframework/widget.lua +++ b/Zframework/widget.lua @@ -29,7 +29,7 @@ local clearIcon=GC.DO{40,40, {'fRect',11,14,18,21}, } local sureIcon=GC.DO{40,40, - {'setFT',35}, + {'rawFT',35}, {'mText',"?",20,0}, } local smallerThen=GC.DO{20,20, @@ -82,7 +82,7 @@ function text:draw() end end end -function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hideF][,hide] +function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,fType][,align='M'][,hideF][,hide] local _={ name= D.name or"_", x= D.x, @@ -91,6 +91,7 @@ function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hide fText=D.fText, color=D.color and(COLOR[D.color]or D.color)or COLOR.Z, font= D.font or 30, + fType=D.fType, align=D.align or'M', hideF=D.hideF, } @@ -139,7 +140,7 @@ function button:reset() end function button:setObject(obj) if type(obj)=='string'or type(obj)=='number'then - self.obj=gc.newText(FONT.get(self.font),obj) + self.obj=gc.newText(FONT.get(self.font,self.fType),obj) elseif obj then self.obj=obj end @@ -209,7 +210,7 @@ function button:draw() end end function button:getInfo() - return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font) + return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font,self.fType) end function button:press(_,_,k) self.code(k) @@ -225,7 +226,7 @@ function button:press(_,_,k) SFX.play('button') end end -function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide] +function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0],code[,hideF][,hide] if not D.h then D.h=D.w end local _={ name= D.name or"_", @@ -246,6 +247,7 @@ function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=tr fText=D.fText, color=D.color and(COLOR[D.color]or D.color)or COLOR.Z, font= D.font or 30, + fType=D.fType, align=D.align or'M', edge= D.edge or 0, sound=D.sound~=false, @@ -268,7 +270,7 @@ function key:reset() end function key:setObject(obj) if type(obj)=='string'or type(obj)=='number'then - self.obj=gc.newText(FONT.get(self.font),obj) + self.obj=gc.newText(FONT.get(self.font,self.fType),obj) elseif obj then self.obj=obj end @@ -331,7 +333,7 @@ function key:draw() end end function key:getInfo() - return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font) + return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font,self.fType) end function key:press(_,_,k) self.code(k) @@ -339,7 +341,7 @@ function key:press(_,_,k) SFX.play('key') end end -function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide] +function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0],code[,hideF][,hide] if not D.h then D.h=D.w end local _={ name= D.name or"_", @@ -362,6 +364,7 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,fo noFrame=D.noFrame, color= D.color and(COLOR[D.color]or D.color)or COLOR.Z, font= D.font or 30, + fType=D.fType, sound= D.sound~=false, align= D.align or'M', edge= D.edge or 0, @@ -430,7 +433,7 @@ function switch:draw() gc_draw(obj,x-12-ATV,y,nil,min(self.lim/obj:getWidth(),1),1,obj:getWidth(),obj:getHeight()*.5) end function switch:getInfo() - return("x=%d,y=%d,font=%d"):format(self.x,self.y,self.font) + return("x=%d,y=%d,font=%d"):format(self.x,self.y,self.font,self.fType) end function switch:press() self.code() @@ -438,7 +441,7 @@ function switch:press() SFX.play('touch') end end -function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=true][,disp],code[,hideF][,hide] +function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,fType][,sound=true][,disp],code[,hideF][,hide] local _={ name= D.name or"_", @@ -453,6 +456,7 @@ function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=tr fText=D.fText, color=D.color and(COLOR[D.color]or D.color)or COLOR.Z, font= D.font or 30, + fType=D.fType, sound=D.sound~=false, disp= D.disp, code= D.code, @@ -595,7 +599,7 @@ end function slider:arrowKey(k) self:scroll((k=="left"or k=="up")and -1 or 1) end -function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,font=30][,change],disp[,show],code,hide +function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,font=30][,fType][,change],disp[,show],code,hide local _={ name= D.name or"_", @@ -617,6 +621,7 @@ function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][, unit= D.unit or 1, smooth=false, font= D.font or 30, + fType=D.fType, change=D.change, disp= D.disp, code= D.code, @@ -863,7 +868,7 @@ function inputBox:draw() --Drawable local f=self.font - FONT.set(f) + FONT.set(f,self.fType) if self.obj then mDraw_Y(self.obj,x-12-self.obj:getWidth(),y+h*.5) end @@ -906,7 +911,7 @@ function inputBox:keypress(k) self.value=t end end -function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,secret][,regex][,limit],hide +function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,fType][,secret][,regex][,limit],hide local _={ name= D.name or"_", @@ -922,6 +927,7 @@ function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,secret][,regex][,limit }, font= D.font or int(D.h/7-1)*5, + fType=D.fType, secret=D.secret==true, regex= D.regex, limit= D.limit, @@ -1022,7 +1028,7 @@ function textBox:draw() gc_rectangle('line',x,y,w,h,3) --Texts - FONT.set(self.font) + FONT.set(self.font,self.fType) gc_push('transform') gc_translate(x,y) @@ -1054,7 +1060,7 @@ end function textBox:getInfo() return("x=%d,y=%d,w=%d,h=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h) end -function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,lineH][,fix],hide +function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,fType][,lineH][,fix],hide local _={ name= D.name or"_", @@ -1076,6 +1082,7 @@ function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,lineH][,fix],hide h= D.h, font= D.font or 30, + fType=D.fType, fix= D.fix, texts={}, hideF=D.hideF, diff --git a/main.lua b/main.lua index 0e80ac12..317b44cd 100644 --- a/main.lua +++ b/main.lua @@ -50,7 +50,13 @@ local _LOADTIME_=TIME() --Load modules Z=require'Zframework' -FONT.load('parts/fonts/proportional.ttf') +FONT.load{ + norm='parts/fonts/proportional.ttf', + mono='parts/fonts/monospaced.ttf', +} +FONT.setDefault('norm') +FONT.setFallback('norm') + SCR.setSize(1280,720)--Initialize Screen size BGM.setMaxSources(5) BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end) diff --git a/parts/scenes/app_console.lua b/parts/scenes/app_console.lua index 7a351c15..b77ff33e 100644 --- a/parts/scenes/app_console.lua +++ b/parts/scenes/app_console.lua @@ -3,8 +3,8 @@ local kb=love.keyboard local ins,rem=table.insert,table.remove local C=COLOR -local inputBox=WIDGET.newInputBox{name='input',x=40,y=650,w=1200,h=50} -local outputBox=WIDGET.newTextBox{name='output',x=40,y=30,w=1200,h=610,font=25,lineH=25,fix=true} +local inputBox=WIDGET.newInputBox{name='input',x=40,y=650,w=1200,h=50,fType='mono'} +local outputBox=WIDGET.newTextBox{name='output',x=40,y=30,w=1200,h=610,font=25,fType='mono',lineH=25,fix=true} local function log(str)outputBox:push(str)end log{C.lP,"Techmino Console"} diff --git a/parts/scenes/load.lua b/parts/scenes/load.lua index 601686ab..ba29d1eb 100644 --- a/parts/scenes/load.lua +++ b/parts/scenes/load.lua @@ -35,7 +35,7 @@ local loadingThread=coroutine.wrap(function() YIELD('loadSample')SFX.loadSample{name='lead',path='media/sample/lead',base='A3'}--A3~A5 YIELD('loadSample')SFX.loadSample{name='bell',path='media/sample/bell',base='A4'}--A4~A6 YIELD('loadVoice')VOC.load('media/vocal/'..SETTING.vocPack..'/') - YIELD('loadFont')for i=1,17 do getFont(15+5*i)end + YIELD('loadFont')for i=1,17 do getFont(15+5*i)getFont(15+5*i,'mono')end YIELD('loadModeIcon') local modeIcons={}