فونٹ فورج کے ذریعے نستعلیق ترسیمہ جات کی امپورٹ

محمد سعد

محفلین
ایس وی جی کو ریسائز کرنے کے لیے جو میں نے دو تجاویز دی تھیں، ان کا کیا ہوا؟ :confused:

اگر کسی وجہ سے pango-view کے ذریعے براہِ راست اپنے مطلب کی فائلیں حاصل نہ ہوں تو اس صورت میں SVG فائلوں کو دوسرے طریقوں سے بھی مدون کیا جا سکتا ہے۔ مثلاً pango-view کی بنائی ہوئی ہر ایس وی جی فائل کچھ اس طرح شروع ہوتی ہے۔
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="45pt" height="31pt" viewBox="0 0 45 31" version="1.1">
اس میں width اور height کی قدرون کو بڑی آسانی کے ساتھ sed کی مدد سے تبدیل کیا جا سکتا ہے۔ مثلاً
HTML:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000pt" height="1000pt" viewBox="0 0 45 31" version="1.1">
اور میں نے مشاہدہ کیا ہے کہ اس مدون شدہ کوڈ کے ساتھ اگرچہ صفحہ 1000x1000 کا ہو جاتا ہے لیکن اصل ترسیمے کے ابعاد کے درمیان تناسب برقرار رہتا ہے۔ یعنی لفظ ٹھگنا یا لمبوترا وغیرہ نہیں ہوتا۔

ایک اور طریقہ اس صفحے پر پیغام نمبر 9 پر موجود ہے۔
Batch resize of .svg files
اس طریقے میں xsltproc کی مدد سے ایس وی جی کو ریسائز کیا جاتا ہے۔ پیغام نمبر 9 کے ساتھ ایک فائل bigger.xsl منسلک ہے (یہاں بھی منسلک کر دیتا ہوں) جسے اس طرح استعمال کیا جائے گا۔
کوڈ:
xsltproc --stringparam scale 2.5 bigger.xsl in.svg > out.svg
یا پورے فولڈر کے لیے۔
کوڈ:
for i in *.svg; do xsltproc --stringparam scale 2.5 bigger.xsl $i > bigger_$i; done
اس طریقے میں ایک مسئلہ یہ ہے کہ اس سے اگرچہ ترسیمہ تو ہماری بتائی ہوئی حد تک بڑا ہوگا لیکن صفحہ اس سے کئی گنا زیادہ بڑا ہو جائے گا جیسا انک سکیپ کا ڈیفالٹ لے آؤٹ ہوتا ہے۔ ایسے میں اسے فانٹ فورج میں خود کار طریقے سے فٹ کرنے میں شاید مسئلہ ہو۔ بہرحال، یہ اس لیے بتا دیا ہے کہ شاید اسے بہتر بنا کر ہمارا کام ہو سکے۔

مجھے چونکہ sed کا استعمال نہیں آتا، اس لیے ابھی تک انتظار کر رہا ہوں کہ چاچا سعود اس پر کوئی تجربات کر کے نتائج سے آگاہ کریں۔ :(
 

arifkarim

معطل
کونسی فائل زیادہ ہے؟
جہاں تک گلفس کی الائنمنٹ کا تعلق ہے تو میں نے پہلے مرحلے میں صرف خودکار امپورٹ پر توجہ دی ہے۔ اس سے آگے بڑھنے کے لیے مجھے فونٹ سازوں کی جانب سے ہنٹس درکار ہوں گے۔ میرے خیال میں بیس لائن اور باؤنڈنگ باکس جیسے مسائل گلفس جنریٹ کرتے وقت حل کیے جانے چاہییں۔

فائل تو زیادہ نہیں پر اوپر جو آپنے اسکا ربط دیا تھا، اسمیں ایک / زیادہ ہے جسکی وجہ سے وہ کھلتا نہیں ہے۔
باقی بیس لائن والا مسئلہ ایسا ہے کہ اسے خود کار طور پر حل کرنا ہوگا، یعنی ٹی ٹی ایف میں گلفس امپورٹ کرتے وقت۔ اگر نتیجہ درست نہیں آتاتو پھر ہمیں svg فائلز کو کسی اور سیٹنگز کیساتھ ایکسپورٹ کرنا ہوگا۔
 

محمد سعد

محفلین
السلام علیکم ورحمۃ اللہ

ابھی کچھ دیر پہلے میں نے پائتھن کے ذریعے ایس وی جی کی پہلی سطر میں width اور height کی قدروں میں خودکار تبدیلی کا کامیاب تجربہ کیا ہے۔
اب مجھے صرف یہ بتا دیں کہ ان میں تبدیلی کیا کرنی ہے۔ کیا انہیں کسی مخصوص عدد سے ضرب دینی ہے یا بس 1000x1000 کر دینا ہے؟ تاکہ میں پھر اس کے لیے سکرپٹ تیار کر کے یہاں ارسال کر دوں۔

والسلام۔
 

نبیل

تکنیکی معاون
فونٹ فورج میں ایس وی جی ترسیمہ جات امپورٹ کرنے کے لیے سکرپٹ پہلی پوسٹ میں شامل کر دی گئی ہے جو یہاں بھی پیش کی جا رہی ہے۔

PHP:
import fontforge
import os.path


# obtain command line arguments for 
# 1: path of the folder containing svgs
# 2: input sfd file
# 3: output font name
def createGlyph(font,glyphname):
	font.createChar(-1, glyphname)
	svgPath= 'Nafees/'+glyphname+'.svg'
	if os.path.isfile(svgPath):
		font[glyphname].importOutlines(svgPath)
	else:
		print svgPath+" is not valid.\n"

def AddGlyphs(font):
	logFile= open("log.txt","w")
	for f in os.listdir('Nafees'):
		(baseName, extName)=os.path.splitext(f)	
		logFile.write("creating glyph "+baseName+"\n")
		createGlyph(font, baseName)
	logFile.close()

def createFont(strFontName):
	tt=fontforge.open("TestFont.sfd")
	AddGlyphs(tt)
	tt.generate(strFontName)

createFont('TestFont.ttf')
 

محمد سعد

محفلین
فی الحال تو تیار کردہ فانٹ میں ایک بڑا مسئلہ یہ ہے کہ اردو لکھنے پر نستعلیق رسم الخط سرے سے استعمال ہی نہیں ہوتا۔
وجہ جاننے کے لیے میں نے آپ کے تیار کردہ فانٹ کو فانٹ فورج میں کھول کر کچھ ترسیموں کی معلومات دیکھیں تو کچھ اس قسم کی صورتِ حال سے واسطہ پڑا:
مثال کے طور پر میں نے فانٹ فورج میں "کلک" کے ترسیمے کی معلومات دیکھیں تو اس کے مطابق:
Glyph Name: KlK
Unicode Value: -1
Unicode Char:
(یونیکوڈ کریکٹر والا خانہ بالکل خالی ہے)

جہاں تک مجھے سمجھ آئی ہے، فانٹ کو قابلِ استعمال بنانے کے لیے صرف گلف کے نام طے کرنا ہی کافی نہیں ہوگا، بلکہ ان کے ساتھ یونیکوڈ قدریں بھی منسلک کرنی پڑیں گی۔ باقی تو اب فانٹ ساز لوگ ہی بتائیں گے کہ اصل مسئلہ کیا ہے اور میرا یہ خیال کس حد تک درست ہے۔
 

نبیل

تکنیکی معاون
اس سکرپٹ کے ذریعے صرف ترسیمہ جات امپورٹ ہوتے ہیں۔ انہیں قابل استعمال بنانے کے لیے اوپن ٹائپ لک اپس شامل کرنے کی ضرورت پیش آئے گی۔ ونڈوز میں یہ کام وولٹ کے ذریعے کیا جاتا ہے۔ یہ کام فونٹ فورج میں بھی کیا جا سکتا ہے۔ جن اوپن ٹائپ لک اپس کی فراہمی کی ضرورت ہے وہ gsub اور gpos ہیں۔
 

محمد سعد

محفلین
ترسیموں کو ریسائز کرنے کا پائتھن سکرپٹ تیار ہو گیا ہے جس میں کسی مخصوص ہندسے سے ضرب دینے اور حجم کو 1000x1000 کر دینے کے دونوں اختیارات موجود ہیں۔ سکرپٹ اسی پیغام کے ساتھ منسلک ہے۔

استعمال کا طریقہ:
ضرب والے طریقے کے لیے:
کوڈ:
python svg-resizer-03.py lig_dir output_dir multiply n
جہاں n وہ عدد ہوگا جس سے ضرب دینی ہے۔ اگر کوئی عدد نہ بتایا گیا تو طے شدہ طور پر n کی جگہ 3 استعمال ہوگا۔ lig_dir وہ فولڈر جس میں ایس وی جی فائلیں پڑی ہیں۔ اور output_dir، جیسا کہ نام سے ظاہر ہے، وہ فولڈر جہاں ریسائز کی گئی فائلیں رکھنی ہیں۔ خیال رکھیں کہ lig_dir اور output_dir دونوں ایک ہی فولڈر نہ ہوں، ورنہ نتیجہ تو آپ جانتے ہی ہوں گے کہ اصل فائلوں سے بھی ہاتھ دھونا پڑیں گے۔

حجم کو 1000x1000 کرنے کے لیے:
کوڈ:
python svg-resizer-03.py lig_dir output_dir 1000x1000
فی الحال میں نے صرف 1000x1000 کا ہی کوڈ ڈالا ہوا ہے۔ اگر فانٹ ساز حضرات اپنی مرضی کا کوئی اور حجم رکھوانا چاہتے ہوں تو سکرپٹ میں تبدیلی کر کے اسے 1000 کے علاوہ بھی دیگر اعداد وصول کرنے کے قابل بنا دوں گا۔

اگر سکرپٹ کے استعمال کا طریقہ بھول جائے تو یاد دلانے کے لیے صرف
کوڈ:
python svg-resizer-03.py
کا استعمال کافی ہوگا۔
 

Attachments

  • svg-resizer-03.zip
    1.1 KB · مناظر: 9

محمد سعد

محفلین
سکرپٹ کو یہاں بھی منسلک کر رہا ہوں تاکہ اگر کسی وجہ سے ڈراپ بکس والے پتے پر قابلِ رسائی نہ رہے تو یہاں سے حاصل کیا جا سکے۔
نوٹ برائے غیر پروگرامر: یہ پائتھن کا کوڈ ہے جسے پائتھن کے انٹرپرٹر کے ذریعے چلایا جائے گا۔

PHP:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
import os
import re
import sys


def replace_line(line, resize_method, n):
	
	# Extract Width and Height values with type 'integer'.
	width_data = re.search(r'(\bwidth\b\s*=\s*")(\d+)(pt")',line).groups()
	height_data = re.search(r'(\bheight\b\s*=\s*")(\d+)(pt")',line).groups()
	original_width, original_height = int(width_data[1]), int(height_data[1])
	
	if resize_method == "multiply":
		final_width, final_height = original_width*n, original_height*n
	elif resize_method == "1000x1000":
		final_width, final_height = 1000, 1000
	else:
		print "Invalid resize method specified\nReturning line as is"
		print '------------------------------'
		return line
	
	# Replace width
	line = line.replace("".join(width_data), width_data[0]+str(final_width)+width_data[2])
	# Replace height
	line = line.replace("".join(height_data), height_data[0]+str(final_height)+height_data[2])
	
	return line


def process_files(lig_dir, output_dir, resize_method, n):
	
	try:
		os.mkdir(output_dir)
	except:
		pass
	
	dirlist = os.listdir(lig_dir)
	
	svglist = []
	for filename in dirlist:
		if re.search(r'.svg$',filename):
			svglist.append(filename)
	
	print '------------------------------'
	print 'List of files to process:\n', svglist
	print '------------------------------'
	
	for svgfile in svglist:
		input_file = open(lig_dir+os.sep+svgfile,"r")
		svglines = input_file.readlines()
		
		for i in range(len(svglines)):
			if re.search(r'<svg.+>',svglines[i]):
				svglines[i] = replace_line(svglines[i],resize_method,n)
		
		output_file = open(output_dir+os.sep+svgfile, "w")
		output_file.writelines(svglines)
		output_file.close()
		print 'Generated', output_dir+os.sep+svgfile
		
	return True
	

if __name__=='__main__':
	
	if len(sys.argv) < 4 or len(sys.argv) > 5:
		print 'Usage: python {0} directory_containing_SVGs output_directory resize_method n_(optional)'.format(sys.argv[0])
		
	else:
		lig_dir = sys.argv[1]
		output_dir = sys.argv[2]
		resize_method = sys.argv[3]
		try:
			n = sys.argv[4]
		except IndexError:
			print 'Warning: n is not specified. Using default value of n=3.'
			print '(Will not be used if resize_method is not multiply)'
			n = 3
		
		# n from sys.argv is type 'string'. Must be converted to type 'integer' first.
		try:
			n = int(n)
		except ValueError:
			print 'Error: n must be a number'
			sys.exit(1)
		
		print 'n =',n
		
		result = process_files(lig_dir, output_dir, resize_method, n)
		if result:
			print '=============================='
			print "Finished processing files."
			print '=============================='
 

Attachments

  • svg-resizer-03.zip
    1.1 KB · مناظر: 2

نبیل

تکنیکی معاون
شکریہ محمد سعد۔ اب ان ترسیمہ جات کو فونٹ میں امپورٹ کرکے دیکھنا چاہیے کہ یہ کس حد تک قابل استعمال ہیں۔ ابھی شاید بیس لائن کا مسئلہ برقرار رہے گا۔
 
اگر ہم ترسیمہ جات کو کسی طرح بیس لائن کے اعتبار سے کیٹیگرائز کر سکیں تو اس کا کو بھی کافی حد تک آٹومیٹ کیا جا سکتا ہے۔ مثلاً وہ سبھی ترسیمے جو ج چ ح خ ع غ پر تمام ہوتے ہیں غالب گمان ہے کہ ان کا بیس لائن الائنمینٹ ایک جیسا ہوگا اسی طرح س ش ص ض ق ل ن ں وغیرہ پر تمام ہونے والے ایک الگ زمرے میں آنے چاہئیں اس کے علاہ ایل بڑی تعداد ب پ ت ٹ ث ف ک گ پر تمام ہونے والے ترسیموں کی بھی ہوگی۔ بہت ممکن ہے کہ زیادہ تر ترسیمے اس قسم کی کیٹیگرائزیشن سے درست الائنمینٹ میں آ جائیں۔ ورنہ قدرے زیادہ کامپلیکس لاجک مثلا ترسیموں کی طوالت وغیرہ کو زیر غور لانا پڑے۔
 

نعیم سعید

محفلین
اگر ہم ترسیمہ جات کو کسی طرح بیس لائن کے اعتبار سے کیٹیگرائز کر سکیں تو اس کا کو بھی کافی حد تک آٹومیٹ کیا جا سکتا ہے۔ مثلاً وہ سبھی ترسیمے جو ج چ ح خ ع غ پر تمام ہوتے ہیں غالب گمان ہے کہ ان کا بیس لائن الائنمینٹ ایک جیسا ہوگا اسی طرح س ش ص ض ق ل ن ں وغیرہ پر تمام ہونے والے ایک الگ زمرے میں آنے چاہئیں اس کے علاہ ایل بڑی تعداد ب پ ت ٹ ث ف ک گ پر تمام ہونے والے ترسیموں کی بھی ہوگی۔ بہت ممکن ہے کہ زیادہ تر ترسیمے اس قسم کی کیٹیگرائزیشن سے درست الائنمینٹ میں آ جائیں۔ ورنہ قدرے زیادہ کامپلیکس لاجک مثلا ترسیموں کی طوالت وغیرہ کو زیر غور لانا پڑے۔

جی بالکل درست آئیڈیا ہے آپ کا، مزید کوشش کریں کہ لگیچرز لسٹ کو ابتدائی حرف پر سارٹ کرنے کی بجائے اختتامی حرف پر سارٹ کیا جائے۔ اس ترتیب پر لگیچرز فونٹ میں شامل ہوں گے تو رینج دے کر ایک ساتھ بیرنگز یا بیس لائن میں تبدیلی کرنا بڑی آسانی سے ممکن ہوجائے گا۔
 
میرے خیال میں سورٹنگ کی چنداں ضرورت نہیں محض ترسیموں کو ان کے آخری حرف کے ہم زمرہ حروف کے ساتھ گروپ کرنے کی ضرورت ہے۔ :)
 

نعیم سعید

محفلین
فونٹ فورج میں گروپ بنا کر ایسا کرنا ممکن ہے تو لگیچرز کی سارٹنگ تبدیل کرنے کی ضرورت نہیں ہے، دراصل میں تو فونٹ فورج سے صرف نام ہی کی حد تک واقف ہوں۔
مزید یہ بھی بتائیں کہ لگیچرز کی تیاری مکمل ہوجانے کے بعد کے مراحل یعنی (لک اپس، پوسٹ اسکرپٹ نیم وغیرہ) بھی فونٹ فورج ہی کے ذریعے ڈالے جائیں گے یا ایم ایس وولٹ پر جانا پڑے گا۔
 

نبیل

تکنیکی معاون
میرے خیال میں بیس لائن کے مسئلے کا کوئی اور حل ڈھونڈنا پڑے گا۔ جہاں تک لک اپس شامل کرنے کا تعلق ہے تو اس کے لیے بھی سکرپٹنگ کا ہی استعمال کیا جائے گا۔ وولٹ کا استعمال نہیں کیا جائے گا۔
 

محمد سعد

محفلین
ابھی ابھی معلوم ہوا ہے کہ اس طرح پوری ایس وی جی دستاویز کو بڑا کرنے سے کوئی فائدہ نہیں ہوتا۔ فانٹ فورج میں درآمد کرتے وقت فرق صرف شکل اور صفحے کے حجم میں تناسب سے پڑے گا۔ میرے سکرپٹ کے ذریعے بڑی کی گئی ایس وی جی میں چونکہ ترسیمے اور صفحے کے حجم میں تناسب نہیں بدلتا، اس لیے چاہے چھوٹی فائل درآمد کی جائے یا بڑی، کوئی فرق نہیں پڑتا۔

ابھی تھوڑی دیر پہلے مجھے ایک اور کام کی چیز ملی ہے جس سے ہمارا کام بن سکتا ہے۔
ایس وی جی فائل میں ترسیمے والے "گروپ" کے ٹیگ میں اگر کچھ اس قسم کا اضافہ کر دیا جائے
کوڈ:
transform="scale(x)"
مثلاً
HTML:
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;" transform="scale(1.3)">
تو صرف ترسیمے کا حجم بڑھتا ہے۔ صفحے کا حجم وہی رہتا ہے۔ یعنی ترسیمے اور صفحے کے حجم کے درمیان تناسب بدل جاتا ہے (جس کی ہمیں ضرورت ہے)۔

کام کو آسان بنانے کے لیے لمبائی اور چوڑائی کو 100 پکسل کر دیں گے (100px) اور viewBox والی آخری دو قدروں کو بھی 100 کر دیں گے، تاکہ دماغ پر ضرب و تقسیم کا بوجھ نہ پڑے۔
 

محمد سعد

محفلین
اسی طرح صفحے پر ترسیمے کا مقام بدلنے کے لیے
HTML:
transform="translate(x,y)"
کا استعمال کریں گے۔

بائیں طرف لے جانے کے لیے x کی قدر منفی جبکہ دائیں طرف لے جانے کے لیے x کی قدر مثبت لگائیں گے۔ اسی طرح اوپر لے جانے کے لیے y کی قدر منفی جبکہ نیچے لے جانے کے لیے y کی قدر مثبت لگائیں گے۔
 

محمد سعد

محفلین
اب کوئی بتائے کہ صفحے اور ترسیمے کے حجم کے درمیان تناسب کیا ہونا چاہیے۔ مجھے لگتا ہے کہ pango-view کے ذریعے بنی ہوئی تمام فائلوں میں صفحے کی لمبائی/ بلندی 31 رکھی گئی ہے۔ یعنی اگر ہم 100x100 پکسل کا صفحہ استعمال کرتے ہیں تو اسے واپس اسی تناسب میں لانے کے لیے تقریباً تین گنا بڑا کرنا پڑے گا۔ اس حساب سے کتنے بڑے کیے گئے ترسیمے ہمارے لیے مناسب رہیں گے؟
 
Top