fz_error * fz_newrenderer(fz_renderer **gcp, fz_colorspace *pcm, int maskonly, int gcmem) { fz_error *error; fz_renderer *gc; gc = fz_malloc(sizeof(fz_renderer)); if (!gc) return fz_outofmem; gc->maskonly = maskonly; gc->model = pcm; gc->cache = nil; gc->gel = nil; gc->ael = nil; error = fz_newglyphcache(&gc->cache, gcmem / 24, gcmem); if (error) goto cleanup; error = fz_newgel(&gc->gel); if (error) goto cleanup; error = fz_newael(&gc->ael); if (error) goto cleanup; gc->dest = nil; gc->over = nil; gc->argb[0] = 255; gc->argb[1] = 0; gc->argb[2] = 0; gc->argb[3] = 0; gc->argb[4] = 0; gc->argb[5] = 0; gc->argb[6] = 0; gc->flag = 0; *gcp = gc; return fz_okay; cleanup: if (gc->model) fz_dropcolorspace(gc->model); if (gc->cache) fz_dropglyphcache(gc->cache); if (gc->gel) fz_dropgel(gc->gel); if (gc->ael) fz_dropael(gc->ael); fz_free(gc); return error; }
fz_device * fz_newdrawdevice(fz_glyphcache *cache, fz_pixmap *dest) { fz_device *dev; fz_drawdevice *ddev = fz_malloc(sizeof(fz_drawdevice)); ddev->cache = cache; ddev->gel = fz_newgel(); ddev->ael = fz_newael(); ddev->dest = dest; ddev->top = 0; ddev->scissor.x0 = dest->x; ddev->scissor.y0 = dest->y; ddev->scissor.x1 = dest->x + dest->w; ddev->scissor.y1 = dest->y + dest->h; dev = fz_newdevice(ddev); dev->freeuser = fz_drawfreeuser; dev->fillpath = fz_drawfillpath; dev->strokepath = fz_drawstrokepath; dev->clippath = fz_drawclippath; dev->clipstrokepath = fz_drawclipstrokepath; dev->filltext = fz_drawfilltext; dev->stroketext = fz_drawstroketext; dev->cliptext = fz_drawcliptext; dev->clipstroketext = fz_drawclipstroketext; dev->ignoretext = fz_drawignoretext; dev->fillimagemask = fz_drawfillimagemask; dev->clipimagemask = fz_drawclipimagemask; dev->fillimage = fz_drawfillimage; dev->fillshade = fz_drawfillshade; dev->popclip = fz_drawpopclip; dev->beginmask = fz_drawbeginmask; dev->endmask = fz_drawendmask; dev->begingroup = fz_drawbegingroup; dev->endgroup = fz_drawendgroup; return dev; }