75 CPDF_TilingPattern* pPattern,
76 CPDF_Form* pPatternForm,
89 if (!
pdfium::IsValueInRangeForNumericType<
int>(ceil_height) ||
90 !
pdfium::IsValueInRangeForNumericType<
int>(ceil_width)) {
94 int width =
static_cast<
int>(ceil_width);
95 int height =
static_cast<
int>(ceil_height);
103 int min_col =
static_cast<
int>(
105 int max_col =
static_cast<
int>(
107 int min_row =
static_cast<
int>(
109 int max_row =
static_cast<
int>(
113 if (height >
std::numeric_limits<
int>::max() / width)
121 std::unique_ptr<CPDF_GraphicStates> pStates;
127 pStates->SetDefaultStates();
132 pPatternForm->GetDict()->GetDictFor(
"Resources");
133 for (
int col = min_col; col <= max_col; col++) {
134 for (
int row = min_row; row <= max_row; row++) {
135 CFX_PointF original = mtPattern2Device.Transform(
136 CFX_PointF(col * pPattern->x_step(), row * pPattern->y_step()));
138 matrix.Translate(original.x - mtPattern2Device
.e,
139 original.y - mtPattern2Device
.f);
161 min_col = (clip_box
.left - orig_x) / width;
162 if (clip_box
.left < orig_x)
165 max_col = (clip_box
.right - orig_x) / width;
166 if (clip_box
.right <= orig_x)
169 min_row = (clip_box
.top - orig_y) / height;
170 if (clip_box
.top < orig_y)
173 max_row = (clip_box
.bottom - orig_y) / height;
177 float left_offset = cell_bbox
.left - mtPattern2Device
.e;
178 float top_offset = cell_bbox
.bottom - mtPattern2Device
.f;
180 if (width * height < 16) {
181 RetainPtr<CFX_DIBitmap> pEnlargedBitmap = DrawPatternBitmap(
182 pContext->GetDocument(), pContext->GetPageCache(), pPattern,
183 pPatternForm, mtObj2Device, 8, 8, options.GetOptions());
184 pPatternBitmap = pEnlargedBitmap->StretchTo(
187 pPatternBitmap = DrawPatternBitmap(
188 pContext->GetDocument(), pContext->GetPageCache(), pPattern,
189 pPatternForm, mtObj2Device, width, height, options.GetOptions());
195 pPatternBitmap->ConvertColorScale(0, 0xffffff);
200 auto pScreen =
pdfium::MakeRetain<CFX_DIBitmap>();
205 pdfium::span<
const uint8_t> src_buf = pPatternBitmap->GetBuffer();
206 for (
int col = min_col; col <= max_col; col++) {
207 for (
int row = min_row; row <= max_row; row++) {
216 CFX_PointF original = mtPattern2Device.Transform(
217 CFX_PointF(col * pPattern->x_step(), row * pPattern->y_step()));
219 FX_SAFE_INT32 safeStartX = FXSYS_roundf(original.x + left_offset);
220 FX_SAFE_INT32 safeStartY = FXSYS_roundf(original.y + top_offset);
222 safeStartX -= clip_box
.left;
223 safeStartY -= clip_box
.top;
224 if (!safeStartX.IsValid() || !safeStartY.IsValid())
227 start_x = safeStartX.ValueOrDie();
228 start_y = safeStartY.ValueOrDie();
230 if (width == 1 && height == 1) {
231 if (start_x < 0 || start_x >= clip_box
.Width() || start_y < 0 ||
235 uint32_t* dest_buf =
fxcrt::reinterpret_span<uint32_t>(
236 pScreen->GetWritableScanline(start_y))
240 const uint32_t* src_buf32 =
241 fxcrt::reinterpret_span<
const uint32_t>(src_buf).data();
242 *dest_buf = *src_buf32;
244 *dest_buf = (*(src_buf.data()) << 24) | (fill_argb & 0xffffff);
248 pScreen->CompositeBitmap(start_x, start_y, width, height,
252 pScreen->CompositeMask(start_x, start_y, width, height,
253 pPatternBitmap, fill_argb, 0, 0,
const CPDF_Transparency & GetTransparency() const
const CPDF_GraphicStates & graphic_states() const
const CPDF_GeneralState & general_state() const
virtual CPDF_PathObject * AsPath()
void AppendLayer(CPDF_PageObjectHolder *pObjectHolder, const CFX_Matrix &mtObject2Device)
void Render(CFX_RenderDevice *pDevice, const CPDF_PageObject *pStopObj, const CPDF_RenderOptions *pOptions, const CFX_Matrix *pLastMatrix)