public WordPlate GetNewWordPlate()
        {
            //create new and register
            if (_wordPlates.Count == MaxPlateCount)
            {
                if (AutoRemoveOldestPlate)
                {
                    //**dictionay not guarantee sorted id**
                    //so we use queue, (TODO: use priority queue)
                    WordPlate oldest = _wordPlatesQueue.Dequeue();
                    _wordPlates.Remove(oldest._plateId);
#if DEBUG
                    if (oldest.dbugUsedCount < 50)
                    {
                    }
                    //oldest.dbugSaveBackBuffer("word_plate_" + oldest._plateId + ".png");
#endif

                    oldest.Dispose();
                    oldest = null;
                }
            }

            if (s_totalPlateId + 1 >= ushort.MaxValue)
            {
                throw new NotSupportedException();
            }

            s_totalPlateId++;  //so plate_id starts at 1

            WordPlate wordPlate = new WordPlate(s_totalPlateId, _defaultPlateW, _defaultPlateH);
            _wordPlates.Add(s_totalPlateId, wordPlate);
            _wordPlatesQueue.Enqueue(wordPlate);

#if DEBUG
            wordPlate.Cleared += WordPlate_Cleared;
#endif
            return(_latestPlate = wordPlate);
        }
 private void WordPlate_Cleared(WordPlate obj)
 {
 }