Sean's Note: 8月 2013

2013年8月29日 星期四

Something about Fonts

  1. 不是所有的 Font 都支援所有的 Languages,所以在 Windows 的 Registry:
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
    便定義了對照表,譬如在打中文字時若套用 MS UI Gothic 字型,便會選擇 MINGLIU.TTC 也就是常見的
    新細明體來顯示。
  2. FontLink\SystemLink\MS UI Gothic
  3. 欲查詢某個 Language 有哪些 Font 有支援,可參考下列網站:
    http://www.alanwood.net/unicode/fontsbyrange.html
  4. 更多有關 Font Linking 的說明,可參考 MSDN 網站:
    http://msdn.microsoft.com/en-us/goglobal/bb688134.aspx

2013年8月16日 星期五

About BitmapFactory.Option.inSampleSize

本以為這個數字可以隨便設,後來看了一下官方寫的文件後才發現,

這個設定只有 2 的冪次方效果, 也就是圖片 down-sapling 完不會有 1/3 或 1/5

的效果。 因為設其他數值,底下也是會取接近 2 的冪次方來做運算。 

例如: 設 3,底層實際取 2 做運算;設 4, 5, 6, 7 ,實際皆取 4 做運算。

If set to a value > 1, requests the decoder to subsample the original image, returning a smaller image to save memory. 
The sample size is the number of pixels in either dimension that correspond to a single pixel in the decoded bitmap. 
For example, inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. 
Any value <= 1 is treated the same as 1. 
Note: the decoder uses a final value based on powers of 2, any other value will be rounded down to the nearest power of 2.
資料來源: 官方網站

仔細看了一下 skia library 的原始檔 SkImageDecoder_libjpeg.cpp,發現 Android 也是

用 IJG 的 JPEG Lib 去做 down-sapling:

bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, SkBitmap::Config prefConfig, Mode mode)
{
    ...
    jpeg_decompress_struct cinfo;
    cinfo.scale_denom = sampleSize;
    ...
}

Google 了一下 scale_denom 的說明,文件上也說明的相當清楚了。

unsigned int scale_num, scale_denom Scale the image by the fraction scale_num/scale_denom. Default is 1/1, or no scaling. 
Currently, the only supported scaling ratios are 1/1, 1/2, 1/4, and 1/8. (The library design allows for arbitrary scaling ratios but 
this is not likely to be implemented any time soon.) Smaller scaling ratios permit significantly faster decoding since fewer 
pixels need be processed and a simpler IDCT method can be used.
資料來源: 網站

2013年8月14日 星期三

"Java SE7 技術手冊" 讀後筆記

CH3 基礎與法

  1. 如果運算式中包括不同型態數值,則運算時以長度最長的型態為主,其他數值自動提昇 (Promote) 型態。
  2. 如果運算元都是不大於 int 的整數,則自動提升為 int 型態進行運算。
    所以下方的例子將編譯失敗 (Type mismatch: cannot convert from int to short) :
    short a = 2;
    short b = 3;
    short c = a + b; // Sol: short c = (short)a + b;
    

CH4 認識物件

  1. Integer 實際上是使用 Integer.valueof() 來建立 Integer 實例,所以看看 Integer.java (可在 JDK 資料夾 src.zip 中的 java/lang
    底下找到) ,會發現其在 -128 ~ 127 間有 cache 的機制。
    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
    }
  2. 使用 + 串接字串會產生新的 String 實例,所以不要將 + 用在重複性的串接場合,可用 StringBuilder (Note: 適用於 single thread,multithread 則用 StringBuffer) 來改善效能。

CH5 物件封裝

  1. 如果沒有宣告權限修飾的成員,只有在相同套件的類別中,才可以直接存取,也就是"套件範圍權限"。

CH7 介面與多型

  1. interface 的方法只能宣告為 public abstract (也可省略不寫),無須且不能有實作。
  2. Listener 常用 interface 來實作。

CH11 執行緒與並行 API

  1. 執行緒有可能在未經 notify()、interrupt() 或逾時情況下私自甦醒 (Spurious wakeup),
    所以 wait() 一定要在條件成立的迴圈中執行。