1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 17:27:35 +00:00

LibPDF: Handle the gs graphical operator

This commit is contained in:
Matthew Olsson 2021-05-27 14:22:24 -07:00 committed by Ali Mohammad Pur
parent 006f5498de
commit 47531619e3
3 changed files with 60 additions and 3 deletions

View file

@ -9,25 +9,33 @@
#include <AK/FlyString.h>
#define ENUMERATE_COMMON_NAMES(V) \
V(AIS) \
V(ASCII85Decode) \
V(ASCIIHexDecode) \
V(BG) \
V(BG2) \
V(BM) \
V(BaseFont) \
V(BlackPoint) \
V(C) \
V(CalRGB) \
V(CA) \
V(CCITTFaxDecode) \
V(CalRGB) \
V(ColorSpace) \
V(Contents) \
V(Count) \
V(CropBox) \
V(Crypt) \
V(D) \
V(DCTDecode) \
V(Dest) \
V(DeviceCMYK) \
V(DeviceGray) \
V(DeviceRGB) \
V(E) \
V(ExtGState) \
V(F) \
V(FL) \
V(Filter) \
V(First) \
V(Fit) \
@ -41,35 +49,54 @@
V(Font) \
V(Gamma) \
V(H) \
V(HT) \
V(HTO) \
V(JBIG2Decode) \
V(JPXDecode) \
V(Kids) \
V(L) \
V(LC) \
V(LJ) \
V(LW) \
V(LZWDecode) \
V(Last) \
V(Length) \
V(Linearized) \
V(ML) \
V(Matrix) \
V(MediaBox) \
V(N) \
V(Next) \
V(O) \
V(OP) \
V(OPM) \
V(Outlines) \
V(P) \
V(Pages) \
V(Parent) \
V(Pattern) \
V(Prev) \
V(RI) \
V(Resources) \
V(Root) \
V(Rotate) \
V(RunLengthDecode) \
V(SA) \
V(SM) \
V(SMask) \
V(T) \
V(TK) \
V(TR) \
V(TR2) \
V(Title) \
V(Type) \
V(UCR) \
V(UseBlackPTComp) \
V(UserUnit) \
V(WhitePoint) \
V(XYZ)
V(XYZ) \
V(ca) \
V(op)
namespace PDF {

View file

@ -146,7 +146,15 @@ RENDERER_HANDLER(set_dash_pattern)
RENDERER_TODO(set_color_rendering_intent);
RENDERER_TODO(set_flatness_tolerance);
RENDERER_TODO(set_graphics_state_from_dict);
RENDERER_HANDLER(set_graphics_state_from_dict)
{
VERIFY(m_page.resources->contains(CommonNames::ExtGState));
auto dict_name = m_document->resolve_to<NameObject>(args[0])->name();
auto ext_gstate_dict = m_page.resources->get_dict(m_document, CommonNames::ExtGState);
auto target_dict = ext_gstate_dict->get_dict(m_document, dict_name);
set_graphics_state_from_dict(target_dict);
}
RENDERER_HANDLER(path_move)
{
@ -475,6 +483,27 @@ Gfx::Rect<T> Renderer::map(Gfx::Rect<T> rect) const
return state().ctm.map(rect);
}
void Renderer::set_graphics_state_from_dict(NonnullRefPtr<DictObject> dict)
{
if (dict->contains(CommonNames::LW))
handle_set_line_width({ dict->get_value(CommonNames::LW) });
if (dict->contains(CommonNames::LC))
handle_set_line_cap({ dict->get_value(CommonNames::LC) });
if (dict->contains(CommonNames::LJ))
handle_set_line_join({ dict->get_value(CommonNames::LJ) });
if (dict->contains(CommonNames::ML))
handle_set_miter_limit({ dict->get_value(CommonNames::ML) });
if (dict->contains(CommonNames::D))
handle_set_dash_pattern(dict->get_array(m_document, CommonNames::D)->elements());
if (dict->contains(CommonNames::FL))
handle_set_flatness_tolerance({ dict->get_value(CommonNames::FL) });
}
void Renderer::show_text(const String& string, int shift)
{
auto utf = Utf8View(string);

View file

@ -92,6 +92,7 @@ private:
void handle_text_next_line_show_string(const Vector<Value>& args);
void handle_text_next_line_show_string_set_spacing(const Vector<Value>& args);
void set_graphics_state_from_dict(NonnullRefPtr<DictObject>);
// shift is the manual advance given in the TJ command array
void show_text(const String&, int shift = 0);
RefPtr<ColorSpace> get_color_space(const Value&);