專利名稱:生成一個(gè)或多個(gè)直線性混合的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及電子圖像生成和控制,更確切地說,涉及生成一個(gè)或多個(gè)直線性混合(linear blend)。
背景技術(shù):
傳統(tǒng)上,諸如字處理器之類的軟件應(yīng)用程序創(chuàng)建基于頁面的文檔,其中每個(gè)頁面包括諸如文本、線條、填充區(qū)域和圖像數(shù)據(jù)之類的圖形對(duì)象。當(dāng)在顯示設(shè)備或打印設(shè)備上繪制文檔數(shù)據(jù)時(shí),上述軟件應(yīng)用程序通常發(fā)送按照該軟件應(yīng)用程序所處的本機(jī)操作系統(tǒng)之圖形接口服務(wù)定義的命令。本機(jī)操作系統(tǒng)的圖形接口服務(wù)統(tǒng)稱為圖形設(shè)備接口(GDI)層。GDI層通常為能夠向全部應(yīng)用程序提供充足圖形功能的應(yīng)用編程接口(API)。通常,圖形描繪系統(tǒng)描繪從GDI層接收的圖形對(duì)象,生成象素,然后發(fā)送到輸出設(shè)備。描繪處理意旨利用圖形描繪系統(tǒng)將從GDI層接收的圖形對(duì)象轉(zhuǎn)換為象素,然后發(fā)送到輸出設(shè)備進(jìn)行存儲(chǔ)、顯示或打印。
現(xiàn)在轉(zhuǎn)到圖1,該圖表示現(xiàn)有軟件應(yīng)用程序110、圖形設(shè)備接口層120、圖形描繪系統(tǒng)130以及輸出設(shè)備140之間的傳統(tǒng)關(guān)系。應(yīng)用程序110按照描述每個(gè)頁面之圖形對(duì)象的圖形接口服務(wù)定義的一系列命令的方式,傳送文檔的每個(gè)頁面。GDI層120介于應(yīng)用程序110和輸出設(shè)備140之間,從而GDI層120使圖形描繪系統(tǒng)130能夠支持更小的功能性集合,如繪制圖像數(shù)據(jù)的矩形塊,利用接近原色(flat color)填充簡單區(qū)域。同時(shí),GDI層120能夠按照GDI層120確定的、描繪系統(tǒng)130能夠進(jìn)行最有效處理的格式,并以輸出設(shè)備140的分辨率,向圖形描繪系統(tǒng)130提供圖形對(duì)象。然后,圖形描繪系統(tǒng)130描繪從GDI層120接收的圖形對(duì)象,生成象素,然后發(fā)送到輸出設(shè)備140。
在某些已知的圖形描繪系統(tǒng)中,描繪處理分兩步。在此類描繪系統(tǒng)中,首先將圖形對(duì)象轉(zhuǎn)換為中間語言,然后開始描繪處理。在此類系統(tǒng)中,第一步處理將從GDI層接收的各圖形對(duì)象轉(zhuǎn)換為某些基于邊緣的中間對(duì)象圖形格式,以便按升序y、然后按升序x對(duì)所有邊緣排序,這些分別對(duì)應(yīng)于光柵化顯示時(shí)的掃描線以及掃描線上的象素位置。該步驟的輸出通常為邊緣及其關(guān)聯(lián)的填充優(yōu)先級(jí)(z軸次序)的顯示列表,以及其他信息,如邊緣是裁剪邊還是填充邊。該處理有時(shí)稱為作業(yè)。作業(yè)包含用來描繪頁面的第二步處理需要的全部信息。第二步處理包括描繪模塊,該模塊對(duì)作業(yè)進(jìn)行語法分析,并對(duì)該頁面下的各掃描線為輸出設(shè)備生成象素。
在某些GDI層中,GDI層將添滿均勻混合顏色的圖形對(duì)象表示為一系列相鄰的單色平行四邊形,每個(gè)平行四邊形與前一個(gè)平行四邊形的顏色有一點(diǎn)小偏差,并且在圖形對(duì)象的區(qū)域上進(jìn)行裁剪。平行四邊形的順序可以為從左到右,從上到下,或沿對(duì)角線遍歷頁面。
某些應(yīng)用程序?qū)⒋祟愄畛浞Q為漸變填充(即Microsoft Word中的gradient fill)或噴泉填充(即Corel Draw中的fountain fill)。為了清楚起見,本說明書中將此類填充稱為漸變填充。圖2A表示現(xiàn)有應(yīng)用程序生成的利用對(duì)角線漸變填充所填充的圖形對(duì)象210的示例。利用漸變填充填充對(duì)象的方法依賴于應(yīng)用程序。然而,在其最簡單形式中,此類方法通常包括指定正在填充的圖形對(duì)象的邊界框的每端的起始顏色和結(jié)束顏色。圖2A、2B、2C表示應(yīng)用程序向GDI層進(jìn)而向圖形描繪系統(tǒng)傳送對(duì)角線漸變填充的方法。
某些圖形描繪系統(tǒng)通常支持稱為直線性斜面或直線性混合的簡單漸變填充效果。利用頁面上帶有關(guān)聯(lián)起始顏色的起始參考點(diǎn)表示上述效果,其中在與漸變混合平行的直線上,每個(gè)象素每個(gè)顏色通道呈現(xiàn)固定的漸變變化。
然而,應(yīng)用程序通常并不限于輸出完全由直線性漸變填充效果組成的混合。事實(shí)上,某些應(yīng)用程序生成的漸變填充效果的顏色變化可以為拋物線,甚至為正弦曲線。圖3表示現(xiàn)有應(yīng)用程序生成的具有正弦曲線漸變填充效果的對(duì)象300的示例。
通常,GDI層使?jié)u變填充變?yōu)閹в懈诫S裁剪對(duì)象的一組單色平行四邊形(此處稱為填充路徑)。例如,圖2B表示典型的現(xiàn)有GDI層傳送到圖形描繪系統(tǒng)的填充路徑和裁剪對(duì)象,其中填充路徑和裁剪對(duì)象是根據(jù)圖2A所示的示例漸變填充生成的。GDI層使?jié)u變填充變?yōu)橐唤M單色填充路徑250和一個(gè)裁剪對(duì)象220。為了清晰起見,圖2B僅示出兩條經(jīng)過放大的填充路徑250。填充路徑250的完整集合覆蓋矩形區(qū)域260,其中各填充路徑250與其相鄰的填充路徑平行。填充路徑250的側(cè)邊的長度依賴于正在進(jìn)行的描繪的分辨率。例如,當(dāng)分辨率為600dpi時(shí),各填充路徑250通常不會(huì)高于100個(gè)象素,但是各填充路徑的寬度可以差幾個(gè)象素。同時(shí),各填充路徑250具有與前一條填充路徑250略微不同的內(nèi)部顏色。從而在描繪對(duì)象時(shí),生成與漸變填充關(guān)聯(lián)的均勻混合顏色?,F(xiàn)在轉(zhuǎn)到圖2C,該圖表示利用現(xiàn)有圖形描繪系統(tǒng)描繪圖2B所示示例時(shí)的結(jié)果。在后一種情況中,描繪系統(tǒng)利用裁剪對(duì)象220裁剪由填充路徑250組成的邊界框260,從而生成對(duì)象210。在圖2C中,描繪處理后的結(jié)果與圖2A相同。
可以利用許多常規(guī)方法來描繪漸變填充效果的圖像。
一種常規(guī)方法僅僅描繪各填充路徑。許多圖形描繪系統(tǒng)使用畫家算法風(fēng)格的描繪,其中在各對(duì)象到達(dá)時(shí),將各對(duì)象繪制到幀緩沖器上。兩步對(duì)象圖形描繪系統(tǒng),首先將所有輸入對(duì)象轉(zhuǎn)換為某些中間格式的頁面,然后描繪各掃描線,其缺點(diǎn)是描繪各填充路徑。對(duì)于圖2A所示的漸變填充,當(dāng)分辨率為600dpi時(shí),GDI層生成128條填充路徑??梢岳斫?,在從上到下或從下到上,然后在任意掃描線上進(jìn)行混合的情況中,只有一條填充路徑起作用。但是在從左到右或從右到左進(jìn)行混合的最壞的情況中,一條掃描線上的所有128條填充路徑都起作用,相當(dāng)于每條掃描線有256條邊緣。因此,對(duì)于基于對(duì)象的描繪系統(tǒng)而言,此類描繪方法的效率非常低。同時(shí),各接近原色填充(flat fill)必須采用中間對(duì)象圖形格式存儲(chǔ),并且每條掃描線的每條填充路徑都要訪問各接近原色填充。當(dāng)填充路徑的數(shù)目為數(shù)千條時(shí),該方法包括大量存儲(chǔ)器訪問,并且需要消耗大量填充資源。當(dāng)以較高分辨率印刷A3以上的幅面時(shí),經(jīng)常出現(xiàn)上述情況。
就審美水平而言,僅僅描繪各填充路徑的另一個(gè)缺點(diǎn)是,盡管期望效果是均勻混合,但出現(xiàn)稱為馬赫條帶(Mach Banding)的人為現(xiàn)象。由于眼睛對(duì)邊緣的敏感度比對(duì)有關(guān)顏色的平滑變化的敏感度高,所以當(dāng)按上述方式描繪漸變填充效果時(shí),眼睛通常能夠看到矩形分割。在部分色域中,分割更加明顯。同時(shí),如果放大整個(gè)圖像,則會(huì)放大每條填充路徑,并且馬赫條帶更明顯。
在應(yīng)用層上,用于處理漸變填充效果的另一個(gè)常規(guī)方法是,僅僅將填充效果描繪到位圖上,然后發(fā)送到GDI層。該方法對(duì)小填充區(qū)域非常有效,其缺點(diǎn)是繪制速度較慢,并且不方便描繪,原因在于圖形描繪系統(tǒng)必須處理圖像的每個(gè)象素。當(dāng)放大(復(fù)制象素)或縮小(損失象素)對(duì)象時(shí),該方法不能按比例縮放。
另一個(gè)常規(guī)方法是測試各輸入填充路徑的直線性,并且當(dāng)下一條填充路徑的直線性不在誤差范圍內(nèi)時(shí),則創(chuàng)建等效直線性混合直至該填充路徑。然后從下一條填充路徑開始,再次跟蹤直線性。該方法能夠顯著減少需要描繪的圖形對(duì)象的數(shù)目。在最好情況中,可以利用單個(gè)直線性混合描繪整個(gè)圖形對(duì)象。對(duì)于圖2A所示的對(duì)角線漸變填充,與如果采用多填充路徑進(jìn)行繪制相比,每掃描線邊緣數(shù)減少了1/128。
然而,該方法有其缺點(diǎn)。如上所述,應(yīng)用程序可以提供比簡單直線性混合更高級(jí)的漸變填充效果。此類效果包括遍布所填充對(duì)象的不同顏色變化(如,圖3所示的正弦曲線),或者為圖4A或4B所示的非線性曲線。同樣,連續(xù)填充路徑的側(cè)邊的長度不一定為常數(shù)。不論出現(xiàn)那種情況,即使各情況下希望的總體效果是跨越圖形對(duì)象有均勻的顏色混合,生成的描繪對(duì)象的填充路徑的集合也不必包括各填充路徑的固定顏色變化。
在該方法中,應(yīng)用誤差因子確定一系列填充路徑中的下一條填充路徑的直線性。如果下一條填充路徑與前一條填充路徑的差別為某個(gè)常數(shù)加減誤差,則將其合并到正在跟蹤的直線性混合中。如果誤差因子太小,則導(dǎo)致許多直線性混合,因此不能達(dá)到該方法的目的。如果誤差因子太大,則導(dǎo)致色移處理,從而輸出不能正確描繪輸入。例如,轉(zhuǎn)到圖4A,該圖表示從左上角的黑色到右下角的白色的非線性混合,其中黑色和白色之間的中點(diǎn)顏色位于左上角和右下角之間的距離的25%。同時(shí),圖4B表示類似的非線性混合,但中點(diǎn)顏色位于左上角和右下角之間的距離的75%。如果使用足夠大的誤差因子跟蹤圖4A或4B所示的非線性填充路徑,則結(jié)果為圖4C所示的從左上角的黑色到右下角的白色的純直線性混合。該結(jié)果顯然不是應(yīng)用程序的用戶希望的結(jié)果。
同時(shí),當(dāng)將填充路徑組合為許多直線性混合時(shí),相鄰直線性混合之間的馬赫條帶將更加明顯。由于直線性混合是按照最大誤差分割的,所以該條帶非常明顯,從而比描繪各填充路徑更明顯地描繪相鄰的直線性混合。
發(fā)明內(nèi)容
本發(fā)明的目的在于充分克服或至少改善現(xiàn)有裝置的一個(gè)或多個(gè)缺點(diǎn)。
根據(jù)本公開的第一方面,提供一種用于生成一個(gè)或多個(gè)直線性混合的方法,其中該方法最初包括業(yè)已接收的定義當(dāng)前直線性混合的一條或多條填充路徑的列表,以及新接收的填充路徑,每條填充路徑包括一個(gè)單色平行四邊形,該方法包括以下步驟(a)如果滿足多個(gè)條件,則將新填充路徑添加到列表中,從而成為該列表中的最后填充路徑,否則轉(zhuǎn)到步驟(c),其中多個(gè)條件中的一個(gè)條件基于新填充路徑和最后填充路徑的顏色以及某個(gè)閾值,并將該閾值預(yù)先設(shè)置為以下值,從而當(dāng)新填充路徑在視覺上并不構(gòu)成當(dāng)前的直線性混合的一部分時(shí),不會(huì)將新填充路徑添加到該列表中;(b)對(duì)接收的每條新填充路徑,重復(fù)步驟(a);以及(c)根據(jù)該列表中的第一填充路徑到該列表中的最后填充路徑,生成一個(gè)或多個(gè)直線性混合。
根據(jù)本公開的第二方面,提供一種根據(jù)定義當(dāng)前直線性混合的一條或多條填充路徑的列表以及至少一條新填充路徑,生成一個(gè)或多個(gè)直線性混合的方法,其中每條填充路徑包括一個(gè)單色平行四邊形,該方法包括以下步驟(a)如果滿足條件集合中的每個(gè)條件,則將所述新填充路徑添加到所述列表中,從而成為所述列表中的最后填充路徑,否則轉(zhuǎn)到步驟(c),所述集合包括至少一個(gè)條件,所述一個(gè)條件基于新填充路徑和最后填充路徑的顏色以及某個(gè)閾值,并將所述閾值預(yù)先設(shè)置為以下值,從而當(dāng)新填充路徑在視覺上并不構(gòu)成當(dāng)前的直線性混合的一部分時(shí),不會(huì)將新填充路徑添加到該列表中;(b)對(duì)每條剩余的所述新填充路徑,重復(fù)所述步驟(a);以及(c)根據(jù)所述列表中的第一填充路徑到所述列表中的最后填充路徑,生成一個(gè)或多個(gè)直線性混合。
條件集合最好包括從以下條件組成的條件組中選擇的條件(第二)條件,新填充路徑與該列表中的最后填充路徑物理鄰接;(第三)條件,新填充路徑的高度不會(huì)超過最近添加到該列表中的填充路徑的高度的兩倍,該高度是在按照該列表的填充路徑的物理位置確定的方向上測量的;(第四)條件,當(dāng)前的直線性混合內(nèi)的填充路徑的數(shù)目大于1;(第五)條件,直線性混合內(nèi)的填充路徑的累積高度與新填充路徑的矩形高度的和小于預(yù)定的最大值;(第六)條件,當(dāng)前接收的填充路徑的光柵操作不使用目的地,并且與當(dāng)前的直線性混合的光柵操作相同;以及(第七)條件,當(dāng)前接收的填充路徑具有與當(dāng)前的直線性混合相同的裁剪。
同時(shí)公開本發(fā)明的其他方面,包括執(zhí)行以上方法的裝置、計(jì)算機(jī)程序和計(jì)算機(jī)介質(zhì)。
以下參照附圖描述本發(fā)明的一個(gè)或多個(gè)實(shí)施方式,其中附圖為
圖1表示現(xiàn)有應(yīng)用程序、圖形設(shè)備接口層、圖形描繪系統(tǒng)和輸出設(shè)備之間的關(guān)系;圖2A表示典型的現(xiàn)有應(yīng)用程序生成的利用對(duì)角線漸變填充所填充的圖形對(duì)象210的示例;圖2B表示在圖2A所示的漸變填充例子中由典型的現(xiàn)有GDI層傳送到典型的現(xiàn)有圖形描繪系統(tǒng)的填充路徑和裁剪對(duì)象;圖2C表示利用典型的現(xiàn)有圖形描繪系統(tǒng)描繪圖2B所示示例時(shí)的結(jié)果;圖3表示現(xiàn)有應(yīng)用程序生成的正弦曲線漸變填充效果的示例;圖4A表示從黑色到白色的對(duì)角線非線性漸變填充效果,其中黑色和白色之間的中點(diǎn)為現(xiàn)有應(yīng)用程序生成的混合的長度的25%;圖4B表示從黑色到白色的對(duì)角線非線性漸變填充效果,其中黑色和白色之間的中點(diǎn)為現(xiàn)有應(yīng)用程序生成的混合的長度的75%;圖4C表示從黑色到白色的對(duì)角線非線性漸變填充效果,其中黑色和白色之間的中點(diǎn)為現(xiàn)有圖形描繪系統(tǒng)根據(jù)圖4A或4B所示的漸變填充效果生成的混合的長度的50%;圖5A至圖5D和圖6A至圖6D表示對(duì)角線漸變填充遍歷方向的不同定義;圖7A和圖7B表示依賴于漸變填充之方向的總高度和矩形高度的定義;圖8A和圖8B表示確定漸變填充的第二點(diǎn)(Q,P)時(shí)使用的直線;圖9A、圖9B和圖9C表示填充路徑的示范集合的顏色通道的值,用于說明生成一個(gè)或多個(gè)直線性混合的方法;圖10表示生成一個(gè)或多個(gè)直線性混合的第一方法的流程圖;圖11表示圖10所示方法調(diào)用的add_rect子過程的流程圖;圖12表示圖10所示方法調(diào)用的check_fill子過程的流程圖;圖13表示圖12的check_fill子過程調(diào)用的check_output_fill子過程的流程圖;圖14A、圖14B和圖14C分別表示圖11的add_rect子過程、圖12的check_fill子過程和圖13的check_output_fill子過程調(diào)用的get_alignment子過程的流程圖;圖15表示圖10所示方法調(diào)用的flush_ramp子過程的流程圖;圖16表示圖15的flush_ramp子過程最初調(diào)用的find_and_put_ramps子過程的流程圖;圖17為可以實(shí)施所述方法的通用計(jì)算機(jī)的示意框圖;圖18表示用于生成一個(gè)或多個(gè)直線性混合的備擇方法的流程圖;圖19表示應(yīng)用于圖10所示的第一方法或圖18所示的備擇方法的modified_add_rect子過程的流程圖;圖20表示在圖18的備擇方法中有用的modified_check_fill子過程的流程圖;圖21表示在圖18的備擇方法中有用的alternate_get_alignment子過程的流程圖;圖22表示與圖8A和圖8B類似但適用于圖18的備擇方法的示意圖;以及圖23A至圖23D表示用于定義類似于圖5A至圖5D和圖6A至圖6D的但適用于圖18備擇方法的混合方向的各種方式。
具體實(shí)施例方式
在本說明書中,當(dāng)引用任何一張或多張附圖中的具有相同參考標(biāo)號(hào)的步驟和/或特征時(shí),除非有相反的說明,否則這些步驟和/或特征具有相同的功能或操作。
最好將用于生成直線性混合的方法實(shí)現(xiàn)為在通用計(jì)算機(jī)的處理器上運(yùn)行的軟件模塊。圖17表示用于執(zhí)行此類軟件模塊的典型通用計(jì)算機(jī)。軟件模塊最好為圖形描繪系統(tǒng)的第一層的一部分,以連接圖形設(shè)備接口(GDI)層,并接收頁面的圖形對(duì)象,從而將各圖形對(duì)象轉(zhuǎn)換為基于邊緣的中間格式。在圖形描繪系統(tǒng)的第二層中,描繪作業(yè),然后將由此生成的象素輸出到諸如打印機(jī)或圖形卡之類的下行設(shè)備上。最好將圖形描繪系統(tǒng)的兩層實(shí)現(xiàn)為圖形軟件應(yīng)用程序中的模塊。作為選擇,將第一層實(shí)現(xiàn)為連接第二層的軟件應(yīng)用程序,將第二層實(shí)現(xiàn)為與總線相連的硬件設(shè)備,以便與在處理器上運(yùn)行的第一層進(jìn)行通信。
GDI層最好為應(yīng)用編程接口(API),并且以一系列填充路徑的形式,向圖形描繪系統(tǒng)提供漸變填充。
盡管以下方法描述非正交漸變填充效果的情況,特別是填充路徑以垂直側(cè)從左上到右下的順序到達(dá)的情況,但是可以很容易地修改該方法,以處理填充路徑以任何正交或非正交方向進(jìn)行的情況。
在進(jìn)行詳細(xì)說明之前,首先簡單地說明術(shù)語。
1.0定義將填充路徑定義為單色(或接近原色(flat-colored))的平行四邊形。術(shù)語平行四邊形還包括矩形或正方形。當(dāng)從水平方向或垂直方向開始漸變填充時(shí),填充路徑的外型通常為矩形。當(dāng)從頁面的對(duì)角線方向開始漸變填充時(shí),填充路徑為平行四邊形。
非正交漸變填充的遍歷方向?yàn)橐韵?個(gè)方向中的任何一個(gè)。將這些方向分割為使用水平填充路徑的漸變填充和使用垂直填充路徑的漸變填充,定義如下水平漸變填充水平左下方向,HDOWNLEFT水平左上方向,HUPLEFT水平右下方向,HDOWNRIGHT水平右上方向,HUPRIGHT水平左方向,LEFT水平右方向,RIGHT垂直漸變填充垂直左下方向,VDOWNLEFT垂直左上方向,VUPLEFT垂直右下方向,VDOWNRIGHT垂直右上方向,VUPRIGHT
垂直下方向,DOWN垂直上方向,UP圖5A至5D和圖6A至6D表示對(duì)角線漸變填充可能遍歷方向的上述定義。圖5A至5D表示垂直漸變填充,而圖6A至6D表示水平漸變填充。
圖5A表示旗幟形狀的裁剪對(duì)象600,其邊界框620以及填充路徑610。許多填充路徑610沿垂直方向從邊界框620的左上角到達(dá)其右下角,并定義為垂直右下方向。同時(shí)表示垂直填充路徑630,并定義為向下。
圖5B表示同一裁剪對(duì)象600,邊界框620以及填充路徑640。填充路徑640沿垂直方向從邊界框620的右上角到達(dá)其左下角,并定義為垂直左下方向。同時(shí)表示垂直填充路徑630,并定義為向下。
圖5C表示同一裁剪對(duì)象600以及邊界框620。填充路徑660沿垂直方向從邊界框620的右下角到達(dá)其左上角,并定義為垂直左上方向。同時(shí)表示垂直填充路徑650,并定義為向上。
圖5D表示同一裁剪對(duì)象600以及邊界框620。填充路徑670沿垂直方向從邊界框620的左下角到達(dá)其右上角,并定義為垂直右上方向。同時(shí)表示垂直填充路徑650,并定義為向上。
圖6A表示裁剪對(duì)象600,其邊界框605以及填充路徑625。填充路徑625沿水平方向從邊界框620的左上角到達(dá)其右下角,并定義為水平右下方向。同時(shí)表示水平填充路徑615,并定義為向右。
另一方面,圖6B的填充路徑635沿水平方向從邊界框的左下角到達(dá)其右上角,并定義為水平右上方向。同時(shí)表示水平填充路徑615,并定義為向右。
圖6C表示裁剪對(duì)象600,其邊界框605以及填充路徑655。填充路徑655沿水平方向從邊界框605的右下角到達(dá)其左上角,并定義為水平左上方向。同時(shí)表示水平填充路徑645,并定義為向左。
另一方面,圖6D的填充路徑665沿水平方向從邊界框的右上角到達(dá)其左下角,并定義為水平左下方向。同時(shí)表示水平填充路徑645,并定義為向左。
然而,如果認(rèn)為一條填充路徑未與相鄰的填充路徑對(duì)準(zhǔn),則不指派方向(即空“NULL”)。沒有方向意旨不會(huì)創(chuàng)建漸變填充,或者不接受新的填充路徑作為當(dāng)前填充的一部分。
本說明書涉及兩類高度,即矩形高度和總高度。根據(jù)當(dāng)前存儲(chǔ)的漸變填充的定向,以不同方式定義高度。圖7A和7B表示這些不同高度的定義以及它們之間的依賴于漸變填充方向的差異。圖7A表示沿垂直方向行進(jìn)的平行四邊形形式的填充路徑700以及裁剪對(duì)象(未示出)的邊界框705。在垂直填充路徑情況中(圖7A),將填充路徑的矩形高度定義為,構(gòu)成填充路徑的平行四邊形的側(cè)邊沿y軸方向的長度。在垂直填充路徑的情況中(圖7A),將第n條填充路徑的總高度定義為,第n條填充路徑沿y軸方向的矩形高度的總和。在水平填充路徑的情況中(圖7B),適用類似定義,但是沿x軸方向測量高度。同時(shí),可以理解,不同填充路徑的矩形高度可以不同。
當(dāng)根據(jù)各填充路徑定義直線性漸變填充時(shí),中間邊緣格式接受與該混合之梯度平行的直線上的兩個(gè)參考點(diǎn)的色值和位置,以定義漸變填充。圖8A和圖8B表示查找第二參考點(diǎn)(Q,P)時(shí)使用的公式,其中利用第二參考點(diǎn)定義漸變填充。第一參考點(diǎn)是已知的。
圖22表示用于備擇方法的兩個(gè)參考點(diǎn)以及用于計(jì)算兩個(gè)參考點(diǎn)的直線,兩個(gè)參考點(diǎn)為點(diǎn)1和點(diǎn)2(Q,P)。第一點(diǎn)(點(diǎn)1)僅僅是填充方向中描述的第一點(diǎn)。根據(jù)直線B和直線C的交點(diǎn),確定第二點(diǎn)(Q,P)。直線C為恰巧超過漸變填充中最后填充路徑之遠(yuǎn)端的長度的直線。直線B為通過漸變填充之點(diǎn)1且與直線A垂直的直線。
可以利用四個(gè)方向中的任一方向描述漸變填充的遍歷方向。在調(diào)準(zhǔn)組成漸變填充內(nèi)的填充路徑的所有點(diǎn)之后,指定以上方向。四個(gè)方向定義如下DIR_01(或DIR_32)DIR_10(或DIR_23)DIR_12(或DIR_03)
DIR_21(或DIR_30)圖23A至23D分別表示前述的對(duì)角線漸變填充可能遍歷的方向的定義。每個(gè)方向具有一個(gè)選擇的名稱,并且可以互換使用。如果認(rèn)為填充路徑未與相鄰的填充路徑對(duì)準(zhǔn),則不指派方向(即空“NULL”)。沒有方向意旨不會(huì)創(chuàng)建漸變填充,或者將不接受新的填充路徑作為當(dāng)前漸變填充的一部分。
說明書涉及兩種不同類型的高度,即矩形高度(或填充路徑的高度)和總高度。將總高度定義為填充路徑之當(dāng)前存儲(chǔ)列表內(nèi)的各填充路徑的矩形高度的總和。定義漸變填充之矩形高度的填充路徑的側(cè)邊依賴于漸變填充的遍歷方向。圖24A至24D表示對(duì)于方向DIR_01,矩形高度定義為填充路徑的點(diǎn)0和點(diǎn)1之間的線段長度。對(duì)于方向DIR_10,矩形高度定義為點(diǎn)1和點(diǎn)0之間的線段長度。對(duì)于方向DIR_12,矩形高度定義為點(diǎn)1和點(diǎn)2之間的線段長度。對(duì)于方向DIR_21,矩形高度定義為點(diǎn)2和點(diǎn)1之間的線段長度。同時(shí),可以理解,不同填充路徑的填充路徑高度可以不同。圖24A至24D還表示各填充路徑的寬度。
將術(shù)語“存儲(chǔ)的顏色梯度”定義為,當(dāng)前存儲(chǔ)的漸變填充內(nèi)最后添加的填充路徑和上一個(gè)最后添加的填充路徑之間的顏色梯度。存儲(chǔ)該顏色梯度的值,以檢查所有的新填充路徑,從而確保其顏色梯度在所存儲(chǔ)的顏色梯度的合理限度內(nèi)。
當(dāng)前存儲(chǔ)的漸變填充為填充路徑的動(dòng)態(tài)列表。對(duì)于添加到當(dāng)前存儲(chǔ)的漸變填充內(nèi)的各填充路徑,該方法定義以下3個(gè)數(shù)組1.顏色數(shù)組,保存填充路徑的每個(gè)色值,其中color[n]=fill-path(n)的顏色;2.高度數(shù)組,保存填充路徑的累積高度值,其中heights[n]=fill-path(1)至fill-path(n)的矩形高度的和。該值也是fill-path(n)的總高度的當(dāng)前值;以及3.點(diǎn)數(shù)組,保存各填充路徑的點(diǎn)的值,其中points[n]=定義fill-path(n)的邊界的平行四邊形的四個(gè)點(diǎn)(x、y坐標(biāo))。
短語“存儲(chǔ)的漸變填充”涉及用來描述當(dāng)前跟蹤的漸變填充所需的變量。這些變量包括上述的顏色數(shù)組,點(diǎn)數(shù)組和高度數(shù)組,漸變填充內(nèi)的填充數(shù),漸變填充的方向,以及漸變填充內(nèi)的前兩種顏色之間的顏色梯度。
2.0概述該方法依次接收來自GDI層的所有填充路徑,并根據(jù)是否滿足某些標(biāo)準(zhǔn)將那些路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。最初,該方法檢查新接收的填充路徑與最后添加到當(dāng)前存儲(chǔ)的漸變填充中的填充路徑之間的色差,是否大于某個(gè)足夠大的誤差因子。誤差因子最好為當(dāng)前存儲(chǔ)的漸變填充的兩個(gè)最后添加的填充路徑的色差的兩倍。具體而言,對(duì)于正在生成的圖像的每個(gè)顏色通道(如RGB),該方法檢查新接收的填充路徑的顏色通道值Cn是否滿足以下公式之一0<Cn-Cn-1≤2(Cn-1-Cn-2)如果Cn>Cn-1-2(Cn-1-Cn-2)≤Cn-Cn-1≤0 如果Cn≤Cn-1公式(1)其中Cn-1和Cn-2為當(dāng)前存儲(chǔ)的漸變填充的兩個(gè)最后添加的填充路徑的對(duì)應(yīng)顏色通道值。
對(duì)于各顏色通道,如果檢查返回真,則該方法將新接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中,并且對(duì)接收的下一條填充路徑重復(fù)上述操作。相反,對(duì)于任一顏色通道,如果檢查返回假,則該方法負(fù)責(zé)生成一個(gè)或多個(gè)、從當(dāng)前存儲(chǔ)的漸變填充的第一條填充路徑的顏色和位置、到當(dāng)前存儲(chǔ)的漸變填充中最后添加的填充路徑的顏色和位置的直線性混合。換句話說,該方法繼續(xù)將填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充內(nèi),直至有一條填充路徑不再滿足上述標(biāo)準(zhǔn)。當(dāng)下一條填充路徑的某個(gè)顏色通道明顯改變當(dāng)前顏色通道的漸變方向時(shí),出現(xiàn)上述情況。例如,當(dāng)顏色梯度的方向改變符號(hào)時(shí),會(huì)出現(xiàn)上述情況。
如上所述,如果檢查返回假,則該方法根據(jù)已經(jīng)添加到當(dāng)前存儲(chǔ)的漸變填充中的填充路徑,生成一個(gè)或多個(gè)直線性混合。具體而言,該方法確定適合當(dāng)前存儲(chǔ)的漸變填充內(nèi)的填充路徑集合的直線性混合的最佳集合。該方法按下述方式實(shí)現(xiàn)上述處理。
首先,為說明起見,假設(shè)當(dāng)前存儲(chǔ)的漸變填充包含n條填充路徑,記作fill-path[1]到fill-path[n],其中fill-path[1]為添加到當(dāng)前存儲(chǔ)的漸變填充內(nèi)的第一條填充路徑,fill-path[n]為添加到當(dāng)前存儲(chǔ)的漸變填充內(nèi)的最后填充路徑。
該方法通過首先測試fill-path[1]和fill-path[n]之間的顏色梯度是否與fill-path[1]和中點(diǎn)fill-path[n/2]之間的對(duì)應(yīng)顏色梯度(在某可接受的誤差內(nèi))不同,生成適合當(dāng)前存儲(chǔ)的漸變填充內(nèi)的填充路徑的直線性混合的集合。如果測試返回真,亦即,如果不相同,則該方法將填充路徑集合分割為兩個(gè)集合,一個(gè)集合為填充路徑的前半部分(fill-path[1]...fill-path[n/2]),一個(gè)集合為填充路徑的后半部分(fill-path[n/2]...fill-path[n]),然后對(duì)這些新的填充路徑集合中的每一個(gè)重復(fù)進(jìn)行測試。另一方面,如果測試返回假,亦即,對(duì)某集合的fill-paths[1...n],fill-path[1]和fill-path[n]之間的顏色梯度與fill-path[1]和fill-path[n/2]之間的對(duì)應(yīng)顏色梯度(在某可接受的誤差內(nèi))相同,則對(duì)于該集合的fill-paths[1...n],該方法向圖形描繪系統(tǒng)輸出直線性斜面調(diào)用,其中利用顏色數(shù)組定義直線性斜面的起始和結(jié)束顏色,利用點(diǎn)數(shù)組定義需要填充的區(qū)域??梢岳密浖K實(shí)現(xiàn)上述步驟,按下述方式遞歸定義軟件模塊Function find_and_put_ramps([1..n],H[1..n],P[1..n])1.If|Gn-Gn/2Gn|>E0]]>對(duì)任一顏色通道公式(2)其中Gn/2=Cn/2-C1Hn/2-H1]]>Gn=Gn-C1Hn-H1]]>Hn、Hn/2分別為填充路徑1到n和填充路徑1到n/2的累計(jì)矩形高度值,Cn為第n條填充路徑的顏色通道值,E0為閾值常數(shù),最好為0.1,并且其中C1和H1分別為傳送給該函數(shù)的集合[1...n]內(nèi)的第一條填充路徑的顏色通道值和矩形高度值。
2.Call find_and_put_ramps(C[1..n/2],H[1..n/2],P[1..n/2])3.Call find_and_put_ramps(C[n/2..n],H[n/2..n],P[n/2..n])4.Endif5.從C1到Cn放置LinearRampEndFunction可以看出,在分割填充路徑集合時(shí),該方法最好使用位于中點(diǎn)的填充路徑作為第一個(gè)斜面的終點(diǎn)和第二個(gè)斜面的起點(diǎn)。從而與先前的實(shí)現(xiàn)相比,確保相鄰直線性斜面之間的均勻混合,并消除馬赫條帶。作為選擇,也可以使用傳統(tǒng)的基于(n/2)和(n/2)+1的分割。
現(xiàn)在轉(zhuǎn)到圖9A至圖9C,圖9A至圖9C表示添加到當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的示范集合的顏色通道的值,用于說明生成一個(gè)或多個(gè)直線性混合的方法。圖9A至圖9C表示沿x坐標(biāo)軸方向描繪的填充路徑1到11沿y坐標(biāo)軸方向的色值。符號(hào)C代表填充路徑的顏色通道值,符號(hào)H代表所有存儲(chǔ)的填充路徑的累計(jì)高度值,即,總高度。為簡單起見,假設(shè)只有一個(gè)顏色通道??梢岳斫?,依次將填充路徑1...10添加到當(dāng)前存儲(chǔ)的漸變填充中,直至收到來自GDI層的填充路徑11??梢钥闯?,填充路徑11不滿足公式(1)所列的標(biāo)準(zhǔn),因此不會(huì)添加到當(dāng)前存儲(chǔ)的漸變填充中。然后,該方法按下述方式,根據(jù)當(dāng)前存儲(chǔ)的漸變填充內(nèi)的填充路徑1...10,生成一個(gè)或多個(gè)直線性混合。
首選方法根據(jù)公式(2),比較填充路徑1...10之間的顏色梯度與填充路徑1...5之間的顏色梯度。同時(shí)上述比較確保n不低于某個(gè)預(yù)定值。為簡單起見,本例忽略該過程。圖9A表示以上比較。此時(shí),比較的輸出大于閾值常數(shù)E0=0.1,因此該方法將集合fill-paths[1...10]劃分為兩個(gè)集合fill-paths[1...5]和fill-paths[5...10]。
接著,該方法根據(jù)公式(2),比較填充路徑1...5之間的顏色梯度與填充路徑1...3之間的顏色梯度。請(qǐng)注意,當(dāng)n為奇數(shù)時(shí),需要增加值n/2,直至到達(dá)下一個(gè)最接近的整數(shù),此時(shí)為3。圖9B表示上述比較。此時(shí)比較的輸出小于閾值常數(shù)E0=0.1,因此輸出填充路徑1到5的直線性混合。
接著,該方法根據(jù)公式(2),比較填充路徑5到10之間的顏色梯度與填充路徑5到7之間的顏色梯度。請(qǐng)注意,此時(shí),該集合中的第一條填充路徑為填充路徑5,從該填充路徑測量梯度。圖9C表示上述比較。此時(shí)比較的輸出大于閾值常數(shù)E0=0.1,因此該方法將集合fill-paths[5...10]劃分為兩個(gè)集合fill-paths[5...7]和fill-paths[7...10]。
接著,該方法根據(jù)公式(2),比較填充路徑5到7之間的顏色梯度與填充路徑5到6之間的顏色梯度。圖9C表示上述比較。此時(shí)比較的輸出小于閾值常數(shù)E0=0.1,因此輸出填充路徑5到7的直線性混合。同樣,該方法確定填充路徑7和8之間的顏色梯度與填充路徑7和10之間的顏色梯度類似,因此輸出填充路徑7和10的直線性混合。然后該方法結(jié)束。
可以看出,該方法依據(jù)全部漸變填充的直線性,而不是簡單地依據(jù)迄今為止處理過的那些部分,將存儲(chǔ)的全部漸變填充劃分為不同部分。因此在確定直線性混合的最佳集合時(shí),確??紤]所有漸變填充,從而保證在最少數(shù)目的直線性斜面的情況下,獲得原始漸變填充的最佳可能匹配。該方法識(shí)別一個(gè)漸變填充內(nèi)較大的不變斜率,并輸出它們。這樣,該方法能夠減少需要描繪的圖形對(duì)象數(shù)。另外,通過將分割的中點(diǎn)作為第一斜面的終點(diǎn)和第二斜面的起點(diǎn),能夠避免馬赫條帶。
如上所述,該方法依次接收來自GDI層的填充路徑,并且根據(jù)新接收的填充路徑是否滿足公式(1)所列的標(biāo)準(zhǔn),將其添加到當(dāng)前存儲(chǔ)的漸變填充中。如果不滿足該標(biāo)準(zhǔn),則不在當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)新接收的填充路徑,并且該方法處理當(dāng)前存儲(chǔ)的漸變填充內(nèi)的現(xiàn)有填充路徑,以生成一個(gè)或多個(gè)直線性混合。除公式(1)指定的標(biāo)準(zhǔn)之外,新接收的填充路徑,在被添加到當(dāng)前存儲(chǔ)的漸變填充中之前,最好還滿足多個(gè)其他標(biāo)準(zhǔn)。例如,新接收的填充路徑的矩形高度應(yīng)小于或等于當(dāng)前存儲(chǔ)的漸變填充內(nèi)的第一條填充路徑的矩形高度的兩倍,才能將新接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。否則,如果將新接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中,則眼睛很容易看到不連續(xù)混合。以下將詳細(xì)描述其他標(biāo)準(zhǔn)。
3.0第一方法現(xiàn)在轉(zhuǎn)到圖10,該圖表示生成一個(gè)或多個(gè)直線性混合的方法1005的流程圖。如上所述,將方法1005實(shí)現(xiàn)為通用計(jì)算機(jī)的處理器上執(zhí)行的軟件模塊。圖17表示適合于實(shí)現(xiàn)首選方法的這樣一種通用計(jì)算機(jī)。軟件模塊最好為圖形描繪系統(tǒng)的第一層的一部分,以連接圖形設(shè)備接口(GDI)層,并接收頁面的圖形對(duì)象,從而將每個(gè)圖形對(duì)象轉(zhuǎn)換為基于邊緣的中間格式。在圖形描繪系統(tǒng)的第二層中,描繪作業(yè),然后將由此生成的象素輸出到諸如打印機(jī)或圖形卡之類的下行設(shè)備上。最好將圖形描繪系統(tǒng)的兩層實(shí)現(xiàn)為用于在計(jì)算機(jī)的處理器上執(zhí)行的圖形描繪軟件應(yīng)用程序。所有已知的圖形描繪軟件應(yīng)用程序都是合適的,前提是進(jìn)行適當(dāng)修改以便連接實(shí)現(xiàn)方法1005的軟件模塊。
當(dāng)被圖形描繪系統(tǒng)的第一層進(jìn)行調(diào)用時(shí),方法1005在步驟1000開始操作。當(dāng)圖形描繪系統(tǒng)收到來自GDI層的一個(gè)新的圖形對(duì)象時(shí),調(diào)用方法1005。在步驟1000之后,在步驟1010中,方法1005輸入當(dāng)前傳送給圖形描繪系統(tǒng)的圖形對(duì)象。同時(shí)在步驟1010中,方法1005檢查當(dāng)前接收的圖形對(duì)象是否是一條填充路徑。如果步驟1010確定當(dāng)前接收的圖形對(duì)象不是填充路徑,則方法1005轉(zhuǎn)到步驟1040,在步驟1040中調(diào)用稱為flush_ramp的子過程1505。子過程flush_ramp1505處理當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的所有填充路徑,以生成一個(gè)或多個(gè)直線性混合,然后傳送給圖形描繪系統(tǒng)。在生成直線性混合之后,子過程flush_ramp 1505清空存儲(chǔ)的漸變填充。以下會(huì)參照?qǐng)D15詳細(xì)描述子過程flush_ramp 1505。
在完成步驟1040之后,方法1005在步驟10100結(jié)束,并向圖形描繪系統(tǒng)的第一層返回消息SKIP(跳過),該消息表示當(dāng)前接收的對(duì)象不是有效填充路徑。接著,圖形描繪系統(tǒng)的第一層試圖將該填充路徑轉(zhuǎn)換為基于邊緣的格式(如果可能的話),否則跳過該對(duì)象,系統(tǒng)轉(zhuǎn)到下一個(gè)對(duì)象??梢岳斫猓绻?dāng)前接收的圖形對(duì)象不是有效填充路徑,則在轉(zhuǎn)換為基于邊緣的中間格式前,方法1005無需進(jìn)行預(yù)處理。
否則,如果步驟1010確定當(dāng)前接收的圖形對(duì)象是填充路徑,則方法1005轉(zhuǎn)到步驟1020。在步驟1020中,方法1005檢查當(dāng)前接收的填充路徑是否具有構(gòu)成漸變填充所需的基本性質(zhì)。特別地,步驟1020對(duì)新接收的填充路徑進(jìn)行以下測試其一邊至少小于預(yù)先確定的可配置的最大長度;正在用接近原色進(jìn)行填充;包含定義平行四邊形的四個(gè)點(diǎn);并且不使用需要目的地的光柵操作。如果當(dāng)前接收的填充路徑滿足以上標(biāo)準(zhǔn),則方法1005轉(zhuǎn)到步驟1030。否則,如果該填充路徑不滿足以上標(biāo)準(zhǔn),則方法1005轉(zhuǎn)到步驟1040,在步驟1040中,調(diào)用名為flush_ramp的子過程1505。
接著,在步驟1030中,方法1005檢查當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的數(shù)目是否為零。如果方法1005確定當(dāng)前存儲(chǔ)的漸變填充不包括填充路徑,則方法1005轉(zhuǎn)到步驟1080。在步驟1080中,方法1005通過將新接收的填充路徑添加到當(dāng)前為空的漸變填充中,初始化一條新的漸變填充。由于填充路徑的方向還未確定,所以填充路徑的高度未知。在接收第二條填充路徑時(shí)定義方向,這意味著只有確定第二條填充路徑為包含第一條填充路徑的漸變填充的一部分時(shí),才累加第一條填充路徑的高度。當(dāng)在步驟1090中調(diào)用add_rect子過程1105時(shí),將第一條填充路徑的高度累加到存儲(chǔ)的漸變填充中。否則,如果當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的數(shù)目大于零,則方法1005轉(zhuǎn)到步驟1050。
在步驟1050中,方法1005調(diào)用名為check_fill的子過程1205,確定是否將當(dāng)前接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。如果填充路徑將要添加到當(dāng)前存儲(chǔ)的漸變填充中,則check_fill子過程1205返回真,否則,如果不需要添加,則返回假。以下會(huì)參照?qǐng)D12詳細(xì)描述check_fill子過程1205。
在完成步驟1050之后,方法1005轉(zhuǎn)到步驟1060,后者確定check_fill子過程1205返回真還是返回假。如果步驟1060確定已返回一個(gè)真,則方法1005轉(zhuǎn)到步驟1090,在步驟1090中,將當(dāng)前接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。在步驟1090中,方法1005調(diào)用名為add_rect的子過程1105,以便將當(dāng)前接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。以下會(huì)參照?qǐng)D11詳細(xì)說明子過程add_rect1105。否則,如果已返回一個(gè)假,則方法1005轉(zhuǎn)到步驟1070。
在步驟1070中,方法1005調(diào)用上述子過程flush_ramp 1505,以便處理當(dāng)前存儲(chǔ)的漸變填充。在完成步驟1070之后,方法1005轉(zhuǎn)到步驟1080,在步驟1080中,通過將當(dāng)前接收的填充路徑添加到所存儲(chǔ)的當(dāng)前為空的漸變填充中,初始化一個(gè)新的漸變填充。
在完成步驟1080或1090之后,方法1005在步驟10100結(jié)束。當(dāng)方法1005結(jié)束時(shí),向圖形描繪系統(tǒng)的第一層返回參數(shù)OK(確定),通知第一層不需要進(jìn)行轉(zhuǎn)換,并將該填充路徑傳遞給圖形描繪系統(tǒng)的第二層。
3.1 add_rect子過程現(xiàn)在轉(zhuǎn)到圖11,該圖表示圖10所示方法1005調(diào)用的add_rect子過程1105的流程圖。add_rect子過程1105負(fù)責(zé)將新填充路徑添加到當(dāng)前存儲(chǔ)的已經(jīng)包含一條或多條填充路徑的漸變填充中。當(dāng)方法1005的步驟1090(圖10)調(diào)用add_rect子過程1105時(shí),子過程1105在步驟1100開始。同時(shí)步驟1090向add_rect子過程1105傳遞當(dāng)前接收的填充路徑,以添加到當(dāng)前存儲(chǔ)的漸變填充中。
在步驟1100之后,add_rect子過程1105轉(zhuǎn)到步驟1110,在步驟1110中,檢查當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的數(shù)目。如果步驟1110顯示當(dāng)前存儲(chǔ)的漸變填充中只有一條填充路徑,則add_rect子過程1105轉(zhuǎn)到步驟1120,在步驟1120中,確定當(dāng)前接收的填充路徑的填充方向(如VDOWNRIGHT)。通過調(diào)用名為get_alignment的子過程1495實(shí)現(xiàn)上述處理。以下會(huì)參照?qǐng)D14詳細(xì)說明get_alignment子過程1495。否則,如果當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的數(shù)目大于1,則add_rect子過程1105直接轉(zhuǎn)到步驟1160。
在步驟1120中確定填充方向之后,add_rect子過程1105轉(zhuǎn)到步驟1130。在步驟1130中,利用switch語句將方向分成水平(HDOWNRIGHT,HUPRIGHT,HDOWNLEFT或HUPLEFT)和垂直(VDOWNRIGHT,VUPRIGHT,VDOWNLEFT或VUPLEFT)斜面。如果斜面為水平斜面,則執(zhí)行步驟1140,在步驟1140中,利用x投影(見圖7B)定義當(dāng)前存儲(chǔ)的漸變填充中的第一條填充路徑和所接收的填充路徑的矩形高度。然后將第一條填充路徑的高度存儲(chǔ)到當(dāng)前存儲(chǔ)的漸變填充中。否則,如果斜面是垂直斜面,則執(zhí)行步驟1150,在步驟1150中,則利用y投影(見圖7A)定義當(dāng)前存儲(chǔ)的漸變填充中的第一條填充路徑和當(dāng)前接收的填充路徑的矩形高度。然后將第一條填充路徑的高度存儲(chǔ)到當(dāng)前存儲(chǔ)的漸變填充中。
在完成步驟1140或1150以后,add_rect子過程1105轉(zhuǎn)到步驟1160,在步驟1160中,將該填充路徑以及所有先前填充路徑(如果有的話)的累計(jì)高度,存儲(chǔ)到高度數(shù)組中。將當(dāng)前接收的填充路徑的顏色增加到顏色數(shù)組中,并且將填充數(shù)目加1。同時(shí)更新點(diǎn)數(shù)組以保存當(dāng)前接收的填充路徑的端點(diǎn)。在完成步驟1160以后,add_rect子過程1105結(jié)束,返回到方法1005的步驟10100。
3.2 check_fill子過程現(xiàn)在轉(zhuǎn)到圖12,該圖表示圖10所示方法1005的步驟1050調(diào)用的check_fill子過程1205的流程圖。check_fill子過程1205負(fù)責(zé)檢查當(dāng)前接收的填充路徑是否適合于添加到當(dāng)前存儲(chǔ)的漸變填充中。當(dāng)方法1005的步驟1050(圖10)調(diào)用check_fill子過程1205時(shí),子過程1205在步驟1200開始。同時(shí)步驟1050向check_fill子過程1205傳遞當(dāng)前接收的填充路徑。
在步驟1200之后,check_fill子過程1205轉(zhuǎn)到步驟1210。在步驟1210中,對(duì)于各RGBA/CMYK(取決于使用的顏色空間)色值,check_fill子過程1205計(jì)算當(dāng)前接收的填充路徑的顏色與當(dāng)前存儲(chǔ)的漸變填充中最后添加的填充路徑的顏色之間的差值(即Cn-Cn-1)。所存儲(chǔ)的漸變填充中最后添加的填充路徑的顏色為顏色數(shù)組的最后位置中存儲(chǔ)的顏色。在完成步驟1210之后,check_fill子過程1205轉(zhuǎn)到步驟1220。
在步驟1220中,check_fill子過程1205首先測試當(dāng)前的漸變填充中是否只存儲(chǔ)了一條填充路徑。其次,測試當(dāng)前接收的填充路徑是否與當(dāng)前存儲(chǔ)的漸變填充對(duì)準(zhǔn)。第三,通過調(diào)用名為check_output_fill的子過程1305,測試當(dāng)前存儲(chǔ)的漸變填充中的填充路徑是否與當(dāng)前接收的填充路徑匹配。最后,測試新填充路徑的裁剪區(qū)域和光柵操作是否與當(dāng)前存儲(chǔ)的漸變填充中先前添加的填充路徑的裁剪區(qū)域和光柵操作相同。以下會(huì)參照?qǐng)D13詳細(xì)說明check_output_fill子過程1305。如果肯定滿足所有上述測試,則check_fill子過程1205轉(zhuǎn)到步驟1240。否則,如果不滿足某項(xiàng)測試,則check_fill子過程1205轉(zhuǎn)到步驟1230。請(qǐng)注意,check_fill子過程1205依次評(píng)價(jià)各項(xiàng)測試,如果肯定不滿足某項(xiàng)測試,則check_fill子過程1205立即轉(zhuǎn)到步驟1230,而不會(huì)評(píng)價(jià)后續(xù)測試。例如,如果當(dāng)前存儲(chǔ)的漸變填充中只有一條填充路徑,并且該填充是對(duì)準(zhǔn)的,則滿足第一和第二項(xiàng)測試,然后第三項(xiàng)測試調(diào)用check_output_fill子過程1305。另一方面,如果當(dāng)前存儲(chǔ)的漸變填充中的填充路徑不止一條,則check_fill子過程1205轉(zhuǎn)到步驟1230,而不會(huì)評(píng)價(jià)后續(xù)測試。因此,僅當(dāng)有一條適當(dāng)對(duì)準(zhǔn)的當(dāng)前接收的填充路徑并且所存儲(chǔ)的漸變填充僅包含一條填充路徑時(shí),才調(diào)用check_output_fill子過程1305。
接著在步驟1240中,check_fill子過程1205檢查前兩條填充路徑的高度是否相似。最好通過測試當(dāng)前接收的填充路徑的矩形高度是否大于當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的矩形高度的兩倍,才測試相似性。請(qǐng)注意,在步驟1240中,當(dāng)前存儲(chǔ)的漸變填充中只有一條填充路徑。如果測試顯示高度相似,則check_fill子過程1205轉(zhuǎn)到步驟1250。否則,如果測試顯示兩個(gè)高度不相似,則check_fill子過程1205在步驟1260結(jié)束,并向方法1005的步驟1050返回假,表示不能將當(dāng)前接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。
在步驟1250中,check_fill子過程1205存儲(chǔ)在步驟1210中計(jì)算的兩條填充路徑的顏色梯度。在步驟1250之后,check_fill子過程1205在步驟1260結(jié)束,并向方法1005的步驟1050返回真,從而方法1005將新填充路徑添加(步驟1090)到存儲(chǔ)的漸變填充(此時(shí)僅包含一條填充路徑)中。
另一方面,如果在步驟1220中不滿足某一需求,則check_fill子過程1205轉(zhuǎn)到步驟1230。接著在步驟1230中,check_fill子過程1205檢查當(dāng)前接收的填充路徑是否為需要添加到當(dāng)前存儲(chǔ)的漸變填充中的合適候選項(xiàng)。步驟1230通過執(zhí)行檢查該處理以確保1.當(dāng)前存儲(chǔ)的漸變填充中的填充數(shù)目大于1;2.當(dāng)前存儲(chǔ)的漸變填充中的累計(jì)高度與當(dāng)前接收的填充路徑的矩形高度之和小于預(yù)定的最大值??梢詫㈩A(yù)定的最大值設(shè)置為某個(gè)值,使得填充不會(huì)延伸到頁面以外;3.當(dāng)前接收的填充路徑與當(dāng)前存儲(chǔ)的漸變填充中最后添加的填充路徑之間的顏色梯度具有相同符號(hào),并與存儲(chǔ)的梯度類似。檢查所用顏色空間內(nèi)每個(gè)顏色指數(shù)的梯度(例如,如果顏色空間為RGBA,則檢查各指數(shù)R、G、B的一致性)。最好進(jìn)行檢查以確保當(dāng)前接收的填充路徑的各顏色通道的顏色通道值Cn滿足公式(1)的某個(gè)關(guān)系;4.當(dāng)前接收的填充路徑與當(dāng)前存儲(chǔ)的漸變填充中的填充路徑正確對(duì)準(zhǔn);5.當(dāng)前接收的填充路徑的高度(矩形高度)與當(dāng)前存儲(chǔ)的漸變填充中最后添加的填充路徑的高度相似。最好通過測試當(dāng)前接收的填充路徑的矩形高度是否不超過當(dāng)前存儲(chǔ)的漸變填充中第一條填充路徑的矩形高度的兩倍,來檢查上述相似性;6.當(dāng)前接收的填充路徑的光柵操作與所存儲(chǔ)的漸變填充的光柵操作相同;7.當(dāng)前接收的填充路徑的裁剪與所存儲(chǔ)的漸變填充的裁剪相同。
如果步驟1230確定當(dāng)前接收的填充路徑已通過上述檢查1到7,則check_fill子過程1205在步驟1260結(jié)束,并向方法1005的過程1050返回真,從而方法1005將新填充路徑添加(步驟1090)到當(dāng)前存儲(chǔ)的漸變填充中。否則,如果檢查1到7的某個(gè)檢查失敗,則check_fill子過程1205在步驟1260結(jié)束,并向方法1005的過程1050返回假,從而不會(huì)將當(dāng)前接收的填充路徑添加到當(dāng)前存儲(chǔ)的漸變填充中。
3.3 check_ouput_fill子過程現(xiàn)在轉(zhuǎn)到圖13,該圖表示圖12的check_fill子過程1205的步驟1220調(diào)用的check_output_fill子過程1305的流程圖。check_output_fill子過程1305負(fù)責(zé)確定當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑和當(dāng)前接收的填充路徑是否適合于創(chuàng)建漸變填充。當(dāng)check_fill子過程1205的步驟1220(圖12)調(diào)用check_output_fill子過程1305時(shí),子過程1305在步驟1300開始。同時(shí)步驟1220向check_output_fill子過程1305傳遞當(dāng)前接收的填充路徑。
在步驟1300之后,check_output_fill子過程1305轉(zhuǎn)到1310。在步驟1310中,對(duì)于各顏色通道(如,紅、綠、藍(lán)和阿爾法),check_output_fill子過程1305首先計(jì)算當(dāng)前接收的填充路徑的顏色與當(dāng)前存儲(chǔ)的漸變填充中單一填充路徑的顏色之間的色差的絕對(duì)值。接著在步驟1310中,check_output_fill子過程1305確定并存儲(chǔ)色差絕對(duì)值最大的計(jì)算值(以下稱為最大顏色梯度)。在完成步驟1310以后,check_output_fill子過程1305轉(zhuǎn)到步驟1330。
在步驟1330中,check_output_fill子過程1305檢查(在步驟1310中計(jì)算的)最大顏色梯度是否小于預(yù)定的最大值。最大值最好為6。如果檢查1330顯示小于預(yù)定的最大值,則check_output_fill子過程1305在步驟13100結(jié)束,并向check_fill子過程1205(圖12)的步驟1220返回真。這通知check_fill子過程1205(圖12)應(yīng)當(dāng)創(chuàng)建漸變填充。另一方面,如果檢查1330顯示最大顏色梯度大于或等于預(yù)定的最大值,則check_output_fill子過程1305轉(zhuǎn)到步驟1340。在后一種情況中,如果各填充路徑的高度很小,則仍有可能應(yīng)當(dāng)創(chuàng)建漸變填充,而高度是在步驟1340至1390中確定的。
在步驟1340中,check_output_fill子過程1305調(diào)用名為get_alignment的子過程1495,以確定填充路徑的對(duì)準(zhǔn)性。該get_alignment子過程1495向check_output_fill子過程1305返回當(dāng)前接收的填充路徑和當(dāng)前存儲(chǔ)的漸變填充中單一填充路徑的對(duì)準(zhǔn)性(如,VDOWNLEFT)。在步驟1340中調(diào)用的get_alignment子過程1495結(jié)束后,check_output_fill子過程1305轉(zhuǎn)到步驟1350。
在步驟1350中,check_output_fill子過程1305檢查步驟1340返回的對(duì)準(zhǔn)性。如果檢查1350顯示根本未定義該方向,即get_alignment的子過程1495返回NONE(無),則check_output_fill子過程1305在步驟13100結(jié)束,并向check_fill子過程1205的步驟1220返回假,表示不應(yīng)創(chuàng)建漸變填充。如果檢查1350顯示方向?yàn)樗椒较颍磄et_alignment的子過程1495返回HDOWNLEFT、HUPLEFT、HDOWNRIGHT或HUPRIGHT,則check_output_fill子過程1305轉(zhuǎn)到步驟1360。否則,如果檢查1350顯示方向?yàn)榇怪狈较?,即get_alignment的子過程1495返回VDOWNLEFT、VUPLEFT、VDOWNRIGHT或VUPRIGHT,則check_output_fill子過程1305轉(zhuǎn)到步驟1390。
在步驟1360中,check_output_fill子過程1305將當(dāng)前接收的填充路徑的矩形高度設(shè)置為平行四邊形沿x坐標(biāo)軸的側(cè)邊的長度(見圖7B)。另一方面,在步驟1390中,check_output_fill子過程1305將當(dāng)前接收的填充路徑的矩形高度設(shè)置為平行四邊形沿y坐標(biāo)軸的側(cè)邊的長度(見圖7B)。在完成步驟1360或1390之后,check_output_fill子過程1305轉(zhuǎn)到步驟1380。
接著在步驟1380中,check_output_fill子過程1305檢查在步驟1360或1390中計(jì)算的矩形高度是否小于某預(yù)定的最大高度且大于零。如果檢查1380顯示并非如此,則check_output_fill子過程1305在步驟13100結(jié)束,并向check_fill子過程1205的步驟1220返回假。這樣表示不應(yīng)創(chuàng)建漸變填充。另一方面,如果檢查1380顯示其高度小于預(yù)定的最大高度且大于零,則check_output_fill子過程1305在步驟13100結(jié)束,并向check_fill子過程1205的步驟1220返回真。這樣表示兩條填充路徑,即當(dāng)前接收的填充路徑和當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑,可能適合于創(chuàng)建一個(gè)漸變填充。
3.4 get_alignment子過程現(xiàn)在轉(zhuǎn)到圖14A至圖14C,圖14A至圖14C分別表示圖11的add_rect子過程1105、圖12的check_fill子過程1205和圖13的check_output_fill子過程1305調(diào)用的get_alignment子過程1495的流程圖。該get_alignment子過程1495負(fù)責(zé)確定由當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑和當(dāng)前接收的填充路徑組成的梯度的方向。當(dāng)check_fill子過程1205的步驟1220(圖12)、add_rect子過程1105的步驟1120(圖11)或check_output_fill子過程1305的步驟1340(圖13)調(diào)用get_alignment子過程1495時(shí),子過程1495在步驟1400開始。在步驟1400中,步驟1220、1120和1340向get_alignment子過程1495傳遞當(dāng)前接收的填充路徑。
在完成步驟1400之后,get_alignment子過程1495轉(zhuǎn)到步驟1401,在步驟1401中,get_alignment子過程1495檢查當(dāng)前接收的填充路徑是否為矩形。如果檢查1401顯示當(dāng)前接收的填充路徑為矩形,則get_alignment子過程1495轉(zhuǎn)到步驟1402。在步驟1402中,get_alignment子過程1495檢查當(dāng)前接收的填充路徑和當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑是否在x平面上對(duì)準(zhǔn)。如果檢查1402顯示它們?cè)趚平面上對(duì)準(zhǔn),則get_alignment子過程1495轉(zhuǎn)到步驟1404。另一方面,如果檢查1402顯示它們未在x平面上對(duì)準(zhǔn),則get_alignment子過程1495轉(zhuǎn)到步驟1403。
在步驟1403中,get_alignment子過程1495檢查是否將當(dāng)前接收的填充路徑連接到當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的頂邊上。如果檢查1403返回真(是),則get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的子過程返回方向UP(上)。另一方面,如果檢查1403返回假(否),則get_alignment子過程1495轉(zhuǎn)到步驟1406。
在步驟1406中,get_alignment子過程1495檢查是否將當(dāng)前接收的填充路徑連接到當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的底邊上。如果檢查1406返回真(是),則get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的子過程返回方向DOWN(下)。另一方面,如果步驟1406處的檢查返回假(否),則get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的子過程返回方向NONE(無)??梢岳斫?,在后一種情況中,不連接填充路徑,表示不進(jìn)行混合。
在步驟1404中,get_alignment子過程1495檢查是否將當(dāng)前接收的填充路徑連接到當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的左邊上。如果步驟1404處的檢查返回真(是),則get_alignment子過程1495在步驟14150處結(jié)束,并向調(diào)用它的子過程返回方向LEFT(左)。另一方面,如果步驟1404處的檢查返回假(否),則get_alignment子過程1495轉(zhuǎn)到步驟1405。
在步驟1405中,get_alignment子過程1495檢查是否將當(dāng)前接收的填充路徑連接到當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的右邊上。如果檢查1405返回真(是),則get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的子過程返回方向RIGHT(右)。另一方面,如果1405處的檢查返回假(否),則get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的子過程返回方向NONE(無)??梢岳斫猓诤笠环N情況中,不連接填充路徑,表示不進(jìn)行混合。
另一方面,如果步驟1401處的檢查顯示當(dāng)前接收的填充路徑不是矩形,則get_alignment子過程1495轉(zhuǎn)到步驟1410。在步驟1410中,檢查當(dāng)前接收的填充路徑和當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑,查看其端點(diǎn)1.y是否對(duì)準(zhǔn)。假如對(duì)準(zhǔn)的話,則漸變填充為水平類型填充(圖6A至圖6D),并且get_alignment子過程1495轉(zhuǎn)到步驟1420。否則,漸變填充為垂直類型填充(圖5A至圖5D),并且get_alignment子過程1495轉(zhuǎn)到步驟1480。
在步驟1420中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑,查看其端點(diǎn)1.x是否小于x平面上的端點(diǎn)4.x。假如這樣的話,則填充或者為HDOWNRIGHT、HUPRIGHT,或者為NONE(圖6A或圖6B),并且get_alignment子過程1495轉(zhuǎn)到步驟1450。在步驟1450中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充的填充路徑的端點(diǎn)1是否位于邊界矩形的上邊界附近。假如這樣的話,則認(rèn)為填充是HDOWNRIGHT填充(見圖6A),get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的步驟返回HDOWNRIGHT。否則,get_alignment子過程1495轉(zhuǎn)到步驟1460。在步驟1460中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充的填充路徑的端點(diǎn)1是否位于邊界矩形的下邊界附近。假如這樣的話,則認(rèn)為填充是HUPRIGHT填充(見圖6B),get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的步驟返回HUPRIGHT。否則,認(rèn)為填充沒有方向(即,NONE),get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的步驟返回值NONE。
另一方面,在步驟1420中,如果get_alignment子過程1495確定當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的端點(diǎn)1.x大于或等于x平面上的端點(diǎn)4.x則get_alignment子過程1495轉(zhuǎn)到步驟1430。在步驟1430中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的端點(diǎn)1是否大于x平面上的端點(diǎn)4。若不然,則認(rèn)為填充沒有方向(即,NONE),get_alignment子過程1495在步驟14150結(jié)束,并向調(diào)用它的步驟返回值NONE。否則,get_alignment子過程1495轉(zhuǎn)到步驟1440。
在步驟1440中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的端點(diǎn)1.y是否位于y平面上的邊界矩形的上邊界附近。若不然,則認(rèn)為該填充是HUPLEFT(圖6D),get_alignment子過程1495在步驟14150結(jié)束,并向其調(diào)用步驟返回值HUPLEFT。否則,get_alignment子過程1495轉(zhuǎn)到步驟1470。在步驟1470中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的端點(diǎn)1.y是否位于y平面上的邊界矩形的下邊界附近。假如這樣的話,則認(rèn)為該填充是HDOWNLEFT填充(見圖6C),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值HDOWNLEFT。否則,認(rèn)為該填充沒有方向(NONE),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值NONE。
在步驟1480中,get_alignment子過程1495檢查對(duì)于端點(diǎn)1當(dāng)前接收的填充路徑和當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的填充路徑是否具有相同的x值。若不然,則填充路徑未對(duì)準(zhǔn),并且不能構(gòu)成一個(gè)漸變填充,get_alignment子過程1495結(jié)束,并向其調(diào)用步驟返回值NONE。否則,get_alignment子過程1495轉(zhuǎn)到步驟1490。
在步驟1490中,get_alignment子過程1495測試當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的填充路徑的端點(diǎn)1是否小于y平面上同一填充路徑的端點(diǎn)4。假如這樣的話,認(rèn)為填充是VDOWNLEFT或VDOWNRIGHT(見圖5A和5B),并且get_alignment子過程1495轉(zhuǎn)到步驟14120。
在步驟14120中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的填充路徑的端點(diǎn)1是否位于邊界矩形的右邊附近。假如這樣的話,認(rèn)為填充是VDOWNLEFT(見圖5B),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值VDOWNLEFT。否則,get_alignment子過程1495轉(zhuǎn)到步驟14130。
在步驟14130中,get_alignment子過程1495檢查當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的填充路徑的端點(diǎn)1是否位于邊界矩形的左邊附近。假如這樣的話,認(rèn)為填充是VDOWNRIGHT(見圖5A),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值VDOWNRIGHT。否則,認(rèn)為填充路徑未對(duì)準(zhǔn),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值NONE。
否則,如果步驟1490返回假(否),則get_alignment子過程1495轉(zhuǎn)到步驟14100。在步驟14100中,get_alignment子過程1495測試當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的填充路徑的端點(diǎn)1是否大于同一填充路徑的端點(diǎn)4(在y平面上)。若不然,認(rèn)為填充路徑未對(duì)準(zhǔn),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值NONE。否則,get_alignment子過程1495轉(zhuǎn)到步驟14110。
在步驟14110中,get_alignment子過程1495測試當(dāng)前存儲(chǔ)的漸變填充中的單一填充路徑的端點(diǎn)1是否位于邊界矩形的右邊附近。假如這樣的話,認(rèn)為填充是VUPLEFT(見圖5C),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值VUPLEFT。否則,get_alignment子過程1495轉(zhuǎn)到步驟14140。
在步驟14140中,get_alignment子過程1495測試當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的端點(diǎn)1,檢查其是否位于邊界框的左邊附近。假如這樣的話,認(rèn)為填充是VUPRIGHT(見圖5D),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值VUPRIGHT。否則,認(rèn)為填充路徑未對(duì)準(zhǔn),get_alignment子過程1495結(jié)束于步驟14150,并向其調(diào)用步驟返回值NONE。
可以看出,已經(jīng)在任何步驟中確定對(duì)準(zhǔn)性或未對(duì)準(zhǔn)性,然后僅僅向調(diào)用子過程返回對(duì)準(zhǔn)性。
3.5 flush_ramp子過程現(xiàn)在轉(zhuǎn)到圖15,該圖表示方法1005的步驟1040和1070調(diào)用的flush_ramp子過程1505的流程圖。flush_ramp子過程1505主要負(fù)責(zé)清空當(dāng)前存儲(chǔ)的漸變填充。當(dāng)方法1005的步驟1040和1070(圖10)調(diào)用flush_ramp子過程1505時(shí),子過程1505開始于步驟1500。在開始于步驟1500之后,flush_ramp子過程1505轉(zhuǎn)到步驟1510。
在步驟1510中,flush_ramp子過程1505檢查當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的數(shù)目。如果步驟1510處的檢查顯示沒有填充路徑,則flush_ramp子過程1505結(jié)束于步驟1560,并向調(diào)用步驟1040或1070返回,因?yàn)橐亚蹇樟怂刑畛渎窂?。否則,如果步驟1510處的檢查顯示當(dāng)前存儲(chǔ)的漸變填充中有一條或多條填充路徑,則flush_ramp子過程1505轉(zhuǎn)到步驟1520。
在步驟1520中,flush_ramp子過程1505再次檢查當(dāng)前存儲(chǔ)的漸變填充中的填充數(shù)目。此時(shí),如果步驟1520處的檢查顯示填充數(shù)目為1,則flush_ramp子過程1505轉(zhuǎn)到步驟1530。在步驟1530中,在圖形描繪系統(tǒng)的第一層中調(diào)用外部函數(shù)draw_flat,以便將單一填充路徑轉(zhuǎn)換為基于邊的格式。在完成步驟1530之后,flush_ramp子過程1505轉(zhuǎn)到步驟1550。另一方面,如果步驟1520處的檢查顯示當(dāng)前存儲(chǔ)的漸變填充中的填充路徑的數(shù)目大于1,則在步驟1540中調(diào)用find_and_put_ramps函數(shù)1605。find_and_put_ramps函數(shù)1605負(fù)責(zé)將當(dāng)前存儲(chǔ)的漸變填充分割為多個(gè)最佳的直線性混合,并輸出到圖形描繪系統(tǒng)的第一層,以便轉(zhuǎn)換為基于邊的格式。以下會(huì)參照?qǐng)D16說明find_and_put_ramps函數(shù)1605。當(dāng)步驟1540中的find_and_put_ramps函數(shù)1605完成之后,flush_ramp子過程1505轉(zhuǎn)到步驟1550。
接著,在步驟1550中,flush_ramp子過程1505清空當(dāng)前存儲(chǔ)的漸變填充中的所有填充路徑,并將變量numfills(填充數(shù)目)復(fù)位為零。在完成步驟1550之后,flush_ramp子過程1505結(jié)束,并返回到方法1005的調(diào)用步驟1040或1070(圖10)。
3.6 find_and_put_ramps子過程現(xiàn)在轉(zhuǎn)到圖16,該圖表示圖15的flush_ramp子過程1505的步驟1540最初調(diào)用的find_and_put_ramps子過程1605的流程圖。find_and_put_ramps子過程1605負(fù)責(zé)將當(dāng)前存儲(chǔ)的漸變填充分割為多個(gè)最佳的直線性混合,并將它們輸出到圖形描繪系統(tǒng)的第一層,以便轉(zhuǎn)換為基于邊的格式??梢詮囊韵抡f明中看出,find_and_put_ramps子過程1605是一個(gè)遞歸子過程。在步驟1600中,find_and_put_ramps子過程1605開始,該過程將當(dāng)前存儲(chǔ)的漸變填充路徑的填充路徑集合的顏色數(shù)組、點(diǎn)數(shù)組和高度數(shù)組作為輸入。當(dāng)flush_ramp子過程1505的步驟1540(圖15)最初調(diào)用find_and_put_ramps子過程1605時(shí),將當(dāng)前存儲(chǔ)的漸變填充的填充路徑的完整集合的顏色數(shù)組、點(diǎn)數(shù)組和高度數(shù)組,傳遞給find_and_put_ramps子過程1605。為了說明起見,將填充路徑的完整集合記作fill-paths[1...n],分別將其顏色數(shù)組、點(diǎn)數(shù)組和高度數(shù)組記作C[1...n],points[1...n]和H[1...n]。
在步驟1600之后,find_and_put_ramps子過程1605轉(zhuǎn)到步驟1610。在步驟1610中,find_and_put_ramps子過程1605根據(jù)上述公式(2),檢查集成fill-paths[1...n]的前一半填充路徑的顏色梯度是否與整個(gè)fill-paths[1...n]的顏色梯度不接近(如,RGBA接近原色的紅、綠、藍(lán)和阿爾法通道)。同時(shí),步驟1610檢查n是否小于預(yù)定的最小值,該最小值最好設(shè)置為5或一個(gè)相同數(shù)量級(jí)的數(shù)值。如果檢查1610顯示顏色梯度不接近,即不滿足公式(2)的要求,并且n不小于預(yù)定閾值,則find_and_put_ramps子過程1605轉(zhuǎn)到步驟1630。否則,find_and_put_ramps子過程1605轉(zhuǎn)到步驟1620。
在步驟1630中,find_and_put_ramps子過程1605將fill-paths[1...n]的點(diǎn)數(shù)組、顏色數(shù)組和高度數(shù)組劃分為兩套點(diǎn)數(shù)組、顏色數(shù)組和高度數(shù)組(C[1..n/2],H[1..n/2],P[1..n/2])和(C[n/2..n],H[n/2..n],P[n/2..n]),其中n為數(shù)組的大小,如果n為奇數(shù),則增加n/2,直至到達(dá)下一個(gè)最接近的整數(shù)。在完成步驟1630之后,find_and_put_ramps子過程1605轉(zhuǎn)到步驟1640。
在步驟1640中,find_and_put_ramps子過程1605依次對(duì)兩個(gè)新數(shù)組集合(C[1..n/2],H[1..n/2],P[1..n/2])和(C[n/2..n],H[n/2..n],P[n/2..n])的每個(gè)集合調(diào)用find_and_put_ramps子過程1605。在完成步驟1640之后,find_and_put_ramps子過程1605結(jié)束于步驟1660,并且方法1005返回到flush_ramp子過程1505的步驟1550(圖15)。
在步驟1620中,find_and_put_ramps子過程1605根據(jù)填充方向計(jì)算總高度,并計(jì)算用于定義將要應(yīng)用的漸變填充的端點(diǎn)所需的兩個(gè)端點(diǎn)。需要計(jì)算這兩個(gè)端點(diǎn),從而沿正確方向應(yīng)用漸變填充,參見圖8A至8C。通常總是將第一個(gè)端點(diǎn)定義為所存儲(chǔ)的填充路徑端點(diǎn)的某個(gè)端點(diǎn)。依據(jù)漸變填充是水平類型還是垂直類型,通過使用總高度以及圖14A至14C所示的公式,查找第二端點(diǎn)(Q,P)。
在完成步驟1620之后,find_and_put_ramps子過程1605轉(zhuǎn)到步驟1650。在步驟1650中,調(diào)用外部函數(shù)draw_blend,以便利用在步驟1620中確定的兩個(gè)端點(diǎn),起始顏色以及每個(gè)象素每個(gè)顏色通道的顏色梯度,生成一個(gè)直線性混合,并輸出到圖形描繪系統(tǒng)。任何已知的用于生成直線性混合的函數(shù)均適用。在完成步驟1650之后,find_and_put_ramps子過程1605結(jié)束,并返回到其調(diào)用步驟1640或1540。
上述方法1005和子過程包括特定控制流。方法1005可具有其他不同形式,可以使用不同的控制流而并不背離本發(fā)明的實(shí)質(zhì)。另外,可以并行執(zhí)行而不是順序執(zhí)行方法1005的一個(gè)或多個(gè)步驟。
4.0備擇方法通過按照?qǐng)D18所示的方式修改上述方法1005,可以實(shí)現(xiàn)用于生成直線性混合的備擇方法。備擇方法主要來自get_alignment子過程的簡化以及由此引起的其他子過程的必然修改。在以下說明中,利用相同參考標(biāo)號(hào)表示與前述步驟和過程相同的方法步驟和過程。
正如在圖18中看到的那樣,備擇方法1805具有入口點(diǎn)1800,從入口點(diǎn)轉(zhuǎn)到步驟1010、1020、1030和1040,其中各步驟按前述方式運(yùn)行。來自步驟1030的“否”結(jié)果,調(diào)用步驟1850,檢查漸變填充。步驟1850調(diào)用圖20的modified_check_fill子過程2005。子過程2005具有入口點(diǎn)2000,從該入口點(diǎn)轉(zhuǎn)到按前述方式運(yùn)行的步驟1210,然后轉(zhuǎn)到判定步驟2002。
在判定步驟2002中,modified_check_fill子過程2005首先測試當(dāng)前的漸變填充中是否僅僅存儲(chǔ)了一條填充路徑。其次,通過調(diào)用參照?qǐng)D21說明的alternate_get_alignment子過程2105,測試當(dāng)前接收的填充路徑是否與當(dāng)前存儲(chǔ)的漸變填充對(duì)準(zhǔn)。第三,通過調(diào)用圖13所示的check_output_fill流程圖的修改流程圖,測試當(dāng)前存儲(chǔ)的漸變填充中的填充路徑和當(dāng)前接收的填充路徑是否看起來一致。盡管未單獨(dú)示出其修改流程圖,但是根據(jù)以下說明以及圖13,其修改是顯而易見的。在修改中,如果圖13的檢查步驟1330顯示最大顏色梯度大于或等于預(yù)定的最大值(即,否),則check_output_fill子過程的當(dāng)前修改直接結(jié)束于步驟13100,并向modified_check_fill子過程2005(圖20)的步驟2002返回假。在該經(jīng)過修改的實(shí)現(xiàn)中,完全省略圖13的步驟1340、1350、1360、1380和1390。這通知modified_check_fill子過程2005(圖20)不應(yīng)創(chuàng)建漸變填充。最后,判定步驟2002檢查當(dāng)前接收的填充路徑的裁剪和光柵操作(ROP)是否與當(dāng)前存儲(chǔ)的漸變填充中存儲(chǔ)的填充路徑相同。裁剪對(duì)象包含一個(gè)唯一標(biāo)識(shí)符,利用該標(biāo)識(shí)符檢查一致裁剪。唯一標(biāo)識(shí)符是由GDI層設(shè)置的。使用與填充路徑本身相同區(qū)域的裁剪區(qū)域被視為空裁剪。
圖20所示的modified_check_fill子過程2005的剩余步驟與參照?qǐng)D12描述的步驟相對(duì)應(yīng),因此不再重復(fù)。
當(dāng)調(diào)用alternate_get_alignment子過程2105時(shí),過程轉(zhuǎn)到圖21中的入口點(diǎn)2100。
在步驟2110中,選擇某個(gè)側(cè)邊作為“chosen_side(選定側(cè)邊)”。選定側(cè)邊基于組成填充路徑的端點(diǎn)。在任何時(shí)候,新填充路徑和存儲(chǔ)的填充路徑總是具有相同的選定側(cè)邊。在這點(diǎn)上,可以將選定側(cè)邊定義為某條填充路徑的端點(diǎn)0和端點(diǎn)1之間的側(cè)邊。由于尚未確定方向,所以假定寬度為選定側(cè)邊的長度,假定高度為與選定側(cè)邊相鄰的側(cè)邊的長度。在步驟2110中,如果在該子過程中已經(jīng)指派了chosen_side,則指派下一個(gè)側(cè)邊為chosen_side。在任何一次對(duì)子過程2105的調(diào)用中,不能將某個(gè)側(cè)邊指派為chosen_side一次以上。
接著,步驟2120檢查新接收的填充路徑的寬度是否與存儲(chǔ)的填充路徑的寬度相同,并且寬度的斜率接近。通常兩條相鄰的填充路徑并不完全相同。該算法具有可定義的公差,從而允許新的填充路徑與第一條填充路徑的寬度和長度有細(xì)微差別。利用組成填充路徑的端點(diǎn)的各x分量和y分量,計(jì)算特定填充路徑的寬度和高度。對(duì)于各x分量和y分量而言,上述計(jì)算中使用的公差最好為±1個(gè)象素,但是可根據(jù)系統(tǒng)需要容易地改變公差。在測試斜率的近似性時(shí)也使用該公差。步驟2120繼續(xù)檢查新填充路徑的高度是否等于或不大于第一條所存儲(chǔ)的填充路徑的高度的兩倍。如果高度足夠接近,則步驟2120轉(zhuǎn)到步驟2130,否則進(jìn)行到步驟2140。
接著,步驟2130檢查新接收的填充路徑的選定側(cè)邊的對(duì)邊是否與存儲(chǔ)的填充路徑的選定側(cè)邊重合(或重疊)。要成為合法重疊,新填充路徑和存儲(chǔ)的填充路徑的全部寬度必須完全重疊。在確定這種重疊時(shí)使用一個(gè)可配置的公差,公差最好為沿x或y方向±1個(gè)象素的數(shù)量級(jí)。只有重疊高度小于當(dāng)前存儲(chǔ)的漸變填充中的最后填充路徑的高度的一半時(shí),重疊才有效。認(rèn)為彼此不接觸的單獨(dú)的填充路徑是不重合或重疊的,即使它們?cè)谏鲜龉顦?biāo)準(zhǔn)內(nèi)。如果側(cè)邊重合或重疊,則可以定義方向,并且進(jìn)行到步驟2150。否則,如果側(cè)邊不重合或重疊,則不能確定方向,并且步驟2130轉(zhuǎn)到步驟2140。
在步驟2150中,為當(dāng)前存儲(chǔ)的直線性斜面指派方向。該方向基于當(dāng)前的選定側(cè)邊。如果選定側(cè)邊為01,則方向是DIR_21,如果選定側(cè)邊為12,則方向是DIR_01,如果選定側(cè)邊為23,則方向是DIR_12,如果選定側(cè)邊為30,則方向是DIR_10。接著子過程結(jié)束于步驟2160,并向調(diào)用步驟2002返回適當(dāng)方向。
在步驟2140中,如果已經(jīng)選取全部四條邊作為選定側(cè)邊,則已經(jīng)用盡所有可能的對(duì)準(zhǔn),因此不能為填充路徑指派方向,從而在步驟2170向調(diào)用步驟2002返回DIR_NONE(無方向)。如果還未用盡全部四條邊,則該算法轉(zhuǎn)到步驟2110。
在步驟1850之后,備擇方法1805在步驟1860中檢查modified_check_fill子過程2005是否已返回真。若不然,步驟1070和1080按前述方式運(yùn)行。假如這樣的話,進(jìn)行到步驟1890,并利用圖19的modified_add_rect子過程1905添加填充路徑。子過程1905可用于方法1005或1805。子過程1905具有入口點(diǎn)1900,該入口點(diǎn)轉(zhuǎn)到按前述方式運(yùn)行的步驟1110。正如在圖23A至圖23D中看到的那樣,如果填充數(shù)為1(即,是),則進(jìn)行到步驟1930,在該步驟直接根據(jù)填充方向確定填充的高度。這大大簡化了先前在步驟1120、1130、1140和1150(見圖11)中執(zhí)行的過程。
在步驟1930之后,步驟1950繼續(xù),在此確定第一條填充路徑的高度,并存儲(chǔ)在高度數(shù)組中。若不然,步驟1160繼續(xù),象步驟1950之后那樣。接著在步驟1970中,modified_add_rect子過程1905返回到圖18的主方法,該方法然后向圖形描繪系統(tǒng)的第一層返回參數(shù)OK,表示無需進(jìn)行轉(zhuǎn)換,并將填充路徑傳遞給圖形描繪系統(tǒng)的第二層。
當(dāng)圖18的備擇方法1805按前述方式運(yùn)行時(shí),步驟1040和1070調(diào)用flush_ramp子過程1505,而后者又調(diào)用find_and_put_ramps子過程1605。子過程1605的步驟1620按前述方式運(yùn)行,以便使用兩個(gè)端點(diǎn)來定義混合方向。正如在圖22中看到的那樣,在備擇方法1805中,需要計(jì)算兩個(gè)端點(diǎn),從而沿正確方向應(yīng)用漸變填充。選擇的第一點(diǎn)依賴于漸變填充的遍歷方向。如果填充具有方向DIR_01,則選擇的第一點(diǎn)為存儲(chǔ)的漸變填充中第一條填充路徑的點(diǎn)0。如果填充具有方向DIR_10,則選擇的第一點(diǎn)為存儲(chǔ)的漸變填充中第一條填充路徑的點(diǎn)1。如果填充具有方向DIR_12,則選擇的第一點(diǎn)為存儲(chǔ)的漸變填充中第一條填充路徑的點(diǎn)1。如果填充具有方向DIR_21,則選擇的第一點(diǎn)為存儲(chǔ)的漸變填充中第一條填充路徑的點(diǎn)2。通常查找直線B和直線C的交點(diǎn),確定選擇的第二點(diǎn),在圖8中為點(diǎn)2(Q,P)。直線B為與通過漸變填充之第一點(diǎn)的直線A垂直的直線。直線A為通過漸變填充的第一點(diǎn)且與存儲(chǔ)的漸變填充中的第一條填充路徑的寬度方向平行的直線。直線C為與存儲(chǔ)的漸變填充的寬度方向平行且通過沿漸變填充方向描述的第二點(diǎn)的直線(如,對(duì)DIR_01漸變填充而言,直線C應(yīng)通過最后填充路徑的點(diǎn)1)。對(duì)于沿水平方向或垂直方向遍歷的漸變填充而言,漸變填充的第二點(diǎn)為沿著存儲(chǔ)的漸變填充中的最后填充路徑的填充方向描述的第二點(diǎn)。例如,對(duì)于方向DIR_12,漸變填充的第二點(diǎn)為存儲(chǔ)的漸變填充中的最后填充路徑的點(diǎn)2。
5.0首選裝置最好使用通用計(jì)算機(jī)系統(tǒng)1700實(shí)現(xiàn)圖10或圖18所示的用于生成一個(gè)或多個(gè)直線性混合的方法,其中可以將該過程實(shí)現(xiàn)為比如計(jì)算機(jī)系統(tǒng)1700上執(zhí)行的應(yīng)用程序軟件。特別地,利用計(jì)算機(jī)執(zhí)行的軟件指令,實(shí)現(xiàn)用于生成一個(gè)或多個(gè)直線性混合的方法的步驟。可以按照一個(gè)或多個(gè)代碼模塊的方式構(gòu)造指令,每個(gè)代碼模塊執(zhí)行一個(gè)或多個(gè)特定任務(wù)??梢詫⒃撥浖澐譃槎鄠€(gè)獨(dú)立部分,其中一個(gè)部分執(zhí)行用于生成一個(gè)或多個(gè)直線性混合的方法,另一部分管理第一部分和用戶之間的用戶界面。可以在包括以下存儲(chǔ)設(shè)備在內(nèi)的計(jì)算機(jī)可讀介質(zhì)上存儲(chǔ)該軟件。從計(jì)算機(jī)可讀介質(zhì)上將該軟件加載到計(jì)算機(jī)中,并由計(jì)算機(jī)執(zhí)行。其上記錄有此類軟件或計(jì)算機(jī)程序的計(jì)算機(jī)可讀介質(zhì)為計(jì)算機(jī)程序產(chǎn)品。在計(jì)算機(jī)中使用計(jì)算機(jī)程序產(chǎn)品可較好地實(shí)現(xiàn)用于生成一個(gè)或多個(gè)直線性混合的有利裝置。
計(jì)算機(jī)系統(tǒng)1700包括計(jì)算機(jī)組件1701,諸如鍵盤1702和鼠標(biāo)1703之類的輸入設(shè)備,包括打印機(jī)1715、顯示設(shè)備1714和揚(yáng)聲器1717的輸出設(shè)備。計(jì)算機(jī)組件1701使用調(diào)制器-解調(diào)器(調(diào)制解調(diào)器)收發(fā)設(shè)備1716與通信網(wǎng)絡(luò)1720通信,例如,通過電話線1721或其他功能媒介進(jìn)行連接。能夠利用調(diào)制解調(diào)器1716訪問因特網(wǎng),或諸如局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)之類的其他網(wǎng)絡(luò)系統(tǒng),并且在某些實(shí)現(xiàn)中,可以將調(diào)制解調(diào)器集成到計(jì)算機(jī)組件1701中。
計(jì)算機(jī)組件1701通常包括至少一個(gè)處理器1705和一個(gè)存儲(chǔ)器1706,例如由半導(dǎo)體隨機(jī)存取存儲(chǔ)器(RAM)和只讀存儲(chǔ)器(ROM)組成的存儲(chǔ)器。組件1701還包括許多輸入/輸出(I/O)接口,如連接視頻顯示器1714和揚(yáng)聲器1717的音頻視頻接口1707,用于鍵盤1702、鼠標(biāo)1703和可選游戲桿(未示出)的I/O接口1713,用于調(diào)制解調(diào)器1716和打印機(jī)1715的接口1708。在某些實(shí)現(xiàn)中,可以將調(diào)制解調(diào)器1716集成到計(jì)算機(jī)組件1701中,例如集成到接口1708中。設(shè)置了存儲(chǔ)設(shè)備1709,它通常包括硬盤驅(qū)動(dòng)器1710和軟盤驅(qū)動(dòng)器1711。還可以使用磁帶驅(qū)動(dòng)器(未示出)。通常提供CD-ROM驅(qū)動(dòng)器1712作為非易失數(shù)據(jù)源。計(jì)算機(jī)組件1701的組件1705到1713通常通過互連總線1704進(jìn)行通信,并采用相關(guān)技術(shù)人員熟知的計(jì)算機(jī)系統(tǒng)1700的常規(guī)操作方式進(jìn)行通信??梢詫?shí)現(xiàn)上述裝置的計(jì)算機(jī)示例包括IBM PC機(jī)或其兼容機(jī),Sun Sparcstation或由此演化的計(jì)算機(jī)系統(tǒng)。
通常,應(yīng)用程序駐留在硬盤驅(qū)動(dòng)器1710上,由處理器1705讀取并控制其執(zhí)行。通過使用半導(dǎo)體存儲(chǔ)器1706(可能需要與硬盤驅(qū)動(dòng)器1710相呼應(yīng)),中間存儲(chǔ)從網(wǎng)絡(luò)1720上取得的程序和數(shù)據(jù)。在某些情況中,可以向CD-ROM或軟盤上編碼的用戶提供應(yīng)用程序,然后通過相應(yīng)驅(qū)動(dòng)器1712或1711進(jìn)行讀取,作為選擇,用戶可通過調(diào)制解調(diào)器設(shè)備1716從網(wǎng)絡(luò)1720上讀取應(yīng)用程序。另外,可以從其他計(jì)算機(jī)可讀介質(zhì)中將該軟件加載到計(jì)算機(jī)系統(tǒng)1700中。本文使用的術(shù)語“計(jì)算機(jī)可讀介質(zhì)”意指,向計(jì)算機(jī)系統(tǒng)1700提供指令和/或數(shù)據(jù)以便執(zhí)行和/或進(jìn)行處理的所有存儲(chǔ)或傳輸介質(zhì)。存儲(chǔ)介質(zhì)的示例包括軟盤,磁帶,CD-ROM,硬盤驅(qū)動(dòng)器,ROM或集成電路,磁光盤,諸如PCMCIA卡之類的計(jì)算機(jī)可讀卡,而不管此類設(shè)備是計(jì)算機(jī)組件1701的內(nèi)部設(shè)備還是外部設(shè)備。傳輸介質(zhì)的示例包括射頻或紅外傳輸通道,到達(dá)其他計(jì)算機(jī)或聯(lián)網(wǎng)設(shè)備的網(wǎng)絡(luò)連接,以及因特網(wǎng)或內(nèi)聯(lián)網(wǎng),包括電子郵件傳輸或網(wǎng)站上記錄的信息等。
作為選擇,可以利用專用硬件,如執(zhí)行用于生成一個(gè)或多個(gè)直線性混合之功能或子功能的一個(gè)或多個(gè)集成電路,實(shí)現(xiàn)用于生成一個(gè)或多個(gè)直線性混合的方法。此類專用硬件可以作為圖形描繪系統(tǒng)的一部分。
工業(yè)實(shí)用性上述裝置顯然適用于計(jì)算機(jī)制圖和印刷行業(yè)。
以上僅僅描述了本發(fā)明的某些實(shí)施方式,可以對(duì)本發(fā)明進(jìn)行修改和/或變更而并不背離本發(fā)明的范圍和實(shí)質(zhì),實(shí)施方式只是說明性的,而不是限制性的。
權(quán)利要求
1.一種根據(jù)限定當(dāng)前直線性混合的一條或多條填充路徑的列表以及至少一條新的填充路徑生成一個(gè)或多個(gè)直線性混合的方法,其中每條填充路徑包括一個(gè)單色平行四邊形,該方法包括以下步驟(a)如果滿足條件集合中的每個(gè)條件,則將所述一條新的填充路徑添加到所述列表中,從而成為所述列表中的最后填充路徑,否則轉(zhuǎn)到步驟(c),所述條件集合包括至少一個(gè)條件,所述一個(gè)條件基于新填充路徑和最后填充路徑的顏色以及一個(gè)閾值,所述閾值被預(yù)先設(shè)置為這樣一個(gè)值,從而當(dāng)新的填充路徑在視覺上不構(gòu)成當(dāng)前的直線性混合的一部分時(shí),不會(huì)將該新的填充路徑添加到列表中;(b)對(duì)剩余的每條所述新的填充路徑,重復(fù)所述步驟(a);以及(c)根據(jù)所述列表中的第一填充路徑到所述列表中的最后填充路徑,生成一個(gè)或多個(gè)直線性混合。
2.根據(jù)權(quán)利要求1的方法,其中所述一個(gè)條件包括所述新的填充路徑和所述列表中的最后填充路徑之間的各顏色通道的色差均不大于閾值。
3.根據(jù)權(quán)利要求2的方法,其中所述閾值為所述列表中的最后填充路徑和倒數(shù)第二條填充路徑之間的色差的兩倍。
4.根據(jù)權(quán)利要求1的方法,其中所述條件集合還包括第二條件,即新填充路徑與該列表中的最后填充路徑物理鄰接或重疊。
5.根據(jù)權(quán)利要求1的方法,其中所述條件集合還包括第三條件,即所述新填充路徑的高度不超過所述列表中最后添加的填充路徑的高度的兩倍,所述高度是在按照所述列表中的填充路徑的物理位置確定的方向上測量的。
6.根據(jù)權(quán)利要求1的方法,其中所述條件集合還包括第四條件,即當(dāng)前的直線性混合內(nèi)的填充路徑的數(shù)目大于1。
7.根據(jù)權(quán)利要求1的方法,其中所述條件集合還包括第五條件,即所述直線性混合內(nèi)的填充路徑的累計(jì)高度與所述新填充路徑的矩形高度之和小于預(yù)定的最大值。
8.根據(jù)權(quán)利要求7的方法,其中所述預(yù)定的最大值被如此設(shè)置以致填充不會(huì)越過輸出介質(zhì)的邊界。
9.根據(jù)權(quán)利要求1的方法,其中所述條件集合還包括第六條件,即當(dāng)前接收的填充路徑的光柵操作不使用目的地,并且與當(dāng)前的直線性混合的光柵操作相同。
10.根據(jù)權(quán)利要求1的方法,其中所述條件集合還包括第七條件,即當(dāng)前接收的填充路徑具有與當(dāng)前的直線性混合相同的裁剪。
11.根據(jù)權(quán)利要求1的方法,其中所述列表包括一個(gè)原始列表fill-paths[1]...[n],所述生成步驟(c)包括以下子步驟(ca)確定該列表的fill-path[1]和fill-path[n]之間的顏色梯度在預(yù)定公差內(nèi)是否等于該列表的fill-path[1]和fill-path[n/2]之間的顏色梯度;以及(caa)假如這樣的話,則根據(jù)所述列表中的第一條填充路徑的顏色和位置以及所述列表中的最后填充路徑的顏色和位置,輸出列表fill-paths[1]...[n]的直線性混合;否則(cab)將列表fill-paths[1]...[n]分割為具有至少實(shí)質(zhì)上相同數(shù)目填充路徑的兩個(gè)列表;以及(cb)對(duì)每個(gè)分割列表重復(fù)步驟(ca),直至處理了原始列表fill-paths[1]...[n]中的所有填充路徑。
12.根據(jù)權(quán)利要求11的方法,其中步驟(cab)包括將所述列表分割為兩個(gè)列表,一個(gè)為列表的第一部分(fill-path[1]..fill-path[n/2]),另一個(gè)為列表的第二部分(fill-path[n/2]..fill-path[n])。
13.根據(jù)權(quán)利要求11的方法,其中步驟(cab)包括將所述列表分割為兩個(gè)列表,一個(gè)為列表的第一部分(fill-path[1]..fill-path[n/2]),另一個(gè)為列表的第二部分(fill-path[(n/2)+1]..fill-path[n])。
14.根據(jù)權(quán)利要求11的方法,其中在與填充路徑的第一分割列表對(duì)應(yīng)的第一直線性混合的附近,輸出與填充路徑的第二分割列表對(duì)應(yīng)的第二直線性混合,其中將第二直線性混合的起始顏色設(shè)置為第一直線性混合的結(jié)束顏色。
15.根據(jù)權(quán)利要求1的方法,其中定義所述當(dāng)前直線性混合的所述列表涉及已經(jīng)接收的一條或多條填充路徑,并且所述至少一條新填充路徑是新接收的,由此能夠?qū)崿F(xiàn)所述方法。
16.根據(jù)權(quán)利要求4的方法,其中至少通過比較所述填充路徑的對(duì)準(zhǔn)性確定其毗連性。
17.一種包括計(jì)算機(jī)程序代碼裝置的計(jì)算機(jī)程序單元,該計(jì)算機(jī)程序代碼裝置使得計(jì)算機(jī)執(zhí)行這樣一個(gè)過程,該過程根據(jù)定義當(dāng)前直線性混合的一條或多條填充路徑的列表和至少一條新填充路徑,生成一個(gè)或多個(gè)直線性混合,其中每條填充路徑包括一個(gè)單色平行四邊形,該程序代碼裝置包括添加代碼裝置,如果滿足條件集合中的每個(gè)條件,則將所述一條新的填充路徑添加到所述列表中,從而成為所述列表中的最后填充路徑,否則執(zhí)行所述生成代碼裝置,其中所述條件集合包括至少一個(gè)條件,所述一個(gè)條件基于新的填充路徑和最后填充路徑的顏色以及一個(gè)閾值,并且所述閾值被預(yù)先設(shè)置為這樣一個(gè)值,從而當(dāng)新填充路徑在視覺上不構(gòu)成當(dāng)前的直線性混合的一部分時(shí),不會(huì)將該新的填充路徑添加到該列表中;用于對(duì)剩余的每條所述新的填充路徑調(diào)用所述添加代碼裝置的代碼裝置;以及生成代碼裝置,根據(jù)所述列表中的第一填充路徑到所述列表中的最后填充路徑,生成一個(gè)或多個(gè)直線性混合。
18.根據(jù)權(quán)利要求17的計(jì)算機(jī)程序單元,其中所述一個(gè)條件包括所述新填充路徑和所述列表中的最后填充路徑之間的各顏色通道的色差均不大于閾值。
19.根據(jù)權(quán)利要求18的計(jì)算機(jī)程序單元,其中所述閾值為所述列表中的最后填充路徑和倒數(shù)第二條填充路徑之間的色差的兩倍。
20.根據(jù)權(quán)利要求17的計(jì)算機(jī)程序單元,其中所述條件集合還包括從以下條件組合中選擇的條件第二條件,即新填充路徑與該列表中的最后填充路徑物理鄰接或重疊;第三條件,即所述新填充路徑的高度不超過所述列表中最后添加的填充路徑的高度的兩倍,所述高度是在按照所述列表中的填充路徑的物理位置確定的方向上測量的;第四條件,即當(dāng)前的直線性混合內(nèi)的填充路徑的數(shù)目大于1;第五條件,即所述直線性混合內(nèi)的填充路徑的累計(jì)高度與所述新填充路徑的矩形高度之和小于預(yù)定的最大值;第六條件,即當(dāng)前接收的填充路徑的光柵操作不使用目的地,并且與當(dāng)前的直線性混合的光柵操作相同;以及第七條件,即當(dāng)前接收的填充路徑具有與當(dāng)前的直線性混合相同的裁剪。
21.根據(jù)權(quán)利要求20的計(jì)算機(jī)程序單元,其中對(duì)所述第五條件的所述預(yù)定的最大值被如此設(shè)置以致填充不會(huì)越過輸出介質(zhì)的邊界。
22.根據(jù)權(quán)利要求17的計(jì)算機(jī)程序單元,其中所述列表包括一個(gè)原始列表fill-paths[1]...[n],所述生成代碼裝置包括用于確定該列表的fill-path[1]和fill-path[n]之間的顏色梯度在預(yù)定公差內(nèi)是否等于該列表的fill-path[1]和fill-path[n/2]之間的顏色梯度的代碼裝置;以及在等于的情況下,用于根據(jù)所述列表中的第一條填充路徑的顏色和位置到所述列表中的最后填充路徑的顏色和位置,輸出列表fill-paths[1]...[n]的直線性混合的代碼裝置;在不等于的情況下,用于將列表fill-paths[1]...[n]分割為具有至少實(shí)質(zhì)上相同數(shù)目的填充路徑的兩個(gè)列表的代碼裝置;以及用于對(duì)每個(gè)分割列表調(diào)用所述用于確定的代碼裝置、直至原始列表fill-paths[1]...[n]中的所有填充路徑已被處理的代碼裝置。
23.根據(jù)權(quán)利要求22的計(jì)算機(jī)程序單元,其中所述用于分割的代碼裝置將所述列表分割為兩個(gè)列表,一個(gè)為列表的第一部分(fill-path[1]..fill-path[n/2]),另一個(gè)為列表的第二部分(fill-path[n/2]..fill-path[n])。
24.根據(jù)權(quán)利要求22的計(jì)算機(jī)程序單元,其中所述用于分割的代碼裝置將所述列表分割為兩個(gè)列表,一個(gè)為列表的第一部分(fill-path[1]..fill-path[n/2]),另一個(gè)為列表的第二部分(fill-path[(n/2)+1]..fill-path[n])。
25.根據(jù)權(quán)利要求22的計(jì)算機(jī)程序單元,其中在與填充路徑的第一分割列表對(duì)應(yīng)的第一直線性混合的附近,輸出與填充路徑的第二分割列表對(duì)應(yīng)的第二直線性混合,其中將第二直線性混合的起始顏色設(shè)置為第一直線性混合的結(jié)束顏色。
26.根據(jù)權(quán)利要求17的計(jì)算機(jī)程序單元,其中定義所述當(dāng)前直線性混合的所述列表涉及已經(jīng)接收的一條或多條填充路徑,并且所述至少一條新填充路徑是新接收的,由此能夠執(zhí)行程序單元。
27.根據(jù)權(quán)利要求17的計(jì)算機(jī)程序單元,其中所述單元包括圖形設(shè)備接口部分。
28.根據(jù)權(quán)利要求20的計(jì)算機(jī)程序單元,其中至少通過比較所述填充路徑的對(duì)準(zhǔn)性確定其毗連性。
29.一種根據(jù)定義當(dāng)前直線性混合的一條或多條填充路徑的列表和至少一條新的填充路徑生成一個(gè)或多個(gè)直線性混合的裝置,其中每條填充路徑包括一個(gè)單色平行四邊形,所述裝置包括添加裝置,如果滿足條件集合中的每個(gè)條件,則將所述一條新的填充路徑添加到所述列表中,從而成為所述列表中的最后填充路徑,否則啟用生成裝置,所述條件集合包括至少一個(gè)條件,所述一個(gè)條件基于新的填充路徑和最后填充路徑的顏色以及一個(gè)閾值,所述閾值被預(yù)先設(shè)置為這樣一個(gè)值,從而當(dāng)新填充路徑在視覺上不構(gòu)成當(dāng)前的直線性混合的一部分時(shí),不會(huì)將新填充路徑添加到該列表中;重復(fù)裝置,用于對(duì)剩余的每條所述新填充路徑,重復(fù)所述添加裝置的操作;以及所述生成裝置,能夠根據(jù)所述列表中的第一填充路徑到所述列表中的最后填充路徑,生成一個(gè)或多個(gè)直線性混合。
30.一種計(jì)算機(jī)可讀介質(zhì),包括根據(jù)權(quán)利要求17的計(jì)算機(jī)程序單元。
全文摘要
本發(fā)明提供一種生成一個(gè)或多個(gè)直線性混合的方法(1005)。最初,該方法具有已經(jīng)接收的定義當(dāng)前直線性混合的一條或多條填充路徑的列表,以及一條新接收的填充路徑,其中每條填充路徑包括一個(gè)單色平行四邊形(如700)。如果新填充路徑與該列表中的最后填充路徑之間的各顏色通道的色差不超過預(yù)定閾值乘以該列表中的最后填充路徑和倒數(shù)第二條填充路徑之間的色差,則該方法將新填充路徑添加(1090)到該列表中,作為該列表中的最后填充路徑。將預(yù)定閾值預(yù)先設(shè)置為以下值,從而當(dāng)新填充路徑在視覺上不構(gòu)成當(dāng)前的直線性混合的一部分時(shí),不會(huì)將新填充路徑添加到該列表中。該方法對(duì)接收的每條新填充路徑重復(fù)上述步驟,直至不再滿足上述條件。然后該方法根據(jù)該列表中的第一填充路徑到該列表中的最后填充路徑生成(1040)一個(gè)或多個(gè)直線性混合。
文檔編號(hào)G06T11/20GK1472705SQ03149128
公開日2004年2月4日 申請(qǐng)日期2003年6月17日 優(yōu)先權(quán)日2002年6月17日
發(fā)明者伊恩·理查德·博蒙特, 賈爾斯·帕克特, 帕克特, 伊恩 理查德 博蒙特 申請(qǐng)人:佳能株式會(huì)社