Разширена семантика на изобразяването
Изобразяването на заредени страници запазва състоянието на вложените Form XObject, като прилага групи за прозрачност, меки маски, глифови процедури от Type 3 и декодиране на видими области от изображения според разделителната способност
Пунктирани щрихи по пътища
Нативното рисуване на пътища запазва пълните dash масиви и фазата им, включително масиви с нечетна дължина, дробни дължини и нуледължини изрисувани тирета с round или square капачета; dash шаблонът се рестартира във всеки подпът
Щрихите с плътен цвят и clip-овете на gradient-pattern щрихи споделят един ограничен геометричен път за dash, запазват съединенията вътре в непрекъснатите изрисувани участъци и съединяват изрисуваните участъци през началната точка на затворен контур
Dash дължините запазват средния мащаб на текущата трансформация на renderer-а, докато разцепването на криви ползва адаптивно изглаждане в device пространство; запълването и чакащото клипиране продължават да ползват оригиналния неразцепен път
Групи за прозрачност
- Стойностите
/Matrixна Form XObject се композират с текущата матрица за трансформация, преди да се изпълни съдържанието на групата - Изолираните групи използват отделна алфа равнина, така че черното съдържание остава различимо от прозрачните пиксели
- Групите с изрязване заменят предишния принос на групата в припокриващите се нарисувани области
- Съдържанието на групата започва от режима на смесване Normal: режимът на смесване, постоянната алфа и мягката маска, действащи при
Do, се прилагат към групата като цяло - Група, нарисувана с друг режим на смесване, смесва собствения си цвят и алфа с фона; неизолирана група, чиито собствени графични състояния се смесват нормално, се рисува на черно и на бяло, за да възстанови алфата си
- Групите се разделят на ограничени плочки от 768 пиксела, докато рисуването с GDI, фазата на полутоновете, вложените групи, меките маски и композирането запазват абсолютните координати на устройството
- Байтовете на формуляра се декодират и токенизират веднъж преди изпълнението на плочките, а временните локални за плочката маски се освобождават преди следващата плочка
- Поддържат се вложени групи с ограничена рекурсия и пълно възстановяване на графичното състояние след всяко извикване на Form
Меки маски
- Маските
/S /Alphaи/S /Luminosityсе изчисляват от групата на маската - Групата на маската се рисува със смесване Normal, какъвто и да е режимът на смесване в графичното състояние, задаващ маската
- Маските за яркост определят
/CSна групата за прозрачност и претеглят определения цвят с приближението на PDF DeviceGray, както правят обичайните визуализатори; задайтеRenderColorimetricLuminosityMasks, вместо това да се използва колориметрично CIE Y за CIE-базираните пространства /BCсе валидира спрямо точния брой компоненти на пространството за смесване и предоставя преобразуваната яркост извън нарисуваното съдържание на маската- Рисуването с Separation и DeviceN се преобразува чрез неговото алтернативно пространство Lab или ICCBased, така че спот компонентите никога да не проникнат в мека маска
- Функциите за прехвърляне
/TRподдържат дискретизирани, експоненциални, свързващи и PostScript калкулаторни функции чрез споделения оценител на функции /SMask /Noneизчиства активната маска, аqилиQзапазват състоянието на маската по обичайния начин- Компилираните маски се използват повторно само когато речникът източник, текущата матрица за трансформация и намерението за изобразяване съвпадат
Функции за прехвърляне и дискретизирани функции
/TR2 има предимство пред /TR, единична функция се прилага към всеки RGB изходен канал, а масив от четири функции прилага първите си три елемента независимо един от друг, като записите /Identity и /Default се запазват
Прилагането на ново състояние за прехвърляне заменя атомарно всеки канал, така че записите за идентичност не могат да наследят стойности от таблицата за търсене от по-ранно графично състояние
Дискретизираните функции Type 0 поддържат от едно до четири входни и изходни измерения, стойности на /BitsPerSample 1, 2, 4, 8, 12, 16, 24 и 32, обратни или прави съпоставяния /Encode, независими диапазони /Decode, многоизмерна линейна интерполация, многоизмерна кубична интерполация и естествени кубични сплайни за едноизмерни данни /Order 3
Декодираните байтове на извадките, валидираните измерения, съпоставянията и кубичните производни споделят осемзаписен LRU, ограничен до 64 MiB за нишка за изобразяване, докато прекомерно големите или неправилно форматираните функции се провалят, без частично да заменят активната таблица за търсене при прехвърляне
Полутонови растери
Праговите масиви от Type 6, Type 10 и Type 16 се изпълняват директно с точни декодирани дължини, 16-битови прагове в big-endian ред, сравнение на адитивни компоненти и компактни периодични ивици, които избягват разширяването на наклонени или двуправоъгълни растери
Речниците Type 5 избират независими растери /Red, /Green и /Blue с резервни варианти /Gray и изисквания /Default, докато всеки избран растер може да замени глобалната функция за прехвърляне
Валидираните прагови байтове и нормализираната им геометрия споделят 64-записен LRU, ограничен до 64 MiB за изобразяващ модул, а неправилните измерения, прекомерно големите разпределяния, вложените речници Type 5 или несъответствията в дължината на полезния товар оставят цялото активно състояние на растера в режим на непрекъснат тон
Глифове Type 3
CharProcs от Type 3 се изпълняват чрез пълния механизъм за оператори на съдържание с текущия обхват на ресурсите от речника на шрифта, поддръжка на Form, изрязване, изображения, шарки и ограничена рекурсия
d0 и d1 предоставят метриките на глифа, докато процедура d1 запазва избрания от извикващата страна цвят, както се изисква от модела за изобразяване на PDF
Повтарящите се CharProcs използват повторно декодирани и токенизирани списъци за показване, когато шрифтът, глифът, линейната матрица на устройството и състоянието на цвета съвпадат; транслацията остава динамична, така че повтарящите се знаци на различни позиции споделят един запис
LRU за всеки изобразяващ модул съхранява най-много 256 записа и 131,072 токена, пропуска всеки CharProc над 16,384 токена и отчита поведението си чрез GetLastType3GlyphCacheStats
Изрязани и намалени области от изображения
Изображенията XObject с подравнени по осите граници заявяват само видимите граници на източника и предават размера на видимите пиксели на устройството към пътя за декодиране
Изображение с мека маска се декодира цяло с размера, с който се рисува, а маската му със същия размер, така че маската остава подравнена с изображението, докато изрязването ограничава това, което се рисува; JPEG маските използват DCT декодера с намален размер
При изобразяване декодирана област, поне два пъти по-голяма от рисувания размер и по двете измерения, се свива точно до рисувания размер чрез осредняване по площ, преди да бъде нарисувана или кеширана; голямо изображение, рисувано малко, тогава се побира в кеша за декодиране, така че група, рисувана два пъти, или повтаряща се страница го използва повторно, а мягката му маска се прилага пиксел по пиксел при този размер. Маските-шаблони на изображения запазват пълната си разделителна способност, а публичните методи за декодиране на области връщат документираните си размери
JPEG 2000 съчетава собствения API на декодера за области с ниво на разделителна способност, степен на двойката, избрано да изпълни и двете целеви измерения преди възстановяването на вълничките и разширяването на растера
JPEG 2000 кодови потоци с адресируеми плочки могат също да декодират една валидирана плочка директно чрез THPDFJpeg2000Decoder.LoadTileFromByteArray, като метаданните за мрежата от плочки и ограниченията за изходните байтове се предоставят от декодера
Когато собствена област пресича няколко независими плочки, LoadRegionFromByteArrayParallel назначава частно състояние на OpenJPEG на всеки работник и композира завършените растери в детерминистичен ред по редове; отмяната, ограниченията на изхода и ефективният бюджет за пикова памет могат да спрат планирането или да изберат последователния резервен вариант
Region := PDF.DecodeLoadedImageRegion(ImageStream, 128, 64, 640, 480);
try
Canvas.Draw(0, 0, Region);
finally
Region.Free;
end;