jidctint.c 180 KB

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