jidctint.c 182 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316
  1. /*
  2. * jidctint.c
  3. *
  4. * Copyright (C) 1991-1998, Thomas G. Lane.
  5. * Modification developed 2002-2018 by Guido Vollbeding.
  6. * This file is part of the Independent JPEG Group's software.
  7. * For conditions of distribution and use, see the accompanying README file.
  8. *
  9. * This file contains a slow-but-accurate integer implementation of the
  10. * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine
  11. * must also perform dequantization of the input coefficients.
  12. *
  13. * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT
  14. * on each row (or vice versa, but it's more convenient to emit a row at
  15. * a time). Direct algorithms are also available, but they are much more
  16. * complex and seem not to be any faster when reduced to code.
  17. *
  18. * This implementation is based on an algorithm described in
  19. * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT
  20. * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics,
  21. * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991.
  22. * The primary algorithm described there uses 11 multiplies and 29 adds.
  23. * We use their alternate method with 12 multiplies and 32 adds.
  24. * The advantage of this method is that no data path contains more than one
  25. * multiplication; this allows a very simple and accurate implementation in
  26. * scaled fixed-point arithmetic, with a minimal number of shifts.
  27. *
  28. * We also provide IDCT routines with various output sample block sizes for
  29. * direct resolution reduction or enlargement and for direct resolving the
  30. * common 2x1 and 1x2 subsampling cases without additional resampling: NxN
  31. * (N=1...16), 2NxN, and Nx2N (N=1...8) pixels for one 8x8 input DCT block.
  32. *
  33. * For N<8 we simply take the corresponding low-frequency coefficients of
  34. * the 8x8 input DCT block and apply an NxN point IDCT on the sub-block
  35. * to yield the downscaled outputs.
  36. * This can be seen as direct low-pass downsampling from the DCT domain
  37. * point of view rather than the usual spatial domain point of view,
  38. * yielding significant computational savings and results at least
  39. * as good as common bilinear (averaging) spatial downsampling.
  40. *
  41. * For N>8 we apply a partial NxN IDCT on the 8 input coefficients as
  42. * lower frequencies and higher frequencies assumed to be zero.
  43. * It turns out that the computational effort is similar to the 8x8 IDCT
  44. * regarding the output size.
  45. * Furthermore, the scaling and descaling is the same for all IDCT sizes.
  46. *
  47. * CAUTION: We rely on the FIX() macro except for the N=1,2,4,8 cases
  48. * since there would be too many additional constants to pre-calculate.
  49. */
  50. #define JPEG_INTERNALS
  51. #include "jinclude.h"
  52. #include "jpeglib.h"
  53. #include "jdct.h" /* Private declarations for DCT subsystem */
  54. #ifdef DCT_ISLOW_SUPPORTED
  55. /*
  56. * This module is specialized to the case DCTSIZE = 8.
  57. */
  58. #if DCTSIZE != 8
  59. Sorry, this code only copes with 8x8 DCT blocks. /* deliberate syntax err */
  60. #endif
  61. /*
  62. * The poop on this scaling stuff is as follows:
  63. *
  64. * Each 1-D IDCT step produces outputs which are a factor of sqrt(N)
  65. * larger than the true IDCT outputs. The final outputs are therefore
  66. * a factor of N larger than desired; since N=8 this can be cured by
  67. * a simple right shift at the end of the algorithm. The advantage of
  68. * this arrangement is that we save two multiplications per 1-D IDCT,
  69. * because the y0 and y4 inputs need not be divided by sqrt(N).
  70. *
  71. * We have to do addition and subtraction of the integer inputs, which
  72. * is no problem, and multiplication by fractional constants, which is
  73. * a problem to do in integer arithmetic. We multiply all the constants
  74. * by CONST_SCALE and convert them to integer constants (thus retaining
  75. * CONST_BITS bits of precision in the constants). After doing a
  76. * multiplication we have to divide the product by CONST_SCALE, with proper
  77. * rounding, to produce the correct output. This division can be done
  78. * cheaply as a right shift of CONST_BITS bits. We postpone shifting
  79. * as long as possible so that partial sums can be added together with
  80. * full fractional precision.
  81. *
  82. * The outputs of the first pass are scaled up by PASS1_BITS bits so that
  83. * they are represented to better-than-integral precision. These outputs
  84. * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word
  85. * with the recommended scaling. (To scale up 12-bit sample data further, an
  86. * intermediate INT32 array would be needed.)
  87. *
  88. * To avoid overflow of the 32-bit intermediate results in pass 2, we must
  89. * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis
  90. * shows that the values given below are the most effective.
  91. */
  92. #if BITS_IN_JSAMPLE == 8
  93. #define CONST_BITS 13
  94. #define PASS1_BITS 2
  95. #else
  96. #define CONST_BITS 13
  97. #define PASS1_BITS 1 /* lose a little precision to avoid overflow */
  98. #endif
  99. /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
  100. * causing a lot of useless floating-point operations at run time.
  101. * To get around this we use the following pre-calculated constants.
  102. * If you change CONST_BITS you may want to add appropriate values.
  103. * (With a reasonable C compiler, you can just rely on the FIX() macro...)
  104. */
  105. #if CONST_BITS == 13
  106. #define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */
  107. #define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */
  108. #define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */
  109. #define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */
  110. #define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */
  111. #define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */
  112. #define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */
  113. #define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */
  114. #define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */
  115. #define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */
  116. #define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */
  117. #define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */
  118. #else
  119. #define FIX_0_298631336 FIX(0.298631336)
  120. #define FIX_0_390180644 FIX(0.390180644)
  121. #define FIX_0_541196100 FIX(0.541196100)
  122. #define FIX_0_765366865 FIX(0.765366865)
  123. #define FIX_0_899976223 FIX(0.899976223)
  124. #define FIX_1_175875602 FIX(1.175875602)
  125. #define FIX_1_501321110 FIX(1.501321110)
  126. #define FIX_1_847759065 FIX(1.847759065)
  127. #define FIX_1_961570560 FIX(1.961570560)
  128. #define FIX_2_053119869 FIX(2.053119869)
  129. #define FIX_2_562915447 FIX(2.562915447)
  130. #define FIX_3_072711026 FIX(3.072711026)
  131. #endif
  132. /* Clamp DC value to acceptable range for bug 697186 */
  133. #define CLAMP_DC(dcval) \
  134. { \
  135. if (dcval < -1024) \
  136. dcval = -1024; \
  137. else if (dcval > 1023) \
  138. dcval = 1023; \
  139. }
  140. /* Multiply an INT32 variable by an INT32 constant to yield an INT32 result.
  141. * For 8-bit samples with the recommended scaling, all the variable
  142. * and constant values involved are no more than 16 bits wide, so a
  143. * 16x16->32 bit multiply can be used instead of a full 32x32 multiply.
  144. * For 12-bit samples, a full 32-bit multiplication will be needed.
  145. */
  146. #if BITS_IN_JSAMPLE == 8
  147. #define MULTIPLY(var,const) MULTIPLY16C16(var,const)
  148. #else
  149. #define MULTIPLY(var,const) ((var) * (const))
  150. #endif
  151. /* Dequantize a coefficient by multiplying it by the multiplier-table
  152. * entry; produce an int result. In this module, both inputs and result
  153. * are 16 bits or less, so either int or short multiply will work.
  154. */
  155. #define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval))
  156. /*
  157. * Perform dequantization and inverse DCT on one block of coefficients.
  158. *
  159. * Optimized algorithm with 12 multiplications in the 1-D kernel.
  160. * cK represents sqrt(2) * cos(K*pi/16).
  161. */
  162. GLOBAL(void)
  163. jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  164. JCOEFPTR coef_block,
  165. JSAMPARRAY output_buf, JDIMENSION output_col)
  166. {
  167. INT32 tmp0, tmp1, tmp2, tmp3;
  168. INT32 tmp10, tmp11, tmp12, tmp13;
  169. INT32 z1, z2, z3;
  170. JCOEFPTR inptr;
  171. ISLOW_MULT_TYPE * quantptr;
  172. int * wsptr;
  173. JSAMPROW outptr;
  174. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  175. int ctr;
  176. int workspace[DCTSIZE2]; /* buffers data between passes */
  177. SHIFT_TEMPS
  178. /* Pass 1: process columns from input, store into work array.
  179. * Note results are scaled up by sqrt(8) compared to a true IDCT;
  180. * furthermore, we scale the results by 2**PASS1_BITS.
  181. */
  182. inptr = coef_block;
  183. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  184. wsptr = workspace;
  185. for (ctr = DCTSIZE; ctr > 0; ctr--) {
  186. /* Due to quantization, we will usually find that many of the input
  187. * coefficients are zero, especially the AC terms. We can exploit this
  188. * by short-circuiting the IDCT calculation for any column in which all
  189. * the AC terms are zero. In that case each output is equal to the
  190. * DC coefficient (with scale factor as needed).
  191. * With typical images and quantization tables, half or more of the
  192. * column DCT calculations can be simplified this way.
  193. */
  194. if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
  195. inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
  196. inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
  197. inptr[DCTSIZE*7] == 0) {
  198. /* AC terms all zero */
  199. int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  200. if (ctr == DCTSIZE)
  201. CLAMP_DC(dcval);
  202. dcval <<= PASS1_BITS;
  203. wsptr[DCTSIZE*0] = dcval;
  204. wsptr[DCTSIZE*1] = dcval;
  205. wsptr[DCTSIZE*2] = dcval;
  206. wsptr[DCTSIZE*3] = dcval;
  207. wsptr[DCTSIZE*4] = dcval;
  208. wsptr[DCTSIZE*5] = dcval;
  209. wsptr[DCTSIZE*6] = dcval;
  210. wsptr[DCTSIZE*7] = dcval;
  211. inptr++; /* advance pointers to next column */
  212. quantptr++;
  213. wsptr++;
  214. continue;
  215. }
  216. /* Even part: reverse the even part of the forward DCT.
  217. * The rotator is c(-6).
  218. */
  219. z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  220. if (ctr == DCTSIZE)
  221. CLAMP_DC(z2);
  222. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  223. z2 <<= CONST_BITS;
  224. z3 <<= CONST_BITS;
  225. /* Add fudge factor here for final descale. */
  226. z2 += ONE << (CONST_BITS-PASS1_BITS-1);
  227. tmp0 = z2 + z3;
  228. tmp1 = z2 - z3;
  229. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  230. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  231. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  232. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  233. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  234. tmp10 = tmp0 + tmp2;
  235. tmp13 = tmp0 - tmp2;
  236. tmp11 = tmp1 + tmp3;
  237. tmp12 = tmp1 - tmp3;
  238. /* Odd part per figure 8; the matrix is unitary and hence its
  239. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  240. */
  241. tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  242. tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  243. tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  244. tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  245. z2 = tmp0 + tmp2;
  246. z3 = tmp1 + tmp3;
  247. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  248. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  249. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  250. z2 += z1;
  251. z3 += z1;
  252. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  253. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  254. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  255. tmp0 += z1 + z2;
  256. tmp3 += z1 + z3;
  257. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  258. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  259. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  260. tmp1 += z1 + z3;
  261. tmp2 += z1 + z2;
  262. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  263. wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  264. wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  265. wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  266. wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  267. wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  268. wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  269. wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  270. wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  271. inptr++; /* advance pointers to next column */
  272. quantptr++;
  273. wsptr++;
  274. }
  275. /* Pass 2: process rows from work array, store into output array.
  276. * Note that we must descale the results by a factor of 8 == 2**3,
  277. * and also undo the PASS1_BITS scaling.
  278. */
  279. wsptr = workspace;
  280. for (ctr = 0; ctr < DCTSIZE; ctr++) {
  281. outptr = output_buf[ctr] + output_col;
  282. /* Add range center and fudge factor for final descale and range-limit. */
  283. z2 = (INT32) wsptr[0] +
  284. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  285. (ONE << (PASS1_BITS+2)));
  286. /* Rows of zeroes can be exploited in the same way as we did with columns.
  287. * However, the column calculation has created many nonzero AC terms, so
  288. * the simplification applies less often (typically 5% to 10% of the time).
  289. * On machines with very fast multiplication, it's possible that the
  290. * test takes more time than it's worth. In that case this section
  291. * may be commented out.
  292. */
  293. #ifndef NO_ZERO_ROW_TEST
  294. if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
  295. wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
  296. /* AC terms all zero */
  297. JSAMPLE dcval = range_limit[(int) RIGHT_SHIFT(z2, PASS1_BITS+3)
  298. & RANGE_MASK];
  299. outptr[0] = dcval;
  300. outptr[1] = dcval;
  301. outptr[2] = dcval;
  302. outptr[3] = dcval;
  303. outptr[4] = dcval;
  304. outptr[5] = dcval;
  305. outptr[6] = dcval;
  306. outptr[7] = dcval;
  307. wsptr += DCTSIZE; /* advance pointer to next row */
  308. continue;
  309. }
  310. #endif
  311. /* Even part: reverse the even part of the forward DCT.
  312. * The rotator is c(-6).
  313. */
  314. z3 = (INT32) wsptr[4];
  315. tmp0 = (z2 + z3) << CONST_BITS;
  316. tmp1 = (z2 - z3) << CONST_BITS;
  317. z2 = (INT32) wsptr[2];
  318. z3 = (INT32) wsptr[6];
  319. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  320. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  321. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  322. tmp10 = tmp0 + tmp2;
  323. tmp13 = tmp0 - tmp2;
  324. tmp11 = tmp1 + tmp3;
  325. tmp12 = tmp1 - tmp3;
  326. /* Odd part per figure 8; the matrix is unitary and hence its
  327. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  328. */
  329. tmp0 = (INT32) wsptr[7];
  330. tmp1 = (INT32) wsptr[5];
  331. tmp2 = (INT32) wsptr[3];
  332. tmp3 = (INT32) wsptr[1];
  333. z2 = tmp0 + tmp2;
  334. z3 = tmp1 + tmp3;
  335. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  336. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  337. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  338. z2 += z1;
  339. z3 += z1;
  340. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  341. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  342. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  343. tmp0 += z1 + z2;
  344. tmp3 += z1 + z3;
  345. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  346. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  347. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  348. tmp1 += z1 + z3;
  349. tmp2 += z1 + z2;
  350. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  351. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
  352. CONST_BITS+PASS1_BITS+3)
  353. & RANGE_MASK];
  354. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,
  355. CONST_BITS+PASS1_BITS+3)
  356. & RANGE_MASK];
  357. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,
  358. CONST_BITS+PASS1_BITS+3)
  359. & RANGE_MASK];
  360. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,
  361. CONST_BITS+PASS1_BITS+3)
  362. & RANGE_MASK];
  363. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,
  364. CONST_BITS+PASS1_BITS+3)
  365. & RANGE_MASK];
  366. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,
  367. CONST_BITS+PASS1_BITS+3)
  368. & RANGE_MASK];
  369. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,
  370. CONST_BITS+PASS1_BITS+3)
  371. & RANGE_MASK];
  372. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
  373. CONST_BITS+PASS1_BITS+3)
  374. & RANGE_MASK];
  375. wsptr += DCTSIZE; /* advance pointer to next row */
  376. }
  377. }
  378. #ifdef IDCT_SCALING_SUPPORTED
  379. /*
  380. * Perform dequantization and inverse DCT on one block of coefficients,
  381. * producing a reduced-size 7x7 output block.
  382. *
  383. * Optimized algorithm with 12 multiplications in the 1-D kernel.
  384. * cK represents sqrt(2) * cos(K*pi/14).
  385. */
  386. GLOBAL(void)
  387. jpeg_idct_7x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  388. JCOEFPTR coef_block,
  389. JSAMPARRAY output_buf, JDIMENSION output_col)
  390. {
  391. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12, tmp13;
  392. INT32 z1, z2, z3;
  393. JCOEFPTR inptr;
  394. ISLOW_MULT_TYPE * quantptr;
  395. int * wsptr;
  396. JSAMPROW outptr;
  397. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  398. int ctr;
  399. int workspace[7*7]; /* buffers data between passes */
  400. SHIFT_TEMPS
  401. /* Pass 1: process columns from input, store into work array. */
  402. inptr = coef_block;
  403. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  404. wsptr = workspace;
  405. for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) {
  406. /* Even part */
  407. tmp13 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  408. if (ctr == 0)
  409. CLAMP_DC(tmp13);
  410. tmp13 <<= CONST_BITS;
  411. /* Add fudge factor here for final descale. */
  412. tmp13 += ONE << (CONST_BITS-PASS1_BITS-1);
  413. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  414. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  415. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  416. tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  417. tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  418. tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  419. tmp0 = z1 + z3;
  420. z2 -= tmp0;
  421. tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */
  422. tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  423. tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  424. tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  425. /* Odd part */
  426. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  427. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  428. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  429. tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  430. tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  431. tmp0 = tmp1 - tmp2;
  432. tmp1 += tmp2;
  433. tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  434. tmp1 += tmp2;
  435. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  436. tmp0 += z2;
  437. tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  438. /* Final output stage */
  439. wsptr[7*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  440. wsptr[7*6] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  441. wsptr[7*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);
  442. wsptr[7*5] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);
  443. wsptr[7*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  444. wsptr[7*4] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  445. wsptr[7*3] = (int) RIGHT_SHIFT(tmp13, CONST_BITS-PASS1_BITS);
  446. }
  447. /* Pass 2: process 7 rows from work array, store into output array. */
  448. wsptr = workspace;
  449. for (ctr = 0; ctr < 7; ctr++) {
  450. outptr = output_buf[ctr] + output_col;
  451. /* Even part */
  452. /* Add range center and fudge factor for final descale and range-limit. */
  453. tmp13 = (INT32) wsptr[0] +
  454. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  455. (ONE << (PASS1_BITS+2)));
  456. tmp13 <<= CONST_BITS;
  457. z1 = (INT32) wsptr[2];
  458. z2 = (INT32) wsptr[4];
  459. z3 = (INT32) wsptr[6];
  460. tmp10 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  461. tmp12 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  462. tmp11 = tmp10 + tmp12 + tmp13 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  463. tmp0 = z1 + z3;
  464. z2 -= tmp0;
  465. tmp0 = MULTIPLY(tmp0, FIX(1.274162392)) + tmp13; /* c2 */
  466. tmp10 += tmp0 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  467. tmp12 += tmp0 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  468. tmp13 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  469. /* Odd part */
  470. z1 = (INT32) wsptr[1];
  471. z2 = (INT32) wsptr[3];
  472. z3 = (INT32) wsptr[5];
  473. tmp1 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  474. tmp2 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  475. tmp0 = tmp1 - tmp2;
  476. tmp1 += tmp2;
  477. tmp2 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  478. tmp1 += tmp2;
  479. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  480. tmp0 += z2;
  481. tmp2 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  482. /* Final output stage */
  483. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  484. CONST_BITS+PASS1_BITS+3)
  485. & RANGE_MASK];
  486. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  487. CONST_BITS+PASS1_BITS+3)
  488. & RANGE_MASK];
  489. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  490. CONST_BITS+PASS1_BITS+3)
  491. & RANGE_MASK];
  492. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  493. CONST_BITS+PASS1_BITS+3)
  494. & RANGE_MASK];
  495. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  496. CONST_BITS+PASS1_BITS+3)
  497. & RANGE_MASK];
  498. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  499. CONST_BITS+PASS1_BITS+3)
  500. & RANGE_MASK];
  501. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13,
  502. CONST_BITS+PASS1_BITS+3)
  503. & RANGE_MASK];
  504. wsptr += 7; /* advance pointer to next row */
  505. }
  506. }
  507. /*
  508. * Perform dequantization and inverse DCT on one block of coefficients,
  509. * producing a reduced-size 6x6 output block.
  510. *
  511. * Optimized algorithm with 3 multiplications in the 1-D kernel.
  512. * cK represents sqrt(2) * cos(K*pi/12).
  513. */
  514. GLOBAL(void)
  515. jpeg_idct_6x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  516. JCOEFPTR coef_block,
  517. JSAMPARRAY output_buf, JDIMENSION output_col)
  518. {
  519. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;
  520. INT32 z1, z2, z3;
  521. JCOEFPTR inptr;
  522. ISLOW_MULT_TYPE * quantptr;
  523. int * wsptr;
  524. JSAMPROW outptr;
  525. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  526. int ctr;
  527. int workspace[6*6]; /* buffers data between passes */
  528. SHIFT_TEMPS
  529. /* Pass 1: process columns from input, store into work array. */
  530. inptr = coef_block;
  531. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  532. wsptr = workspace;
  533. for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {
  534. /* Even part */
  535. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  536. if (ctr == 0)
  537. CLAMP_DC(tmp0);
  538. tmp0 <<= CONST_BITS;
  539. /* Add fudge factor here for final descale. */
  540. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  541. tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  542. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  543. tmp1 = tmp0 + tmp10;
  544. tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS);
  545. tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  546. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  547. tmp10 = tmp1 + tmp0;
  548. tmp12 = tmp1 - tmp0;
  549. /* Odd part */
  550. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  551. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  552. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  553. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  554. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  555. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  556. tmp1 = (z1 - z2 - z3) << PASS1_BITS;
  557. /* Final output stage */
  558. wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  559. wsptr[6*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  560. wsptr[6*1] = (int) (tmp11 + tmp1);
  561. wsptr[6*4] = (int) (tmp11 - tmp1);
  562. wsptr[6*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  563. wsptr[6*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  564. }
  565. /* Pass 2: process 6 rows from work array, store into output array. */
  566. wsptr = workspace;
  567. for (ctr = 0; ctr < 6; ctr++) {
  568. outptr = output_buf[ctr] + output_col;
  569. /* Even part */
  570. /* Add range center and fudge factor for final descale and range-limit. */
  571. tmp0 = (INT32) wsptr[0] +
  572. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  573. (ONE << (PASS1_BITS+2)));
  574. tmp0 <<= CONST_BITS;
  575. tmp2 = (INT32) wsptr[4];
  576. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  577. tmp1 = tmp0 + tmp10;
  578. tmp11 = tmp0 - tmp10 - tmp10;
  579. tmp10 = (INT32) wsptr[2];
  580. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  581. tmp10 = tmp1 + tmp0;
  582. tmp12 = tmp1 - tmp0;
  583. /* Odd part */
  584. z1 = (INT32) wsptr[1];
  585. z2 = (INT32) wsptr[3];
  586. z3 = (INT32) wsptr[5];
  587. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  588. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  589. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  590. tmp1 = (z1 - z2 - z3) << CONST_BITS;
  591. /* Final output stage */
  592. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  593. CONST_BITS+PASS1_BITS+3)
  594. & RANGE_MASK];
  595. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  596. CONST_BITS+PASS1_BITS+3)
  597. & RANGE_MASK];
  598. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  599. CONST_BITS+PASS1_BITS+3)
  600. & RANGE_MASK];
  601. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  602. CONST_BITS+PASS1_BITS+3)
  603. & RANGE_MASK];
  604. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  605. CONST_BITS+PASS1_BITS+3)
  606. & RANGE_MASK];
  607. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  608. CONST_BITS+PASS1_BITS+3)
  609. & RANGE_MASK];
  610. wsptr += 6; /* advance pointer to next row */
  611. }
  612. }
  613. /*
  614. * Perform dequantization and inverse DCT on one block of coefficients,
  615. * producing a reduced-size 5x5 output block.
  616. *
  617. * Optimized algorithm with 5 multiplications in the 1-D kernel.
  618. * cK represents sqrt(2) * cos(K*pi/10).
  619. */
  620. GLOBAL(void)
  621. jpeg_idct_5x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  622. JCOEFPTR coef_block,
  623. JSAMPARRAY output_buf, JDIMENSION output_col)
  624. {
  625. INT32 tmp0, tmp1, tmp10, tmp11, tmp12;
  626. INT32 z1, z2, z3;
  627. JCOEFPTR inptr;
  628. ISLOW_MULT_TYPE * quantptr;
  629. int * wsptr;
  630. JSAMPROW outptr;
  631. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  632. int ctr;
  633. int workspace[5*5]; /* buffers data between passes */
  634. SHIFT_TEMPS
  635. /* Pass 1: process columns from input, store into work array. */
  636. inptr = coef_block;
  637. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  638. wsptr = workspace;
  639. for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) {
  640. /* Even part */
  641. tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  642. if (ctr == 0)
  643. CLAMP_DC(tmp12);
  644. tmp12 <<= CONST_BITS;
  645. /* Add fudge factor here for final descale. */
  646. tmp12 += ONE << (CONST_BITS-PASS1_BITS-1);
  647. tmp0 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  648. tmp1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  649. z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */
  650. z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */
  651. z3 = tmp12 + z2;
  652. tmp10 = z3 + z1;
  653. tmp11 = z3 - z1;
  654. tmp12 -= z2 << 2;
  655. /* Odd part */
  656. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  657. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  658. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  659. tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  660. tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  661. /* Final output stage */
  662. wsptr[5*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  663. wsptr[5*4] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  664. wsptr[5*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);
  665. wsptr[5*3] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);
  666. wsptr[5*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS);
  667. }
  668. /* Pass 2: process 5 rows from work array, store into output array. */
  669. wsptr = workspace;
  670. for (ctr = 0; ctr < 5; ctr++) {
  671. outptr = output_buf[ctr] + output_col;
  672. /* Even part */
  673. /* Add range center and fudge factor for final descale and range-limit. */
  674. tmp12 = (INT32) wsptr[0] +
  675. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  676. (ONE << (PASS1_BITS+2)));
  677. tmp12 <<= CONST_BITS;
  678. tmp0 = (INT32) wsptr[2];
  679. tmp1 = (INT32) wsptr[4];
  680. z1 = MULTIPLY(tmp0 + tmp1, FIX(0.790569415)); /* (c2+c4)/2 */
  681. z2 = MULTIPLY(tmp0 - tmp1, FIX(0.353553391)); /* (c2-c4)/2 */
  682. z3 = tmp12 + z2;
  683. tmp10 = z3 + z1;
  684. tmp11 = z3 - z1;
  685. tmp12 -= z2 << 2;
  686. /* Odd part */
  687. z2 = (INT32) wsptr[1];
  688. z3 = (INT32) wsptr[3];
  689. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  690. tmp0 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  691. tmp1 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  692. /* Final output stage */
  693. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  694. CONST_BITS+PASS1_BITS+3)
  695. & RANGE_MASK];
  696. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  697. CONST_BITS+PASS1_BITS+3)
  698. & RANGE_MASK];
  699. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  700. CONST_BITS+PASS1_BITS+3)
  701. & RANGE_MASK];
  702. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  703. CONST_BITS+PASS1_BITS+3)
  704. & RANGE_MASK];
  705. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12,
  706. CONST_BITS+PASS1_BITS+3)
  707. & RANGE_MASK];
  708. wsptr += 5; /* advance pointer to next row */
  709. }
  710. }
  711. /*
  712. * Perform dequantization and inverse DCT on one block of coefficients,
  713. * producing a reduced-size 4x4 output block.
  714. *
  715. * Optimized algorithm with 3 multiplications in the 1-D kernel.
  716. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  717. */
  718. GLOBAL(void)
  719. jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  720. JCOEFPTR coef_block,
  721. JSAMPARRAY output_buf, JDIMENSION output_col)
  722. {
  723. INT32 tmp0, tmp2, tmp10, tmp12;
  724. INT32 z1, z2, z3;
  725. JCOEFPTR inptr;
  726. ISLOW_MULT_TYPE * quantptr;
  727. int * wsptr;
  728. JSAMPROW outptr;
  729. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  730. int ctr;
  731. int workspace[4*4]; /* buffers data between passes */
  732. SHIFT_TEMPS
  733. /* Pass 1: process columns from input, store into work array. */
  734. inptr = coef_block;
  735. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  736. wsptr = workspace;
  737. for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) {
  738. /* Even part */
  739. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  740. if (ctr == 0)
  741. CLAMP_DC(tmp0);
  742. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  743. tmp10 = (tmp0 + tmp2) << PASS1_BITS;
  744. tmp12 = (tmp0 - tmp2) << PASS1_BITS;
  745. /* Odd part */
  746. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  747. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  748. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  749. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  750. /* Add fudge factor here for final descale. */
  751. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  752. tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */
  753. CONST_BITS-PASS1_BITS);
  754. tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */
  755. CONST_BITS-PASS1_BITS);
  756. /* Final output stage */
  757. wsptr[4*0] = (int) (tmp10 + tmp0);
  758. wsptr[4*3] = (int) (tmp10 - tmp0);
  759. wsptr[4*1] = (int) (tmp12 + tmp2);
  760. wsptr[4*2] = (int) (tmp12 - tmp2);
  761. }
  762. /* Pass 2: process 4 rows from work array, store into output array. */
  763. wsptr = workspace;
  764. for (ctr = 0; ctr < 4; ctr++) {
  765. outptr = output_buf[ctr] + output_col;
  766. /* Even part */
  767. /* Add range center and fudge factor for final descale and range-limit. */
  768. tmp0 = (INT32) wsptr[0] +
  769. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  770. (ONE << (PASS1_BITS+2)));
  771. tmp2 = (INT32) wsptr[2];
  772. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  773. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  774. /* Odd part */
  775. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  776. z2 = (INT32) wsptr[1];
  777. z3 = (INT32) wsptr[3];
  778. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  779. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  780. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  781. /* Final output stage */
  782. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  783. CONST_BITS+PASS1_BITS+3)
  784. & RANGE_MASK];
  785. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  786. CONST_BITS+PASS1_BITS+3)
  787. & RANGE_MASK];
  788. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  789. CONST_BITS+PASS1_BITS+3)
  790. & RANGE_MASK];
  791. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  792. CONST_BITS+PASS1_BITS+3)
  793. & RANGE_MASK];
  794. wsptr += 4; /* advance pointer to next row */
  795. }
  796. }
  797. /*
  798. * Perform dequantization and inverse DCT on one block of coefficients,
  799. * producing a reduced-size 3x3 output block.
  800. *
  801. * Optimized algorithm with 2 multiplications in the 1-D kernel.
  802. * cK represents sqrt(2) * cos(K*pi/6).
  803. */
  804. GLOBAL(void)
  805. jpeg_idct_3x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  806. JCOEFPTR coef_block,
  807. JSAMPARRAY output_buf, JDIMENSION output_col)
  808. {
  809. INT32 tmp0, tmp2, tmp10, tmp12;
  810. JCOEFPTR inptr;
  811. ISLOW_MULT_TYPE * quantptr;
  812. int * wsptr;
  813. JSAMPROW outptr;
  814. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  815. int ctr;
  816. int workspace[3*3]; /* buffers data between passes */
  817. SHIFT_TEMPS
  818. /* Pass 1: process columns from input, store into work array. */
  819. inptr = coef_block;
  820. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  821. wsptr = workspace;
  822. for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) {
  823. /* Even part */
  824. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  825. if (ctr == 0)
  826. CLAMP_DC(tmp0);
  827. tmp0 <<= CONST_BITS;
  828. /* Add fudge factor here for final descale. */
  829. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  830. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  831. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  832. tmp10 = tmp0 + tmp12;
  833. tmp2 = tmp0 - tmp12 - tmp12;
  834. /* Odd part */
  835. tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  836. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  837. /* Final output stage */
  838. wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  839. wsptr[3*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  840. wsptr[3*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);
  841. }
  842. /* Pass 2: process 3 rows from work array, store into output array. */
  843. wsptr = workspace;
  844. for (ctr = 0; ctr < 3; ctr++) {
  845. outptr = output_buf[ctr] + output_col;
  846. /* Even part */
  847. /* Add range center and fudge factor for final descale and range-limit. */
  848. tmp0 = (INT32) wsptr[0] +
  849. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  850. (ONE << (PASS1_BITS+2)));
  851. tmp0 <<= CONST_BITS;
  852. tmp2 = (INT32) wsptr[2];
  853. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  854. tmp10 = tmp0 + tmp12;
  855. tmp2 = tmp0 - tmp12 - tmp12;
  856. /* Odd part */
  857. tmp12 = (INT32) wsptr[1];
  858. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  859. /* Final output stage */
  860. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  861. CONST_BITS+PASS1_BITS+3)
  862. & RANGE_MASK];
  863. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  864. CONST_BITS+PASS1_BITS+3)
  865. & RANGE_MASK];
  866. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2,
  867. CONST_BITS+PASS1_BITS+3)
  868. & RANGE_MASK];
  869. wsptr += 3; /* advance pointer to next row */
  870. }
  871. }
  872. /*
  873. * Perform dequantization and inverse DCT on one block of coefficients,
  874. * producing a reduced-size 2x2 output block.
  875. *
  876. * Multiplication-less algorithm.
  877. */
  878. GLOBAL(void)
  879. jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  880. JCOEFPTR coef_block,
  881. JSAMPARRAY output_buf, JDIMENSION output_col)
  882. {
  883. DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5;
  884. ISLOW_MULT_TYPE * quantptr;
  885. JSAMPROW outptr;
  886. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  887. ISHIFT_TEMPS
  888. /* Pass 1: process columns from input. */
  889. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  890. /* Column 0 */
  891. tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
  892. CLAMP_DC(tmp4);
  893. tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
  894. /* Add range center and fudge factor for final descale and range-limit. */
  895. tmp4 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  896. tmp0 = tmp4 + tmp5;
  897. tmp2 = tmp4 - tmp5;
  898. /* Column 1 */
  899. tmp4 = DEQUANTIZE(coef_block[DCTSIZE*0+1], quantptr[DCTSIZE*0+1]);
  900. tmp5 = DEQUANTIZE(coef_block[DCTSIZE*1+1], quantptr[DCTSIZE*1+1]);
  901. tmp1 = tmp4 + tmp5;
  902. tmp3 = tmp4 - tmp5;
  903. /* Pass 2: process 2 rows, store into output array. */
  904. /* Row 0 */
  905. outptr = output_buf[0] + output_col;
  906. outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
  907. outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
  908. /* Row 1 */
  909. outptr = output_buf[1] + output_col;
  910. outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp2 + tmp3, 3) & RANGE_MASK];
  911. outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp2 - tmp3, 3) & RANGE_MASK];
  912. }
  913. /*
  914. * Perform dequantization and inverse DCT on one block of coefficients,
  915. * producing a reduced-size 1x1 output block.
  916. *
  917. * We hardly need an inverse DCT routine for this: just take the
  918. * average pixel value, which is one-eighth of the DC coefficient.
  919. */
  920. GLOBAL(void)
  921. jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  922. JCOEFPTR coef_block,
  923. JSAMPARRAY output_buf, JDIMENSION output_col)
  924. {
  925. DCTELEM dcval;
  926. ISLOW_MULT_TYPE * quantptr;
  927. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  928. ISHIFT_TEMPS
  929. /* 1x1 is trivial: just take the DC coefficient divided by 8. */
  930. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  931. dcval = DEQUANTIZE(coef_block[0], quantptr[0]);
  932. CLAMP_DC(dcval);
  933. /* Add range center and fudge factor for descale and range-limit. */
  934. dcval += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  935. output_buf[0][output_col] =
  936. range_limit[(int) IRIGHT_SHIFT(dcval, 3) & RANGE_MASK];
  937. }
  938. /*
  939. * Perform dequantization and inverse DCT on one block of coefficients,
  940. * producing a 9x9 output block.
  941. *
  942. * Optimized algorithm with 10 multiplications in the 1-D kernel.
  943. * cK represents sqrt(2) * cos(K*pi/18).
  944. */
  945. GLOBAL(void)
  946. jpeg_idct_9x9 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  947. JCOEFPTR coef_block,
  948. JSAMPARRAY output_buf, JDIMENSION output_col)
  949. {
  950. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13, tmp14;
  951. INT32 z1, z2, z3, z4;
  952. JCOEFPTR inptr;
  953. ISLOW_MULT_TYPE * quantptr;
  954. int * wsptr;
  955. JSAMPROW outptr;
  956. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  957. int ctr;
  958. int workspace[8*9]; /* buffers data between passes */
  959. SHIFT_TEMPS
  960. /* Pass 1: process columns from input, store into work array. */
  961. inptr = coef_block;
  962. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  963. wsptr = workspace;
  964. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  965. /* Even part */
  966. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  967. if (ctr == 0)
  968. CLAMP_DC(tmp0);
  969. tmp0 <<= CONST_BITS;
  970. /* Add fudge factor here for final descale. */
  971. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  972. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  973. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  974. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  975. tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */
  976. tmp1 = tmp0 + tmp3;
  977. tmp2 = tmp0 - tmp3 - tmp3;
  978. tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */
  979. tmp11 = tmp2 + tmp0;
  980. tmp14 = tmp2 - tmp0 - tmp0;
  981. tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */
  982. tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */
  983. tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */
  984. tmp10 = tmp1 + tmp0 - tmp3;
  985. tmp12 = tmp1 - tmp0 + tmp2;
  986. tmp13 = tmp1 - tmp2 + tmp3;
  987. /* Odd part */
  988. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  989. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  990. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  991. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  992. z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */
  993. tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */
  994. tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */
  995. tmp0 = tmp2 + tmp3 - z2;
  996. tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */
  997. tmp2 += z2 - tmp1;
  998. tmp3 += z2 + tmp1;
  999. tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */
  1000. /* Final output stage */
  1001. wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  1002. wsptr[8*8] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  1003. wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp1, CONST_BITS-PASS1_BITS);
  1004. wsptr[8*7] = (int) RIGHT_SHIFT(tmp11 - tmp1, CONST_BITS-PASS1_BITS);
  1005. wsptr[8*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  1006. wsptr[8*6] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  1007. wsptr[8*3] = (int) RIGHT_SHIFT(tmp13 + tmp3, CONST_BITS-PASS1_BITS);
  1008. wsptr[8*5] = (int) RIGHT_SHIFT(tmp13 - tmp3, CONST_BITS-PASS1_BITS);
  1009. wsptr[8*4] = (int) RIGHT_SHIFT(tmp14, CONST_BITS-PASS1_BITS);
  1010. }
  1011. /* Pass 2: process 9 rows from work array, store into output array. */
  1012. wsptr = workspace;
  1013. for (ctr = 0; ctr < 9; ctr++) {
  1014. outptr = output_buf[ctr] + output_col;
  1015. /* Even part */
  1016. /* Add range center and fudge factor for final descale and range-limit. */
  1017. tmp0 = (INT32) wsptr[0] +
  1018. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1019. (ONE << (PASS1_BITS+2)));
  1020. tmp0 <<= CONST_BITS;
  1021. z1 = (INT32) wsptr[2];
  1022. z2 = (INT32) wsptr[4];
  1023. z3 = (INT32) wsptr[6];
  1024. tmp3 = MULTIPLY(z3, FIX(0.707106781)); /* c6 */
  1025. tmp1 = tmp0 + tmp3;
  1026. tmp2 = tmp0 - tmp3 - tmp3;
  1027. tmp0 = MULTIPLY(z1 - z2, FIX(0.707106781)); /* c6 */
  1028. tmp11 = tmp2 + tmp0;
  1029. tmp14 = tmp2 - tmp0 - tmp0;
  1030. tmp0 = MULTIPLY(z1 + z2, FIX(1.328926049)); /* c2 */
  1031. tmp2 = MULTIPLY(z1, FIX(1.083350441)); /* c4 */
  1032. tmp3 = MULTIPLY(z2, FIX(0.245575608)); /* c8 */
  1033. tmp10 = tmp1 + tmp0 - tmp3;
  1034. tmp12 = tmp1 - tmp0 + tmp2;
  1035. tmp13 = tmp1 - tmp2 + tmp3;
  1036. /* Odd part */
  1037. z1 = (INT32) wsptr[1];
  1038. z2 = (INT32) wsptr[3];
  1039. z3 = (INT32) wsptr[5];
  1040. z4 = (INT32) wsptr[7];
  1041. z2 = MULTIPLY(z2, - FIX(1.224744871)); /* -c3 */
  1042. tmp2 = MULTIPLY(z1 + z3, FIX(0.909038955)); /* c5 */
  1043. tmp3 = MULTIPLY(z1 + z4, FIX(0.483689525)); /* c7 */
  1044. tmp0 = tmp2 + tmp3 - z2;
  1045. tmp1 = MULTIPLY(z3 - z4, FIX(1.392728481)); /* c1 */
  1046. tmp2 += z2 - tmp1;
  1047. tmp3 += z2 + tmp1;
  1048. tmp1 = MULTIPLY(z1 - z3 - z4, FIX(1.224744871)); /* c3 */
  1049. /* Final output stage */
  1050. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  1051. CONST_BITS+PASS1_BITS+3)
  1052. & RANGE_MASK];
  1053. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  1054. CONST_BITS+PASS1_BITS+3)
  1055. & RANGE_MASK];
  1056. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  1057. CONST_BITS+PASS1_BITS+3)
  1058. & RANGE_MASK];
  1059. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  1060. CONST_BITS+PASS1_BITS+3)
  1061. & RANGE_MASK];
  1062. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  1063. CONST_BITS+PASS1_BITS+3)
  1064. & RANGE_MASK];
  1065. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  1066. CONST_BITS+PASS1_BITS+3)
  1067. & RANGE_MASK];
  1068. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp3,
  1069. CONST_BITS+PASS1_BITS+3)
  1070. & RANGE_MASK];
  1071. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp3,
  1072. CONST_BITS+PASS1_BITS+3)
  1073. & RANGE_MASK];
  1074. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp14,
  1075. CONST_BITS+PASS1_BITS+3)
  1076. & RANGE_MASK];
  1077. wsptr += 8; /* advance pointer to next row */
  1078. }
  1079. }
  1080. /*
  1081. * Perform dequantization and inverse DCT on one block of coefficients,
  1082. * producing a 10x10 output block.
  1083. *
  1084. * Optimized algorithm with 12 multiplications in the 1-D kernel.
  1085. * cK represents sqrt(2) * cos(K*pi/20).
  1086. */
  1087. GLOBAL(void)
  1088. jpeg_idct_10x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1089. JCOEFPTR coef_block,
  1090. JSAMPARRAY output_buf, JDIMENSION output_col)
  1091. {
  1092. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  1093. INT32 tmp20, tmp21, tmp22, tmp23, tmp24;
  1094. INT32 z1, z2, z3, z4, z5;
  1095. JCOEFPTR inptr;
  1096. ISLOW_MULT_TYPE * quantptr;
  1097. int * wsptr;
  1098. JSAMPROW outptr;
  1099. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1100. int ctr;
  1101. int workspace[8*10]; /* buffers data between passes */
  1102. SHIFT_TEMPS
  1103. /* Pass 1: process columns from input, store into work array. */
  1104. inptr = coef_block;
  1105. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1106. wsptr = workspace;
  1107. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1108. /* Even part */
  1109. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1110. if (ctr == 0)
  1111. CLAMP_DC(z3);
  1112. z3 <<= CONST_BITS;
  1113. /* Add fudge factor here for final descale. */
  1114. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  1115. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1116. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  1117. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  1118. tmp10 = z3 + z1;
  1119. tmp11 = z3 - z2;
  1120. tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */
  1121. CONST_BITS-PASS1_BITS);
  1122. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1123. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1124. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  1125. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  1126. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  1127. tmp20 = tmp10 + tmp12;
  1128. tmp24 = tmp10 - tmp12;
  1129. tmp21 = tmp11 + tmp13;
  1130. tmp23 = tmp11 - tmp13;
  1131. /* Odd part */
  1132. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1133. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1134. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1135. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1136. tmp11 = z2 + z4;
  1137. tmp13 = z2 - z4;
  1138. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  1139. z5 = z3 << CONST_BITS;
  1140. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  1141. z4 = z5 + tmp12;
  1142. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  1143. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  1144. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  1145. z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1));
  1146. tmp12 = (z1 - tmp13 - z3) << PASS1_BITS;
  1147. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  1148. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  1149. /* Final output stage */
  1150. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1151. wsptr[8*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1152. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1153. wsptr[8*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1154. wsptr[8*2] = (int) (tmp22 + tmp12);
  1155. wsptr[8*7] = (int) (tmp22 - tmp12);
  1156. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1157. wsptr[8*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1158. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1159. wsptr[8*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1160. }
  1161. /* Pass 2: process 10 rows from work array, store into output array. */
  1162. wsptr = workspace;
  1163. for (ctr = 0; ctr < 10; ctr++) {
  1164. outptr = output_buf[ctr] + output_col;
  1165. /* Even part */
  1166. /* Add range center and fudge factor for final descale and range-limit. */
  1167. z3 = (INT32) wsptr[0] +
  1168. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1169. (ONE << (PASS1_BITS+2)));
  1170. z3 <<= CONST_BITS;
  1171. z4 = (INT32) wsptr[4];
  1172. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  1173. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  1174. tmp10 = z3 + z1;
  1175. tmp11 = z3 - z2;
  1176. tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */
  1177. z2 = (INT32) wsptr[2];
  1178. z3 = (INT32) wsptr[6];
  1179. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  1180. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  1181. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  1182. tmp20 = tmp10 + tmp12;
  1183. tmp24 = tmp10 - tmp12;
  1184. tmp21 = tmp11 + tmp13;
  1185. tmp23 = tmp11 - tmp13;
  1186. /* Odd part */
  1187. z1 = (INT32) wsptr[1];
  1188. z2 = (INT32) wsptr[3];
  1189. z3 = (INT32) wsptr[5];
  1190. z3 <<= CONST_BITS;
  1191. z4 = (INT32) wsptr[7];
  1192. tmp11 = z2 + z4;
  1193. tmp13 = z2 - z4;
  1194. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  1195. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  1196. z4 = z3 + tmp12;
  1197. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  1198. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  1199. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  1200. z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1));
  1201. tmp12 = ((z1 - tmp13) << CONST_BITS) - z3;
  1202. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  1203. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  1204. /* Final output stage */
  1205. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1206. CONST_BITS+PASS1_BITS+3)
  1207. & RANGE_MASK];
  1208. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1209. CONST_BITS+PASS1_BITS+3)
  1210. & RANGE_MASK];
  1211. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1212. CONST_BITS+PASS1_BITS+3)
  1213. & RANGE_MASK];
  1214. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1215. CONST_BITS+PASS1_BITS+3)
  1216. & RANGE_MASK];
  1217. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1218. CONST_BITS+PASS1_BITS+3)
  1219. & RANGE_MASK];
  1220. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1221. CONST_BITS+PASS1_BITS+3)
  1222. & RANGE_MASK];
  1223. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1224. CONST_BITS+PASS1_BITS+3)
  1225. & RANGE_MASK];
  1226. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1227. CONST_BITS+PASS1_BITS+3)
  1228. & RANGE_MASK];
  1229. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1230. CONST_BITS+PASS1_BITS+3)
  1231. & RANGE_MASK];
  1232. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1233. CONST_BITS+PASS1_BITS+3)
  1234. & RANGE_MASK];
  1235. wsptr += 8; /* advance pointer to next row */
  1236. }
  1237. }
  1238. /*
  1239. * Perform dequantization and inverse DCT on one block of coefficients,
  1240. * producing an 11x11 output block.
  1241. *
  1242. * Optimized algorithm with 24 multiplications in the 1-D kernel.
  1243. * cK represents sqrt(2) * cos(K*pi/22).
  1244. */
  1245. GLOBAL(void)
  1246. jpeg_idct_11x11 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1247. JCOEFPTR coef_block,
  1248. JSAMPARRAY output_buf, JDIMENSION output_col)
  1249. {
  1250. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  1251. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  1252. INT32 z1, z2, z3, z4;
  1253. JCOEFPTR inptr;
  1254. ISLOW_MULT_TYPE * quantptr;
  1255. int * wsptr;
  1256. JSAMPROW outptr;
  1257. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1258. int ctr;
  1259. int workspace[8*11]; /* buffers data between passes */
  1260. SHIFT_TEMPS
  1261. /* Pass 1: process columns from input, store into work array. */
  1262. inptr = coef_block;
  1263. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1264. wsptr = workspace;
  1265. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1266. /* Even part */
  1267. tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1268. if (ctr == 0)
  1269. CLAMP_DC(tmp10);
  1270. tmp10 <<= CONST_BITS;
  1271. /* Add fudge factor here for final descale. */
  1272. tmp10 += ONE << (CONST_BITS-PASS1_BITS-1);
  1273. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1274. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1275. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1276. tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */
  1277. tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */
  1278. z4 = z1 + z3;
  1279. tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */
  1280. z4 -= z2;
  1281. tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */
  1282. tmp21 = tmp20 + tmp23 + tmp25 -
  1283. MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */
  1284. tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */
  1285. tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */
  1286. tmp24 += tmp25;
  1287. tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */
  1288. tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */
  1289. MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */
  1290. tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */
  1291. /* Odd part */
  1292. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1293. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1294. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1295. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1296. tmp11 = z1 + z2;
  1297. tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */
  1298. tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */
  1299. tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */
  1300. tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */
  1301. tmp10 = tmp11 + tmp12 + tmp13 -
  1302. MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */
  1303. z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */
  1304. tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */
  1305. tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */
  1306. z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */
  1307. tmp11 += z1;
  1308. tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */
  1309. tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */
  1310. MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */
  1311. MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */
  1312. /* Final output stage */
  1313. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1314. wsptr[8*10] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1315. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1316. wsptr[8*9] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1317. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1318. wsptr[8*8] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1319. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1320. wsptr[8*7] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1321. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1322. wsptr[8*6] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1323. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25, CONST_BITS-PASS1_BITS);
  1324. }
  1325. /* Pass 2: process 11 rows from work array, store into output array. */
  1326. wsptr = workspace;
  1327. for (ctr = 0; ctr < 11; ctr++) {
  1328. outptr = output_buf[ctr] + output_col;
  1329. /* Even part */
  1330. /* Add range center and fudge factor for final descale and range-limit. */
  1331. tmp10 = (INT32) wsptr[0] +
  1332. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1333. (ONE << (PASS1_BITS+2)));
  1334. tmp10 <<= CONST_BITS;
  1335. z1 = (INT32) wsptr[2];
  1336. z2 = (INT32) wsptr[4];
  1337. z3 = (INT32) wsptr[6];
  1338. tmp20 = MULTIPLY(z2 - z3, FIX(2.546640132)); /* c2+c4 */
  1339. tmp23 = MULTIPLY(z2 - z1, FIX(0.430815045)); /* c2-c6 */
  1340. z4 = z1 + z3;
  1341. tmp24 = MULTIPLY(z4, - FIX(1.155664402)); /* -(c2-c10) */
  1342. z4 -= z2;
  1343. tmp25 = tmp10 + MULTIPLY(z4, FIX(1.356927976)); /* c2 */
  1344. tmp21 = tmp20 + tmp23 + tmp25 -
  1345. MULTIPLY(z2, FIX(1.821790775)); /* c2+c4+c10-c6 */
  1346. tmp20 += tmp25 + MULTIPLY(z3, FIX(2.115825087)); /* c4+c6 */
  1347. tmp23 += tmp25 - MULTIPLY(z1, FIX(1.513598477)); /* c6+c8 */
  1348. tmp24 += tmp25;
  1349. tmp22 = tmp24 - MULTIPLY(z3, FIX(0.788749120)); /* c8+c10 */
  1350. tmp24 += MULTIPLY(z2, FIX(1.944413522)) - /* c2+c8 */
  1351. MULTIPLY(z1, FIX(1.390975730)); /* c4+c10 */
  1352. tmp25 = tmp10 - MULTIPLY(z4, FIX(1.414213562)); /* c0 */
  1353. /* Odd part */
  1354. z1 = (INT32) wsptr[1];
  1355. z2 = (INT32) wsptr[3];
  1356. z3 = (INT32) wsptr[5];
  1357. z4 = (INT32) wsptr[7];
  1358. tmp11 = z1 + z2;
  1359. tmp14 = MULTIPLY(tmp11 + z3 + z4, FIX(0.398430003)); /* c9 */
  1360. tmp11 = MULTIPLY(tmp11, FIX(0.887983902)); /* c3-c9 */
  1361. tmp12 = MULTIPLY(z1 + z3, FIX(0.670361295)); /* c5-c9 */
  1362. tmp13 = tmp14 + MULTIPLY(z1 + z4, FIX(0.366151574)); /* c7-c9 */
  1363. tmp10 = tmp11 + tmp12 + tmp13 -
  1364. MULTIPLY(z1, FIX(0.923107866)); /* c7+c5+c3-c1-2*c9 */
  1365. z1 = tmp14 - MULTIPLY(z2 + z3, FIX(1.163011579)); /* c7+c9 */
  1366. tmp11 += z1 + MULTIPLY(z2, FIX(2.073276588)); /* c1+c7+3*c9-c3 */
  1367. tmp12 += z1 - MULTIPLY(z3, FIX(1.192193623)); /* c3+c5-c7-c9 */
  1368. z1 = MULTIPLY(z2 + z4, - FIX(1.798248910)); /* -(c1+c9) */
  1369. tmp11 += z1;
  1370. tmp13 += z1 + MULTIPLY(z4, FIX(2.102458632)); /* c1+c5+c9-c7 */
  1371. tmp14 += MULTIPLY(z2, - FIX(1.467221301)) + /* -(c5+c9) */
  1372. MULTIPLY(z3, FIX(1.001388905)) - /* c1-c9 */
  1373. MULTIPLY(z4, FIX(1.684843907)); /* c3+c9 */
  1374. /* Final output stage */
  1375. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1376. CONST_BITS+PASS1_BITS+3)
  1377. & RANGE_MASK];
  1378. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1379. CONST_BITS+PASS1_BITS+3)
  1380. & RANGE_MASK];
  1381. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1382. CONST_BITS+PASS1_BITS+3)
  1383. & RANGE_MASK];
  1384. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1385. CONST_BITS+PASS1_BITS+3)
  1386. & RANGE_MASK];
  1387. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1388. CONST_BITS+PASS1_BITS+3)
  1389. & RANGE_MASK];
  1390. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1391. CONST_BITS+PASS1_BITS+3)
  1392. & RANGE_MASK];
  1393. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1394. CONST_BITS+PASS1_BITS+3)
  1395. & RANGE_MASK];
  1396. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1397. CONST_BITS+PASS1_BITS+3)
  1398. & RANGE_MASK];
  1399. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1400. CONST_BITS+PASS1_BITS+3)
  1401. & RANGE_MASK];
  1402. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1403. CONST_BITS+PASS1_BITS+3)
  1404. & RANGE_MASK];
  1405. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25,
  1406. CONST_BITS+PASS1_BITS+3)
  1407. & RANGE_MASK];
  1408. wsptr += 8; /* advance pointer to next row */
  1409. }
  1410. }
  1411. /*
  1412. * Perform dequantization and inverse DCT on one block of coefficients,
  1413. * producing a 12x12 output block.
  1414. *
  1415. * Optimized algorithm with 15 multiplications in the 1-D kernel.
  1416. * cK represents sqrt(2) * cos(K*pi/24).
  1417. */
  1418. GLOBAL(void)
  1419. jpeg_idct_12x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1420. JCOEFPTR coef_block,
  1421. JSAMPARRAY output_buf, JDIMENSION output_col)
  1422. {
  1423. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  1424. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  1425. INT32 z1, z2, z3, z4;
  1426. JCOEFPTR inptr;
  1427. ISLOW_MULT_TYPE * quantptr;
  1428. int * wsptr;
  1429. JSAMPROW outptr;
  1430. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1431. int ctr;
  1432. int workspace[8*12]; /* buffers data between passes */
  1433. SHIFT_TEMPS
  1434. /* Pass 1: process columns from input, store into work array. */
  1435. inptr = coef_block;
  1436. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1437. wsptr = workspace;
  1438. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1439. /* Even part */
  1440. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1441. if (ctr == 0)
  1442. CLAMP_DC(z3);
  1443. z3 <<= CONST_BITS;
  1444. /* Add fudge factor here for final descale. */
  1445. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  1446. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1447. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  1448. tmp10 = z3 + z4;
  1449. tmp11 = z3 - z4;
  1450. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1451. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  1452. z1 <<= CONST_BITS;
  1453. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1454. z2 <<= CONST_BITS;
  1455. tmp12 = z1 - z2;
  1456. tmp21 = z3 + tmp12;
  1457. tmp24 = z3 - tmp12;
  1458. tmp12 = z4 + z2;
  1459. tmp20 = tmp10 + tmp12;
  1460. tmp25 = tmp10 - tmp12;
  1461. tmp12 = z4 - z1 - z2;
  1462. tmp22 = tmp11 + tmp12;
  1463. tmp23 = tmp11 - tmp12;
  1464. /* Odd part */
  1465. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1466. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1467. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1468. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1469. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  1470. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  1471. tmp10 = z1 + z3;
  1472. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  1473. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  1474. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  1475. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  1476. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  1477. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  1478. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  1479. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  1480. z1 -= z4;
  1481. z2 -= z3;
  1482. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  1483. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  1484. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  1485. /* Final output stage */
  1486. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1487. wsptr[8*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1488. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1489. wsptr[8*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1490. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1491. wsptr[8*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1492. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1493. wsptr[8*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1494. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1495. wsptr[8*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1496. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  1497. wsptr[8*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  1498. }
  1499. /* Pass 2: process 12 rows from work array, store into output array. */
  1500. wsptr = workspace;
  1501. for (ctr = 0; ctr < 12; ctr++) {
  1502. outptr = output_buf[ctr] + output_col;
  1503. /* Even part */
  1504. /* Add range center and fudge factor for final descale and range-limit. */
  1505. z3 = (INT32) wsptr[0] +
  1506. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1507. (ONE << (PASS1_BITS+2)));
  1508. z3 <<= CONST_BITS;
  1509. z4 = (INT32) wsptr[4];
  1510. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  1511. tmp10 = z3 + z4;
  1512. tmp11 = z3 - z4;
  1513. z1 = (INT32) wsptr[2];
  1514. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  1515. z1 <<= CONST_BITS;
  1516. z2 = (INT32) wsptr[6];
  1517. z2 <<= CONST_BITS;
  1518. tmp12 = z1 - z2;
  1519. tmp21 = z3 + tmp12;
  1520. tmp24 = z3 - tmp12;
  1521. tmp12 = z4 + z2;
  1522. tmp20 = tmp10 + tmp12;
  1523. tmp25 = tmp10 - tmp12;
  1524. tmp12 = z4 - z1 - z2;
  1525. tmp22 = tmp11 + tmp12;
  1526. tmp23 = tmp11 - tmp12;
  1527. /* Odd part */
  1528. z1 = (INT32) wsptr[1];
  1529. z2 = (INT32) wsptr[3];
  1530. z3 = (INT32) wsptr[5];
  1531. z4 = (INT32) wsptr[7];
  1532. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  1533. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  1534. tmp10 = z1 + z3;
  1535. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  1536. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  1537. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  1538. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  1539. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  1540. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  1541. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  1542. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  1543. z1 -= z4;
  1544. z2 -= z3;
  1545. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  1546. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  1547. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  1548. /* Final output stage */
  1549. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1550. CONST_BITS+PASS1_BITS+3)
  1551. & RANGE_MASK];
  1552. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1553. CONST_BITS+PASS1_BITS+3)
  1554. & RANGE_MASK];
  1555. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1556. CONST_BITS+PASS1_BITS+3)
  1557. & RANGE_MASK];
  1558. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1559. CONST_BITS+PASS1_BITS+3)
  1560. & RANGE_MASK];
  1561. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1562. CONST_BITS+PASS1_BITS+3)
  1563. & RANGE_MASK];
  1564. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1565. CONST_BITS+PASS1_BITS+3)
  1566. & RANGE_MASK];
  1567. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1568. CONST_BITS+PASS1_BITS+3)
  1569. & RANGE_MASK];
  1570. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1571. CONST_BITS+PASS1_BITS+3)
  1572. & RANGE_MASK];
  1573. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1574. CONST_BITS+PASS1_BITS+3)
  1575. & RANGE_MASK];
  1576. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1577. CONST_BITS+PASS1_BITS+3)
  1578. & RANGE_MASK];
  1579. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  1580. CONST_BITS+PASS1_BITS+3)
  1581. & RANGE_MASK];
  1582. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  1583. CONST_BITS+PASS1_BITS+3)
  1584. & RANGE_MASK];
  1585. wsptr += 8; /* advance pointer to next row */
  1586. }
  1587. }
  1588. /*
  1589. * Perform dequantization and inverse DCT on one block of coefficients,
  1590. * producing a 13x13 output block.
  1591. *
  1592. * Optimized algorithm with 29 multiplications in the 1-D kernel.
  1593. * cK represents sqrt(2) * cos(K*pi/26).
  1594. */
  1595. GLOBAL(void)
  1596. jpeg_idct_13x13 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1597. JCOEFPTR coef_block,
  1598. JSAMPARRAY output_buf, JDIMENSION output_col)
  1599. {
  1600. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  1601. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  1602. INT32 z1, z2, z3, z4;
  1603. JCOEFPTR inptr;
  1604. ISLOW_MULT_TYPE * quantptr;
  1605. int * wsptr;
  1606. JSAMPROW outptr;
  1607. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1608. int ctr;
  1609. int workspace[8*13]; /* buffers data between passes */
  1610. SHIFT_TEMPS
  1611. /* Pass 1: process columns from input, store into work array. */
  1612. inptr = coef_block;
  1613. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1614. wsptr = workspace;
  1615. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1616. /* Even part */
  1617. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1618. if (ctr == 0)
  1619. CLAMP_DC(z1);
  1620. z1 <<= CONST_BITS;
  1621. /* Add fudge factor here for final descale. */
  1622. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  1623. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1624. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1625. z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1626. tmp10 = z3 + z4;
  1627. tmp11 = z3 - z4;
  1628. tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */
  1629. tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */
  1630. tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */
  1631. tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */
  1632. tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */
  1633. tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */
  1634. tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */
  1635. tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */
  1636. tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */
  1637. tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */
  1638. tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */
  1639. tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */
  1640. tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */
  1641. /* Odd part */
  1642. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1643. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1644. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1645. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1646. tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */
  1647. tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */
  1648. tmp15 = z1 + z4;
  1649. tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */
  1650. tmp10 = tmp11 + tmp12 + tmp13 -
  1651. MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */
  1652. tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */
  1653. tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */
  1654. tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */
  1655. tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */
  1656. tmp11 += tmp14;
  1657. tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */
  1658. tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */
  1659. tmp12 += tmp14;
  1660. tmp13 += tmp14;
  1661. tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */
  1662. tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */
  1663. MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */
  1664. z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */
  1665. tmp14 += z1;
  1666. tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */
  1667. MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */
  1668. /* Final output stage */
  1669. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1670. wsptr[8*12] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1671. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1672. wsptr[8*11] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1673. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1674. wsptr[8*10] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1675. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  1676. wsptr[8*9] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  1677. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1678. wsptr[8*8] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1679. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  1680. wsptr[8*7] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  1681. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26, CONST_BITS-PASS1_BITS);
  1682. }
  1683. /* Pass 2: process 13 rows from work array, store into output array. */
  1684. wsptr = workspace;
  1685. for (ctr = 0; ctr < 13; ctr++) {
  1686. outptr = output_buf[ctr] + output_col;
  1687. /* Even part */
  1688. /* Add range center and fudge factor for final descale and range-limit. */
  1689. z1 = (INT32) wsptr[0] +
  1690. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1691. (ONE << (PASS1_BITS+2)));
  1692. z1 <<= CONST_BITS;
  1693. z2 = (INT32) wsptr[2];
  1694. z3 = (INT32) wsptr[4];
  1695. z4 = (INT32) wsptr[6];
  1696. tmp10 = z3 + z4;
  1697. tmp11 = z3 - z4;
  1698. tmp12 = MULTIPLY(tmp10, FIX(1.155388986)); /* (c4+c6)/2 */
  1699. tmp13 = MULTIPLY(tmp11, FIX(0.096834934)) + z1; /* (c4-c6)/2 */
  1700. tmp20 = MULTIPLY(z2, FIX(1.373119086)) + tmp12 + tmp13; /* c2 */
  1701. tmp22 = MULTIPLY(z2, FIX(0.501487041)) - tmp12 + tmp13; /* c10 */
  1702. tmp12 = MULTIPLY(tmp10, FIX(0.316450131)); /* (c8-c12)/2 */
  1703. tmp13 = MULTIPLY(tmp11, FIX(0.486914739)) + z1; /* (c8+c12)/2 */
  1704. tmp21 = MULTIPLY(z2, FIX(1.058554052)) - tmp12 + tmp13; /* c6 */
  1705. tmp25 = MULTIPLY(z2, - FIX(1.252223920)) + tmp12 + tmp13; /* c4 */
  1706. tmp12 = MULTIPLY(tmp10, FIX(0.435816023)); /* (c2-c10)/2 */
  1707. tmp13 = MULTIPLY(tmp11, FIX(0.937303064)) - z1; /* (c2+c10)/2 */
  1708. tmp23 = MULTIPLY(z2, - FIX(0.170464608)) - tmp12 - tmp13; /* c12 */
  1709. tmp24 = MULTIPLY(z2, - FIX(0.803364869)) + tmp12 - tmp13; /* c8 */
  1710. tmp26 = MULTIPLY(tmp11 - z2, FIX(1.414213562)) + z1; /* c0 */
  1711. /* Odd part */
  1712. z1 = (INT32) wsptr[1];
  1713. z2 = (INT32) wsptr[3];
  1714. z3 = (INT32) wsptr[5];
  1715. z4 = (INT32) wsptr[7];
  1716. tmp11 = MULTIPLY(z1 + z2, FIX(1.322312651)); /* c3 */
  1717. tmp12 = MULTIPLY(z1 + z3, FIX(1.163874945)); /* c5 */
  1718. tmp15 = z1 + z4;
  1719. tmp13 = MULTIPLY(tmp15, FIX(0.937797057)); /* c7 */
  1720. tmp10 = tmp11 + tmp12 + tmp13 -
  1721. MULTIPLY(z1, FIX(2.020082300)); /* c7+c5+c3-c1 */
  1722. tmp14 = MULTIPLY(z2 + z3, - FIX(0.338443458)); /* -c11 */
  1723. tmp11 += tmp14 + MULTIPLY(z2, FIX(0.837223564)); /* c5+c9+c11-c3 */
  1724. tmp12 += tmp14 - MULTIPLY(z3, FIX(1.572116027)); /* c1+c5-c9-c11 */
  1725. tmp14 = MULTIPLY(z2 + z4, - FIX(1.163874945)); /* -c5 */
  1726. tmp11 += tmp14;
  1727. tmp13 += tmp14 + MULTIPLY(z4, FIX(2.205608352)); /* c3+c5+c9-c7 */
  1728. tmp14 = MULTIPLY(z3 + z4, - FIX(0.657217813)); /* -c9 */
  1729. tmp12 += tmp14;
  1730. tmp13 += tmp14;
  1731. tmp15 = MULTIPLY(tmp15, FIX(0.338443458)); /* c11 */
  1732. tmp14 = tmp15 + MULTIPLY(z1, FIX(0.318774355)) - /* c9-c11 */
  1733. MULTIPLY(z2, FIX(0.466105296)); /* c1-c7 */
  1734. z1 = MULTIPLY(z3 - z2, FIX(0.937797057)); /* c7 */
  1735. tmp14 += z1;
  1736. tmp15 += z1 + MULTIPLY(z3, FIX(0.384515595)) - /* c3-c7 */
  1737. MULTIPLY(z4, FIX(1.742345811)); /* c1+c11 */
  1738. /* Final output stage */
  1739. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1740. CONST_BITS+PASS1_BITS+3)
  1741. & RANGE_MASK];
  1742. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1743. CONST_BITS+PASS1_BITS+3)
  1744. & RANGE_MASK];
  1745. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1746. CONST_BITS+PASS1_BITS+3)
  1747. & RANGE_MASK];
  1748. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1749. CONST_BITS+PASS1_BITS+3)
  1750. & RANGE_MASK];
  1751. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1752. CONST_BITS+PASS1_BITS+3)
  1753. & RANGE_MASK];
  1754. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1755. CONST_BITS+PASS1_BITS+3)
  1756. & RANGE_MASK];
  1757. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1758. CONST_BITS+PASS1_BITS+3)
  1759. & RANGE_MASK];
  1760. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1761. CONST_BITS+PASS1_BITS+3)
  1762. & RANGE_MASK];
  1763. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1764. CONST_BITS+PASS1_BITS+3)
  1765. & RANGE_MASK];
  1766. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1767. CONST_BITS+PASS1_BITS+3)
  1768. & RANGE_MASK];
  1769. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  1770. CONST_BITS+PASS1_BITS+3)
  1771. & RANGE_MASK];
  1772. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  1773. CONST_BITS+PASS1_BITS+3)
  1774. & RANGE_MASK];
  1775. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26,
  1776. CONST_BITS+PASS1_BITS+3)
  1777. & RANGE_MASK];
  1778. wsptr += 8; /* advance pointer to next row */
  1779. }
  1780. }
  1781. /*
  1782. * Perform dequantization and inverse DCT on one block of coefficients,
  1783. * producing a 14x14 output block.
  1784. *
  1785. * Optimized algorithm with 20 multiplications in the 1-D kernel.
  1786. * cK represents sqrt(2) * cos(K*pi/28).
  1787. */
  1788. GLOBAL(void)
  1789. jpeg_idct_14x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1790. JCOEFPTR coef_block,
  1791. JSAMPARRAY output_buf, JDIMENSION output_col)
  1792. {
  1793. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  1794. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  1795. INT32 z1, z2, z3, z4;
  1796. JCOEFPTR inptr;
  1797. ISLOW_MULT_TYPE * quantptr;
  1798. int * wsptr;
  1799. JSAMPROW outptr;
  1800. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1801. int ctr;
  1802. int workspace[8*14]; /* buffers data between passes */
  1803. SHIFT_TEMPS
  1804. /* Pass 1: process columns from input, store into work array. */
  1805. inptr = coef_block;
  1806. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  1807. wsptr = workspace;
  1808. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  1809. /* Even part */
  1810. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  1811. if (ctr == 0)
  1812. CLAMP_DC(z1);
  1813. z1 <<= CONST_BITS;
  1814. /* Add fudge factor here for final descale. */
  1815. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  1816. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  1817. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  1818. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  1819. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  1820. tmp10 = z1 + z2;
  1821. tmp11 = z1 + z3;
  1822. tmp12 = z1 - z4;
  1823. tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */
  1824. CONST_BITS-PASS1_BITS);
  1825. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  1826. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  1827. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  1828. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  1829. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  1830. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  1831. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  1832. tmp20 = tmp10 + tmp13;
  1833. tmp26 = tmp10 - tmp13;
  1834. tmp21 = tmp11 + tmp14;
  1835. tmp25 = tmp11 - tmp14;
  1836. tmp22 = tmp12 + tmp15;
  1837. tmp24 = tmp12 - tmp15;
  1838. /* Odd part */
  1839. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  1840. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  1841. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  1842. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  1843. tmp13 = z4 << CONST_BITS;
  1844. tmp14 = z1 + z3;
  1845. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  1846. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  1847. tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  1848. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  1849. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  1850. z1 -= z2;
  1851. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */
  1852. tmp16 += tmp15;
  1853. z1 += z4;
  1854. z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */
  1855. tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  1856. tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  1857. z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  1858. tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  1859. tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  1860. tmp13 = (z1 - z3) << PASS1_BITS;
  1861. /* Final output stage */
  1862. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  1863. wsptr[8*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  1864. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  1865. wsptr[8*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  1866. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  1867. wsptr[8*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  1868. wsptr[8*3] = (int) (tmp23 + tmp13);
  1869. wsptr[8*10] = (int) (tmp23 - tmp13);
  1870. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  1871. wsptr[8*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  1872. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  1873. wsptr[8*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  1874. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);
  1875. wsptr[8*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);
  1876. }
  1877. /* Pass 2: process 14 rows from work array, store into output array. */
  1878. wsptr = workspace;
  1879. for (ctr = 0; ctr < 14; ctr++) {
  1880. outptr = output_buf[ctr] + output_col;
  1881. /* Even part */
  1882. /* Add range center and fudge factor for final descale and range-limit. */
  1883. z1 = (INT32) wsptr[0] +
  1884. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  1885. (ONE << (PASS1_BITS+2)));
  1886. z1 <<= CONST_BITS;
  1887. z4 = (INT32) wsptr[4];
  1888. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  1889. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  1890. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  1891. tmp10 = z1 + z2;
  1892. tmp11 = z1 + z3;
  1893. tmp12 = z1 - z4;
  1894. tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */
  1895. z1 = (INT32) wsptr[2];
  1896. z2 = (INT32) wsptr[6];
  1897. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  1898. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  1899. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  1900. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  1901. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  1902. tmp20 = tmp10 + tmp13;
  1903. tmp26 = tmp10 - tmp13;
  1904. tmp21 = tmp11 + tmp14;
  1905. tmp25 = tmp11 - tmp14;
  1906. tmp22 = tmp12 + tmp15;
  1907. tmp24 = tmp12 - tmp15;
  1908. /* Odd part */
  1909. z1 = (INT32) wsptr[1];
  1910. z2 = (INT32) wsptr[3];
  1911. z3 = (INT32) wsptr[5];
  1912. z4 = (INT32) wsptr[7];
  1913. z4 <<= CONST_BITS;
  1914. tmp14 = z1 + z3;
  1915. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  1916. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  1917. tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  1918. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  1919. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  1920. z1 -= z2;
  1921. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */
  1922. tmp16 += tmp15;
  1923. tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */
  1924. tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  1925. tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  1926. tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  1927. tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  1928. tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  1929. tmp13 = ((z1 - z3) << CONST_BITS) + z4;
  1930. /* Final output stage */
  1931. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  1932. CONST_BITS+PASS1_BITS+3)
  1933. & RANGE_MASK];
  1934. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  1935. CONST_BITS+PASS1_BITS+3)
  1936. & RANGE_MASK];
  1937. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  1938. CONST_BITS+PASS1_BITS+3)
  1939. & RANGE_MASK];
  1940. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  1941. CONST_BITS+PASS1_BITS+3)
  1942. & RANGE_MASK];
  1943. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  1944. CONST_BITS+PASS1_BITS+3)
  1945. & RANGE_MASK];
  1946. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  1947. CONST_BITS+PASS1_BITS+3)
  1948. & RANGE_MASK];
  1949. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  1950. CONST_BITS+PASS1_BITS+3)
  1951. & RANGE_MASK];
  1952. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  1953. CONST_BITS+PASS1_BITS+3)
  1954. & RANGE_MASK];
  1955. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  1956. CONST_BITS+PASS1_BITS+3)
  1957. & RANGE_MASK];
  1958. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  1959. CONST_BITS+PASS1_BITS+3)
  1960. & RANGE_MASK];
  1961. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  1962. CONST_BITS+PASS1_BITS+3)
  1963. & RANGE_MASK];
  1964. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  1965. CONST_BITS+PASS1_BITS+3)
  1966. & RANGE_MASK];
  1967. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,
  1968. CONST_BITS+PASS1_BITS+3)
  1969. & RANGE_MASK];
  1970. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,
  1971. CONST_BITS+PASS1_BITS+3)
  1972. & RANGE_MASK];
  1973. wsptr += 8; /* advance pointer to next row */
  1974. }
  1975. }
  1976. /*
  1977. * Perform dequantization and inverse DCT on one block of coefficients,
  1978. * producing a 15x15 output block.
  1979. *
  1980. * Optimized algorithm with 22 multiplications in the 1-D kernel.
  1981. * cK represents sqrt(2) * cos(K*pi/30).
  1982. */
  1983. GLOBAL(void)
  1984. jpeg_idct_15x15 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  1985. JCOEFPTR coef_block,
  1986. JSAMPARRAY output_buf, JDIMENSION output_col)
  1987. {
  1988. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  1989. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  1990. INT32 z1, z2, z3, z4;
  1991. JCOEFPTR inptr;
  1992. ISLOW_MULT_TYPE * quantptr;
  1993. int * wsptr;
  1994. JSAMPROW outptr;
  1995. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  1996. int ctr;
  1997. int workspace[8*15]; /* buffers data between passes */
  1998. SHIFT_TEMPS
  1999. /* Pass 1: process columns from input, store into work array. */
  2000. inptr = coef_block;
  2001. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2002. wsptr = workspace;
  2003. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2004. /* Even part */
  2005. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2006. if (ctr == 0)
  2007. CLAMP_DC(z1);
  2008. z1 <<= CONST_BITS;
  2009. /* Add fudge factor here for final descale. */
  2010. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  2011. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2012. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2013. z4 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2014. tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */
  2015. tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */
  2016. tmp12 = z1 - tmp10;
  2017. tmp13 = z1 + tmp11;
  2018. z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */
  2019. z4 = z2 - z3;
  2020. z3 += z2;
  2021. tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */
  2022. tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */
  2023. z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */
  2024. tmp20 = tmp13 + tmp10 + tmp11;
  2025. tmp23 = tmp12 - tmp10 + tmp11 + z2;
  2026. tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */
  2027. tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */
  2028. tmp25 = tmp13 - tmp10 - tmp11;
  2029. tmp26 = tmp12 + tmp10 - tmp11 - z2;
  2030. tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */
  2031. tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */
  2032. tmp21 = tmp12 + tmp10 + tmp11;
  2033. tmp24 = tmp13 - tmp10 + tmp11;
  2034. tmp11 += tmp11;
  2035. tmp22 = z1 + tmp11; /* c10 = c6-c12 */
  2036. tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */
  2037. /* Odd part */
  2038. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2039. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2040. z4 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2041. z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */
  2042. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  2043. tmp13 = z2 - z4;
  2044. tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */
  2045. tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */
  2046. tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */
  2047. tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */
  2048. tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */
  2049. z2 = z1 - z4;
  2050. tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */
  2051. tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */
  2052. tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */
  2053. tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */
  2054. z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */
  2055. tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */
  2056. tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */
  2057. /* Final output stage */
  2058. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  2059. wsptr[8*14] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  2060. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  2061. wsptr[8*13] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  2062. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  2063. wsptr[8*12] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  2064. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  2065. wsptr[8*11] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  2066. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  2067. wsptr[8*10] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  2068. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  2069. wsptr[8*9] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  2070. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);
  2071. wsptr[8*8] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);
  2072. wsptr[8*7] = (int) RIGHT_SHIFT(tmp27, CONST_BITS-PASS1_BITS);
  2073. }
  2074. /* Pass 2: process 15 rows from work array, store into output array. */
  2075. wsptr = workspace;
  2076. for (ctr = 0; ctr < 15; ctr++) {
  2077. outptr = output_buf[ctr] + output_col;
  2078. /* Even part */
  2079. /* Add range center and fudge factor for final descale and range-limit. */
  2080. z1 = (INT32) wsptr[0] +
  2081. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2082. (ONE << (PASS1_BITS+2)));
  2083. z1 <<= CONST_BITS;
  2084. z2 = (INT32) wsptr[2];
  2085. z3 = (INT32) wsptr[4];
  2086. z4 = (INT32) wsptr[6];
  2087. tmp10 = MULTIPLY(z4, FIX(0.437016024)); /* c12 */
  2088. tmp11 = MULTIPLY(z4, FIX(1.144122806)); /* c6 */
  2089. tmp12 = z1 - tmp10;
  2090. tmp13 = z1 + tmp11;
  2091. z1 -= (tmp11 - tmp10) << 1; /* c0 = (c6-c12)*2 */
  2092. z4 = z2 - z3;
  2093. z3 += z2;
  2094. tmp10 = MULTIPLY(z3, FIX(1.337628990)); /* (c2+c4)/2 */
  2095. tmp11 = MULTIPLY(z4, FIX(0.045680613)); /* (c2-c4)/2 */
  2096. z2 = MULTIPLY(z2, FIX(1.439773946)); /* c4+c14 */
  2097. tmp20 = tmp13 + tmp10 + tmp11;
  2098. tmp23 = tmp12 - tmp10 + tmp11 + z2;
  2099. tmp10 = MULTIPLY(z3, FIX(0.547059574)); /* (c8+c14)/2 */
  2100. tmp11 = MULTIPLY(z4, FIX(0.399234004)); /* (c8-c14)/2 */
  2101. tmp25 = tmp13 - tmp10 - tmp11;
  2102. tmp26 = tmp12 + tmp10 - tmp11 - z2;
  2103. tmp10 = MULTIPLY(z3, FIX(0.790569415)); /* (c6+c12)/2 */
  2104. tmp11 = MULTIPLY(z4, FIX(0.353553391)); /* (c6-c12)/2 */
  2105. tmp21 = tmp12 + tmp10 + tmp11;
  2106. tmp24 = tmp13 - tmp10 + tmp11;
  2107. tmp11 += tmp11;
  2108. tmp22 = z1 + tmp11; /* c10 = c6-c12 */
  2109. tmp27 = z1 - tmp11 - tmp11; /* c0 = (c6-c12)*2 */
  2110. /* Odd part */
  2111. z1 = (INT32) wsptr[1];
  2112. z2 = (INT32) wsptr[3];
  2113. z4 = (INT32) wsptr[5];
  2114. z3 = MULTIPLY(z4, FIX(1.224744871)); /* c5 */
  2115. z4 = (INT32) wsptr[7];
  2116. tmp13 = z2 - z4;
  2117. tmp15 = MULTIPLY(z1 + tmp13, FIX(0.831253876)); /* c9 */
  2118. tmp11 = tmp15 + MULTIPLY(z1, FIX(0.513743148)); /* c3-c9 */
  2119. tmp14 = tmp15 - MULTIPLY(tmp13, FIX(2.176250899)); /* c3+c9 */
  2120. tmp13 = MULTIPLY(z2, - FIX(0.831253876)); /* -c9 */
  2121. tmp15 = MULTIPLY(z2, - FIX(1.344997024)); /* -c3 */
  2122. z2 = z1 - z4;
  2123. tmp12 = z3 + MULTIPLY(z2, FIX(1.406466353)); /* c1 */
  2124. tmp10 = tmp12 + MULTIPLY(z4, FIX(2.457431844)) - tmp15; /* c1+c7 */
  2125. tmp16 = tmp12 - MULTIPLY(z1, FIX(1.112434820)) + tmp13; /* c1-c13 */
  2126. tmp12 = MULTIPLY(z2, FIX(1.224744871)) - z3; /* c5 */
  2127. z2 = MULTIPLY(z1 + z4, FIX(0.575212477)); /* c11 */
  2128. tmp13 += z2 + MULTIPLY(z1, FIX(0.475753014)) - z3; /* c7-c11 */
  2129. tmp15 += z2 - MULTIPLY(z4, FIX(0.869244010)) + z3; /* c11+c13 */
  2130. /* Final output stage */
  2131. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  2132. CONST_BITS+PASS1_BITS+3)
  2133. & RANGE_MASK];
  2134. outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  2135. CONST_BITS+PASS1_BITS+3)
  2136. & RANGE_MASK];
  2137. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  2138. CONST_BITS+PASS1_BITS+3)
  2139. & RANGE_MASK];
  2140. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  2141. CONST_BITS+PASS1_BITS+3)
  2142. & RANGE_MASK];
  2143. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  2144. CONST_BITS+PASS1_BITS+3)
  2145. & RANGE_MASK];
  2146. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  2147. CONST_BITS+PASS1_BITS+3)
  2148. & RANGE_MASK];
  2149. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  2150. CONST_BITS+PASS1_BITS+3)
  2151. & RANGE_MASK];
  2152. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  2153. CONST_BITS+PASS1_BITS+3)
  2154. & RANGE_MASK];
  2155. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  2156. CONST_BITS+PASS1_BITS+3)
  2157. & RANGE_MASK];
  2158. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  2159. CONST_BITS+PASS1_BITS+3)
  2160. & RANGE_MASK];
  2161. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  2162. CONST_BITS+PASS1_BITS+3)
  2163. & RANGE_MASK];
  2164. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  2165. CONST_BITS+PASS1_BITS+3)
  2166. & RANGE_MASK];
  2167. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,
  2168. CONST_BITS+PASS1_BITS+3)
  2169. & RANGE_MASK];
  2170. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,
  2171. CONST_BITS+PASS1_BITS+3)
  2172. & RANGE_MASK];
  2173. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27,
  2174. CONST_BITS+PASS1_BITS+3)
  2175. & RANGE_MASK];
  2176. wsptr += 8; /* advance pointer to next row */
  2177. }
  2178. }
  2179. /*
  2180. * Perform dequantization and inverse DCT on one block of coefficients,
  2181. * producing a 16x16 output block.
  2182. *
  2183. * Optimized algorithm with 28 multiplications in the 1-D kernel.
  2184. * cK represents sqrt(2) * cos(K*pi/32).
  2185. */
  2186. GLOBAL(void)
  2187. jpeg_idct_16x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2188. JCOEFPTR coef_block,
  2189. JSAMPARRAY output_buf, JDIMENSION output_col)
  2190. {
  2191. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;
  2192. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  2193. INT32 z1, z2, z3, z4;
  2194. JCOEFPTR inptr;
  2195. ISLOW_MULT_TYPE * quantptr;
  2196. int * wsptr;
  2197. JSAMPROW outptr;
  2198. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2199. int ctr;
  2200. int workspace[8*16]; /* buffers data between passes */
  2201. SHIFT_TEMPS
  2202. /* Pass 1: process columns from input, store into work array. */
  2203. inptr = coef_block;
  2204. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2205. wsptr = workspace;
  2206. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2207. /* Even part */
  2208. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2209. if (ctr == 0)
  2210. CLAMP_DC(tmp0);
  2211. tmp0 <<= CONST_BITS;
  2212. /* Add fudge factor here for final descale. */
  2213. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  2214. z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2215. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  2216. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  2217. tmp10 = tmp0 + tmp1;
  2218. tmp11 = tmp0 - tmp1;
  2219. tmp12 = tmp0 + tmp2;
  2220. tmp13 = tmp0 - tmp2;
  2221. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2222. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2223. z3 = z1 - z2;
  2224. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  2225. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  2226. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  2227. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  2228. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  2229. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  2230. tmp20 = tmp10 + tmp0;
  2231. tmp27 = tmp10 - tmp0;
  2232. tmp21 = tmp12 + tmp1;
  2233. tmp26 = tmp12 - tmp1;
  2234. tmp22 = tmp13 + tmp2;
  2235. tmp25 = tmp13 - tmp2;
  2236. tmp23 = tmp11 + tmp3;
  2237. tmp24 = tmp11 - tmp3;
  2238. /* Odd part */
  2239. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2240. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2241. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2242. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  2243. tmp11 = z1 + z3;
  2244. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  2245. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  2246. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  2247. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  2248. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  2249. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  2250. tmp0 = tmp1 + tmp2 + tmp3 -
  2251. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  2252. tmp13 = tmp10 + tmp11 + tmp12 -
  2253. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  2254. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  2255. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  2256. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  2257. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  2258. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  2259. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  2260. z2 += z4;
  2261. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  2262. tmp1 += z1;
  2263. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  2264. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  2265. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  2266. tmp12 += z2;
  2267. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  2268. tmp2 += z2;
  2269. tmp3 += z2;
  2270. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  2271. tmp10 += z2;
  2272. tmp11 += z2;
  2273. /* Final output stage */
  2274. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS);
  2275. wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS);
  2276. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS);
  2277. wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS);
  2278. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS);
  2279. wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS);
  2280. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS);
  2281. wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS);
  2282. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS);
  2283. wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS);
  2284. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS);
  2285. wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS);
  2286. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS);
  2287. wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS);
  2288. wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
  2289. wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
  2290. }
  2291. /* Pass 2: process 16 rows from work array, store into output array. */
  2292. wsptr = workspace;
  2293. for (ctr = 0; ctr < 16; ctr++) {
  2294. outptr = output_buf[ctr] + output_col;
  2295. /* Even part */
  2296. /* Add range center and fudge factor for final descale and range-limit. */
  2297. tmp0 = (INT32) wsptr[0] +
  2298. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2299. (ONE << (PASS1_BITS+2)));
  2300. tmp0 <<= CONST_BITS;
  2301. z1 = (INT32) wsptr[4];
  2302. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  2303. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  2304. tmp10 = tmp0 + tmp1;
  2305. tmp11 = tmp0 - tmp1;
  2306. tmp12 = tmp0 + tmp2;
  2307. tmp13 = tmp0 - tmp2;
  2308. z1 = (INT32) wsptr[2];
  2309. z2 = (INT32) wsptr[6];
  2310. z3 = z1 - z2;
  2311. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  2312. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  2313. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  2314. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  2315. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  2316. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  2317. tmp20 = tmp10 + tmp0;
  2318. tmp27 = tmp10 - tmp0;
  2319. tmp21 = tmp12 + tmp1;
  2320. tmp26 = tmp12 - tmp1;
  2321. tmp22 = tmp13 + tmp2;
  2322. tmp25 = tmp13 - tmp2;
  2323. tmp23 = tmp11 + tmp3;
  2324. tmp24 = tmp11 - tmp3;
  2325. /* Odd part */
  2326. z1 = (INT32) wsptr[1];
  2327. z2 = (INT32) wsptr[3];
  2328. z3 = (INT32) wsptr[5];
  2329. z4 = (INT32) wsptr[7];
  2330. tmp11 = z1 + z3;
  2331. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  2332. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  2333. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  2334. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  2335. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  2336. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  2337. tmp0 = tmp1 + tmp2 + tmp3 -
  2338. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  2339. tmp13 = tmp10 + tmp11 + tmp12 -
  2340. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  2341. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  2342. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  2343. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  2344. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  2345. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  2346. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  2347. z2 += z4;
  2348. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  2349. tmp1 += z1;
  2350. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  2351. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  2352. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  2353. tmp12 += z2;
  2354. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  2355. tmp2 += z2;
  2356. tmp3 += z2;
  2357. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  2358. tmp10 += z2;
  2359. tmp11 += z2;
  2360. /* Final output stage */
  2361. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0,
  2362. CONST_BITS+PASS1_BITS+3)
  2363. & RANGE_MASK];
  2364. outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0,
  2365. CONST_BITS+PASS1_BITS+3)
  2366. & RANGE_MASK];
  2367. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1,
  2368. CONST_BITS+PASS1_BITS+3)
  2369. & RANGE_MASK];
  2370. outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1,
  2371. CONST_BITS+PASS1_BITS+3)
  2372. & RANGE_MASK];
  2373. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2,
  2374. CONST_BITS+PASS1_BITS+3)
  2375. & RANGE_MASK];
  2376. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2,
  2377. CONST_BITS+PASS1_BITS+3)
  2378. & RANGE_MASK];
  2379. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3,
  2380. CONST_BITS+PASS1_BITS+3)
  2381. & RANGE_MASK];
  2382. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3,
  2383. CONST_BITS+PASS1_BITS+3)
  2384. & RANGE_MASK];
  2385. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10,
  2386. CONST_BITS+PASS1_BITS+3)
  2387. & RANGE_MASK];
  2388. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10,
  2389. CONST_BITS+PASS1_BITS+3)
  2390. & RANGE_MASK];
  2391. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11,
  2392. CONST_BITS+PASS1_BITS+3)
  2393. & RANGE_MASK];
  2394. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11,
  2395. CONST_BITS+PASS1_BITS+3)
  2396. & RANGE_MASK];
  2397. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12,
  2398. CONST_BITS+PASS1_BITS+3)
  2399. & RANGE_MASK];
  2400. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12,
  2401. CONST_BITS+PASS1_BITS+3)
  2402. & RANGE_MASK];
  2403. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13,
  2404. CONST_BITS+PASS1_BITS+3)
  2405. & RANGE_MASK];
  2406. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13,
  2407. CONST_BITS+PASS1_BITS+3)
  2408. & RANGE_MASK];
  2409. wsptr += 8; /* advance pointer to next row */
  2410. }
  2411. }
  2412. /*
  2413. * Perform dequantization and inverse DCT on one block of coefficients,
  2414. * producing a 16x8 output block.
  2415. *
  2416. * 8-point IDCT in pass 1 (columns), 16-point in pass 2 (rows).
  2417. */
  2418. GLOBAL(void)
  2419. jpeg_idct_16x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2420. JCOEFPTR coef_block,
  2421. JSAMPARRAY output_buf, JDIMENSION output_col)
  2422. {
  2423. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;
  2424. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  2425. INT32 z1, z2, z3, z4;
  2426. JCOEFPTR inptr;
  2427. ISLOW_MULT_TYPE * quantptr;
  2428. int * wsptr;
  2429. JSAMPROW outptr;
  2430. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2431. int ctr;
  2432. int workspace[8*8]; /* buffers data between passes */
  2433. SHIFT_TEMPS
  2434. /* Pass 1: process columns from input, store into work array.
  2435. * Note results are scaled up by sqrt(8) compared to a true IDCT;
  2436. * furthermore, we scale the results by 2**PASS1_BITS.
  2437. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  2438. */
  2439. inptr = coef_block;
  2440. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2441. wsptr = workspace;
  2442. for (ctr = DCTSIZE; ctr > 0; ctr--) {
  2443. /* Due to quantization, we will usually find that many of the input
  2444. * coefficients are zero, especially the AC terms. We can exploit this
  2445. * by short-circuiting the IDCT calculation for any column in which all
  2446. * the AC terms are zero. In that case each output is equal to the
  2447. * DC coefficient (with scale factor as needed).
  2448. * With typical images and quantization tables, half or more of the
  2449. * column DCT calculations can be simplified this way.
  2450. */
  2451. if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
  2452. inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
  2453. inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
  2454. inptr[DCTSIZE*7] == 0) {
  2455. /* AC terms all zero */
  2456. int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2457. if (ctr == DCTSIZE)
  2458. CLAMP_DC(dcval);
  2459. dcval <<= PASS1_BITS;
  2460. wsptr[DCTSIZE*0] = dcval;
  2461. wsptr[DCTSIZE*1] = dcval;
  2462. wsptr[DCTSIZE*2] = dcval;
  2463. wsptr[DCTSIZE*3] = dcval;
  2464. wsptr[DCTSIZE*4] = dcval;
  2465. wsptr[DCTSIZE*5] = dcval;
  2466. wsptr[DCTSIZE*6] = dcval;
  2467. wsptr[DCTSIZE*7] = dcval;
  2468. inptr++; /* advance pointers to next column */
  2469. quantptr++;
  2470. wsptr++;
  2471. continue;
  2472. }
  2473. /* Even part: reverse the even part of the forward DCT.
  2474. * The rotator is c(-6).
  2475. */
  2476. z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2477. if (ctr == DCTSIZE)
  2478. CLAMP_DC(z2);
  2479. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2480. z2 <<= CONST_BITS;
  2481. z3 <<= CONST_BITS;
  2482. /* Add fudge factor here for final descale. */
  2483. z2 += ONE << (CONST_BITS-PASS1_BITS-1);
  2484. tmp0 = z2 + z3;
  2485. tmp1 = z2 - z3;
  2486. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2487. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2488. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  2489. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  2490. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  2491. tmp10 = tmp0 + tmp2;
  2492. tmp13 = tmp0 - tmp2;
  2493. tmp11 = tmp1 + tmp3;
  2494. tmp12 = tmp1 - tmp3;
  2495. /* Odd part per figure 8; the matrix is unitary and hence its
  2496. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  2497. */
  2498. tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  2499. tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2500. tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2501. tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2502. z2 = tmp0 + tmp2;
  2503. z3 = tmp1 + tmp3;
  2504. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  2505. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  2506. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  2507. z2 += z1;
  2508. z3 += z1;
  2509. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  2510. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  2511. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  2512. tmp0 += z1 + z2;
  2513. tmp3 += z1 + z3;
  2514. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  2515. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  2516. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  2517. tmp1 += z1 + z3;
  2518. tmp2 += z1 + z2;
  2519. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  2520. wsptr[DCTSIZE*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  2521. wsptr[DCTSIZE*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  2522. wsptr[DCTSIZE*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  2523. wsptr[DCTSIZE*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  2524. wsptr[DCTSIZE*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  2525. wsptr[DCTSIZE*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  2526. wsptr[DCTSIZE*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  2527. wsptr[DCTSIZE*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  2528. inptr++; /* advance pointers to next column */
  2529. quantptr++;
  2530. wsptr++;
  2531. }
  2532. /* Pass 2: process 8 rows from work array, store into output array.
  2533. * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
  2534. */
  2535. wsptr = workspace;
  2536. for (ctr = 0; ctr < 8; ctr++) {
  2537. outptr = output_buf[ctr] + output_col;
  2538. /* Even part */
  2539. /* Add range center and fudge factor for final descale and range-limit. */
  2540. tmp0 = (INT32) wsptr[0] +
  2541. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2542. (ONE << (PASS1_BITS+2)));
  2543. tmp0 <<= CONST_BITS;
  2544. z1 = (INT32) wsptr[4];
  2545. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  2546. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  2547. tmp10 = tmp0 + tmp1;
  2548. tmp11 = tmp0 - tmp1;
  2549. tmp12 = tmp0 + tmp2;
  2550. tmp13 = tmp0 - tmp2;
  2551. z1 = (INT32) wsptr[2];
  2552. z2 = (INT32) wsptr[6];
  2553. z3 = z1 - z2;
  2554. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  2555. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  2556. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  2557. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  2558. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  2559. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  2560. tmp20 = tmp10 + tmp0;
  2561. tmp27 = tmp10 - tmp0;
  2562. tmp21 = tmp12 + tmp1;
  2563. tmp26 = tmp12 - tmp1;
  2564. tmp22 = tmp13 + tmp2;
  2565. tmp25 = tmp13 - tmp2;
  2566. tmp23 = tmp11 + tmp3;
  2567. tmp24 = tmp11 - tmp3;
  2568. /* Odd part */
  2569. z1 = (INT32) wsptr[1];
  2570. z2 = (INT32) wsptr[3];
  2571. z3 = (INT32) wsptr[5];
  2572. z4 = (INT32) wsptr[7];
  2573. tmp11 = z1 + z3;
  2574. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  2575. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  2576. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  2577. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  2578. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  2579. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  2580. tmp0 = tmp1 + tmp2 + tmp3 -
  2581. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  2582. tmp13 = tmp10 + tmp11 + tmp12 -
  2583. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  2584. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  2585. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  2586. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  2587. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  2588. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  2589. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  2590. z2 += z4;
  2591. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  2592. tmp1 += z1;
  2593. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  2594. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  2595. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  2596. tmp12 += z2;
  2597. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  2598. tmp2 += z2;
  2599. tmp3 += z2;
  2600. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  2601. tmp10 += z2;
  2602. tmp11 += z2;
  2603. /* Final output stage */
  2604. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp0,
  2605. CONST_BITS+PASS1_BITS+3)
  2606. & RANGE_MASK];
  2607. outptr[15] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp0,
  2608. CONST_BITS+PASS1_BITS+3)
  2609. & RANGE_MASK];
  2610. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp1,
  2611. CONST_BITS+PASS1_BITS+3)
  2612. & RANGE_MASK];
  2613. outptr[14] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp1,
  2614. CONST_BITS+PASS1_BITS+3)
  2615. & RANGE_MASK];
  2616. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp2,
  2617. CONST_BITS+PASS1_BITS+3)
  2618. & RANGE_MASK];
  2619. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp2,
  2620. CONST_BITS+PASS1_BITS+3)
  2621. & RANGE_MASK];
  2622. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp3,
  2623. CONST_BITS+PASS1_BITS+3)
  2624. & RANGE_MASK];
  2625. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp3,
  2626. CONST_BITS+PASS1_BITS+3)
  2627. & RANGE_MASK];
  2628. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp10,
  2629. CONST_BITS+PASS1_BITS+3)
  2630. & RANGE_MASK];
  2631. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp10,
  2632. CONST_BITS+PASS1_BITS+3)
  2633. & RANGE_MASK];
  2634. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp11,
  2635. CONST_BITS+PASS1_BITS+3)
  2636. & RANGE_MASK];
  2637. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp11,
  2638. CONST_BITS+PASS1_BITS+3)
  2639. & RANGE_MASK];
  2640. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp12,
  2641. CONST_BITS+PASS1_BITS+3)
  2642. & RANGE_MASK];
  2643. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp12,
  2644. CONST_BITS+PASS1_BITS+3)
  2645. & RANGE_MASK];
  2646. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp27 + tmp13,
  2647. CONST_BITS+PASS1_BITS+3)
  2648. & RANGE_MASK];
  2649. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp27 - tmp13,
  2650. CONST_BITS+PASS1_BITS+3)
  2651. & RANGE_MASK];
  2652. wsptr += 8; /* advance pointer to next row */
  2653. }
  2654. }
  2655. /*
  2656. * Perform dequantization and inverse DCT on one block of coefficients,
  2657. * producing a 14x7 output block.
  2658. *
  2659. * 7-point IDCT in pass 1 (columns), 14-point in pass 2 (rows).
  2660. */
  2661. GLOBAL(void)
  2662. jpeg_idct_14x7 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2663. JCOEFPTR coef_block,
  2664. JSAMPARRAY output_buf, JDIMENSION output_col)
  2665. {
  2666. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  2667. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  2668. INT32 z1, z2, z3, z4;
  2669. JCOEFPTR inptr;
  2670. ISLOW_MULT_TYPE * quantptr;
  2671. int * wsptr;
  2672. JSAMPROW outptr;
  2673. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2674. int ctr;
  2675. int workspace[8*7]; /* buffers data between passes */
  2676. SHIFT_TEMPS
  2677. /* Pass 1: process columns from input, store into work array.
  2678. * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
  2679. */
  2680. inptr = coef_block;
  2681. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2682. wsptr = workspace;
  2683. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2684. /* Even part */
  2685. tmp23 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2686. if (ctr == 0)
  2687. CLAMP_DC(tmp23);
  2688. tmp23 <<= CONST_BITS;
  2689. /* Add fudge factor here for final descale. */
  2690. tmp23 += ONE << (CONST_BITS-PASS1_BITS-1);
  2691. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2692. z2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2693. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  2694. tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  2695. tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  2696. tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  2697. tmp10 = z1 + z3;
  2698. z2 -= tmp10;
  2699. tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */
  2700. tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  2701. tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  2702. tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  2703. /* Odd part */
  2704. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2705. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2706. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2707. tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  2708. tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  2709. tmp10 = tmp11 - tmp12;
  2710. tmp11 += tmp12;
  2711. tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  2712. tmp11 += tmp12;
  2713. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  2714. tmp10 += z2;
  2715. tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  2716. /* Final output stage */
  2717. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  2718. wsptr[8*6] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  2719. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  2720. wsptr[8*5] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  2721. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  2722. wsptr[8*4] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  2723. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23, CONST_BITS-PASS1_BITS);
  2724. }
  2725. /* Pass 2: process 7 rows from work array, store into output array.
  2726. * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
  2727. */
  2728. wsptr = workspace;
  2729. for (ctr = 0; ctr < 7; ctr++) {
  2730. outptr = output_buf[ctr] + output_col;
  2731. /* Even part */
  2732. /* Add range center and fudge factor for final descale and range-limit. */
  2733. z1 = (INT32) wsptr[0] +
  2734. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2735. (ONE << (PASS1_BITS+2)));
  2736. z1 <<= CONST_BITS;
  2737. z4 = (INT32) wsptr[4];
  2738. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  2739. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  2740. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  2741. tmp10 = z1 + z2;
  2742. tmp11 = z1 + z3;
  2743. tmp12 = z1 - z4;
  2744. tmp23 = z1 - ((z2 + z3 - z4) << 1); /* c0 = (c4+c12-c8)*2 */
  2745. z1 = (INT32) wsptr[2];
  2746. z2 = (INT32) wsptr[6];
  2747. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  2748. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  2749. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  2750. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  2751. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  2752. tmp20 = tmp10 + tmp13;
  2753. tmp26 = tmp10 - tmp13;
  2754. tmp21 = tmp11 + tmp14;
  2755. tmp25 = tmp11 - tmp14;
  2756. tmp22 = tmp12 + tmp15;
  2757. tmp24 = tmp12 - tmp15;
  2758. /* Odd part */
  2759. z1 = (INT32) wsptr[1];
  2760. z2 = (INT32) wsptr[3];
  2761. z3 = (INT32) wsptr[5];
  2762. z4 = (INT32) wsptr[7];
  2763. z4 <<= CONST_BITS;
  2764. tmp14 = z1 + z3;
  2765. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  2766. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  2767. tmp10 = tmp11 + tmp12 + z4 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  2768. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  2769. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  2770. z1 -= z2;
  2771. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - z4; /* c11 */
  2772. tmp16 += tmp15;
  2773. tmp13 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - z4; /* -c13 */
  2774. tmp11 += tmp13 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  2775. tmp12 += tmp13 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  2776. tmp13 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  2777. tmp14 += tmp13 + z4 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  2778. tmp15 += tmp13 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  2779. tmp13 = ((z1 - z3) << CONST_BITS) + z4;
  2780. /* Final output stage */
  2781. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  2782. CONST_BITS+PASS1_BITS+3)
  2783. & RANGE_MASK];
  2784. outptr[13] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  2785. CONST_BITS+PASS1_BITS+3)
  2786. & RANGE_MASK];
  2787. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  2788. CONST_BITS+PASS1_BITS+3)
  2789. & RANGE_MASK];
  2790. outptr[12] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  2791. CONST_BITS+PASS1_BITS+3)
  2792. & RANGE_MASK];
  2793. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  2794. CONST_BITS+PASS1_BITS+3)
  2795. & RANGE_MASK];
  2796. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  2797. CONST_BITS+PASS1_BITS+3)
  2798. & RANGE_MASK];
  2799. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  2800. CONST_BITS+PASS1_BITS+3)
  2801. & RANGE_MASK];
  2802. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  2803. CONST_BITS+PASS1_BITS+3)
  2804. & RANGE_MASK];
  2805. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  2806. CONST_BITS+PASS1_BITS+3)
  2807. & RANGE_MASK];
  2808. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  2809. CONST_BITS+PASS1_BITS+3)
  2810. & RANGE_MASK];
  2811. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  2812. CONST_BITS+PASS1_BITS+3)
  2813. & RANGE_MASK];
  2814. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  2815. CONST_BITS+PASS1_BITS+3)
  2816. & RANGE_MASK];
  2817. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp26 + tmp16,
  2818. CONST_BITS+PASS1_BITS+3)
  2819. & RANGE_MASK];
  2820. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp26 - tmp16,
  2821. CONST_BITS+PASS1_BITS+3)
  2822. & RANGE_MASK];
  2823. wsptr += 8; /* advance pointer to next row */
  2824. }
  2825. }
  2826. /*
  2827. * Perform dequantization and inverse DCT on one block of coefficients,
  2828. * producing a 12x6 output block.
  2829. *
  2830. * 6-point IDCT in pass 1 (columns), 12-point in pass 2 (rows).
  2831. */
  2832. GLOBAL(void)
  2833. jpeg_idct_12x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2834. JCOEFPTR coef_block,
  2835. JSAMPARRAY output_buf, JDIMENSION output_col)
  2836. {
  2837. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  2838. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  2839. INT32 z1, z2, z3, z4;
  2840. JCOEFPTR inptr;
  2841. ISLOW_MULT_TYPE * quantptr;
  2842. int * wsptr;
  2843. JSAMPROW outptr;
  2844. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2845. int ctr;
  2846. int workspace[8*6]; /* buffers data between passes */
  2847. SHIFT_TEMPS
  2848. /* Pass 1: process columns from input, store into work array.
  2849. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  2850. */
  2851. inptr = coef_block;
  2852. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  2853. wsptr = workspace;
  2854. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  2855. /* Even part */
  2856. tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  2857. if (ctr == 0)
  2858. CLAMP_DC(tmp10);
  2859. tmp10 <<= CONST_BITS;
  2860. /* Add fudge factor here for final descale. */
  2861. tmp10 += ONE << (CONST_BITS-PASS1_BITS-1);
  2862. tmp12 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  2863. tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */
  2864. tmp11 = tmp10 + tmp20;
  2865. tmp21 = RIGHT_SHIFT(tmp10 - tmp20 - tmp20, CONST_BITS-PASS1_BITS);
  2866. tmp20 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  2867. tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */
  2868. tmp20 = tmp11 + tmp10;
  2869. tmp22 = tmp11 - tmp10;
  2870. /* Odd part */
  2871. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  2872. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  2873. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  2874. tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  2875. tmp10 = tmp11 + ((z1 + z2) << CONST_BITS);
  2876. tmp12 = tmp11 + ((z3 - z2) << CONST_BITS);
  2877. tmp11 = (z1 - z2 - z3) << PASS1_BITS;
  2878. /* Final output stage */
  2879. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  2880. wsptr[8*5] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  2881. wsptr[8*1] = (int) (tmp21 + tmp11);
  2882. wsptr[8*4] = (int) (tmp21 - tmp11);
  2883. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  2884. wsptr[8*3] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  2885. }
  2886. /* Pass 2: process 6 rows from work array, store into output array.
  2887. * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
  2888. */
  2889. wsptr = workspace;
  2890. for (ctr = 0; ctr < 6; ctr++) {
  2891. outptr = output_buf[ctr] + output_col;
  2892. /* Even part */
  2893. /* Add range center and fudge factor for final descale and range-limit. */
  2894. z3 = (INT32) wsptr[0] +
  2895. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  2896. (ONE << (PASS1_BITS+2)));
  2897. z3 <<= CONST_BITS;
  2898. z4 = (INT32) wsptr[4];
  2899. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  2900. tmp10 = z3 + z4;
  2901. tmp11 = z3 - z4;
  2902. z1 = (INT32) wsptr[2];
  2903. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  2904. z1 <<= CONST_BITS;
  2905. z2 = (INT32) wsptr[6];
  2906. z2 <<= CONST_BITS;
  2907. tmp12 = z1 - z2;
  2908. tmp21 = z3 + tmp12;
  2909. tmp24 = z3 - tmp12;
  2910. tmp12 = z4 + z2;
  2911. tmp20 = tmp10 + tmp12;
  2912. tmp25 = tmp10 - tmp12;
  2913. tmp12 = z4 - z1 - z2;
  2914. tmp22 = tmp11 + tmp12;
  2915. tmp23 = tmp11 - tmp12;
  2916. /* Odd part */
  2917. z1 = (INT32) wsptr[1];
  2918. z2 = (INT32) wsptr[3];
  2919. z3 = (INT32) wsptr[5];
  2920. z4 = (INT32) wsptr[7];
  2921. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  2922. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  2923. tmp10 = z1 + z3;
  2924. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  2925. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  2926. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  2927. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  2928. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  2929. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  2930. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  2931. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  2932. z1 -= z4;
  2933. z2 -= z3;
  2934. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  2935. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  2936. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  2937. /* Final output stage */
  2938. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  2939. CONST_BITS+PASS1_BITS+3)
  2940. & RANGE_MASK];
  2941. outptr[11] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  2942. CONST_BITS+PASS1_BITS+3)
  2943. & RANGE_MASK];
  2944. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  2945. CONST_BITS+PASS1_BITS+3)
  2946. & RANGE_MASK];
  2947. outptr[10] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  2948. CONST_BITS+PASS1_BITS+3)
  2949. & RANGE_MASK];
  2950. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  2951. CONST_BITS+PASS1_BITS+3)
  2952. & RANGE_MASK];
  2953. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  2954. CONST_BITS+PASS1_BITS+3)
  2955. & RANGE_MASK];
  2956. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  2957. CONST_BITS+PASS1_BITS+3)
  2958. & RANGE_MASK];
  2959. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  2960. CONST_BITS+PASS1_BITS+3)
  2961. & RANGE_MASK];
  2962. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  2963. CONST_BITS+PASS1_BITS+3)
  2964. & RANGE_MASK];
  2965. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  2966. CONST_BITS+PASS1_BITS+3)
  2967. & RANGE_MASK];
  2968. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp25 + tmp15,
  2969. CONST_BITS+PASS1_BITS+3)
  2970. & RANGE_MASK];
  2971. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp25 - tmp15,
  2972. CONST_BITS+PASS1_BITS+3)
  2973. & RANGE_MASK];
  2974. wsptr += 8; /* advance pointer to next row */
  2975. }
  2976. }
  2977. /*
  2978. * Perform dequantization and inverse DCT on one block of coefficients,
  2979. * producing a 10x5 output block.
  2980. *
  2981. * 5-point IDCT in pass 1 (columns), 10-point in pass 2 (rows).
  2982. */
  2983. GLOBAL(void)
  2984. jpeg_idct_10x5 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  2985. JCOEFPTR coef_block,
  2986. JSAMPARRAY output_buf, JDIMENSION output_col)
  2987. {
  2988. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  2989. INT32 tmp20, tmp21, tmp22, tmp23, tmp24;
  2990. INT32 z1, z2, z3, z4;
  2991. JCOEFPTR inptr;
  2992. ISLOW_MULT_TYPE * quantptr;
  2993. int * wsptr;
  2994. JSAMPROW outptr;
  2995. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  2996. int ctr;
  2997. int workspace[8*5]; /* buffers data between passes */
  2998. SHIFT_TEMPS
  2999. /* Pass 1: process columns from input, store into work array.
  3000. * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
  3001. */
  3002. inptr = coef_block;
  3003. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3004. wsptr = workspace;
  3005. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  3006. /* Even part */
  3007. tmp12 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3008. if (ctr == 0)
  3009. CLAMP_DC(tmp12);
  3010. tmp12 <<= CONST_BITS;
  3011. /* Add fudge factor here for final descale. */
  3012. tmp12 += ONE << (CONST_BITS-PASS1_BITS-1);
  3013. tmp13 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3014. tmp14 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3015. z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */
  3016. z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */
  3017. z3 = tmp12 + z2;
  3018. tmp10 = z3 + z1;
  3019. tmp11 = z3 - z1;
  3020. tmp12 -= z2 << 2;
  3021. /* Odd part */
  3022. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3023. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3024. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  3025. tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  3026. tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  3027. /* Final output stage */
  3028. wsptr[8*0] = (int) RIGHT_SHIFT(tmp10 + tmp13, CONST_BITS-PASS1_BITS);
  3029. wsptr[8*4] = (int) RIGHT_SHIFT(tmp10 - tmp13, CONST_BITS-PASS1_BITS);
  3030. wsptr[8*1] = (int) RIGHT_SHIFT(tmp11 + tmp14, CONST_BITS-PASS1_BITS);
  3031. wsptr[8*3] = (int) RIGHT_SHIFT(tmp11 - tmp14, CONST_BITS-PASS1_BITS);
  3032. wsptr[8*2] = (int) RIGHT_SHIFT(tmp12, CONST_BITS-PASS1_BITS);
  3033. }
  3034. /* Pass 2: process 5 rows from work array, store into output array.
  3035. * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
  3036. */
  3037. wsptr = workspace;
  3038. for (ctr = 0; ctr < 5; ctr++) {
  3039. outptr = output_buf[ctr] + output_col;
  3040. /* Even part */
  3041. /* Add range center and fudge factor for final descale and range-limit. */
  3042. z3 = (INT32) wsptr[0] +
  3043. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3044. (ONE << (PASS1_BITS+2)));
  3045. z3 <<= CONST_BITS;
  3046. z4 = (INT32) wsptr[4];
  3047. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  3048. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  3049. tmp10 = z3 + z1;
  3050. tmp11 = z3 - z2;
  3051. tmp22 = z3 - ((z1 - z2) << 1); /* c0 = (c4-c8)*2 */
  3052. z2 = (INT32) wsptr[2];
  3053. z3 = (INT32) wsptr[6];
  3054. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  3055. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  3056. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  3057. tmp20 = tmp10 + tmp12;
  3058. tmp24 = tmp10 - tmp12;
  3059. tmp21 = tmp11 + tmp13;
  3060. tmp23 = tmp11 - tmp13;
  3061. /* Odd part */
  3062. z1 = (INT32) wsptr[1];
  3063. z2 = (INT32) wsptr[3];
  3064. z3 = (INT32) wsptr[5];
  3065. z3 <<= CONST_BITS;
  3066. z4 = (INT32) wsptr[7];
  3067. tmp11 = z2 + z4;
  3068. tmp13 = z2 - z4;
  3069. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  3070. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  3071. z4 = z3 + tmp12;
  3072. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  3073. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  3074. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  3075. z4 = z3 - tmp12 - (tmp13 << (CONST_BITS - 1));
  3076. tmp12 = ((z1 - tmp13) << CONST_BITS) - z3;
  3077. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  3078. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  3079. /* Final output stage */
  3080. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  3081. CONST_BITS+PASS1_BITS+3)
  3082. & RANGE_MASK];
  3083. outptr[9] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  3084. CONST_BITS+PASS1_BITS+3)
  3085. & RANGE_MASK];
  3086. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  3087. CONST_BITS+PASS1_BITS+3)
  3088. & RANGE_MASK];
  3089. outptr[8] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  3090. CONST_BITS+PASS1_BITS+3)
  3091. & RANGE_MASK];
  3092. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  3093. CONST_BITS+PASS1_BITS+3)
  3094. & RANGE_MASK];
  3095. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  3096. CONST_BITS+PASS1_BITS+3)
  3097. & RANGE_MASK];
  3098. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23 + tmp13,
  3099. CONST_BITS+PASS1_BITS+3)
  3100. & RANGE_MASK];
  3101. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp23 - tmp13,
  3102. CONST_BITS+PASS1_BITS+3)
  3103. & RANGE_MASK];
  3104. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp24 + tmp14,
  3105. CONST_BITS+PASS1_BITS+3)
  3106. & RANGE_MASK];
  3107. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp24 - tmp14,
  3108. CONST_BITS+PASS1_BITS+3)
  3109. & RANGE_MASK];
  3110. wsptr += 8; /* advance pointer to next row */
  3111. }
  3112. }
  3113. /*
  3114. * Perform dequantization and inverse DCT on one block of coefficients,
  3115. * producing an 8x4 output block.
  3116. *
  3117. * 4-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
  3118. */
  3119. GLOBAL(void)
  3120. jpeg_idct_8x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3121. JCOEFPTR coef_block,
  3122. JSAMPARRAY output_buf, JDIMENSION output_col)
  3123. {
  3124. INT32 tmp0, tmp1, tmp2, tmp3;
  3125. INT32 tmp10, tmp11, tmp12, tmp13;
  3126. INT32 z1, z2, z3;
  3127. JCOEFPTR inptr;
  3128. ISLOW_MULT_TYPE * quantptr;
  3129. int * wsptr;
  3130. JSAMPROW outptr;
  3131. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3132. int ctr;
  3133. int workspace[8*4]; /* buffers data between passes */
  3134. SHIFT_TEMPS
  3135. /* Pass 1: process columns from input, store into work array.
  3136. * 4-point IDCT kernel,
  3137. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  3138. */
  3139. inptr = coef_block;
  3140. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3141. wsptr = workspace;
  3142. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  3143. /* Even part */
  3144. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3145. if (ctr == 0)
  3146. CLAMP_DC(tmp0);
  3147. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3148. tmp10 = (tmp0 + tmp2) << PASS1_BITS;
  3149. tmp12 = (tmp0 - tmp2) << PASS1_BITS;
  3150. /* Odd part */
  3151. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  3152. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3153. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3154. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3155. /* Add fudge factor here for final descale. */
  3156. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  3157. tmp0 = RIGHT_SHIFT(z1 + MULTIPLY(z2, FIX_0_765366865), /* c2-c6 */
  3158. CONST_BITS-PASS1_BITS);
  3159. tmp2 = RIGHT_SHIFT(z1 - MULTIPLY(z3, FIX_1_847759065), /* c2+c6 */
  3160. CONST_BITS-PASS1_BITS);
  3161. /* Final output stage */
  3162. wsptr[8*0] = (int) (tmp10 + tmp0);
  3163. wsptr[8*3] = (int) (tmp10 - tmp0);
  3164. wsptr[8*1] = (int) (tmp12 + tmp2);
  3165. wsptr[8*2] = (int) (tmp12 - tmp2);
  3166. }
  3167. /* Pass 2: process rows from work array, store into output array.
  3168. * Note that we must descale the results by a factor of 8 == 2**3,
  3169. * and also undo the PASS1_BITS scaling.
  3170. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  3171. */
  3172. wsptr = workspace;
  3173. for (ctr = 0; ctr < 4; ctr++) {
  3174. outptr = output_buf[ctr] + output_col;
  3175. /* Even part: reverse the even part of the forward DCT.
  3176. * The rotator is c(-6).
  3177. */
  3178. /* Add range center and fudge factor for final descale and range-limit. */
  3179. z2 = (INT32) wsptr[0] +
  3180. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3181. (ONE << (PASS1_BITS+2)));
  3182. z3 = (INT32) wsptr[4];
  3183. tmp0 = (z2 + z3) << CONST_BITS;
  3184. tmp1 = (z2 - z3) << CONST_BITS;
  3185. z2 = (INT32) wsptr[2];
  3186. z3 = (INT32) wsptr[6];
  3187. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3188. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  3189. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  3190. tmp10 = tmp0 + tmp2;
  3191. tmp13 = tmp0 - tmp2;
  3192. tmp11 = tmp1 + tmp3;
  3193. tmp12 = tmp1 - tmp3;
  3194. /* Odd part per figure 8; the matrix is unitary and hence its
  3195. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  3196. */
  3197. tmp0 = (INT32) wsptr[7];
  3198. tmp1 = (INT32) wsptr[5];
  3199. tmp2 = (INT32) wsptr[3];
  3200. tmp3 = (INT32) wsptr[1];
  3201. z2 = tmp0 + tmp2;
  3202. z3 = tmp1 + tmp3;
  3203. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  3204. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  3205. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  3206. z2 += z1;
  3207. z3 += z1;
  3208. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  3209. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  3210. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  3211. tmp0 += z1 + z2;
  3212. tmp3 += z1 + z3;
  3213. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  3214. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  3215. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  3216. tmp1 += z1 + z3;
  3217. tmp2 += z1 + z2;
  3218. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  3219. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
  3220. CONST_BITS+PASS1_BITS+3)
  3221. & RANGE_MASK];
  3222. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,
  3223. CONST_BITS+PASS1_BITS+3)
  3224. & RANGE_MASK];
  3225. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,
  3226. CONST_BITS+PASS1_BITS+3)
  3227. & RANGE_MASK];
  3228. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,
  3229. CONST_BITS+PASS1_BITS+3)
  3230. & RANGE_MASK];
  3231. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,
  3232. CONST_BITS+PASS1_BITS+3)
  3233. & RANGE_MASK];
  3234. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,
  3235. CONST_BITS+PASS1_BITS+3)
  3236. & RANGE_MASK];
  3237. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,
  3238. CONST_BITS+PASS1_BITS+3)
  3239. & RANGE_MASK];
  3240. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
  3241. CONST_BITS+PASS1_BITS+3)
  3242. & RANGE_MASK];
  3243. wsptr += DCTSIZE; /* advance pointer to next row */
  3244. }
  3245. }
  3246. /*
  3247. * Perform dequantization and inverse DCT on one block of coefficients,
  3248. * producing a 6x3 output block.
  3249. *
  3250. * 3-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
  3251. */
  3252. GLOBAL(void)
  3253. jpeg_idct_6x3 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3254. JCOEFPTR coef_block,
  3255. JSAMPARRAY output_buf, JDIMENSION output_col)
  3256. {
  3257. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;
  3258. INT32 z1, z2, z3;
  3259. JCOEFPTR inptr;
  3260. ISLOW_MULT_TYPE * quantptr;
  3261. int * wsptr;
  3262. JSAMPROW outptr;
  3263. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3264. int ctr;
  3265. int workspace[6*3]; /* buffers data between passes */
  3266. SHIFT_TEMPS
  3267. /* Pass 1: process columns from input, store into work array.
  3268. * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
  3269. */
  3270. inptr = coef_block;
  3271. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3272. wsptr = workspace;
  3273. for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {
  3274. /* Even part */
  3275. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3276. if (ctr == 0)
  3277. CLAMP_DC(tmp0);
  3278. tmp0 <<= CONST_BITS;
  3279. /* Add fudge factor here for final descale. */
  3280. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  3281. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3282. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  3283. tmp10 = tmp0 + tmp12;
  3284. tmp2 = tmp0 - tmp12 - tmp12;
  3285. /* Odd part */
  3286. tmp12 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3287. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  3288. /* Final output stage */
  3289. wsptr[6*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  3290. wsptr[6*2] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  3291. wsptr[6*1] = (int) RIGHT_SHIFT(tmp2, CONST_BITS-PASS1_BITS);
  3292. }
  3293. /* Pass 2: process 3 rows from work array, store into output array.
  3294. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  3295. */
  3296. wsptr = workspace;
  3297. for (ctr = 0; ctr < 3; ctr++) {
  3298. outptr = output_buf[ctr] + output_col;
  3299. /* Even part */
  3300. /* Add range center and fudge factor for final descale and range-limit. */
  3301. tmp0 = (INT32) wsptr[0] +
  3302. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3303. (ONE << (PASS1_BITS+2)));
  3304. tmp0 <<= CONST_BITS;
  3305. tmp2 = (INT32) wsptr[4];
  3306. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  3307. tmp1 = tmp0 + tmp10;
  3308. tmp11 = tmp0 - tmp10 - tmp10;
  3309. tmp10 = (INT32) wsptr[2];
  3310. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  3311. tmp10 = tmp1 + tmp0;
  3312. tmp12 = tmp1 - tmp0;
  3313. /* Odd part */
  3314. z1 = (INT32) wsptr[1];
  3315. z2 = (INT32) wsptr[3];
  3316. z3 = (INT32) wsptr[5];
  3317. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  3318. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  3319. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  3320. tmp1 = (z1 - z2 - z3) << CONST_BITS;
  3321. /* Final output stage */
  3322. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  3323. CONST_BITS+PASS1_BITS+3)
  3324. & RANGE_MASK];
  3325. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  3326. CONST_BITS+PASS1_BITS+3)
  3327. & RANGE_MASK];
  3328. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp1,
  3329. CONST_BITS+PASS1_BITS+3)
  3330. & RANGE_MASK];
  3331. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp1,
  3332. CONST_BITS+PASS1_BITS+3)
  3333. & RANGE_MASK];
  3334. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  3335. CONST_BITS+PASS1_BITS+3)
  3336. & RANGE_MASK];
  3337. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  3338. CONST_BITS+PASS1_BITS+3)
  3339. & RANGE_MASK];
  3340. wsptr += 6; /* advance pointer to next row */
  3341. }
  3342. }
  3343. /*
  3344. * Perform dequantization and inverse DCT on one block of coefficients,
  3345. * producing a 4x2 output block.
  3346. *
  3347. * 2-point IDCT in pass 1 (columns), 4-point in pass 2 (rows).
  3348. */
  3349. GLOBAL(void)
  3350. jpeg_idct_4x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3351. JCOEFPTR coef_block,
  3352. JSAMPARRAY output_buf, JDIMENSION output_col)
  3353. {
  3354. INT32 tmp0, tmp2, tmp10, tmp12;
  3355. INT32 z1, z2, z3;
  3356. JCOEFPTR inptr;
  3357. ISLOW_MULT_TYPE * quantptr;
  3358. INT32 * wsptr;
  3359. JSAMPROW outptr;
  3360. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3361. int ctr;
  3362. INT32 workspace[4*2]; /* buffers data between passes */
  3363. SHIFT_TEMPS
  3364. /* Pass 1: process columns from input, store into work array. */
  3365. inptr = coef_block;
  3366. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3367. wsptr = workspace;
  3368. for (ctr = 0; ctr < 4; ctr++, inptr++, quantptr++, wsptr++) {
  3369. /* Even part */
  3370. tmp10 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3371. if (ctr == 0)
  3372. CLAMP_DC(tmp10);
  3373. /* Odd part */
  3374. tmp0 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3375. /* Final output stage */
  3376. wsptr[4*0] = tmp10 + tmp0;
  3377. wsptr[4*1] = tmp10 - tmp0;
  3378. }
  3379. /* Pass 2: process 2 rows from work array, store into output array.
  3380. * 4-point IDCT kernel,
  3381. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  3382. */
  3383. wsptr = workspace;
  3384. for (ctr = 0; ctr < 2; ctr++) {
  3385. outptr = output_buf[ctr] + output_col;
  3386. /* Even part */
  3387. /* Add range center and fudge factor for final descale and range-limit. */
  3388. tmp0 = wsptr[0] + ((((INT32) RANGE_CENTER) << 3) + (ONE << 2));
  3389. tmp2 = wsptr[2];
  3390. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  3391. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  3392. /* Odd part */
  3393. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  3394. z2 = wsptr[1];
  3395. z3 = wsptr[3];
  3396. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3397. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  3398. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  3399. /* Final output stage */
  3400. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  3401. CONST_BITS+3)
  3402. & RANGE_MASK];
  3403. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  3404. CONST_BITS+3)
  3405. & RANGE_MASK];
  3406. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  3407. CONST_BITS+3)
  3408. & RANGE_MASK];
  3409. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  3410. CONST_BITS+3)
  3411. & RANGE_MASK];
  3412. wsptr += 4; /* advance pointer to next row */
  3413. }
  3414. }
  3415. /*
  3416. * Perform dequantization and inverse DCT on one block of coefficients,
  3417. * producing a 2x1 output block.
  3418. *
  3419. * 1-point IDCT in pass 1 (columns), 2-point in pass 2 (rows).
  3420. */
  3421. GLOBAL(void)
  3422. jpeg_idct_2x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3423. JCOEFPTR coef_block,
  3424. JSAMPARRAY output_buf, JDIMENSION output_col)
  3425. {
  3426. DCTELEM tmp0, tmp1;
  3427. ISLOW_MULT_TYPE * quantptr;
  3428. JSAMPROW outptr;
  3429. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3430. ISHIFT_TEMPS
  3431. /* Pass 1: empty. */
  3432. /* Pass 2: process 1 row from input, store into output array. */
  3433. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3434. outptr = output_buf[0] + output_col;
  3435. /* Even part */
  3436. tmp0 = DEQUANTIZE(coef_block[0], quantptr[0]);
  3437. CLAMP_DC(tmp0);
  3438. /* Add range center and fudge factor for final descale and range-limit. */
  3439. tmp0 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  3440. /* Odd part */
  3441. tmp1 = DEQUANTIZE(coef_block[1], quantptr[1]);
  3442. /* Final output stage */
  3443. outptr[0] = range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
  3444. outptr[1] = range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
  3445. }
  3446. /*
  3447. * Perform dequantization and inverse DCT on one block of coefficients,
  3448. * producing an 8x16 output block.
  3449. *
  3450. * 16-point IDCT in pass 1 (columns), 8-point in pass 2 (rows).
  3451. */
  3452. GLOBAL(void)
  3453. jpeg_idct_8x16 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3454. JCOEFPTR coef_block,
  3455. JSAMPARRAY output_buf, JDIMENSION output_col)
  3456. {
  3457. INT32 tmp0, tmp1, tmp2, tmp3, tmp10, tmp11, tmp12, tmp13;
  3458. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;
  3459. INT32 z1, z2, z3, z4;
  3460. JCOEFPTR inptr;
  3461. ISLOW_MULT_TYPE * quantptr;
  3462. int * wsptr;
  3463. JSAMPROW outptr;
  3464. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3465. int ctr;
  3466. int workspace[8*16]; /* buffers data between passes */
  3467. SHIFT_TEMPS
  3468. /* Pass 1: process columns from input, store into work array.
  3469. * 16-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/32).
  3470. */
  3471. inptr = coef_block;
  3472. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3473. wsptr = workspace;
  3474. for (ctr = 0; ctr < 8; ctr++, inptr++, quantptr++, wsptr++) {
  3475. /* Even part */
  3476. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3477. if (ctr == 0)
  3478. CLAMP_DC(tmp0);
  3479. tmp0 <<= CONST_BITS;
  3480. /* Add fudge factor here for final descale. */
  3481. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  3482. z1 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3483. tmp1 = MULTIPLY(z1, FIX(1.306562965)); /* c4[16] = c2[8] */
  3484. tmp2 = MULTIPLY(z1, FIX_0_541196100); /* c12[16] = c6[8] */
  3485. tmp10 = tmp0 + tmp1;
  3486. tmp11 = tmp0 - tmp1;
  3487. tmp12 = tmp0 + tmp2;
  3488. tmp13 = tmp0 - tmp2;
  3489. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3490. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3491. z3 = z1 - z2;
  3492. z4 = MULTIPLY(z3, FIX(0.275899379)); /* c14[16] = c7[8] */
  3493. z3 = MULTIPLY(z3, FIX(1.387039845)); /* c2[16] = c1[8] */
  3494. tmp0 = z3 + MULTIPLY(z2, FIX_2_562915447); /* (c6+c2)[16] = (c3+c1)[8] */
  3495. tmp1 = z4 + MULTIPLY(z1, FIX_0_899976223); /* (c6-c14)[16] = (c3-c7)[8] */
  3496. tmp2 = z3 - MULTIPLY(z1, FIX(0.601344887)); /* (c2-c10)[16] = (c1-c5)[8] */
  3497. tmp3 = z4 - MULTIPLY(z2, FIX(0.509795579)); /* (c10-c14)[16] = (c5-c7)[8] */
  3498. tmp20 = tmp10 + tmp0;
  3499. tmp27 = tmp10 - tmp0;
  3500. tmp21 = tmp12 + tmp1;
  3501. tmp26 = tmp12 - tmp1;
  3502. tmp22 = tmp13 + tmp2;
  3503. tmp25 = tmp13 - tmp2;
  3504. tmp23 = tmp11 + tmp3;
  3505. tmp24 = tmp11 - tmp3;
  3506. /* Odd part */
  3507. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3508. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3509. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3510. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3511. tmp11 = z1 + z3;
  3512. tmp1 = MULTIPLY(z1 + z2, FIX(1.353318001)); /* c3 */
  3513. tmp2 = MULTIPLY(tmp11, FIX(1.247225013)); /* c5 */
  3514. tmp3 = MULTIPLY(z1 + z4, FIX(1.093201867)); /* c7 */
  3515. tmp10 = MULTIPLY(z1 - z4, FIX(0.897167586)); /* c9 */
  3516. tmp11 = MULTIPLY(tmp11, FIX(0.666655658)); /* c11 */
  3517. tmp12 = MULTIPLY(z1 - z2, FIX(0.410524528)); /* c13 */
  3518. tmp0 = tmp1 + tmp2 + tmp3 -
  3519. MULTIPLY(z1, FIX(2.286341144)); /* c7+c5+c3-c1 */
  3520. tmp13 = tmp10 + tmp11 + tmp12 -
  3521. MULTIPLY(z1, FIX(1.835730603)); /* c9+c11+c13-c15 */
  3522. z1 = MULTIPLY(z2 + z3, FIX(0.138617169)); /* c15 */
  3523. tmp1 += z1 + MULTIPLY(z2, FIX(0.071888074)); /* c9+c11-c3-c15 */
  3524. tmp2 += z1 - MULTIPLY(z3, FIX(1.125726048)); /* c5+c7+c15-c3 */
  3525. z1 = MULTIPLY(z3 - z2, FIX(1.407403738)); /* c1 */
  3526. tmp11 += z1 - MULTIPLY(z3, FIX(0.766367282)); /* c1+c11-c9-c13 */
  3527. tmp12 += z1 + MULTIPLY(z2, FIX(1.971951411)); /* c1+c5+c13-c7 */
  3528. z2 += z4;
  3529. z1 = MULTIPLY(z2, - FIX(0.666655658)); /* -c11 */
  3530. tmp1 += z1;
  3531. tmp3 += z1 + MULTIPLY(z4, FIX(1.065388962)); /* c3+c11+c15-c7 */
  3532. z2 = MULTIPLY(z2, - FIX(1.247225013)); /* -c5 */
  3533. tmp10 += z2 + MULTIPLY(z4, FIX(3.141271809)); /* c1+c5+c9-c13 */
  3534. tmp12 += z2;
  3535. z2 = MULTIPLY(z3 + z4, - FIX(1.353318001)); /* -c3 */
  3536. tmp2 += z2;
  3537. tmp3 += z2;
  3538. z2 = MULTIPLY(z4 - z3, FIX(0.410524528)); /* c13 */
  3539. tmp10 += z2;
  3540. tmp11 += z2;
  3541. /* Final output stage */
  3542. wsptr[8*0] = (int) RIGHT_SHIFT(tmp20 + tmp0, CONST_BITS-PASS1_BITS);
  3543. wsptr[8*15] = (int) RIGHT_SHIFT(tmp20 - tmp0, CONST_BITS-PASS1_BITS);
  3544. wsptr[8*1] = (int) RIGHT_SHIFT(tmp21 + tmp1, CONST_BITS-PASS1_BITS);
  3545. wsptr[8*14] = (int) RIGHT_SHIFT(tmp21 - tmp1, CONST_BITS-PASS1_BITS);
  3546. wsptr[8*2] = (int) RIGHT_SHIFT(tmp22 + tmp2, CONST_BITS-PASS1_BITS);
  3547. wsptr[8*13] = (int) RIGHT_SHIFT(tmp22 - tmp2, CONST_BITS-PASS1_BITS);
  3548. wsptr[8*3] = (int) RIGHT_SHIFT(tmp23 + tmp3, CONST_BITS-PASS1_BITS);
  3549. wsptr[8*12] = (int) RIGHT_SHIFT(tmp23 - tmp3, CONST_BITS-PASS1_BITS);
  3550. wsptr[8*4] = (int) RIGHT_SHIFT(tmp24 + tmp10, CONST_BITS-PASS1_BITS);
  3551. wsptr[8*11] = (int) RIGHT_SHIFT(tmp24 - tmp10, CONST_BITS-PASS1_BITS);
  3552. wsptr[8*5] = (int) RIGHT_SHIFT(tmp25 + tmp11, CONST_BITS-PASS1_BITS);
  3553. wsptr[8*10] = (int) RIGHT_SHIFT(tmp25 - tmp11, CONST_BITS-PASS1_BITS);
  3554. wsptr[8*6] = (int) RIGHT_SHIFT(tmp26 + tmp12, CONST_BITS-PASS1_BITS);
  3555. wsptr[8*9] = (int) RIGHT_SHIFT(tmp26 - tmp12, CONST_BITS-PASS1_BITS);
  3556. wsptr[8*7] = (int) RIGHT_SHIFT(tmp27 + tmp13, CONST_BITS-PASS1_BITS);
  3557. wsptr[8*8] = (int) RIGHT_SHIFT(tmp27 - tmp13, CONST_BITS-PASS1_BITS);
  3558. }
  3559. /* Pass 2: process rows from work array, store into output array.
  3560. * Note that we must descale the results by a factor of 8 == 2**3,
  3561. * and also undo the PASS1_BITS scaling.
  3562. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  3563. */
  3564. wsptr = workspace;
  3565. for (ctr = 0; ctr < 16; ctr++) {
  3566. outptr = output_buf[ctr] + output_col;
  3567. /* Even part: reverse the even part of the forward DCT.
  3568. * The rotator is c(-6).
  3569. */
  3570. /* Add range center and fudge factor for final descale and range-limit. */
  3571. z2 = (INT32) wsptr[0] +
  3572. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3573. (ONE << (PASS1_BITS+2)));
  3574. z3 = (INT32) wsptr[4];
  3575. tmp0 = (z2 + z3) << CONST_BITS;
  3576. tmp1 = (z2 - z3) << CONST_BITS;
  3577. z2 = (INT32) wsptr[2];
  3578. z3 = (INT32) wsptr[6];
  3579. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  3580. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  3581. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  3582. tmp10 = tmp0 + tmp2;
  3583. tmp13 = tmp0 - tmp2;
  3584. tmp11 = tmp1 + tmp3;
  3585. tmp12 = tmp1 - tmp3;
  3586. /* Odd part per figure 8; the matrix is unitary and hence its
  3587. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  3588. */
  3589. tmp0 = (INT32) wsptr[7];
  3590. tmp1 = (INT32) wsptr[5];
  3591. tmp2 = (INT32) wsptr[3];
  3592. tmp3 = (INT32) wsptr[1];
  3593. z2 = tmp0 + tmp2;
  3594. z3 = tmp1 + tmp3;
  3595. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  3596. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  3597. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  3598. z2 += z1;
  3599. z3 += z1;
  3600. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  3601. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  3602. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  3603. tmp0 += z1 + z2;
  3604. tmp3 += z1 + z3;
  3605. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  3606. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  3607. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  3608. tmp1 += z1 + z3;
  3609. tmp2 += z1 + z2;
  3610. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  3611. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp3,
  3612. CONST_BITS+PASS1_BITS+3)
  3613. & RANGE_MASK];
  3614. outptr[7] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp3,
  3615. CONST_BITS+PASS1_BITS+3)
  3616. & RANGE_MASK];
  3617. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp2,
  3618. CONST_BITS+PASS1_BITS+3)
  3619. & RANGE_MASK];
  3620. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp2,
  3621. CONST_BITS+PASS1_BITS+3)
  3622. & RANGE_MASK];
  3623. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp1,
  3624. CONST_BITS+PASS1_BITS+3)
  3625. & RANGE_MASK];
  3626. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp1,
  3627. CONST_BITS+PASS1_BITS+3)
  3628. & RANGE_MASK];
  3629. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp13 + tmp0,
  3630. CONST_BITS+PASS1_BITS+3)
  3631. & RANGE_MASK];
  3632. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp13 - tmp0,
  3633. CONST_BITS+PASS1_BITS+3)
  3634. & RANGE_MASK];
  3635. wsptr += DCTSIZE; /* advance pointer to next row */
  3636. }
  3637. }
  3638. /*
  3639. * Perform dequantization and inverse DCT on one block of coefficients,
  3640. * producing a 7x14 output block.
  3641. *
  3642. * 14-point IDCT in pass 1 (columns), 7-point in pass 2 (rows).
  3643. */
  3644. GLOBAL(void)
  3645. jpeg_idct_7x14 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3646. JCOEFPTR coef_block,
  3647. JSAMPARRAY output_buf, JDIMENSION output_col)
  3648. {
  3649. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16;
  3650. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26;
  3651. INT32 z1, z2, z3, z4;
  3652. JCOEFPTR inptr;
  3653. ISLOW_MULT_TYPE * quantptr;
  3654. int * wsptr;
  3655. JSAMPROW outptr;
  3656. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3657. int ctr;
  3658. int workspace[7*14]; /* buffers data between passes */
  3659. SHIFT_TEMPS
  3660. /* Pass 1: process columns from input, store into work array.
  3661. * 14-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/28).
  3662. */
  3663. inptr = coef_block;
  3664. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3665. wsptr = workspace;
  3666. for (ctr = 0; ctr < 7; ctr++, inptr++, quantptr++, wsptr++) {
  3667. /* Even part */
  3668. z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3669. if (ctr == 0)
  3670. CLAMP_DC(z1);
  3671. z1 <<= CONST_BITS;
  3672. /* Add fudge factor here for final descale. */
  3673. z1 += ONE << (CONST_BITS-PASS1_BITS-1);
  3674. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3675. z2 = MULTIPLY(z4, FIX(1.274162392)); /* c4 */
  3676. z3 = MULTIPLY(z4, FIX(0.314692123)); /* c12 */
  3677. z4 = MULTIPLY(z4, FIX(0.881747734)); /* c8 */
  3678. tmp10 = z1 + z2;
  3679. tmp11 = z1 + z3;
  3680. tmp12 = z1 - z4;
  3681. tmp23 = RIGHT_SHIFT(z1 - ((z2 + z3 - z4) << 1), /* c0 = (c4+c12-c8)*2 */
  3682. CONST_BITS-PASS1_BITS);
  3683. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3684. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3685. z3 = MULTIPLY(z1 + z2, FIX(1.105676686)); /* c6 */
  3686. tmp13 = z3 + MULTIPLY(z1, FIX(0.273079590)); /* c2-c6 */
  3687. tmp14 = z3 - MULTIPLY(z2, FIX(1.719280954)); /* c6+c10 */
  3688. tmp15 = MULTIPLY(z1, FIX(0.613604268)) - /* c10 */
  3689. MULTIPLY(z2, FIX(1.378756276)); /* c2 */
  3690. tmp20 = tmp10 + tmp13;
  3691. tmp26 = tmp10 - tmp13;
  3692. tmp21 = tmp11 + tmp14;
  3693. tmp25 = tmp11 - tmp14;
  3694. tmp22 = tmp12 + tmp15;
  3695. tmp24 = tmp12 - tmp15;
  3696. /* Odd part */
  3697. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3698. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3699. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3700. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3701. tmp13 = z4 << CONST_BITS;
  3702. tmp14 = z1 + z3;
  3703. tmp11 = MULTIPLY(z1 + z2, FIX(1.334852607)); /* c3 */
  3704. tmp12 = MULTIPLY(tmp14, FIX(1.197448846)); /* c5 */
  3705. tmp10 = tmp11 + tmp12 + tmp13 - MULTIPLY(z1, FIX(1.126980169)); /* c3+c5-c1 */
  3706. tmp14 = MULTIPLY(tmp14, FIX(0.752406978)); /* c9 */
  3707. tmp16 = tmp14 - MULTIPLY(z1, FIX(1.061150426)); /* c9+c11-c13 */
  3708. z1 -= z2;
  3709. tmp15 = MULTIPLY(z1, FIX(0.467085129)) - tmp13; /* c11 */
  3710. tmp16 += tmp15;
  3711. z1 += z4;
  3712. z4 = MULTIPLY(z2 + z3, - FIX(0.158341681)) - tmp13; /* -c13 */
  3713. tmp11 += z4 - MULTIPLY(z2, FIX(0.424103948)); /* c3-c9-c13 */
  3714. tmp12 += z4 - MULTIPLY(z3, FIX(2.373959773)); /* c3+c5-c13 */
  3715. z4 = MULTIPLY(z3 - z2, FIX(1.405321284)); /* c1 */
  3716. tmp14 += z4 + tmp13 - MULTIPLY(z3, FIX(1.6906431334)); /* c1+c9-c11 */
  3717. tmp15 += z4 + MULTIPLY(z2, FIX(0.674957567)); /* c1+c11-c5 */
  3718. tmp13 = (z1 - z3) << PASS1_BITS;
  3719. /* Final output stage */
  3720. wsptr[7*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  3721. wsptr[7*13] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  3722. wsptr[7*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  3723. wsptr[7*12] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  3724. wsptr[7*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  3725. wsptr[7*11] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  3726. wsptr[7*3] = (int) (tmp23 + tmp13);
  3727. wsptr[7*10] = (int) (tmp23 - tmp13);
  3728. wsptr[7*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  3729. wsptr[7*9] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  3730. wsptr[7*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  3731. wsptr[7*8] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  3732. wsptr[7*6] = (int) RIGHT_SHIFT(tmp26 + tmp16, CONST_BITS-PASS1_BITS);
  3733. wsptr[7*7] = (int) RIGHT_SHIFT(tmp26 - tmp16, CONST_BITS-PASS1_BITS);
  3734. }
  3735. /* Pass 2: process 14 rows from work array, store into output array.
  3736. * 7-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/14).
  3737. */
  3738. wsptr = workspace;
  3739. for (ctr = 0; ctr < 14; ctr++) {
  3740. outptr = output_buf[ctr] + output_col;
  3741. /* Even part */
  3742. /* Add range center and fudge factor for final descale and range-limit. */
  3743. tmp23 = (INT32) wsptr[0] +
  3744. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3745. (ONE << (PASS1_BITS+2)));
  3746. tmp23 <<= CONST_BITS;
  3747. z1 = (INT32) wsptr[2];
  3748. z2 = (INT32) wsptr[4];
  3749. z3 = (INT32) wsptr[6];
  3750. tmp20 = MULTIPLY(z2 - z3, FIX(0.881747734)); /* c4 */
  3751. tmp22 = MULTIPLY(z1 - z2, FIX(0.314692123)); /* c6 */
  3752. tmp21 = tmp20 + tmp22 + tmp23 - MULTIPLY(z2, FIX(1.841218003)); /* c2+c4-c6 */
  3753. tmp10 = z1 + z3;
  3754. z2 -= tmp10;
  3755. tmp10 = MULTIPLY(tmp10, FIX(1.274162392)) + tmp23; /* c2 */
  3756. tmp20 += tmp10 - MULTIPLY(z3, FIX(0.077722536)); /* c2-c4-c6 */
  3757. tmp22 += tmp10 - MULTIPLY(z1, FIX(2.470602249)); /* c2+c4+c6 */
  3758. tmp23 += MULTIPLY(z2, FIX(1.414213562)); /* c0 */
  3759. /* Odd part */
  3760. z1 = (INT32) wsptr[1];
  3761. z2 = (INT32) wsptr[3];
  3762. z3 = (INT32) wsptr[5];
  3763. tmp11 = MULTIPLY(z1 + z2, FIX(0.935414347)); /* (c3+c1-c5)/2 */
  3764. tmp12 = MULTIPLY(z1 - z2, FIX(0.170262339)); /* (c3+c5-c1)/2 */
  3765. tmp10 = tmp11 - tmp12;
  3766. tmp11 += tmp12;
  3767. tmp12 = MULTIPLY(z2 + z3, - FIX(1.378756276)); /* -c1 */
  3768. tmp11 += tmp12;
  3769. z2 = MULTIPLY(z1 + z3, FIX(0.613604268)); /* c5 */
  3770. tmp10 += z2;
  3771. tmp12 += z2 + MULTIPLY(z3, FIX(1.870828693)); /* c3+c1-c5 */
  3772. /* Final output stage */
  3773. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  3774. CONST_BITS+PASS1_BITS+3)
  3775. & RANGE_MASK];
  3776. outptr[6] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  3777. CONST_BITS+PASS1_BITS+3)
  3778. & RANGE_MASK];
  3779. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  3780. CONST_BITS+PASS1_BITS+3)
  3781. & RANGE_MASK];
  3782. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  3783. CONST_BITS+PASS1_BITS+3)
  3784. & RANGE_MASK];
  3785. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  3786. CONST_BITS+PASS1_BITS+3)
  3787. & RANGE_MASK];
  3788. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  3789. CONST_BITS+PASS1_BITS+3)
  3790. & RANGE_MASK];
  3791. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp23,
  3792. CONST_BITS+PASS1_BITS+3)
  3793. & RANGE_MASK];
  3794. wsptr += 7; /* advance pointer to next row */
  3795. }
  3796. }
  3797. /*
  3798. * Perform dequantization and inverse DCT on one block of coefficients,
  3799. * producing a 6x12 output block.
  3800. *
  3801. * 12-point IDCT in pass 1 (columns), 6-point in pass 2 (rows).
  3802. */
  3803. GLOBAL(void)
  3804. jpeg_idct_6x12 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3805. JCOEFPTR coef_block,
  3806. JSAMPARRAY output_buf, JDIMENSION output_col)
  3807. {
  3808. INT32 tmp10, tmp11, tmp12, tmp13, tmp14, tmp15;
  3809. INT32 tmp20, tmp21, tmp22, tmp23, tmp24, tmp25;
  3810. INT32 z1, z2, z3, z4;
  3811. JCOEFPTR inptr;
  3812. ISLOW_MULT_TYPE * quantptr;
  3813. int * wsptr;
  3814. JSAMPROW outptr;
  3815. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3816. int ctr;
  3817. int workspace[6*12]; /* buffers data between passes */
  3818. SHIFT_TEMPS
  3819. /* Pass 1: process columns from input, store into work array.
  3820. * 12-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/24).
  3821. */
  3822. inptr = coef_block;
  3823. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3824. wsptr = workspace;
  3825. for (ctr = 0; ctr < 6; ctr++, inptr++, quantptr++, wsptr++) {
  3826. /* Even part */
  3827. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3828. if (ctr == 0)
  3829. CLAMP_DC(z3);
  3830. z3 <<= CONST_BITS;
  3831. /* Add fudge factor here for final descale. */
  3832. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  3833. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3834. z4 = MULTIPLY(z4, FIX(1.224744871)); /* c4 */
  3835. tmp10 = z3 + z4;
  3836. tmp11 = z3 - z4;
  3837. z1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3838. z4 = MULTIPLY(z1, FIX(1.366025404)); /* c2 */
  3839. z1 <<= CONST_BITS;
  3840. z2 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3841. z2 <<= CONST_BITS;
  3842. tmp12 = z1 - z2;
  3843. tmp21 = z3 + tmp12;
  3844. tmp24 = z3 - tmp12;
  3845. tmp12 = z4 + z2;
  3846. tmp20 = tmp10 + tmp12;
  3847. tmp25 = tmp10 - tmp12;
  3848. tmp12 = z4 - z1 - z2;
  3849. tmp22 = tmp11 + tmp12;
  3850. tmp23 = tmp11 - tmp12;
  3851. /* Odd part */
  3852. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3853. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3854. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3855. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3856. tmp11 = MULTIPLY(z2, FIX(1.306562965)); /* c3 */
  3857. tmp14 = MULTIPLY(z2, - FIX_0_541196100); /* -c9 */
  3858. tmp10 = z1 + z3;
  3859. tmp15 = MULTIPLY(tmp10 + z4, FIX(0.860918669)); /* c7 */
  3860. tmp12 = tmp15 + MULTIPLY(tmp10, FIX(0.261052384)); /* c5-c7 */
  3861. tmp10 = tmp12 + tmp11 + MULTIPLY(z1, FIX(0.280143716)); /* c1-c5 */
  3862. tmp13 = MULTIPLY(z3 + z4, - FIX(1.045510580)); /* -(c7+c11) */
  3863. tmp12 += tmp13 + tmp14 - MULTIPLY(z3, FIX(1.478575242)); /* c1+c5-c7-c11 */
  3864. tmp13 += tmp15 - tmp11 + MULTIPLY(z4, FIX(1.586706681)); /* c1+c11 */
  3865. tmp15 += tmp14 - MULTIPLY(z1, FIX(0.676326758)) - /* c7-c11 */
  3866. MULTIPLY(z4, FIX(1.982889723)); /* c5+c7 */
  3867. z1 -= z4;
  3868. z2 -= z3;
  3869. z3 = MULTIPLY(z1 + z2, FIX_0_541196100); /* c9 */
  3870. tmp11 = z3 + MULTIPLY(z1, FIX_0_765366865); /* c3-c9 */
  3871. tmp14 = z3 - MULTIPLY(z2, FIX_1_847759065); /* c3+c9 */
  3872. /* Final output stage */
  3873. wsptr[6*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  3874. wsptr[6*11] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  3875. wsptr[6*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  3876. wsptr[6*10] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  3877. wsptr[6*2] = (int) RIGHT_SHIFT(tmp22 + tmp12, CONST_BITS-PASS1_BITS);
  3878. wsptr[6*9] = (int) RIGHT_SHIFT(tmp22 - tmp12, CONST_BITS-PASS1_BITS);
  3879. wsptr[6*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  3880. wsptr[6*8] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  3881. wsptr[6*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  3882. wsptr[6*7] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  3883. wsptr[6*5] = (int) RIGHT_SHIFT(tmp25 + tmp15, CONST_BITS-PASS1_BITS);
  3884. wsptr[6*6] = (int) RIGHT_SHIFT(tmp25 - tmp15, CONST_BITS-PASS1_BITS);
  3885. }
  3886. /* Pass 2: process 12 rows from work array, store into output array.
  3887. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  3888. */
  3889. wsptr = workspace;
  3890. for (ctr = 0; ctr < 12; ctr++) {
  3891. outptr = output_buf[ctr] + output_col;
  3892. /* Even part */
  3893. /* Add range center and fudge factor for final descale and range-limit. */
  3894. tmp10 = (INT32) wsptr[0] +
  3895. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  3896. (ONE << (PASS1_BITS+2)));
  3897. tmp10 <<= CONST_BITS;
  3898. tmp12 = (INT32) wsptr[4];
  3899. tmp20 = MULTIPLY(tmp12, FIX(0.707106781)); /* c4 */
  3900. tmp11 = tmp10 + tmp20;
  3901. tmp21 = tmp10 - tmp20 - tmp20;
  3902. tmp20 = (INT32) wsptr[2];
  3903. tmp10 = MULTIPLY(tmp20, FIX(1.224744871)); /* c2 */
  3904. tmp20 = tmp11 + tmp10;
  3905. tmp22 = tmp11 - tmp10;
  3906. /* Odd part */
  3907. z1 = (INT32) wsptr[1];
  3908. z2 = (INT32) wsptr[3];
  3909. z3 = (INT32) wsptr[5];
  3910. tmp11 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  3911. tmp10 = tmp11 + ((z1 + z2) << CONST_BITS);
  3912. tmp12 = tmp11 + ((z3 - z2) << CONST_BITS);
  3913. tmp11 = (z1 - z2 - z3) << CONST_BITS;
  3914. /* Final output stage */
  3915. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp20 + tmp10,
  3916. CONST_BITS+PASS1_BITS+3)
  3917. & RANGE_MASK];
  3918. outptr[5] = range_limit[(int) RIGHT_SHIFT(tmp20 - tmp10,
  3919. CONST_BITS+PASS1_BITS+3)
  3920. & RANGE_MASK];
  3921. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp21 + tmp11,
  3922. CONST_BITS+PASS1_BITS+3)
  3923. & RANGE_MASK];
  3924. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp21 - tmp11,
  3925. CONST_BITS+PASS1_BITS+3)
  3926. & RANGE_MASK];
  3927. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp22 + tmp12,
  3928. CONST_BITS+PASS1_BITS+3)
  3929. & RANGE_MASK];
  3930. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp22 - tmp12,
  3931. CONST_BITS+PASS1_BITS+3)
  3932. & RANGE_MASK];
  3933. wsptr += 6; /* advance pointer to next row */
  3934. }
  3935. }
  3936. /*
  3937. * Perform dequantization and inverse DCT on one block of coefficients,
  3938. * producing a 5x10 output block.
  3939. *
  3940. * 10-point IDCT in pass 1 (columns), 5-point in pass 2 (rows).
  3941. */
  3942. GLOBAL(void)
  3943. jpeg_idct_5x10 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  3944. JCOEFPTR coef_block,
  3945. JSAMPARRAY output_buf, JDIMENSION output_col)
  3946. {
  3947. INT32 tmp10, tmp11, tmp12, tmp13, tmp14;
  3948. INT32 tmp20, tmp21, tmp22, tmp23, tmp24;
  3949. INT32 z1, z2, z3, z4, z5;
  3950. JCOEFPTR inptr;
  3951. ISLOW_MULT_TYPE * quantptr;
  3952. int * wsptr;
  3953. JSAMPROW outptr;
  3954. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  3955. int ctr;
  3956. int workspace[5*10]; /* buffers data between passes */
  3957. SHIFT_TEMPS
  3958. /* Pass 1: process columns from input, store into work array.
  3959. * 10-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/20).
  3960. */
  3961. inptr = coef_block;
  3962. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  3963. wsptr = workspace;
  3964. for (ctr = 0; ctr < 5; ctr++, inptr++, quantptr++, wsptr++) {
  3965. /* Even part */
  3966. z3 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  3967. if (ctr == 0)
  3968. CLAMP_DC(z3);
  3969. z3 <<= CONST_BITS;
  3970. /* Add fudge factor here for final descale. */
  3971. z3 += ONE << (CONST_BITS-PASS1_BITS-1);
  3972. z4 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  3973. z1 = MULTIPLY(z4, FIX(1.144122806)); /* c4 */
  3974. z2 = MULTIPLY(z4, FIX(0.437016024)); /* c8 */
  3975. tmp10 = z3 + z1;
  3976. tmp11 = z3 - z2;
  3977. tmp22 = RIGHT_SHIFT(z3 - ((z1 - z2) << 1), /* c0 = (c4-c8)*2 */
  3978. CONST_BITS-PASS1_BITS);
  3979. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  3980. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  3981. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c6 */
  3982. tmp12 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c2-c6 */
  3983. tmp13 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c2+c6 */
  3984. tmp20 = tmp10 + tmp12;
  3985. tmp24 = tmp10 - tmp12;
  3986. tmp21 = tmp11 + tmp13;
  3987. tmp23 = tmp11 - tmp13;
  3988. /* Odd part */
  3989. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  3990. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  3991. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  3992. z4 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  3993. tmp11 = z2 + z4;
  3994. tmp13 = z2 - z4;
  3995. tmp12 = MULTIPLY(tmp13, FIX(0.309016994)); /* (c3-c7)/2 */
  3996. z5 = z3 << CONST_BITS;
  3997. z2 = MULTIPLY(tmp11, FIX(0.951056516)); /* (c3+c7)/2 */
  3998. z4 = z5 + tmp12;
  3999. tmp10 = MULTIPLY(z1, FIX(1.396802247)) + z2 + z4; /* c1 */
  4000. tmp14 = MULTIPLY(z1, FIX(0.221231742)) - z2 + z4; /* c9 */
  4001. z2 = MULTIPLY(tmp11, FIX(0.587785252)); /* (c1-c9)/2 */
  4002. z4 = z5 - tmp12 - (tmp13 << (CONST_BITS - 1));
  4003. tmp12 = (z1 - tmp13 - z3) << PASS1_BITS;
  4004. tmp11 = MULTIPLY(z1, FIX(1.260073511)) - z2 - z4; /* c3 */
  4005. tmp13 = MULTIPLY(z1, FIX(0.642039522)) - z2 + z4; /* c7 */
  4006. /* Final output stage */
  4007. wsptr[5*0] = (int) RIGHT_SHIFT(tmp20 + tmp10, CONST_BITS-PASS1_BITS);
  4008. wsptr[5*9] = (int) RIGHT_SHIFT(tmp20 - tmp10, CONST_BITS-PASS1_BITS);
  4009. wsptr[5*1] = (int) RIGHT_SHIFT(tmp21 + tmp11, CONST_BITS-PASS1_BITS);
  4010. wsptr[5*8] = (int) RIGHT_SHIFT(tmp21 - tmp11, CONST_BITS-PASS1_BITS);
  4011. wsptr[5*2] = (int) (tmp22 + tmp12);
  4012. wsptr[5*7] = (int) (tmp22 - tmp12);
  4013. wsptr[5*3] = (int) RIGHT_SHIFT(tmp23 + tmp13, CONST_BITS-PASS1_BITS);
  4014. wsptr[5*6] = (int) RIGHT_SHIFT(tmp23 - tmp13, CONST_BITS-PASS1_BITS);
  4015. wsptr[5*4] = (int) RIGHT_SHIFT(tmp24 + tmp14, CONST_BITS-PASS1_BITS);
  4016. wsptr[5*5] = (int) RIGHT_SHIFT(tmp24 - tmp14, CONST_BITS-PASS1_BITS);
  4017. }
  4018. /* Pass 2: process 10 rows from work array, store into output array.
  4019. * 5-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/10).
  4020. */
  4021. wsptr = workspace;
  4022. for (ctr = 0; ctr < 10; ctr++) {
  4023. outptr = output_buf[ctr] + output_col;
  4024. /* Even part */
  4025. /* Add range center and fudge factor for final descale and range-limit. */
  4026. tmp12 = (INT32) wsptr[0] +
  4027. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  4028. (ONE << (PASS1_BITS+2)));
  4029. tmp12 <<= CONST_BITS;
  4030. tmp13 = (INT32) wsptr[2];
  4031. tmp14 = (INT32) wsptr[4];
  4032. z1 = MULTIPLY(tmp13 + tmp14, FIX(0.790569415)); /* (c2+c4)/2 */
  4033. z2 = MULTIPLY(tmp13 - tmp14, FIX(0.353553391)); /* (c2-c4)/2 */
  4034. z3 = tmp12 + z2;
  4035. tmp10 = z3 + z1;
  4036. tmp11 = z3 - z1;
  4037. tmp12 -= z2 << 2;
  4038. /* Odd part */
  4039. z2 = (INT32) wsptr[1];
  4040. z3 = (INT32) wsptr[3];
  4041. z1 = MULTIPLY(z2 + z3, FIX(0.831253876)); /* c3 */
  4042. tmp13 = z1 + MULTIPLY(z2, FIX(0.513743148)); /* c1-c3 */
  4043. tmp14 = z1 - MULTIPLY(z3, FIX(2.176250899)); /* c1+c3 */
  4044. /* Final output stage */
  4045. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp13,
  4046. CONST_BITS+PASS1_BITS+3)
  4047. & RANGE_MASK];
  4048. outptr[4] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp13,
  4049. CONST_BITS+PASS1_BITS+3)
  4050. & RANGE_MASK];
  4051. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp11 + tmp14,
  4052. CONST_BITS+PASS1_BITS+3)
  4053. & RANGE_MASK];
  4054. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp11 - tmp14,
  4055. CONST_BITS+PASS1_BITS+3)
  4056. & RANGE_MASK];
  4057. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12,
  4058. CONST_BITS+PASS1_BITS+3)
  4059. & RANGE_MASK];
  4060. wsptr += 5; /* advance pointer to next row */
  4061. }
  4062. }
  4063. /*
  4064. * Perform dequantization and inverse DCT on one block of coefficients,
  4065. * producing a 4x8 output block.
  4066. *
  4067. * 8-point IDCT in pass 1 (columns), 4-point in pass 2 (rows).
  4068. */
  4069. GLOBAL(void)
  4070. jpeg_idct_4x8 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4071. JCOEFPTR coef_block,
  4072. JSAMPARRAY output_buf, JDIMENSION output_col)
  4073. {
  4074. INT32 tmp0, tmp1, tmp2, tmp3;
  4075. INT32 tmp10, tmp11, tmp12, tmp13;
  4076. INT32 z1, z2, z3;
  4077. JCOEFPTR inptr;
  4078. ISLOW_MULT_TYPE * quantptr;
  4079. int * wsptr;
  4080. JSAMPROW outptr;
  4081. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4082. int ctr;
  4083. int workspace[4*8]; /* buffers data between passes */
  4084. SHIFT_TEMPS
  4085. /* Pass 1: process columns from input, store into work array.
  4086. * Note results are scaled up by sqrt(8) compared to a true IDCT;
  4087. * furthermore, we scale the results by 2**PASS1_BITS.
  4088. * 8-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/16).
  4089. */
  4090. inptr = coef_block;
  4091. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4092. wsptr = workspace;
  4093. for (ctr = 4; ctr > 0; ctr--) {
  4094. /* Due to quantization, we will usually find that many of the input
  4095. * coefficients are zero, especially the AC terms. We can exploit this
  4096. * by short-circuiting the IDCT calculation for any column in which all
  4097. * the AC terms are zero. In that case each output is equal to the
  4098. * DC coefficient (with scale factor as needed).
  4099. * With typical images and quantization tables, half or more of the
  4100. * column DCT calculations can be simplified this way.
  4101. */
  4102. if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
  4103. inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
  4104. inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
  4105. inptr[DCTSIZE*7] == 0) {
  4106. /* AC terms all zero */
  4107. int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4108. if (ctr == 4)
  4109. CLAMP_DC(dcval);
  4110. dcval <<= PASS1_BITS;
  4111. wsptr[4*0] = dcval;
  4112. wsptr[4*1] = dcval;
  4113. wsptr[4*2] = dcval;
  4114. wsptr[4*3] = dcval;
  4115. wsptr[4*4] = dcval;
  4116. wsptr[4*5] = dcval;
  4117. wsptr[4*6] = dcval;
  4118. wsptr[4*7] = dcval;
  4119. inptr++; /* advance pointers to next column */
  4120. quantptr++;
  4121. wsptr++;
  4122. continue;
  4123. }
  4124. /* Even part: reverse the even part of the forward DCT.
  4125. * The rotator is c(-6).
  4126. */
  4127. z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4128. if (ctr == 4)
  4129. CLAMP_DC(z2);
  4130. z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  4131. z2 <<= CONST_BITS;
  4132. z3 <<= CONST_BITS;
  4133. /* Add fudge factor here for final descale. */
  4134. z2 += ONE << (CONST_BITS-PASS1_BITS-1);
  4135. tmp0 = z2 + z3;
  4136. tmp1 = z2 - z3;
  4137. z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  4138. z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
  4139. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  4140. tmp2 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  4141. tmp3 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  4142. tmp10 = tmp0 + tmp2;
  4143. tmp13 = tmp0 - tmp2;
  4144. tmp11 = tmp1 + tmp3;
  4145. tmp12 = tmp1 - tmp3;
  4146. /* Odd part per figure 8; the matrix is unitary and hence its
  4147. * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively.
  4148. */
  4149. tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
  4150. tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  4151. tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  4152. tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4153. z2 = tmp0 + tmp2;
  4154. z3 = tmp1 + tmp3;
  4155. z1 = MULTIPLY(z2 + z3, FIX_1_175875602); /* c3 */
  4156. z2 = MULTIPLY(z2, - FIX_1_961570560); /* -c3-c5 */
  4157. z3 = MULTIPLY(z3, - FIX_0_390180644); /* -c3+c5 */
  4158. z2 += z1;
  4159. z3 += z1;
  4160. z1 = MULTIPLY(tmp0 + tmp3, - FIX_0_899976223); /* -c3+c7 */
  4161. tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* -c1+c3+c5-c7 */
  4162. tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* c1+c3-c5-c7 */
  4163. tmp0 += z1 + z2;
  4164. tmp3 += z1 + z3;
  4165. z1 = MULTIPLY(tmp1 + tmp2, - FIX_2_562915447); /* -c1-c3 */
  4166. tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* c1+c3-c5+c7 */
  4167. tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* c1+c3+c5-c7 */
  4168. tmp1 += z1 + z3;
  4169. tmp2 += z1 + z2;
  4170. /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */
  4171. wsptr[4*0] = (int) RIGHT_SHIFT(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
  4172. wsptr[4*7] = (int) RIGHT_SHIFT(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
  4173. wsptr[4*1] = (int) RIGHT_SHIFT(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
  4174. wsptr[4*6] = (int) RIGHT_SHIFT(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
  4175. wsptr[4*2] = (int) RIGHT_SHIFT(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
  4176. wsptr[4*5] = (int) RIGHT_SHIFT(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
  4177. wsptr[4*3] = (int) RIGHT_SHIFT(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
  4178. wsptr[4*4] = (int) RIGHT_SHIFT(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
  4179. inptr++; /* advance pointers to next column */
  4180. quantptr++;
  4181. wsptr++;
  4182. }
  4183. /* Pass 2: process 8 rows from work array, store into output array.
  4184. * 4-point IDCT kernel,
  4185. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  4186. */
  4187. wsptr = workspace;
  4188. for (ctr = 0; ctr < 8; ctr++) {
  4189. outptr = output_buf[ctr] + output_col;
  4190. /* Even part */
  4191. /* Add range center and fudge factor for final descale and range-limit. */
  4192. tmp0 = (INT32) wsptr[0] +
  4193. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  4194. (ONE << (PASS1_BITS+2)));
  4195. tmp2 = (INT32) wsptr[2];
  4196. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  4197. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  4198. /* Odd part */
  4199. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  4200. z2 = (INT32) wsptr[1];
  4201. z3 = (INT32) wsptr[3];
  4202. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  4203. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  4204. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  4205. /* Final output stage */
  4206. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  4207. CONST_BITS+PASS1_BITS+3)
  4208. & RANGE_MASK];
  4209. outptr[3] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  4210. CONST_BITS+PASS1_BITS+3)
  4211. & RANGE_MASK];
  4212. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp12 + tmp2,
  4213. CONST_BITS+PASS1_BITS+3)
  4214. & RANGE_MASK];
  4215. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp12 - tmp2,
  4216. CONST_BITS+PASS1_BITS+3)
  4217. & RANGE_MASK];
  4218. wsptr += 4; /* advance pointer to next row */
  4219. }
  4220. }
  4221. /*
  4222. * Perform dequantization and inverse DCT on one block of coefficients,
  4223. * producing a 3x6 output block.
  4224. *
  4225. * 6-point IDCT in pass 1 (columns), 3-point in pass 2 (rows).
  4226. */
  4227. GLOBAL(void)
  4228. jpeg_idct_3x6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4229. JCOEFPTR coef_block,
  4230. JSAMPARRAY output_buf, JDIMENSION output_col)
  4231. {
  4232. INT32 tmp0, tmp1, tmp2, tmp10, tmp11, tmp12;
  4233. INT32 z1, z2, z3;
  4234. JCOEFPTR inptr;
  4235. ISLOW_MULT_TYPE * quantptr;
  4236. int * wsptr;
  4237. JSAMPROW outptr;
  4238. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4239. int ctr;
  4240. int workspace[3*6]; /* buffers data between passes */
  4241. SHIFT_TEMPS
  4242. /* Pass 1: process columns from input, store into work array.
  4243. * 6-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/12).
  4244. */
  4245. inptr = coef_block;
  4246. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4247. wsptr = workspace;
  4248. for (ctr = 0; ctr < 3; ctr++, inptr++, quantptr++, wsptr++) {
  4249. /* Even part */
  4250. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4251. if (ctr == 0)
  4252. CLAMP_DC(tmp0);
  4253. tmp0 <<= CONST_BITS;
  4254. /* Add fudge factor here for final descale. */
  4255. tmp0 += ONE << (CONST_BITS-PASS1_BITS-1);
  4256. tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
  4257. tmp10 = MULTIPLY(tmp2, FIX(0.707106781)); /* c4 */
  4258. tmp1 = tmp0 + tmp10;
  4259. tmp11 = RIGHT_SHIFT(tmp0 - tmp10 - tmp10, CONST_BITS-PASS1_BITS);
  4260. tmp10 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  4261. tmp0 = MULTIPLY(tmp10, FIX(1.224744871)); /* c2 */
  4262. tmp10 = tmp1 + tmp0;
  4263. tmp12 = tmp1 - tmp0;
  4264. /* Odd part */
  4265. z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4266. z2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  4267. z3 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
  4268. tmp1 = MULTIPLY(z1 + z3, FIX(0.366025404)); /* c5 */
  4269. tmp0 = tmp1 + ((z1 + z2) << CONST_BITS);
  4270. tmp2 = tmp1 + ((z3 - z2) << CONST_BITS);
  4271. tmp1 = (z1 - z2 - z3) << PASS1_BITS;
  4272. /* Final output stage */
  4273. wsptr[3*0] = (int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS-PASS1_BITS);
  4274. wsptr[3*5] = (int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS-PASS1_BITS);
  4275. wsptr[3*1] = (int) (tmp11 + tmp1);
  4276. wsptr[3*4] = (int) (tmp11 - tmp1);
  4277. wsptr[3*2] = (int) RIGHT_SHIFT(tmp12 + tmp2, CONST_BITS-PASS1_BITS);
  4278. wsptr[3*3] = (int) RIGHT_SHIFT(tmp12 - tmp2, CONST_BITS-PASS1_BITS);
  4279. }
  4280. /* Pass 2: process 6 rows from work array, store into output array.
  4281. * 3-point IDCT kernel, cK represents sqrt(2) * cos(K*pi/6).
  4282. */
  4283. wsptr = workspace;
  4284. for (ctr = 0; ctr < 6; ctr++) {
  4285. outptr = output_buf[ctr] + output_col;
  4286. /* Even part */
  4287. /* Add range center and fudge factor for final descale and range-limit. */
  4288. tmp0 = (INT32) wsptr[0] +
  4289. ((((INT32) RANGE_CENTER) << (PASS1_BITS+3)) +
  4290. (ONE << (PASS1_BITS+2)));
  4291. tmp0 <<= CONST_BITS;
  4292. tmp2 = (INT32) wsptr[2];
  4293. tmp12 = MULTIPLY(tmp2, FIX(0.707106781)); /* c2 */
  4294. tmp10 = tmp0 + tmp12;
  4295. tmp2 = tmp0 - tmp12 - tmp12;
  4296. /* Odd part */
  4297. tmp12 = (INT32) wsptr[1];
  4298. tmp0 = MULTIPLY(tmp12, FIX(1.224744871)); /* c1 */
  4299. /* Final output stage */
  4300. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0,
  4301. CONST_BITS+PASS1_BITS+3)
  4302. & RANGE_MASK];
  4303. outptr[2] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0,
  4304. CONST_BITS+PASS1_BITS+3)
  4305. & RANGE_MASK];
  4306. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp2,
  4307. CONST_BITS+PASS1_BITS+3)
  4308. & RANGE_MASK];
  4309. wsptr += 3; /* advance pointer to next row */
  4310. }
  4311. }
  4312. /*
  4313. * Perform dequantization and inverse DCT on one block of coefficients,
  4314. * producing a 2x4 output block.
  4315. *
  4316. * 4-point IDCT in pass 1 (columns), 2-point in pass 2 (rows).
  4317. */
  4318. GLOBAL(void)
  4319. jpeg_idct_2x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4320. JCOEFPTR coef_block,
  4321. JSAMPARRAY output_buf, JDIMENSION output_col)
  4322. {
  4323. INT32 tmp0, tmp2, tmp10, tmp12;
  4324. INT32 z1, z2, z3;
  4325. JCOEFPTR inptr;
  4326. ISLOW_MULT_TYPE * quantptr;
  4327. INT32 * wsptr;
  4328. JSAMPROW outptr;
  4329. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4330. int ctr;
  4331. INT32 workspace[2*4]; /* buffers data between passes */
  4332. SHIFT_TEMPS
  4333. /* Pass 1: process columns from input, store into work array.
  4334. * 4-point IDCT kernel,
  4335. * cK represents sqrt(2) * cos(K*pi/16) [refers to 8-point IDCT].
  4336. */
  4337. inptr = coef_block;
  4338. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4339. wsptr = workspace;
  4340. for (ctr = 0; ctr < 2; ctr++, inptr++, quantptr++, wsptr++) {
  4341. /* Even part */
  4342. tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4343. if (ctr == 0)
  4344. CLAMP_DC(tmp0);
  4345. tmp2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
  4346. tmp10 = (tmp0 + tmp2) << CONST_BITS;
  4347. tmp12 = (tmp0 - tmp2) << CONST_BITS;
  4348. /* Odd part */
  4349. /* Same rotation as in the even part of the 8x8 LL&M IDCT */
  4350. z2 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4351. z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
  4352. z1 = MULTIPLY(z2 + z3, FIX_0_541196100); /* c6 */
  4353. tmp0 = z1 + MULTIPLY(z2, FIX_0_765366865); /* c2-c6 */
  4354. tmp2 = z1 - MULTIPLY(z3, FIX_1_847759065); /* c2+c6 */
  4355. /* Final output stage */
  4356. wsptr[2*0] = tmp10 + tmp0;
  4357. wsptr[2*3] = tmp10 - tmp0;
  4358. wsptr[2*1] = tmp12 + tmp2;
  4359. wsptr[2*2] = tmp12 - tmp2;
  4360. }
  4361. /* Pass 2: process 4 rows from work array, store into output array. */
  4362. wsptr = workspace;
  4363. for (ctr = 0; ctr < 4; ctr++) {
  4364. outptr = output_buf[ctr] + output_col;
  4365. /* Even part */
  4366. /* Add range center and fudge factor for final descale and range-limit. */
  4367. tmp10 = wsptr[0] +
  4368. ((((INT32) RANGE_CENTER) << (CONST_BITS+3)) +
  4369. (ONE << (CONST_BITS+2)));
  4370. /* Odd part */
  4371. tmp0 = wsptr[1];
  4372. /* Final output stage */
  4373. outptr[0] = range_limit[(int) RIGHT_SHIFT(tmp10 + tmp0, CONST_BITS+3)
  4374. & RANGE_MASK];
  4375. outptr[1] = range_limit[(int) RIGHT_SHIFT(tmp10 - tmp0, CONST_BITS+3)
  4376. & RANGE_MASK];
  4377. wsptr += 2; /* advance pointer to next row */
  4378. }
  4379. }
  4380. /*
  4381. * Perform dequantization and inverse DCT on one block of coefficients,
  4382. * producing a 1x2 output block.
  4383. *
  4384. * 2-point IDCT in pass 1 (columns), 1-point in pass 2 (rows).
  4385. */
  4386. GLOBAL(void)
  4387. jpeg_idct_1x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
  4388. JCOEFPTR coef_block,
  4389. JSAMPARRAY output_buf, JDIMENSION output_col)
  4390. {
  4391. DCTELEM tmp0, tmp1;
  4392. ISLOW_MULT_TYPE * quantptr;
  4393. JSAMPLE *range_limit = IDCT_range_limit(cinfo);
  4394. ISHIFT_TEMPS
  4395. /* Process 1 column from input, store into output array. */
  4396. quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
  4397. /* Even part */
  4398. tmp0 = DEQUANTIZE(coef_block[DCTSIZE*0], quantptr[DCTSIZE*0]);
  4399. CLAMP_DC(tmp0);
  4400. /* Add range center and fudge factor for final descale and range-limit. */
  4401. tmp0 += (((DCTELEM) RANGE_CENTER) << 3) + (1 << 2);
  4402. /* Odd part */
  4403. tmp1 = DEQUANTIZE(coef_block[DCTSIZE*1], quantptr[DCTSIZE*1]);
  4404. /* Final output stage */
  4405. output_buf[0][output_col] =
  4406. range_limit[(int) IRIGHT_SHIFT(tmp0 + tmp1, 3) & RANGE_MASK];
  4407. output_buf[1][output_col] =
  4408. range_limit[(int) IRIGHT_SHIFT(tmp0 - tmp1, 3) & RANGE_MASK];
  4409. }
  4410. #endif /* IDCT_SCALING_SUPPORTED */
  4411. #endif /* DCT_ISLOW_SUPPORTED */